@rytass/cms-base-nestjs-module
Version:
Rytass Content Management System NestJS Base Module
165 lines (162 loc) • 7.88 kB
JavaScript
import { Injectable, Inject } from '@nestjs/common';
import { RESOLVED_ARTICLE_REPO, MULTIPLE_LANGUAGE_MODE } from '../typings/cms-base-providers.js';
import { Repository } from 'typeorm';
import DataLoader from 'dataloader';
import { removeArticleInvalidFields, removeMultipleLanguageArticleVersionInvalidFields, removeArticleVersionInvalidFields, removeArticleVersionContentInvalidFields } from '../utils/remove-invalid-fields.js';
import { DEFAULT_LANGUAGE } from '../constants/default-language.js';
import { LRUCache } from 'lru-cache';
import { ArticleStage } from '../typings/article-stage.enum.js';
import { SignatureService } from '../services/signature.service.js';
import { ArticleSignatureResult } from '../typings/article-signature-result.enum.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 ArticleVersionDataLoader {
articleRepo;
multipleLanguageMode;
signatureService;
constructor(articleRepo, multipleLanguageMode, signatureService){
this.articleRepo = articleRepo;
this.multipleLanguageMode = multipleLanguageMode;
this.signatureService = signatureService;
}
stageVersionsLoader = new DataLoader(async (ids)=>{
const qb = this.articleRepo.createQueryBuilder('articles');
qb.innerJoinAndSelect('articles.versions', 'versions');
qb.leftJoinAndSelect('versions.signatures', 'signatures');
qb.leftJoinAndSelect('versions.multiLanguageContents', 'multiLanguageContents');
qb.andWhere('versions.articleId IN (:...ids)', {
ids: ids
});
const articles = await qb.getMany();
const articleMap = new Map(articles.map((article)=>[
article.id,
article.versions.reduce((vars, version)=>{
const articleVersion = this.multipleLanguageMode ? {
...removeMultipleLanguageArticleVersionInvalidFields(version),
...removeArticleInvalidFields(article),
id: article.id,
createdAt: article.createdAt,
updatedAt: article.versions[0].createdAt,
deletedAt: article.deletedAt,
updatedBy: article.versions[0].createdBy
} : {
...removeArticleVersionContentInvalidFields(version.multiLanguageContents.find((content)=>content.language === DEFAULT_LANGUAGE)),
...removeArticleVersionInvalidFields(version),
...removeArticleInvalidFields(article),
id: article.id,
createdAt: article.createdAt,
updatedAt: version.createdAt,
deletedAt: article.deletedAt,
updatedBy: version.createdBy
};
if (version.releasedAt) {
if (version.releasedAt.getTime() > Date.now()) {
return {
...vars,
[ArticleStage.SCHEDULED]: articleVersion
};
}
return {
...vars,
[ArticleStage.RELEASED]: articleVersion
};
}
if (version.signatures.some((sig)=>sig.result === ArticleSignatureResult.APPROVED && sig.deletedAt === null && sig.signatureLevelId === this.signatureService.finalSignatureLevel?.id)) {
return {
...vars,
[ArticleStage.VERIFIED]: articleVersion
};
}
if (version.submittedAt) {
return {
...vars,
[ArticleStage.REVIEWING]: articleVersion
};
}
return {
...vars,
[ArticleStage.DRAFT]: articleVersion
};
}, {
[ArticleStage.DRAFT]: null,
[ArticleStage.REVIEWING]: null,
[ArticleStage.VERIFIED]: null,
[ArticleStage.SCHEDULED]: null,
[ArticleStage.RELEASED]: null
})
]));
return ids.map((id)=>articleMap.get(id));
}, {
cache: true,
cacheMap: new LRUCache({
ttl: 1000 * 10,
max: 1000,
ttlAutopurge: true
})
});
versionsLoader = new DataLoader(async (ids)=>{
const qb = this.articleRepo.createQueryBuilder('articles');
qb.withDeleted();
qb.innerJoinAndSelect('articles.versions', 'versions');
qb.leftJoinAndSelect('versions.signatures', 'signatures');
qb.leftJoinAndSelect('versions.multiLanguageContents', 'multiLanguageContents');
qb.andWhere('versions.articleId IN (:...ids)', {
ids: ids
});
qb.addOrderBy('versions.version', 'ASC');
const articles = await qb.getMany();
const articleMap = new Map(articles.map((article)=>[
article.id,
article.versions.map((version)=>this.multipleLanguageMode ? {
...removeMultipleLanguageArticleVersionInvalidFields(version),
...removeArticleInvalidFields(article),
id: article.id,
createdAt: article.createdAt,
updatedAt: article.versions[0].createdAt,
deletedAt: article.deletedAt,
updatedBy: article.versions[0].createdBy
} : {
...removeArticleVersionContentInvalidFields(version.multiLanguageContents.find((content)=>content.language === DEFAULT_LANGUAGE)),
...removeArticleVersionInvalidFields(version),
...removeArticleInvalidFields(article),
id: article.id,
createdAt: article.createdAt,
updatedAt: version.createdAt,
deletedAt: article.deletedAt,
updatedBy: version.createdBy
})
]));
return ids.map((id)=>articleMap.get(id) || []);
}, {
cache: true,
cacheMap: new LRUCache({
ttl: 1000 * 10,
max: 1000,
ttlAutopurge: true
})
});
}
ArticleVersionDataLoader = _ts_decorate([
Injectable(),
_ts_param(0, Inject(RESOLVED_ARTICLE_REPO)),
_ts_param(1, Inject(MULTIPLE_LANGUAGE_MODE)),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof Repository === "undefined" ? Object : Repository,
Boolean,
typeof SignatureService === "undefined" ? Object : SignatureService
])
], ArticleVersionDataLoader);
export { ArticleVersionDataLoader };