Skip to content

HalModel

Mihael Safaric edited this page Sep 27, 2024 · 29 revisions

HalModel is an abstract class which enriches your models with the HAL functionalies.

constructor(resource: RawHalResource = {}, private datastore: DatastoreService, public rawResponse?: HttpResponse<any>)

Properties

  • endpoint: string

    • used for building resource URLs
    • readonly
    • can be set via ModelConfig decorator
    • default value: the value of endpoint property from the model decorator
    • NOTE: either this getter has to be implemented or endpoint must be specified in the model constructor
  • modelEndpoints: ModelEndpoints

    • used for building resource URLs instead of endpoint
    • readonly
    • if provided, singleResourceEndpoint is used when:
      • fetching a resource via the findOne method
      • updating a resource via the update method
    • if provided, collectionEndpoint is used when:
      • fetching resources via the find method
      • creating a resource
    • both singleResourceEndpoint and collectionEndpoint support templated strings
      • templated parts of an URL will be replaced with requestOptions.params and requestOptions.routeParams
        • the difference between the two is that routeParams won't be sent in a request payload, they are used only for building templated URL
  • type: string

    • return unique name of the model class specified in the model decorator
  • uniqueModelIdentificator: string

  • id: string

    • returns the model ID parsed from self link
  • networkConfig: NetworkConfig

    • returns network config specified on a model level
  • isSaved: boolean

    • return true if model is saved, else otherwise
  • selfLink: string

    • GET: returns URL to the resource
    • SET: sets selfLink property of the model if it is not already set
  • links: RawHalLinks

    • returns an object with the links to related resources
  • modelType: string

Methods

save

save(requestOptions?: RequestOptions, options: CustomOptions = {}): Observable<this>;

update

update(requestOptions?: RequestOptions, options: CustomOptions<this> = {}): Observable<this>
  • calls update method on a datastore service
  • makes a PATCH request with changed properties only
  • NOTE: it works with Attribute model properties only (omits hasOne and hasMany relationships) (TODO: implement handling hasOne and hasMany relationships)
  • options
    • specificFields: Array
      • optional
      • if provided, only the listed fields are taken in consideration while generating a payload (if they are changed)
    • buildUrlFunction
      • function used for generating the final request URL
      • optional
      • default: model.endpoint
    • transformPayloadBeforeSave
      • optional
      • the function gets a generated payload as an argument and the value returned from the function will be the payload which will be sent in the request

delete

delete(requestOptions?: RequestOptions, options: CustomOptions): Observable<void>;
  • calls delete method on a datastore service which then makes DELETE request for the current model
  • see DatastoreService

getHalDocumentClass

getHalDocumentClass<T extends HalModel<P>, P extends Pagination>(): HalDocumentConstructor<T, P>;
  • returns HalDocument class which is defined on the model level

getRelationshipUrl

getRelationshipUrl(relationshipName: string): string;
  • returns URL for fetching relationshipName relationship
  • relationshipName has to be defined in a model, otherwise, null will be returned even if the relationship is present in the model links

fetchRelationships

fetchRelationships(relationships: string | RelationshipRequestDescriptor | Array<string | RelationshipRequestDescriptor>): Observable<this>;
  • it uses fetchModelRelationships in the background, check docs there
  • fetches one or more model relationships
  • returns the original model
  • the original model is fetched from the local store
  • requestOptions
    • optional
    • options which will be passed to all requests

getRelationship

getRelationship<T extends HalModel<P>>(relationshipName: string): T | HalDocument<T, P>;
  • it returns a HAL model (for has-one relationships) or a HAL document (for has-many relationships)
  • it does NOT make an API call
  • if the resource is not in the local store, undefined will be returned

refetch

refetch(includeRelationships?: Array<string | RelationshipRequestDescriptor>, requestOptions?: RequestOptions): Observable<T>;
  • re-fetches the model with provided options

getPropertyData

getPropertyData(propertyName: string): ModelProperty;

getEmbeddedResource

getEmbeddedResource(resourceName: string): RawHalResource | undefined;
  • returns HAL formatted object which represents a model (or models) under resourceName relationship
  • returns undefined if such object does not exist in the resource response
  • it searches for the object under resource[resourceName] and inside the embedded property, ie. resource._embedded[resourceName]

generatePayload

generatePayload(options: GeneratePayloadOptions): object;
  • maps model attribute properties to a simple object and returns that object

generateHeaders

generateHeaders(): object;
  • maps model header attribute properties to a simple object and returns that object

populateModelMetadata

populateModelMetadata(sourceModel): void;
  • replaces source model data with a new one

Decorators

Model properties must be decorated with one of the following decorator: