Skip to content

Commit

Permalink
feat(hal-model-builder): add hal-model-builder
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Schaffer committed Sep 11, 2019
1 parent 0f601a1 commit f2ceead
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/dandi/hal-model-builder/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './src/hal-model-builder'
4 changes: 4 additions & 0 deletions packages/dandi/hal-model-builder/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions packages/dandi/hal-model-builder/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@dandi/hal-model-builder",
"peerDependencies": {
"@dandi/common": "*",
"@dandi/core": "*",
"@dandi/hal": "*",
"@dandi/model-builder": "*"
}
}
3 changes: 3 additions & 0 deletions packages/dandi/hal-model-builder/src/global.symbol.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { GlobalSymbolFn, packageGlobalSymbol } from '@dandi/common'

export const globalSymbol: GlobalSymbolFn = packageGlobalSymbol.bind(null, '@dandi/hal-model-builder')
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { HalModelBuilder } from '@dandi/hal-model-builder'

describe(HalModelBuilder.name, () => {

})
37 changes: 37 additions & 0 deletions packages/dandi/hal-model-builder/src/hal-model-builder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { Constructor } from '@dandi/common'
import { Inject, Injectable } from '@dandi/core'
import { getResourceMetadata, HalObject, isHalObject, ResourceMetadata } from '@dandi/hal'
import { MetadataModelBuilder, ModelBuilder, ModelBuilderOptions, PrimitiveTypeConverter } from '@dandi/model-builder'


@Injectable(ModelBuilder)
export class HalModelBuilder extends MetadataModelBuilder {

constructor(@Inject(PrimitiveTypeConverter) primitive: PrimitiveTypeConverter) {
super(primitive)
}

public constructModel(type: Constructor<any>, source: any, options?: ModelBuilderOptions): any {
const result = super.constructModel(type, source, options)

if (isHalObject(source) && source._embedded) {
result._embedded = this.constructEmbeddedResources(getResourceMetadata(type), source)
}

return result
}

private constructEmbeddedResources(resourceMeta: ResourceMetadata, source: HalObject, options?: ModelBuilderOptions): { [rel: string]: any } {
return Object.keys(source._embedded).reduce((embedded, rel) => {
const relMeta = resourceMeta.relations[rel]
const relSource = source._embedded[rel]
if (Array.isArray(relSource)) {
embedded[rel] = relSource.map(relSourceItem => this.constructModel(relMeta.resource, relSourceItem, options))
} else {
embedded[rel] = this.constructModel(relMeta.resource, relSource, options)
}
return embedded
}, {})
}

}
3 changes: 3 additions & 0 deletions packages/dandi/hal-model-builder/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "../../../tsconfig.json"
}

0 comments on commit f2ceead

Please sign in to comment.