UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

228 lines 18.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { AttributeMetadata } from './decorators/symboles'; import { ResourceMetadataWrapper } from './resource-metadata.wrapper'; import { JsonapiConverter } from './converters/jsonapi.converter'; export class ResourceSerializer { /** * @param {?} model */ constructor(model) { this.model = model; this.mdwrapper = new ResourceMetadataWrapper(model); } /** * @return {?} */ toJsonapi() { /** @type {?} */ const result = this.serialize(); /** @type {?} */ const includeKeys = this.mdwrapper.getIncludedKeys(); /** @type {?} */ const body = new JsonapiConverter().serialize(result, includeKeys); return body; } /** * @return {?} */ serialize() { /** @type {?} */ const type = this.model.type; const [attributes, belongstos, hasManys] = this.serializeAll(); /** @type {?} */ const relationshipNames = []; relationshipNames.push(...Object.keys(belongstos).filter((/** * @param {?} key * @return {?} */ key => belongstos.hasOwnProperty(key)))); relationshipNames.push(...Object.keys(hasManys).filter((/** * @param {?} key * @return {?} */ key => hasManys.hasOwnProperty(key)))); /** @type {?} */ const result = Object.assign({ id: this.model.id, type }, attributes, belongstos, hasManys, { relationshipNames }); if (this.model.isRelation) { result.__method = this.model.relationMethod; } return result; } /** * @return {?} */ toHash() { /** @type {?} */ const res = { id: this.model.id, type: this.model.type }; this.mdwrapper.attributesKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ key => res[key] = this.model[key])); this.mdwrapper.belongsToKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ key => res[key] = this.model[key].toHash())); this.mdwrapper.hasManyKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ key => { this.model[key].forEach((/** * @param {?} elt * @return {?} */ elt => { res[key] = res[key] || []; // no need to init res[key] if array has no elements. res[key].push(elt.toHash()); })); })); return res; } /** * @private * @return {?} */ serializeAll() { /** @type {?} */ const attributes = this.serializeAttributes(); /** @type {?} */ const belongstos = this.serializeBelongsTo(); /** @type {?} */ const hasManys = this.serializeHasMany(); return [attributes, belongstos, hasManys]; } /** * @private * @return {?} */ serializeAttributes() { /** @type {?} */ let keys = this.mdwrapper.attributesKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.mdwrapper.isWritable(key))); /** @type {?} */ const attributes = this.model[AttributeMetadata]; keys = this.model.id ? keys.filter((/** * @param {?} key * @return {?} */ key => attributes[key].hasDirtyAttributes)) : keys; /** @type {?} */ const result = {}; keys.forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const beKey = this.mdwrapper.backendPropName(key); result[beKey] = attributes[key].serializedValue; })); return result; } /** * @private * @return {?} */ serializeBelongsTo() { /** @type {?} */ let keys = this.mdwrapper.belongsToKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.mdwrapper.isWritable(key))); // Ignore untouched relationships keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.model[key].hasBeenTouched)); /** @type {?} */ const belongstos = {}; keys.forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const sidepostable = this.mdwrapper.isSidepostable(key); /** @type {?} */ const beKey = this.mdwrapper.backendPropName(key); belongstos[beKey] = sidepostable ? this.model[key].serialize() : this.model[key].sideload(); if (!belongstos[beKey]) { delete belongstos[beKey]; } })); return belongstos; } /** * @private * @return {?} */ serializeHasMany() { /** @type {?} */ let keys = this.mdwrapper.hasManyKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.mdwrapper.isWritable(key))); /** @type {?} */ const hasManys = {}; keys.forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const sidepostable = this.mdwrapper.isSidepostable(key); /** @type {?} */ const beKey = this.mdwrapper.backendPropName(key); hasManys[beKey] = sidepostable ? this.model[key].filter((/** * @param {?} elt * @return {?} */ elt => elt.hasBeenTouched)).map((/** * @param {?} elt * @return {?} */ elt => elt.serialize())) : this.model[key].filter((/** * @param {?} elt * @return {?} */ elt => elt.hasBeenTouched)).map((/** * @param {?} elt * @return {?} */ elt => elt.sideload())); if (hasManys[beKey].length === 0) { delete hasManys[beKey]; } })); return hasManys; } } if (false) { /** * @type {?} * @private */ ResourceSerializer.prototype.mdwrapper; /** * @type {?} * @private */ ResourceSerializer.prototype.model; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1haXJicnVzaC8iLCJzb3VyY2VzIjpbImxpYi9yZXNvdXJjZS5zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdsRSxNQUFNLE9BQU8sa0JBQWtCOzs7O0lBRzdCLFlBQW9CLEtBQW1CO1FBQW5CLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7Ozs7SUFFTSxTQUFTOztjQUNSLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFOztjQUN6QixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUU7O2NBRTlDLElBQUksR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7O0lBRU0sU0FBUzs7Y0FDUixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO2NBRXRCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFOztjQUN4RCxpQkFBaUIsR0FBRyxFQUFFO1FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTTs7OztRQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFD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QUc7Ozs7Z0JBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUMsQ0FBQztZQUMvRixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUFFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQUU7UUFDL0QsQ0FBQyxFQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7Ozs7OztJQXBHQyx1Q0FBMkM7Ozs7O0lBRS9CLG1DQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpzb25hcGlSZXNvdXJjZVJlcXVlc3QgfSBmcm9tICcuL2ludGVyZmFjZXMvanNvbmFwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVzb3VyY2VCYXNlIH0gZnJvbSAnLi9yZXNvdXJjZS1iYXNlLm1vZGVsJztcbmltcG9ydCB7IEF0dHJpYnV0ZU1ldGFkYXRhIH0gZnJvbSAnLi9kZWNvcmF0b3JzL3N5bWJvbGVzJztcbmltcG9ydCB7IFJlc291cmNlTWV0YWRhdGFXcmFwcGVyIH0gZnJvbSAnLi9yZXNvdXJjZS1tZXRhZGF0YS53cmFwcGVyJztcbmltcG9ydCB7IEpzb25hcGlDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcnMvanNvbmFwaS5jb252ZXJ0ZXInO1xuXG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVNlcmlhbGl6ZXIge1xuICBwcml2YXRlIG1kd3JhcHBlcjogUmVzb3VyY2VNZXRhZGF0YVdyYXBwZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogUmVzb3VyY2VCYXNlKSB7XG4gICAgdGhpcy5tZHdyYXBwZXIgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YVdyYXBwZXIobW9kZWwpO1xuICB9XG5cbiAgcHVibGljIHRvSnNvbmFwaSgpOiBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0IHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6ZSgpO1xuICAgIGNvbnN0IGluY2x1ZGVLZXlzID0gdGhpcy5tZHdyYXBwZXIuZ2V0SW5jbHVkZWRLZXlzKCk7XG5cbiAgICBjb25zdCBib2R5ID0gbmV3IEpzb25hcGlDb252ZXJ0ZXIoKS5zZXJpYWxpemUocmVzdWx0LCBpbmNsdWRlS2V5cyk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm1vZGVsLnR5cGU7XG5cbiAgICBjb25zdCBbYXR0cmlidXRlcywgYmVsb25nc3RvcywgaGFzTWFueXNdID0gdGhpcy5zZXJpYWxpemVBbGwoKTtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lcyA9IFtdO1xuICAgIHJlbGF0aW9uc2hpcE5hbWVzLnB1c2goLi4uT2JqZWN0LmtleXMoYmVsb25nc3RvcykuZmlsdGVyKGtleSA9PiBiZWxvbmdzdG9zLmhhc093blByb3BlcnR5KGtleSkpKTtcbiAgICByZWxhdGlvbnNoaXBOYW1lcy5wdXNoKC4uLk9iamVjdC5rZXlzKGhhc01hbnlzKS5maWx0ZXIoa2V5ID0+IGhhc01hbnlzLmhhc093blByb3BlcnR5KGtleSkpKTtcbiAgICBjb25zdCByZXN1bHQ6IHsgW2F0dHJOYW1lOiBzdHJpbmddOiBhbnk7IH0gPSB7XG4gICAgICBpZDogdGhpcy5tb2RlbC5pZCxcbiAgICAgIHR5cGUsXG4gICAgICAuLi5hdHRyaWJ1dGVzLFxuICAgICAgLi4uYmVsb25nc3RvcyxcbiAgICAgIC4uLmhhc01hbnlzLFxuICAgICAgcmVsYXRpb25zaGlwTmFtZXMsXG4gICAgfTtcbiAgICBpZiAodGhpcy5tb2RlbC5pc1JlbGF0aW9uKSB7XG4gICAgICByZXN1bHQuX19tZXRob2QgPSB0aGlzLm1vZGVsLnJlbGF0aW9uTWV0aG9kO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHRvSGFzaCgpOiB7IFthdHRyTmFtZTogc3RyaW5nXTogYW55OyB9IHtcbiAgICBjb25zdCByZXMgPSB7IGlkOiB0aGlzLm1vZGVsLmlkLCB0eXBlOiB0aGlzLm1vZGVsLnR5cGUgfTtcbiAgICB0aGlzLm1kd3JhcHBlci5hdHRyaWJ1dGVzS2V5cyh7IGRlZmluZWQ6IHRydWUgfSkuZm9yRWFjaChrZXkgPT4gcmVzW2tleV0gPSB0aGlzLm1vZGVsW2tleV0pO1xuICAgIHRoaXMubWR3cmFwcGVyLmJlbG9uZ3NUb0tleXMoeyBkZWZpbmVkOiB0cnVlIH0pLmZvckVhY2goa2V5ID0+IHJlc1trZXldID0gdGhpcy5tb2RlbFtrZXldLnRvSGFzaCgpKTtcbiAgICB0aGlzLm1kd3JhcHBlci5oYXNNYW55S2V5cyh7IGRlZmluZWQ6IHRydWUgfSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5tb2RlbFtrZXldLmZvckVhY2goZWx0ID0+IHtcbiAgICAgICAgcmVzW2tleV0gPSByZXNba2V5XSB8fCBbXTsgLy8gbm8gbmVlZCB0byBpbml0IHJlc1trZXldIGlmIGFycmF5IGhhcyBubyBlbGVtZW50cy5cbiAgICAgICAgcmVzW2tleV0ucHVzaChlbHQudG9IYXNoKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplQWxsKCk6IHsgW2F0dHJOYW1lOiBzdHJpbmddOiBhbnk7IH1bXSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuc2VyaWFsaXplQXR0cmlidXRlcygpO1xuICAgIGNvbnN0IGJlbG9uZ3N0b3MgPSB0aGlzLnNlcmlhbGl6ZUJlbG9uZ3NUbygpO1xuICAgIGNvbnN0IGhhc01hbnlzID0gdGhpcy5zZXJpYWxpemVIYXNNYW55KCk7XG4gICAgcmV0dXJuIFthdHRyaWJ1dGVzLCBiZWxvbmdzdG9zLCBoYXNNYW55c107XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZUF0dHJpYnV0ZXMoKTogeyBbYXR0ck5hbWU6IHN0cmluZ106IGFueTsgfSB7XG4gICAgbGV0IGtleXMgPSB0aGlzLm1kd3JhcHBlci5hdHRyaWJ1dGVzS2V5cyh7IGRlZmluZWQ6IHRydWUgfSk7XG4gICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1kd3JhcHBlci5pc1dyaXRhYmxlKGtleSkpO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxbQXR0cmlidXRlTWV0YWRhdGFdO1xuICAgIGtleXMgPSB0aGlzLm1vZGVsLmlkID8ga2V5cy5maWx0ZXIoa2V5ID0+IGF0dHJpYnV0ZXNba2V5XS5oYXNEaXJ0eUF0dHJpYnV0ZXMpIDoga2V5cztcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGJlS2V5ID0gdGhpcy5tZHdyYXBwZXIuYmFja2VuZFByb3BOYW1lKGtleSk7XG4gICAgICByZXN1bHRbYmVLZXldID0gYXR0cmlidXRlc1trZXldLnNlcmlhbGl6ZWRWYWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemVCZWxvbmdzVG8oKTogeyBbYXR0ck5hbWU6IHN0cmluZ106IGFueTsgfSB7XG4gICAgbGV0IGtleXMgPSB0aGlzLm1kd3JhcHBlci5iZWxvbmdzVG9LZXlzKHsgZGVmaW5lZDogdHJ1ZSB9KTtcbiAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHRoaXMubWR3cmFwcGVyLmlzV3JpdGFibGUoa2V5KSk7XG5cbiAgICAvLyBJZ25vcmUgdW50b3VjaGVkIHJlbGF0aW9uc2hpcHNcbiAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHRoaXMubW9kZWxba2V5XS5oYXNCZWVuVG91Y2hlZCk7XG4gICAgY29uc3QgYmVsb25nc3RvcyA9IHt9O1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qgc2lkZXBvc3RhYmxlID0gdGhpcy5tZHdyYXBwZXIuaXNTaWRlcG9zdGFibGUoa2V5KTtcbiAgICAgIGNvbnN0IGJlS2V5ID0gdGhpcy5tZHdyYXBwZXIuYmFja2VuZFByb3BOYW1lKGtleSk7XG4gICAgICBiZWxvbmdzdG9zW2JlS2V5XSA9IHNpZGVwb3N0YWJsZSA/IHRoaXMubW9kZWxba2V5XS5zZXJpYWxpemUoKSA6IHRoaXMubW9kZWxba2V5XS5zaWRlbG9hZCgpO1xuICAgICAgaWYgKCFiZWxvbmdzdG9zW2JlS2V5XSkgeyBkZWxldGUgYmVsb25nc3Rvc1tiZUtleV07IH1cbiAgICB9KTtcbiAgICByZXR1cm4gYmVsb25nc3RvcztcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplSGFzTWFueSgpOiB7IFthdHRyTmFtZTogc3RyaW5nXTogYW55OyB9IHtcbiAgICBsZXQga2V5cyA9IHRoaXMubWR3cmFwcGVyLmhhc01hbnlLZXlzKHsgZGVmaW5lZDogdHJ1ZSB9KTtcbiAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+IHRoaXMubWR3cmFwcGVyLmlzV3JpdGFibGUoa2V5KSk7XG5cbiAgICBjb25zdCBoYXNNYW55cyA9IHt9O1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qgc2lkZXBvc3RhYmxlID0gdGhpcy5tZHdyYXBwZXIuaXNTaWRlcG9zdGFibGUoa2V5KTtcbiAgICAgIGNvbnN0IGJlS2V5ID0gdGhpcy5tZHdyYXBwZXIuYmFja2VuZFByb3BOYW1lKGtleSk7XG4gICAgICBoYXNNYW55c1tiZUtleV0gPSBzaWRlcG9zdGFibGUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtrZXldLmZpbHRlcihlbHQgPT4gZWx0Lmhhc0JlZW5Ub3VjaGVkKS5tYXAoZWx0ID0+IGVsdC5zZXJpYWxpemUoKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtrZXldLmZpbHRlcihlbHQgPT4gZWx0Lmhhc0JlZW5Ub3VjaGVkKS5tYXAoZWx0ID0+IGVsdC5zaWRlbG9hZCgpKTtcbiAgICAgIGlmIChoYXNNYW55c1tiZUtleV0ubGVuZ3RoID09PSAwKSB7IGRlbGV0ZSBoYXNNYW55c1tiZUtleV07IH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGFzTWFueXM7XG4gIH1cbn1cbiJdfQ==