UNPKG

@rytass/cms-base-nestjs-module

Version:

Rytass Content Management System NestJS Base Module

118 lines (115 loc) 5.48 kB
import { Injectable, Inject } from '@nestjs/common'; import { SIGNATURE_LEVELS, RESOLVED_SIGNATURE_LEVEL_REPO } from '../typings/cms-base-providers.js'; import { BaseSignatureLevelEntity } from '../models/base-signature-level.entity.js'; import { Repository, DataSource } from 'typeorm'; import { InjectDataSource } from '@nestjs/typeorm'; import { ArticleSignatureRepo } from '../models/article-signature.entity.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 SignatureService { signatureLevels; signatureLevelRepo; dataSource; articleSignatureRepo; constructor(signatureLevels, signatureLevelRepo, dataSource, articleSignatureRepo){ this.signatureLevels = signatureLevels; this.signatureLevelRepo = signatureLevelRepo; this.dataSource = dataSource; this.articleSignatureRepo = articleSignatureRepo; } get signatureEnabled() { return this.signatureLevels.length > 0; } signatureLevelsCache = []; get finalSignatureLevel() { return this.signatureLevelsCache[this.signatureLevelsCache.length - 1] ?? null; } async onApplicationBootstrap() { if (this.signatureEnabled) { const signatureLevels = await this.signatureLevelRepo.find(); const existedMap = new Map(signatureLevels.map((level)=>[ level.name, level ])); const usedSet = new Set(); const targetLevelNames = new Set(this.signatureLevels.map((level)=>level instanceof BaseSignatureLevelEntity ? level.name : level)); const runner = this.dataSource.createQueryRunner(); await runner.connect(); await runner.startTransaction(); try { await signatureLevels.filter((level)=>!targetLevelNames.has(level.name)).map((level)=>async ()=>{ await runner.manager.delete(this.articleSignatureRepo.metadata.tableName, { signatureLevelId: level.id }); await runner.manager.softDelete(this.signatureLevelRepo.metadata.tableName, { id: level.id }); }).reduce((prev, next)=>prev.then(next), Promise.resolve()); this.signatureLevelsCache = await this.signatureLevels.map((level, index)=>async (levels)=>{ if (level instanceof BaseSignatureLevelEntity) { level.sequence = index; level.required = true; await runner.manager.save(level); usedSet.add(level); return [ ...levels, level ]; } if (existedMap.has(level)) { const existedLevel = existedMap.get(level); existedLevel.sequence = index; existedLevel.required = true; await runner.manager.save(existedLevel); usedSet.add(existedLevel); return [ ...levels, existedLevel ]; } const newLevel = this.signatureLevelRepo.create({ name: level, required: true, sequence: index }); await runner.manager.save(newLevel); usedSet.add(newLevel); return levels; }).reduce((prev, next)=>prev.then(next), Promise.resolve([])); await runner.commitTransaction(); } catch (ex) { await runner.rollbackTransaction(); throw ex; } finally{ await runner.release(); } } } } SignatureService = _ts_decorate([ Injectable(), _ts_param(0, Inject(SIGNATURE_LEVELS)), _ts_param(1, Inject(RESOLVED_SIGNATURE_LEVEL_REPO)), _ts_param(2, InjectDataSource()), _ts_param(3, Inject(ArticleSignatureRepo)), _ts_metadata("design:type", Function), _ts_metadata("design:paramtypes", [ Array, typeof Repository === "undefined" ? Object : Repository, typeof DataSource === "undefined" ? Object : DataSource, typeof Repository === "undefined" ? Object : Repository ]) ], SignatureService); export { SignatureService };