ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
228 lines • 18.9 kB
JavaScript
/**
* @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==