UNPKG

@rytass/cms-base-nestjs-module

Version:

Rytass Content Management System NestJS Base Module

165 lines (162 loc) 7.88 kB
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 };