UNPKG

@rytass/cms-base-nestjs-module

Version:

Rytass Content Management System NestJS Base Module

1,242 lines (1,215 loc) 138 kB
'use strict'; var common = require('@nestjs/common'); var typeorm$1 = require('@nestjs/typeorm'); var typeorm = require('typeorm'); var core = require('@quadrats/core'); var DataLoader = require('dataloader'); var lruCache = require('lru-cache'); const DEFAULT_LANGUAGE = 'DEFAULT'; const FULL_TEXT_SEARCH_TOKEN_VERSION = '0.0.1'; const EMPTY_QUADRATS_ELEMENTS = [ { type: core.PARAGRAPH_TYPE, children: [ { text: '' } ] } ]; function _ts_decorate$h(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$f(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseArticleVersionContentRepo = Symbol('BaseArticleVersionContentRepo'); class BaseArticleVersionContentEntity { articleId; version; language; title; description; content; searchTokens; searchTokenVersion; articleVersion; } _ts_decorate$h([ typeorm.PrimaryColumn('uuid'), _ts_metadata$f("design:type", String) ], BaseArticleVersionContentEntity.prototype, "articleId", void 0); _ts_decorate$h([ typeorm.PrimaryColumn('int', { default: 0 }), _ts_metadata$f("design:type", Number) ], BaseArticleVersionContentEntity.prototype, "version", void 0); _ts_decorate$h([ typeorm.PrimaryColumn('varchar', { default: DEFAULT_LANGUAGE }), _ts_metadata$f("design:type", String) ], BaseArticleVersionContentEntity.prototype, "language", void 0); _ts_decorate$h([ typeorm.Column('varchar'), typeorm.Index(), _ts_metadata$f("design:type", String) ], BaseArticleVersionContentEntity.prototype, "title", void 0); _ts_decorate$h([ typeorm.Column('varchar', { nullable: true, comment: 'Use for SEO' }), typeorm.Index(), _ts_metadata$f("design:type", Object) ], BaseArticleVersionContentEntity.prototype, "description", void 0); _ts_decorate$h([ typeorm.Column('json', { default: EMPTY_QUADRATS_ELEMENTS }), _ts_metadata$f("design:type", Array) ], BaseArticleVersionContentEntity.prototype, "content", void 0); _ts_decorate$h([ typeorm.Column('tsvector', { nullable: true, select: false }), _ts_metadata$f("design:type", Object) ], BaseArticleVersionContentEntity.prototype, "searchTokens", void 0); _ts_decorate$h([ typeorm.Column('varchar', { default: FULL_TEXT_SEARCH_TOKEN_VERSION, select: false }), _ts_metadata$f("design:type", String) ], BaseArticleVersionContentEntity.prototype, "searchTokenVersion", void 0); _ts_decorate$h([ typeorm.ManyToOne(()=>BaseArticleVersionEntity, (articleVersion)=>articleVersion.multiLanguageContents, { onUpdate: 'CASCADE', onDelete: 'CASCADE', orphanedRowAction: 'delete' }), typeorm.JoinColumn([ { name: 'articleId', referencedColumnName: 'articleId' }, { name: 'version', referencedColumnName: 'version' } ]), _ts_metadata$f("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleVersionContentEntity.prototype, "articleVersion", void 0); BaseArticleVersionContentEntity = _ts_decorate$h([ typeorm.Entity('article_version_contents'), typeorm.Index([ 'articleId', 'version' ]), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseArticleVersionContentEntity); var ArticleSignatureResult = /*#__PURE__*/ function(ArticleSignatureResult) { ArticleSignatureResult["APPROVED"] = "APPROVED"; ArticleSignatureResult["REJECTED"] = "REJECTED"; return ArticleSignatureResult; }({}); function _ts_decorate$g(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$e(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseSignatureLevelRepo = Symbol('BaseSignatureLevelRepo'); class BaseSignatureLevelEntity { id; name; sequence; required; createdAt; deletedAt; signatures; } _ts_decorate$g([ typeorm.PrimaryGeneratedColumn('uuid'), _ts_metadata$e("design:type", String) ], BaseSignatureLevelEntity.prototype, "id", void 0); _ts_decorate$g([ typeorm.Column('varchar'), _ts_metadata$e("design:type", String) ], BaseSignatureLevelEntity.prototype, "name", void 0); _ts_decorate$g([ typeorm.Column('int', { default: 0 }), typeorm.Index({ unique: true, where: '"deletedAt" IS NULL' }), _ts_metadata$e("design:type", Number) ], BaseSignatureLevelEntity.prototype, "sequence", void 0); _ts_decorate$g([ typeorm.Column('boolean', { default: true }), _ts_metadata$e("design:type", Boolean) ], BaseSignatureLevelEntity.prototype, "required", void 0); _ts_decorate$g([ typeorm.CreateDateColumn(), _ts_metadata$e("design:type", typeof Date === "undefined" ? Object : Date) ], BaseSignatureLevelEntity.prototype, "createdAt", void 0); _ts_decorate$g([ typeorm.DeleteDateColumn(), _ts_metadata$e("design:type", Object) ], BaseSignatureLevelEntity.prototype, "deletedAt", void 0); _ts_decorate$g([ typeorm.OneToMany(()=>ArticleSignatureEntity, (signature)=>signature.signatureLevel), _ts_metadata$e("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseSignatureLevelEntity.prototype, "signatures", void 0); BaseSignatureLevelEntity = _ts_decorate$g([ typeorm.Entity('signature_levels'), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseSignatureLevelEntity); function _ts_decorate$f(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$d(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const ArticleSignatureRepo = Symbol('ArticleSignatureRepo'); class ArticleSignatureEntity { id; articleId; version; signatureLevelId; result; rejectReason; signerId; signedAt; deletedAt; articleVersion; signatureLevel; } _ts_decorate$f([ typeorm.PrimaryGeneratedColumn('uuid'), _ts_metadata$d("design:type", String) ], ArticleSignatureEntity.prototype, "id", void 0); _ts_decorate$f([ typeorm.Column('uuid'), _ts_metadata$d("design:type", String) ], ArticleSignatureEntity.prototype, "articleId", void 0); _ts_decorate$f([ typeorm.Column('int'), _ts_metadata$d("design:type", Number) ], ArticleSignatureEntity.prototype, "version", void 0); _ts_decorate$f([ typeorm.Column('uuid', { nullable: true }), typeorm.Index(), _ts_metadata$d("design:type", Object) ], ArticleSignatureEntity.prototype, "signatureLevelId", void 0); _ts_decorate$f([ typeorm.Column('enum', { enum: ArticleSignatureResult, default: ArticleSignatureResult.APPROVED }), _ts_metadata$d("design:type", typeof ArticleSignatureResult === "undefined" ? Object : ArticleSignatureResult) ], ArticleSignatureEntity.prototype, "result", void 0); _ts_decorate$f([ typeorm.Column('varchar', { nullable: true }), _ts_metadata$d("design:type", Object) ], ArticleSignatureEntity.prototype, "rejectReason", void 0); _ts_decorate$f([ typeorm.Column('uuid', { nullable: true }), _ts_metadata$d("design:type", Object) ], ArticleSignatureEntity.prototype, "signerId", void 0); _ts_decorate$f([ typeorm.CreateDateColumn(), _ts_metadata$d("design:type", typeof Date === "undefined" ? Object : Date) ], ArticleSignatureEntity.prototype, "signedAt", void 0); _ts_decorate$f([ typeorm.DeleteDateColumn(), _ts_metadata$d("design:type", Object) ], ArticleSignatureEntity.prototype, "deletedAt", void 0); _ts_decorate$f([ typeorm.ManyToOne(()=>BaseArticleVersionEntity, (version)=>version.signatures), typeorm.JoinColumn([ { name: 'articleId', referencedColumnName: 'articleId' }, { name: 'version', referencedColumnName: 'version' } ]), _ts_metadata$d("design:type", typeof Relation === "undefined" ? Object : Relation) ], ArticleSignatureEntity.prototype, "articleVersion", void 0); _ts_decorate$f([ typeorm.ManyToOne(()=>BaseSignatureLevelEntity, (level)=>level.signatures, { nullable: true }), typeorm.JoinColumn({ name: 'signatureLevelId', referencedColumnName: 'id' }), _ts_metadata$d("design:type", Object) ], ArticleSignatureEntity.prototype, "signatureLevel", void 0); ArticleSignatureEntity = _ts_decorate$f([ typeorm.Entity('article_signatures'), typeorm.Index('article_signature_article_id_version', [ 'articleId', 'version', 'signatureLevelId' ], { unique: true, where: '"deletedAt" IS NULL' }), typeorm.Index([ 'articleId', 'version' ]) ], ArticleSignatureEntity); function _ts_decorate$e(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$c(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseArticleVersionRepo = Symbol('BaseArticleVersionRepo'); class BaseArticleVersionEntity { articleId; version; tags; submittedAt; submittedBy; releasedAt; releasedBy; createdAt; createdBy; deletedAt; article; multiLanguageContents; signatures; } _ts_decorate$e([ typeorm.PrimaryColumn('uuid'), typeorm.Index(), _ts_metadata$c("design:type", String) ], BaseArticleVersionEntity.prototype, "articleId", void 0); _ts_decorate$e([ typeorm.PrimaryColumn('int', { default: 0 }), _ts_metadata$c("design:type", Number) ], BaseArticleVersionEntity.prototype, "version", void 0); _ts_decorate$e([ typeorm.Column('jsonb', { default: /* istanbul ignore next: TypeORM default function */ ()=>"'[]'::jsonb" }), _ts_metadata$c("design:type", Array) ], BaseArticleVersionEntity.prototype, "tags", void 0); _ts_decorate$e([ typeorm.Column('timestamptz', { nullable: true }), typeorm.Index(), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "submittedAt", void 0); _ts_decorate$e([ typeorm.Column('uuid', { nullable: true }), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "submittedBy", void 0); _ts_decorate$e([ typeorm.Column('timestamptz', { nullable: true }), typeorm.Index(), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "releasedAt", void 0); _ts_decorate$e([ typeorm.Column('uuid', { nullable: true }), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "releasedBy", void 0); _ts_decorate$e([ typeorm.CreateDateColumn(), _ts_metadata$c("design:type", typeof Date === "undefined" ? Object : Date) ], BaseArticleVersionEntity.prototype, "createdAt", void 0); _ts_decorate$e([ typeorm.Column('uuid', { nullable: true }), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "createdBy", void 0); _ts_decorate$e([ typeorm.DeleteDateColumn(), _ts_metadata$c("design:type", Object) ], BaseArticleVersionEntity.prototype, "deletedAt", void 0); _ts_decorate$e([ typeorm.ManyToOne(()=>BaseArticleEntity, (article)=>article.versions, { onUpdate: 'CASCADE', onDelete: 'CASCADE', orphanedRowAction: 'delete' }), typeorm.JoinColumn({ name: 'articleId', referencedColumnName: 'id' }), _ts_metadata$c("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleVersionEntity.prototype, "article", void 0); _ts_decorate$e([ typeorm.OneToMany(()=>BaseArticleVersionContentEntity, (content)=>content.articleVersion), _ts_metadata$c("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleVersionEntity.prototype, "multiLanguageContents", void 0); _ts_decorate$e([ typeorm.OneToMany(()=>ArticleSignatureEntity, (signature)=>signature.articleVersion), _ts_metadata$c("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleVersionEntity.prototype, "signatures", void 0); BaseArticleVersionEntity = _ts_decorate$e([ typeorm.Entity('article_versions'), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseArticleVersionEntity); function _ts_decorate$d(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$b(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseCategoryMultiLanguageNameRepo = Symbol('BaseCategoryMultiLanguageNameRepo'); class BaseCategoryMultiLanguageNameEntity { categoryId; language; name; createdAt; updatedAt; category; } _ts_decorate$d([ typeorm.PrimaryColumn('uuid'), typeorm.Index(), _ts_metadata$b("design:type", String) ], BaseCategoryMultiLanguageNameEntity.prototype, "categoryId", void 0); _ts_decorate$d([ typeorm.PrimaryColumn('varchar', { default: DEFAULT_LANGUAGE }), _ts_metadata$b("design:type", typeof Language === "undefined" ? Object : Language) ], BaseCategoryMultiLanguageNameEntity.prototype, "language", void 0); _ts_decorate$d([ typeorm.Column('varchar'), _ts_metadata$b("design:type", String) ], BaseCategoryMultiLanguageNameEntity.prototype, "name", void 0); _ts_decorate$d([ typeorm.CreateDateColumn(), _ts_metadata$b("design:type", typeof Date === "undefined" ? Object : Date) ], BaseCategoryMultiLanguageNameEntity.prototype, "createdAt", void 0); _ts_decorate$d([ typeorm.UpdateDateColumn(), _ts_metadata$b("design:type", typeof Date === "undefined" ? Object : Date) ], BaseCategoryMultiLanguageNameEntity.prototype, "updatedAt", void 0); _ts_decorate$d([ typeorm.ManyToOne(()=>BaseCategoryEntity, (category)=>category.multiLanguageNames, { onUpdate: 'CASCADE', onDelete: 'CASCADE', orphanedRowAction: 'delete' }), typeorm.JoinColumn({ name: 'categoryId', referencedColumnName: 'id' }), _ts_metadata$b("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseCategoryMultiLanguageNameEntity.prototype, "category", void 0); BaseCategoryMultiLanguageNameEntity = _ts_decorate$d([ typeorm.Entity('category_multi_language_names'), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseCategoryMultiLanguageNameEntity); function _ts_decorate$c(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$a(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseCategoryRepo = Symbol('BaseCategoryRepo'); class BaseCategoryEntity { id; bindable; createdAt; updatedAt; deletedAt; parents; children; multiLanguageNames; articles; } _ts_decorate$c([ typeorm.PrimaryGeneratedColumn('uuid'), _ts_metadata$a("design:type", String) ], BaseCategoryEntity.prototype, "id", void 0); _ts_decorate$c([ typeorm.Column('boolean', { default: false, comment: 'is article bindable' }), _ts_metadata$a("design:type", Boolean) ], BaseCategoryEntity.prototype, "bindable", void 0); _ts_decorate$c([ typeorm.CreateDateColumn(), _ts_metadata$a("design:type", typeof Date === "undefined" ? Object : Date) ], BaseCategoryEntity.prototype, "createdAt", void 0); _ts_decorate$c([ typeorm.UpdateDateColumn(), _ts_metadata$a("design:type", typeof Date === "undefined" ? Object : Date) ], BaseCategoryEntity.prototype, "updatedAt", void 0); _ts_decorate$c([ typeorm.DeleteDateColumn(), _ts_metadata$a("design:type", Object) ], BaseCategoryEntity.prototype, "deletedAt", void 0); _ts_decorate$c([ typeorm.ManyToMany(()=>BaseCategoryEntity, (category)=>category.children), typeorm.JoinTable({ name: 'category_relations', joinColumn: { name: 'childId', referencedColumnName: 'id' }, inverseJoinColumn: { name: 'parentId', referencedColumnName: 'id' } }), _ts_metadata$a("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseCategoryEntity.prototype, "parents", void 0); _ts_decorate$c([ typeorm.ManyToMany(()=>BaseCategoryEntity, (category)=>category.parents, { onUpdate: 'CASCADE', onDelete: 'CASCADE', orphanedRowAction: 'delete' }), _ts_metadata$a("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseCategoryEntity.prototype, "children", void 0); _ts_decorate$c([ typeorm.OneToMany(()=>BaseCategoryMultiLanguageNameEntity, (multiLanguageName)=>multiLanguageName.category), _ts_metadata$a("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseCategoryEntity.prototype, "multiLanguageNames", void 0); _ts_decorate$c([ typeorm.ManyToMany(()=>BaseArticleEntity, (article)=>article.categories, { onUpdate: 'CASCADE', onDelete: 'CASCADE', orphanedRowAction: 'delete' }), _ts_metadata$a("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseCategoryEntity.prototype, "articles", void 0); BaseCategoryEntity = _ts_decorate$c([ typeorm.Entity('categories'), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseCategoryEntity); function _ts_decorate$b(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$9(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const BaseArticleRepo = Symbol('BaseArticleRepo'); class BaseArticleEntity { id; createdAt; deletedAt; versions; categories; } _ts_decorate$b([ typeorm.PrimaryGeneratedColumn('uuid'), _ts_metadata$9("design:type", String) ], BaseArticleEntity.prototype, "id", void 0); _ts_decorate$b([ typeorm.CreateDateColumn(), _ts_metadata$9("design:type", typeof Date === "undefined" ? Object : Date) ], BaseArticleEntity.prototype, "createdAt", void 0); _ts_decorate$b([ typeorm.DeleteDateColumn(), _ts_metadata$9("design:type", Object) ], BaseArticleEntity.prototype, "deletedAt", void 0); _ts_decorate$b([ typeorm.OneToMany(()=>BaseArticleVersionEntity, (articleVersion)=>articleVersion.article), _ts_metadata$9("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleEntity.prototype, "versions", void 0); _ts_decorate$b([ typeorm.ManyToMany(()=>BaseCategoryEntity, (category)=>category.articles), typeorm.JoinTable({ name: 'article_categories', joinColumn: { name: 'articleId', referencedColumnName: 'id' }, inverseJoinColumn: { name: 'categoryId', referencedColumnName: 'id' } }), _ts_metadata$9("design:type", typeof Relation === "undefined" ? Object : Relation) ], BaseArticleEntity.prototype, "categories", void 0); BaseArticleEntity = _ts_decorate$b([ typeorm.Entity('articles'), typeorm.TableInheritance({ column: { type: 'varchar', name: 'entityName' } }) ], BaseArticleEntity); function _ts_decorate$a(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$8(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const CategoryRelationRepo = Symbol('CategoryRelationRepo'); class CategoryRelationEntity { parentId; childId; } _ts_decorate$a([ typeorm.PrimaryColumn('uuid'), _ts_metadata$8("design:type", String) ], CategoryRelationEntity.prototype, "parentId", void 0); _ts_decorate$a([ typeorm.PrimaryColumn('uuid'), _ts_metadata$8("design:type", String) ], CategoryRelationEntity.prototype, "childId", void 0); CategoryRelationEntity = _ts_decorate$a([ typeorm.Entity('category_relations') ], CategoryRelationEntity); function _ts_decorate$9(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : 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$7(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } const ArticleCategoryRepo = Symbol('ArticleCategoryRepo'); class ArticleCategoryEntity { articleId; categoryId; } _ts_decorate$9([ typeorm.PrimaryColumn('uuid'), _ts_metadata$7("design:type", String) ], ArticleCategoryEntity.prototype, "articleId", void 0); _ts_decorate$9([ typeorm.PrimaryColumn('uuid'), _ts_metadata$7("design:type", String) ], ArticleCategoryEntity.prototype, "categoryId", void 0); ArticleCategoryEntity = _ts_decorate$9([ typeorm.Entity('article_categories') ], ArticleCategoryEntity); function _ts_decorate$8(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; } const models = [ [ BaseArticleRepo, BaseArticleEntity ], [ BaseArticleVersionRepo, BaseArticleVersionEntity ], [ BaseArticleVersionContentRepo, BaseArticleVersionContentEntity ], [ BaseCategoryRepo, BaseCategoryEntity ], [ BaseCategoryMultiLanguageNameRepo, BaseCategoryMultiLanguageNameEntity ], [ BaseSignatureLevelRepo, BaseSignatureLevelEntity ], [ CategoryRelationRepo, CategoryRelationEntity ], [ ArticleCategoryRepo, ArticleCategoryEntity ], [ ArticleSignatureRepo, ArticleSignatureEntity ] ]; class CMSBaseModelsModule { } CMSBaseModelsModule = _ts_decorate$8([ common.Module({ imports: [ typeorm$1.TypeOrmModule.forFeature(models.map((model)=>model[1])) ], providers: models.map(([symbol, entity])=>({ provide: symbol, useFactory: (dataSource)=>dataSource.getRepository(entity), inject: [ typeorm.DataSource ] })), exports: models.map((model)=>model[0]) }) ], CMSBaseModelsModule); const CMS_BASE_MODULE_OPTIONS = Symbol('CMS_BASE_MODULE_OPTIONS'); const MULTIPLE_LANGUAGE_MODE = Symbol('MULTIPLE_LANGUAGE_MODE'); const MULTIPLE_CATEGORY_PARENT_MODE = Symbol('MULTIPLE_CATEGORY_PARENT_MODE'); const CIRCULAR_CATEGORY_MODE = Symbol('CIRCULAR_CATEGORY_MODE'); const FULL_TEXT_SEARCH_MODE = Symbol('FULL_TEXT_SEARCH_MODE'); const SIGNATURE_LEVELS = Symbol('SIGNATURE_LEVELS'); const DRAFT_MODE = Symbol('DRAFT_MODE'); const AUTO_RELEASE_AFTER_APPROVED = Symbol('AUTO_RELEASE_AFTER_APPROVED'); // Options Entity Providers const PROVIDE_ARTICLE_ENTITY = Symbol('PROVIDE_ARTICLE_ENTITY'); const PROVIDE_ARTICLE_VERSION_ENTITY = Symbol('PROVIDE_ARTICLE_VERSION_ENTITY'); const PROVIDE_ARTICLE_VERSION_CONTENT_ENTITY = Symbol('PROVIDE_ARTICLE_VERSION_CONTENT_ENTITY'); const PROVIDE_CATEGORY_ENTITY = Symbol('PROVIDE_CATEGORY_ENTITY'); const PROVIDE_CATEGORY_MULTI_LANGUAGE_NAME_ENTITY = Symbol('PROVIDE_CATEGORY_MULTI_LANGUAGE_NAME_ENTITY'); const PROVIDE_SIGNATURE_LEVEL_ENTITY = Symbol('PROVIDE_SIGNATURE_LEVEL_ENTITY'); // Resolved Entity Repository Providers const RESOLVED_ARTICLE_REPO = Symbol('RESOLVED_ARTICLE_REPO'); const RESOLVED_ARTICLE_VERSION_REPO = Symbol('RESOLVED_ARTICLE_VERSION_REPO'); const RESOLVED_ARTICLE_VERSION_CONTENT_REPO = Symbol('RESOLVED_ARTICLE_VERSION_CONTENT_REPO'); const RESOLVED_CATEGORY_REPO = Symbol('RESOLVED_CATEGORY_REPO'); const RESOLVED_CATEGORY_MULTI_LANGUAGE_NAME_REPO = Symbol('RESOLVED_CATEGORY_MULTI_LANGUAGE_NAME_REPO'); const RESOLVED_SIGNATURE_LEVEL_REPO = Symbol('RESOLVED_SIGNATURE_LEVEL_REPO'); // Internal Use Injection Token const CATEGORY_DATA_LOADER = Symbol('CATEGORY_DATA_LOADER'); const ARTICLE_BASE_SERVICE = Symbol('ARTICLE_BASE_SERVICE'); const ARTICLE_SIGNATURE_DATALOADER = Symbol('ARTICLE_SIGNATURE_DATALOADER'); var ArticleSorter = /*#__PURE__*/ function(ArticleSorter) { ArticleSorter["CREATED_AT_DESC"] = "CREATED_AT_DESC"; ArticleSorter["CREATED_AT_ASC"] = "CREATED_AT_ASC"; ArticleSorter["UPDATED_AT_DESC"] = "UPDATED_AT_DESC"; ArticleSorter["UPDATED_AT_ASC"] = "UPDATED_AT_ASC"; ArticleSorter["SUBMITTED_AT_DESC"] = "SUBMITTED_AT_DESC"; ArticleSorter["SUBMITTED_AT_ASC"] = "SUBMITTED_AT_ASC"; ArticleSorter["RELEASED_AT_DESC"] = "RELEASED_AT_DESC"; ArticleSorter["RELEASED_AT_ASC"] = "RELEASED_AT_ASC"; return ArticleSorter; }({}); class MultipleLanguageModeIsDisabledError extends common.BadRequestException { constructor(){ super('Multiple language mode is disabled'); } code = 100; } class ArticleNotFoundError extends common.BadRequestException { constructor(){ super('Article not found'); } code = 200; } class ArticleVersionNotFoundError extends common.BadRequestException { constructor(){ super('Article version not found'); } code = 201; } class CategoryNotFoundError extends common.BadRequestException { constructor(){ super('Category not found'); } code = 300; } class CircularCategoryNotAllowedError extends common.BadRequestException { constructor(){ super('Circular category is not allowed'); } code = 301; } class MultipleParentCategoryNotAllowedError extends common.BadRequestException { constructor(){ super('Multiple parent categories not allowed, please enable on module forRoot options'); } code = 302; } class ParentCategoryNotFoundError extends common.BadRequestException { constructor(){ super('Parent category not found'); } code = 303; } var ArticleSearchMode = /*#__PURE__*/ function(ArticleSearchMode) { ArticleSearchMode["FULL_TEXT"] = "full_text"; ArticleSearchMode["TITLE"] = "title"; ArticleSearchMode["TITLE_AND_TAG"] = "title-and-tag"; return ArticleSearchMode; }({}); var ArticleStage = /*#__PURE__*/ function(ArticleStage) { ArticleStage["DRAFT"] = "DRAFT"; ArticleStage["REVIEWING"] = "REVIEWING"; ArticleStage["VERIFIED"] = "VERIFIED"; ArticleStage["SCHEDULED"] = "SCHEDULED"; ArticleStage["RELEASED"] = "RELEASED"; ArticleStage["DELETED"] = "DELETED"; ArticleStage["UNKNOWN"] = "UNKNOWN"; return ArticleStage; }({}); const ArticleNotIncludeFields = [ 'id', 'createdAt', 'deletedAt', 'versions', 'categories' ]; const ArticleVersionNotIncludeFields = [ ...ArticleNotIncludeFields, 'articleId', 'article', 'multiLanguageContents', 'signatures' ]; const ArticleVersionContentNotIncludeFields = [ ...ArticleVersionNotIncludeFields, 'version', 'language', 'articleVersion' ]; function removeArticleInvalidFields(article) { return Object.entries(article).filter(([key])=>!~ArticleNotIncludeFields.indexOf(key)).reduce((vars, [key, value])=>({ ...vars, [key]: value }), {}); } function removeMultipleLanguageArticleVersionInvalidFields(articleVersion) { return Object.entries(articleVersion).filter(([key])=>!ArticleVersionNotIncludeFields.includes(key) || key === 'multiLanguageContents').reduce((vars, [key, value])=>({ ...vars, [key]: value }), {}); } function removeArticleVersionInvalidFields(articleVersion) { return Object.entries(articleVersion).filter(([key])=>!ArticleVersionNotIncludeFields.includes(key)).reduce((vars, [key, value])=>({ ...vars, [key]: value }), {}); } function removeArticleVersionContentInvalidFields(articleVersionContent) { return Object.entries(articleVersionContent).filter(([key])=>!~ArticleVersionContentNotIncludeFields.indexOf(key)).reduce((vars, [key, value])=>({ ...vars, [key]: value }), {}); } function _ts_decorate$7(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$6(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } function _ts_param$6(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$7([ common.Injectable(), _ts_param$6(0, common.Inject(SIGNATURE_LEVELS)), _ts_param$6(1, common.Inject(RESOLVED_SIGNATURE_LEVEL_REPO)), _ts_param$6(2, typeorm$1.InjectDataSource()), _ts_param$6(3, common.Inject(ArticleSignatureRepo)), _ts_metadata$6("design:type", Function), _ts_metadata$6("design:paramtypes", [ Array, typeof typeorm.Repository === "undefined" ? Object : typeorm.Repository, typeof typeorm.DataSource === "undefined" ? Object : typeorm.DataSource, typeof typeorm.Repository === "undefined" ? Object : typeorm.Repository ]) ], SignatureService); function _ts_decorate$6(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$5(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } function _ts_param$5(paramIndex, decorator) { return function(target, key) { decorator(target, key, paramIndex); }; } class ArticleDataLoader { articleRepo; articleVersionRepo; signatureService; constructor(articleRepo, articleVersionRepo, signatureService){ this.articleRepo = articleRepo; this.articleVersionRepo = articleVersionRepo; this.signatureService = signatureService; } stageCache = new lruCache.LRUCache({ ttl: 1000 * 5, ttlAutopurge: true, max: 1000 }); stageLoader = new DataLoader(async (queryArgs)=>{ const qb = this.articleVersionRepo.createQueryBuilder('versions'); qb.withDeleted(); qb.leftJoinAndSelect('versions.signatures', 'signatures'); qb.andWhere(new typeorm.Brackets((subQb)=>{ queryArgs.forEach((args, index)=>{ subQb.orWhere(`versions.articleId = :id_${index} AND versions.version = :version_${index}`, { [`id_${index}`]: args.id, [`version_${index}`]: args.version }); }); return subQb; })); const versions = await qb.getMany(); const versionMap = new Map(versions.map((version)=>[ `${version.articleId}:${version.version}`, (()=>{ if (version.deletedAt) return ArticleStage.DELETED; if (version.releasedAt) { if (version.releasedAt.getTime() > Date.now()) { return ArticleStage.SCHEDULED; } return ArticleStage.RELEASED; } if (version.signatures.some((sig)=>sig.result === ArticleSignatureResult.APPROVED && sig.deletedAt === null && sig.signatureLevelId === this.signatureService.finalSignatureLevel?.id)) { return ArticleStage.VERIFIED; } if (version.submittedAt) { return ArticleStage.REVIEWING; } return ArticleStage.DRAFT; })() ])); return queryArgs.map((args)=>versionMap.get(`${args.id}:${args.version}`) ?? ArticleStage.UNKNOWN); }, { cache: true, cacheMap: this.stageCache, cacheKeyFn: (queryArgs)=>`${queryArgs.id}:${queryArgs.version}` }); categoriesLoader = new DataLoader(async (ids)=>{ const qb = this.articleRepo.createQueryBuilder('articles'); qb.leftJoinAndSelect('articles.categories', 'categories'); qb.andWhere('articles.id IN (:...ids)', { ids }); const articles = await qb.getMany(); const categoryMap = new Map(articles.map((article)=>[ article.id, article.categories ])); return ids.map((id)=>categoryMap.get(id) ?? []); }, { cache: true, cacheMap: new lruCache.LRUCache({ ttl: 1000 * 60, ttlAutopurge: true, max: 1000 }) }); } ArticleDataLoader = _ts_decorate$6([ common.Injectable(), _ts_param$5(0, common.Inject(RESOLVED_ARTICLE_REPO)), _ts_param$5(1, common.Inject(RESOLVED_ARTICLE_VERSION_REPO)), _ts_metadata$5("design:type", Function), _ts_metadata$5("design:paramtypes", [ typeof typeorm.Repository === "undefined" ? Object : typeorm.Repository, typeof typeorm.Repository === "undefined" ? Object : typeorm.Repository, typeof SignatureService === "undefined" ? Object : SignatureService ]) ], ArticleDataLoader); function _ts_decorate$5(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$4(k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); } function _ts_param$4(paramIndex, decorator) { return function(target, key) { decorator(target, key, paramIndex); }; } class ArticleBaseService { baseArticleRepo; baseArticleVersionRepo; baseArticleVersionContentRepo; baseCategoryRepo; multipleLanguageMode; fullTextSearchMode; draftMode; signatureLevels; signatureLevelRepo; articleSignatureRepo; autoReleaseAfterApproved; dataSource; articleDataLoader; signatureService; constructor(baseArticleRepo, baseArticleVersionRepo, baseArticleVersionContentRepo, baseCategoryRepo, multipleLanguageMode, fullTextSearchMode, draftMode, signatureLevels, signatureLevelRepo, articleSignatureRepo, autoReleaseAfterApproved, dataSource, articleDataLoader, signatureService){ this.baseArticleRepo = baseArticleRepo; this.baseArticleVersionRepo = baseArticleVersionRepo; this.baseArticleVersionContentRepo = baseArticleVersionContentRepo; this.baseCategoryRepo = baseCategoryRepo; this.multipleLanguageMode = multipleLanguageMode; this.fullTextSearchMode = fullTextSearchMode; this.draftMode = draftMode; this.signatureLevels = signatureLevels; this.signatureLevelRepo = signatureLevelRepo; this.articleSignatureRepo = articleSignatureRepo; this.autoReleaseAfterApproved = autoReleaseAfterApproved; this.dataSource = dataSource; this.articleDataLoader = articleDataLoader; this.signatureService = signatureService; } logger = new common.Logger(ArticleBaseService.name); queryStagesFeaturesCheck = (stage)=>{ switch(stage){ case ArticleStage.DRAFT: if (!this.draftMode) { throw new Error('Draft mode is disabled.'); } break; case ArticleStage.VERIFIED: case ArticleStage.REVIEWING: if (!this.signatureService.signatureEnabled) { throw new Error('Signature mode is disabled.'); } break; } }; limitStageWithQueryBuilder(qb, stage, signatureLevel) { switch(stage){ case ArticleStage.DRAFT: qb.innerJoin((subQb)=>{ subQb.from(this.baseArticleVersionRepo.metadata.tableName, 'versions'); subQb.select('versions.articleId', 'articleId'); subQb.addSelect('versions.version', 'version'); subQb.addSelect('ROW_NUMBER() OVER (PARTITION BY versions."articleId" ORDER BY versions."createdAt" DESC)', 'rowIndex'); subQb.andWhere('versions.releasedAt IS NULL'); subQb.andWhere('versions.submittedAt IS NULL'); return subQb; }, 'stage_ranked', 'stage_ranked."articleId" = versions."articleId" AND stage_ranked."version" = versions."version" AND stage_ranked."rowIndex" = 1'); break; case ArticleStage.REVIEWING: qb.andWhere(`versions.releasedAt IS NULL`); qb.andWhere(`versions.submittedAt IS NOT NULL`); qb.leftJoin('versions.signatures', 'signatures', `signatures.result = :result`, { result: ArticleSignatureResult.APPROVED }); qb.leftJoin('signatures.signatureLevel', 'signatureLevel', 'signatureLevel.name = :signatureLevel', { signatureLevel: signatureLevel ?? this.signatureService.finalSignatureLevel?.name }); qb.andWhere('signatureLevel.id IS NULL'); break; case ArticleStage.VERIFIED: qb.andWhere(`versions.releasedAt IS NULL`); qb.innerJoin((subQb)=>{ subQb.from(this.articleSignatureRepo.metadata.tableName, 'signatures'); subQb.innerJoin('signatures.articleVersion', 'articleVersion'); subQb.select('signatures.articleId', 'articleId'); subQb.addSelect('signatures.version', 'version'); subQb.addSelect('ROW_NUMBER() OVER (PARTITION BY signatures."articleId" ORDER BY signatures."signedAt" DESC)', 'rowIndex'); subQb.andWhere(`signatures.result = :result AND signatures."signatureLevelId" = :signatureLevelId`, { result: ArticleSignatureResult.APPROVED, signatureLevelId: this.signatureService.finalSignatureLevel?.id }); return subQb; }, 'stage_ranked', 'stage_ranked."articleId" = versions."articleId" AND stage_ranked."version" = versions."version" AND stage_ranked."rowIndex" = 1'); break; case ArticleStage.SCHEDULED: qb.innerJoin((subQb)=>{ subQb.from(this.baseArticleVersionRepo.metadata.tableName, 'versions'); subQb.select('versions.articleId', 'articleId'); subQb.addSelect('versions.version', 'version'); subQb.addSelect('ROW_NUMBER() OVER (PARTITION BY versions."articleId" ORDER BY versions."releasedAt" ASC)', 'rowIndex'); subQb.andWhere(`versions.releasedAt IS NOT NULL`); subQb.andWhere(`versions.releasedAt > CURRENT_TIMESTAMP`); return subQb; }, 'stage_ranked', 'stage_ranked."articleId" = versions."articleId" AND stage_ranked."version" = versions."version" AND stage_ranked."rowIndex" = 1'); break; case ArticleStage.RELEASED: default: qb.innerJoin((subQb)=>{ subQb.from(this.baseArticleVersionRepo.metadata.tableName, 'versions'); subQb.select('versions.articleId', 'articleId'); subQb.addSelect('versions.version', 'version'); subQb.addSelect('ROW_NUMBER() OVER (PARTITION BY versions."articleId" ORDER BY versions."releasedAt" DESC)', 'rowIndex'); subQb.andWhere(`versions.releasedAt IS NOT NULL`); subQb.andWhere(`versions.releasedAt <= CURRENT_TIMESTAMP`); return subQb; }, 'stage_ranked', 'stage_ranked."articleId" = versions."articleId" AND stage_ranked."version" = versions."version" AND stage_ranked."rowIndex" = 1'); break; } return qb; } getDefaultQueryBuilder(alias = 'articles', options, runner) { if (options?.version && options?.stage) { this.logger.warn(`Combining version and stage filters, only version filter will be applied.`); } if (options?.stage) { this.queryStagesFeaturesCheck(options.stage); } const qb = runner ? runner.manager.createQueryBuilder(this.baseArticleRepo.metadata.tableName, alias) : this.baseArticleRepo.createQueryBuilder(alias); qb.leftJoinAndSelect(`${alias}.categories`, 'categories'); qb.innerJoinAndSelect(`${alias}.versions`, 'versions'); qb.innerJoinAndSelect('versions.multiLanguageContents', 'multiLanguageContents'); if (options?.version !== undefined) { qb.andWhere('versions.version = :version', { version: options.version }); } else if (options?.stage) { this.limitStageWithQueryBuilder(qb, options.stage, (options.stage === ArticleStage.REVIEWING ? options?