typeorm-versions
Version:
Entity versioning for TypeORM
77 lines • 3.1 kB
JavaScript
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
;