@@ -12,6 +12,7 @@ import {HalOptions, HalParam} from './rest.service';
1212import { SubTypeBuilder } from './subtype-builder' ;
1313import { Observable } from 'rxjs/internal/Observable' ;
1414import { CustomEncoder } from './CustomEncoder' ;
15+ import * as url from 'url' ;
1516
1617@Injectable ( )
1718export class ResourceService {
@@ -35,15 +36,30 @@ export class ResourceService {
3536 catchError ( error => observableThrowError ( error ) ) , ) ;
3637 }
3738
38- public get < T extends Resource > ( type : { new ( ) : T } , resource : string , id : any , params ?: HalParam [ ] ) : Observable < T > {
39+ public get < T extends Resource > ( type : { new ( ) : T } , resource : string , id : any , params ?: HalParam [ ] , builder ?: SubTypeBuilder ) : Observable < T > {
40+ let self = this ;
3941 const uri = this . getResourceUrl ( resource ) . concat ( '/' , id ) ;
40- const result : T = new type ( ) ;
42+
43+ let result : T = new type ( ) ;
4144 const httpParams = ResourceHelper . params ( new HttpParams ( ) , params ) ;
4245
4346 this . setUrlsResource ( result ) ;
44- let observable = ResourceHelper . getHttp ( ) . get ( uri , { headers : ResourceHelper . headers , params : httpParams } ) ;
45- return observable . pipe ( map ( data => ResourceHelper . instantiateResource ( result , data ) ) ,
46- catchError ( error => observableThrowError ( error ) ) , ) ;
47+ let observable = ResourceHelper . getHttp ( ) . get ( uri , { headers : ResourceHelper . headers , observe : 'response' , params : httpParams } ) ;
48+ return observable . pipe (
49+ map ( ( response : HttpResponse < any > ) => {
50+ if ( builder ) {
51+ let linkHref = url . parse ( response . body . _links . self . href ) . pathname ;
52+ let regex = / ( [ A - Z a - z 0 - 9 ] + ) \/ ( [ A - Z a - z 0 - 9 ] + ) \/ ( [ A - Z a - z 0 - 9 ] + ) / g;
53+ let match = regex . exec ( linkHref ) ;
54+ if ( match != null ) {
55+ let embeddedClassName = match [ 2 ] ;
56+ result = ResourceHelper . searchSubtypes ( builder , embeddedClassName , result ) ;
57+ }
58+ }
59+ return ResourceHelper . instantiateResourceFromResponse ( result , response ) ;
60+ } ) ,
61+ catchError ( error => this . handleError ( error ) )
62+ ) ;
4763 }
4864
4965 public getBySelfLink < T extends Resource > ( type : { new ( ) : T } , resourceLink : string ) : Observable < T > {
0 commit comments