@loopback/repository
Version:
Define and implement a common set of interfaces for interacting with databases
85 lines (77 loc) • 2.68 kB
text/typescript
// Copyright IBM Corp. and LoopBack contributors 2017,2020. All Rights Reserved.
// Node module: @loopback/repository
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {InspectionOptions, MetadataInspector} from '@loopback/core';
import {ModelDefinition, RelationDefinitionMap} from '../model';
import {RELATIONS_KEY} from '../relations';
import {
MODEL_KEY,
MODEL_PROPERTIES_KEY,
MODEL_WITH_PROPERTIES_KEY,
PropertyMap,
} from './model.decorator';
export class ModelMetadataHelper {
/**
* A utility function to simplify retrieving metadata from a target model and
* its properties.
* @param target - The class from which to retrieve metadata.
* @param options - An options object for the MetadataInspector to customize
* the output of the metadata retrieval functions.
*/
static getModelMetadata(
target: Function,
options?: InspectionOptions,
): ModelDefinition | {} {
const classDef = MetadataInspector.getClassMetadata(
MODEL_WITH_PROPERTIES_KEY,
target,
// https://github.com/loopbackio/loopback-next/issues/4721
// The `target` can be a subclass for a base model
{...options, ownMetadataOnly: true},
);
// Return the cached value, if it exists.
// XXX(kjdelisle): If we're going to support dynamic updates, then this
// will be problematic in the future, since it will never update.
if (classDef) {
return classDef;
} else {
const modelMeta = MetadataInspector.getClassMetadata<ModelDefinition>(
MODEL_KEY,
target,
options,
);
if (!modelMeta) {
return {};
} else {
// sets the metadata to a dedicated key if cached value does not exist
// set ModelDefinition properties if they don't already exist
const meta = new ModelDefinition({...modelMeta});
// set properties lost from creating instance of ModelDefinition
Object.assign(meta, modelMeta);
meta.properties = Object.assign(
<PropertyMap>meta.properties,
MetadataInspector.getAllPropertyMetadata(
MODEL_PROPERTIES_KEY,
target.prototype,
options,
),
);
meta.relations = Object.assign(
<RelationDefinitionMap>meta.relations,
MetadataInspector.getAllPropertyMetadata(
RELATIONS_KEY,
target.prototype,
options,
),
);
MetadataInspector.defineMetadata(
MODEL_WITH_PROPERTIES_KEY.key,
meta,
target,
);
return meta;
}
}
}
}