{ "version": 3, "sources": ["libs/proman/src/lib/services/model.service.ts"], "sourcesContent": ["import { Injectable } from '@angular/core';\nimport { ACL } from '@proman/services/acl.service';\nimport { deepCopy, isArray, isDefinedNotNull, isObject, prepareRequest } from '@proman/utils';\n\nimport { Entity, EntityInterface, EntityNameType } from '@proman/services/entity.service';\nimport { PromanFile } from '@proman/interfaces/entity-interfaces';\nimport * as lodash from 'lodash';\n\ninterface RequestInterface {\n id: number;\n version?: number;\n}\n\nexport interface ModelItemInterface {\n create: (data?: any) => Promise;\n update: (property: keyof T, value: any, isId?: boolean) => Promise;\n updateAssociation: (property: string, value: any) => Promise;\n updateItem: (item: keyof T, property: string, value: any) => void;\n addAssociation: (property: string, value: any) => Promise;\n removeAssociation: (property: string, value: any) => Promise;\n addFile: (data: PromanFile[], key?: string) => Promise;\n removeFile: (data: { file: PromanFile; index: number }, key?: string) => Promise;\n addHandler: (property: string, callback: (data?: any) => void) => void;\n permissions: { [key: string]: boolean };\n}\n\nclass ModelHelper {\n handlers: any = {};\n originalEntity: any;\n\n constructor(\n private entity: any,\n private Entity: any,\n public permissions: any,\n private versioned: any,\n ) {\n if (this.entity) this.originalEntity = deepCopy(this.entity);\n }\n\n getRequest() {\n let request: RequestInterface = { id: this.entity.id };\n\n if (this.versioned) {\n request.version = this.entity.version;\n\n }\n\n return request;\n }\n\n create() {\n let data = prepareRequest(this.entity);\n\n return this.Entity\n .create(data);\n\n }\n\n updateItem(item: any, property: string, value: any) {\n let data = { id: item.id, [property]: value };\n\n let oldValue = isObject(item[property]) && Object.keys(item[property]).length ? Object.assign({}, item[property]) : item[property];\n\n return this.Entity\n .update(data)\n .then((response: any) => {\n item[property] = value;\n this.success(property, value)(response);\n })\n .catch(() => item[property] = oldValue);\n }\n\n update(property: any, value: any, isId: boolean = false) {\n let oldValue = isObject(this.entity[property]) && Object.keys(this.entity[property]).length ? Object.assign({}, this.entity[property]) : this.entity[property];\n this.entity[property] = value;\n\n if (this.entity.id) {\n let data = this.getRequest();\n\n data[property] = isId ? (value && value.id || null) : value;\n\n return this.Entity\n .update(data)\n .then(this.success(property, value))\n .catch(() => this.entity[property] = oldValue);\n\n } else {\n this.success(property, value)(null);\n\n }\n\n }\n\n updateAssociation(property: any, value: any) {\n return this.update(property, value, true);\n }\n\n success(property: any, value: any) {\n\n return (response: any) => {\n\n if (this.versioned) {\n this.entity.version = response.version;\n }\n\n this.executeHandlers(property, value);\n // this.Pace.trigger();\n };\n }\n\n executeHandlers(property: string, value: any) {\n\n if (this.handlers[property]) {\n\n for (let handler of this.handlers[property]) {\n handler(value);\n }\n\n }\n\n if (this.handlers['*']) {\n for (let handler of this.handlers['*']) {\n handler(value);\n }\n }\n\n }\n\n addHandler(property: string, callback: (data?: any) => void) {\n\n if (!this.handlers[property]) this.handlers[property] = [];\n\n this.handlers[property].push(callback);\n }\n\n addAssociation(property: any, value: any) {\n const data = this.getRequest();\n\n data[property] = value?.id;\n\n return this.Entity.addAssociation(data);\n }\n\n removeAssociation(property: any, value: any) {\n const data = this.getRequest();\n\n data[property] = value.id;\n\n return this.Entity.removeAssociation(data);\n }\n\n addFile(data: PromanFile[], key: string = 'files') {\n const uploadedFiles: PromanFile[] = lodash.differenceBy(data, this.originalEntity[key], 'id');\n const files: PromanFile[] = [];\n\n const uploadedIds = uploadedFiles.filter((i) => isDefinedNotNull(i)).map((i) => i.id);\n // data.forEach((file: any) => {\n // if (isDefinedNotNull(file)) {\n // if (!file.error) {\n // files.push(file);\n // uploadedFiles.push(file.id);\n // }\n // }\n // });\n\n if (uploadedFiles.length) {\n\n if (this.entity.id) {\n return this.Entity\n .addAssociation({ id: this.entity.id, [key]: uploadedIds })\n .then(() => {\n if (this.originalEntity && this.originalEntity[key]) {\n if (isArray(this.originalEntity[key])) {\n this.originalEntity[key].push(uploadedFiles[0]);\n } else {\n this.originalEntity[key] = uploadedFiles[0];\n }\n }\n })\n\n } else {\n this.entity[key] = this.entity[key] ? this.entity[key].concat(files) : files;\n }\n }\n }\n\n removeFile(data: { file: PromanFile; index: number }, key: string = 'files') {\n\n if (this.entity.id) {\n return this.Entity\n .removeAssociation({ id: this.entity.id, [key]: data.file.id })\n .then(() => isArray(this.entity[key]) ? this.entity[key].splice(data.index, 1) : this.entity[key] = null);\n } else {\n this.entity.files.splice(data.index, 1);\n }\n }\n}\n\n/**\n * `Model` service\n *\n */\n@Injectable()\nexport class ModelService {\n\n constructor(private acl: ACL, private Entity: Entity) {\n\n }\n\n getPermissions(Entity: any) {\n let endpoint = Entity.config.endpoint;\n let permissions: { [key: string]: boolean } = {};\n let parsedKey;\n\n for (let key in this.acl.permissions) {\n\n if (key.startsWith(endpoint)) {\n parsedKey = key.replace(endpoint + '.', '');\n permissions[parsedKey] = this.acl.permissions[key];\n\n }\n\n }\n\n return permissions;\n }\n\n get(entity: any, _Entity: EntityNameType|EntityInterface, versioned?: boolean): any {\n let Entity: any = typeof _Entity === 'string' ?\n this.Entity.get({ name: _Entity }) :\n _Entity;\n let permissions = this.getPermissions(Entity);\n\n return new ModelHelper(entity, Entity, permissions, versioned);\n }\n\n}\n"], "mappings": "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", "names": ["ModelHelper", "constructor", "entity", "Entity", "permissions", "versioned", "handlers", "originalEntity", "deepCopy", "getRequest", "request", "id", "version", "create", "data", "prepareRequest", "updateItem", "item", "property", "value", "oldValue", "isObject", "Object", "keys", "length", "assign", "update", "then", "response", "success", "catch", "isId", "updateAssociation", "executeHandlers", "handler", "addHandler", "callback", "push", "addAssociation", "removeAssociation", "addFile", "key", "uploadedFiles", "differenceBy", "files", "uploadedIds", "filter", "i", "isDefinedNotNull", "map", "isArray", "concat", "removeFile", "file", "splice", "index", "ModelService", "acl", "getPermissions", "endpoint", "config", "parsedKey", "startsWith", "replace", "get", "_Entity", "name", "\u0275\u0275inject", "ACL", "factory", "\u0275fac"] }