@rytass/cms-base-nestjs-module
Version:
Rytass Content Management System NestJS Base Module
68 lines (65 loc) • 2.89 kB
JavaScript
import { Injectable, Inject } from '@nestjs/common';
import DataLoader from 'dataloader';
import { LRUCache } from 'lru-cache';
import { Brackets, Repository } from 'typeorm';
import { RESOLVED_ARTICLE_VERSION_REPO } from '../typings/cms-base-providers.js';
function _ts_decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function _ts_metadata(k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}
function _ts_param(paramIndex, decorator) {
return function(target, key) {
decorator(target, key, paramIndex);
};
}
class ArticleSignatureDataLoader {
articleVersionRepo;
constructor(articleVersionRepo){
this.articleVersionRepo = articleVersionRepo;
}
versionSignaturesLoader = new DataLoader(async (args)=>{
const qb = this.articleVersionRepo.createQueryBuilder('articleVersions');
qb.leftJoinAndSelect('articleVersions.signatures', 'signatures');
qb.leftJoinAndSelect('signatures.signatureLevel', 'signatureLevel');
args.forEach(({ id, version }, index)=>{
qb.orWhere(new Brackets((subQb)=>{
subQb.andWhere(`articleVersions.articleId = :id_${index}`, {
[`id_${index}`]: id
});
subQb.andWhere(`articleVersions.version = :version_${index}`, {
[`version_${index}`]: version
});
return subQb;
}));
});
qb.addOrderBy('signatures.signedAt', 'DESC');
const versions = await qb.getMany();
const versionMap = new Map(versions.map((version)=>[
`${version.articleId}|${version.version}`,
version
]));
return args.map(({ id, version })=>versionMap.get(`${id}|${version}`)?.signatures ?? []);
}, {
cache: true,
cacheMap: new LRUCache({
max: 100,
ttl: 1000 * 15,
ttlAutopurge: true
}),
cacheKeyFn: (args)=>`${args.id}|${args.version}`
});
}
ArticleSignatureDataLoader = _ts_decorate([
Injectable(),
_ts_param(0, Inject(RESOLVED_ARTICLE_VERSION_REPO)),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof Repository === "undefined" ? Object : Repository
])
], ArticleSignatureDataLoader);
export { ArticleSignatureDataLoader };