UNPKG

typeorm-versions

Version:
77 lines 3.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VersionRepository = void 0; const Version_1 = require("../entity/Version"); const class_transformer_1 = require("class-transformer"); function buildIdFromEntity(manager, entity) { const ids = []; for (const pColumn of manager.connection.getMetadata(entity.constructor.name).primaryColumns) { ids.push(pColumn.getEntityValue(entity)); } return ids.join('/'); } function buildId(originalId) { if (originalId === undefined) { return undefined; } if (originalId instanceof Array) { const ids = []; for (const idItem of originalId) { ids.push(buildId(idItem)); } return ids.join('/'); } else { return originalId; } } const VersionRepository = (dataSource) => { return dataSource .getRepository(Version_1.Version) .extend({ allForEntity(entity, id, take, skip, order = 'DESC') { return this.find({ where: { itemType: entity.constructor.name, itemId: buildId(id) || buildIdFromEntity(this.manager, entity) }, order: { timestamp: order }, take: take, skip: skip, }); }, async previousForEntity(entity, id) { const versions = await this.allForEntity(entity, id, 1, 1); return Promise.resolve(versions.shift()); }, async latestForEntity(entity, id) { const versions = await this.allForEntity(entity, id, 1); return Promise.resolve(versions.shift()); }, async previousObjectForEntity(entity, id) { return (await this.previousForEntity(entity, id))?.getObject(); }, async latestObjectForEntity(entity, id) { return (await this.latestForEntity(entity, id))?.getObject(); }, async saveVersion(entity, event, owner) { Version_1.Version.useDataSource(this.manager.connection); const id = buildIdFromEntity(this.manager, entity); if (id?.length < 1) { return; } const v = new Version_1.Version(); v.event = event; v.owner = owner || 'system'; v.object = (0, class_transformer_1.instanceToPlain)(entity); v.itemId = id; v.itemType = entity.constructor.name; // timestamp shuould be defined via @CreateDateColumn, this shouldn't be necessary // because the value should awlays be set via the DB's default current date-time function. // However, the implementation accross DBs and drivers seems inconsistent, e.g. // SQLite cuts off milliseconds, PostgreSQL is to precise for JS's Date object, // MySQL differs in procision for a @CreateDateColumn and a simple Date @Column v.timestamp = new Date(); return this.save(v); } }); }; exports.VersionRepository = VersionRepository; //# sourceMappingURL=VersionRepository.js.map