@things-factory/operato-tools 7.0.1-beta.14 → 7.0.1-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -494,7 +494,7 @@ export class {{pascalCase name}}Query {
|
|
|
494
494
|
}
|
|
495
495
|
|
|
496
496
|
@Query(returns => {{pascalCase name}}List, { description: 'To fetch multiple {{pluralPascalCase name}}' })
|
|
497
|
-
async {{pluralCamelCase name}}(@Args() params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}List> {
|
|
497
|
+
async {{pluralCamelCase name}}(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}List> {
|
|
498
498
|
const { domain } = context.state
|
|
499
499
|
|
|
500
500
|
const queryBuilder = getQueryBuilderFromListParams({
|
|
@@ -544,7 +544,7 @@ export class {{pascalCase name}}HistoryQuery {
|
|
|
544
544
|
}
|
|
545
545
|
|
|
546
546
|
@Query(returns => {{pascalCase name}}HistoryList, { description: 'To fetch multiple {{pluralPascalCase name}}History' })
|
|
547
|
-
async {{camelCase name}}Histories(@Args() params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}HistoryList> {
|
|
547
|
+
async {{camelCase name}}Histories(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}HistoryList> {
|
|
548
548
|
const { domain } = context.state
|
|
549
549
|
|
|
550
550
|
const queryBuilder = getQueryBuilderFromListParams({
|
|
@@ -791,7 +791,7 @@ export class {{pascalCase name}} {
|
|
|
791
791
|
createForeignKeyConstraints: false,
|
|
792
792
|
nullable: true
|
|
793
793
|
})
|
|
794
|
-
@Field({ nullable: true })
|
|
794
|
+
@Field(type => User, { nullable: true })
|
|
795
795
|
creator?: User
|
|
796
796
|
|
|
797
797
|
@RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.creator)
|
|
@@ -801,7 +801,7 @@ export class {{pascalCase name}} {
|
|
|
801
801
|
createForeignKeyConstraints: false,
|
|
802
802
|
nullable: true
|
|
803
803
|
})
|
|
804
|
-
@Field({ nullable: true })
|
|
804
|
+
@Field(type => User, { nullable: true })
|
|
805
805
|
updater?: User
|
|
806
806
|
|
|
807
807
|
@RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.updater)
|
|
@@ -896,7 +896,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
|
896
896
|
createForeignKeyConstraints: false,
|
|
897
897
|
nullable: true
|
|
898
898
|
})
|
|
899
|
-
@Field({ nullable: true })
|
|
899
|
+
@Field(type => User, { nullable: true })
|
|
900
900
|
creator?: User
|
|
901
901
|
|
|
902
902
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)
|
|
@@ -906,7 +906,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
|
906
906
|
createForeignKeyConstraints: false,
|
|
907
907
|
nullable: true
|
|
908
908
|
})
|
|
909
|
-
@Field({ nullable: true })
|
|
909
|
+
@Field(type => User, { nullable: true })
|
|
910
910
|
updater?: User
|
|
911
911
|
|
|
912
912
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)
|
|
@@ -1003,7 +1003,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
|
1003
1003
|
createForeignKeyConstraints: false,
|
|
1004
1004
|
nullable: true
|
|
1005
1005
|
})
|
|
1006
|
-
@Field({ nullable: true })
|
|
1006
|
+
@Field(type => User, { nullable: true })
|
|
1007
1007
|
creator?: User
|
|
1008
1008
|
|
|
1009
1009
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)
|
|
@@ -1013,7 +1013,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
|
1013
1013
|
createForeignKeyConstraints: false,
|
|
1014
1014
|
nullable: true
|
|
1015
1015
|
})
|
|
1016
|
-
@Field({ nullable: true })
|
|
1016
|
+
@Field(type => User, { nullable: true })
|
|
1017
1017
|
updater?: User
|
|
1018
1018
|
|
|
1019
1019
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-service.js","sourceRoot":"","sources":["../../../server/service/tool-entity/create-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Query, Resolver } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport { Entity, EntityColumn } from '@things-factory/resource-base'\n\nconst { camelCase, startCase, snakeCase, kebabCase } = require('lodash')\nconst { plural } = require('pluralize')\nconst fs = require('fs')\n\n@Resolver()\nexport class OperatoToolCreateService {\n @Query(returns => Boolean, { description: 'Operato Tool Create Service' })\n async toolCreateService(@Arg('id') id: string, @Ctx() context: any): Promise<Boolean> {\n const { domain } = context.state\n // Entity 조회\n const entity: Entity = await getRepository(Entity).findOne({\n where: {\n id\n }\n })\n\n // Entity 컬럼 조회\n const entityColumns: EntityColumn[] = await getRepository(EntityColumn).find({\n where: {\n domain: { id: domain.id },\n entity: { id: entity.id }\n }\n })\n\n let { name = '', bundle = '' } = entity || {}\n\n // 프로젝트 Root Path 구하기\n let appRootPath: string = this.getProjectRootPath()\n let serviceName: string = kebabCase(name)\n // 서비스 경로 생성\n await this.createServicePath(appRootPath, bundle, serviceName)\n\n // 서비스 파일 생성\n await this.createServiceFiles(appRootPath, bundle, name, serviceName, entity, entityColumns)\n\n return true\n }\n\n /**\n * 서비스 연관 파일 생성\n * @param appRootPath\n * @param moduleName\n * @param name\n * @param serviceName\n * @param entity\n * @param entityColumns\n */\n async createServiceFiles(\n appRootPath: string,\n moduleName: string,\n name: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[]\n ) {\n // 이름 케이스 워드 만들기\n let nameMap = {\n name: serviceName,\n tableName: entity.tableName,\n pascalCaseName: startCase(camelCase(name)).replace(/ /g, ''),\n camelCaseName: camelCase(name),\n snakeCaseName: snakeCase(name),\n pluralPascalCaseName: startCase(camelCase(plural(name))).replace(/ /g, ''),\n pluralCamelCaseName: camelCase(plural(name))\n }\n let servicePath = `${appRootPath}/packages/${moduleName}/server/service/`\n\n if (['JSON', 'COPY'].includes(entity.dataProp)) {\n await this.createHistoryServiceFiles(servicePath, serviceName, entity, entityColumns, nameMap)\n } else {\n await this.createNoHistoryServiceFiels(servicePath, serviceName, entity, entityColumns, nameMap)\n }\n }\n\n async createHistoryServiceFiles(\n servicePath: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[],\n nameMap: any\n ) {\n // 서비스 연관 파일 생성\n await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceHistoryIndex, nameMap)\n\n // Entity\n let entityText = this.createEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}.ts`, entityText, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-query.ts`, serviceQuery, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-mutation.ts`, serviceMutation, nameMap)\n // TYPE\n let typeText = this.createTypeText(entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap)\n\n // 이력관리 entity 생성\n let historyText = this.createHistoryEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history.ts`, historyText, nameMap)\n let entitySubscriberEntityToJson = ''\n if (entity.dataProp == 'JSON') {\n entitySubscriberEntityToJson = `\n public createHistoryEntity(manager, entity) {\n let history = manager.create(this.historyEntity, entity);\n history.historyJson = JSON.stringify(entity);\n return history;\n }\n `\n await this.writeFile(servicePath + `${serviceName}/event-subscriber.ts`, serviceEntitySubscriber, nameMap)\n } else {\n entitySubscriberEntityToJson = ''\n }\n let subscriberTxt = serviceEntitySubscriber.replace(/{{entityToJson}}/g, entitySubscriberEntityToJson)\n await this.writeFile(servicePath + `${serviceName}/event-subscriber.ts`, subscriberTxt, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history-query.ts`, serviceHistoryQuery, nameMap)\n // TYPE\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history-type.ts`, sereviceHistoryType, nameMap)\n\n // 전체 서비스 index.ts 파일\n let allServiceIdxPath = servicePath + 'index.ts'\n if ((await this.existsPath(allServiceIdxPath)) == false) {\n await this.writeFile(allServiceIdxPath, allIndex, nameMap)\n }\n\n let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8')\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}-history'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}-history'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}'`\n )\n }\n\n if (\n allIdxFileTxt.indexOf(\n `import { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers, subscribers as ${nameMap.pascalCaseName}EntitySubscribers } from './${nameMap.name}'`\n ) < 0\n ) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* IMPORT ENTITIES AND RESOLVERS \\*\\//,\n `/* IMPORT ENTITIES AND RESOLVERS */\\nimport { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers, subscribers as ${nameMap.pascalCaseName}EntitySubscribers } from './${nameMap.name}'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Entities,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* ENTITIES \\*\\//,\n `/* ENTITIES */\\n\\t...${nameMap.pascalCaseName}Entities,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Resolvers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* RESOLVER CLASSES \\*\\//,\n `/* RESOLVER CLASSES */\\n\\t\\t...${nameMap.pascalCaseName}Resolvers,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}EntitySubscribers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* SUBSCRIBERS \\*\\//,\n `/* SUBSCRIBERS */\\n\\t\\t...${nameMap.pascalCaseName}EntitySubscribers,`\n )\n }\n\n await this.writeFile(allServiceIdxPath, allIdxFileTxt, nameMap)\n }\n\n async createNoHistoryServiceFiels(\n servicePath: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[],\n nameMap: any\n ) {\n // 서비스 연관 파일 생성\n await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceIndex, nameMap)\n\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-query.ts`, serviceQuery, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-mutation.ts`, serviceMutation, nameMap)\n\n // Entity\n let entityText = this.createEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}.ts`, entityText, nameMap)\n\n // TYPE\n let typeText = this.createTypeText(entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap)\n\n // 전체 서비스 index.ts 파일\n let allServiceIdxPath = servicePath + 'index.ts'\n if ((await this.existsPath(allServiceIdxPath)) == false) {\n await this.writeFile(allServiceIdxPath, allIndex, nameMap)\n }\n\n let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8')\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}'`\n )\n }\n\n if (\n allIdxFileTxt.indexOf(\n `import { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers } from './${nameMap.name}'`\n ) < 0\n ) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* IMPORT ENTITIES AND RESOLVERS \\*\\//,\n `/* IMPORT ENTITIES AND RESOLVERS */\\nimport { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers } from './${nameMap.name}'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Entities,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* ENTITIES \\*\\//,\n `/* ENTITIES */\\n\\t...${nameMap.pascalCaseName}Entities,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Resolvers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* RESOLVER CLASSES \\*\\//,\n `/* RESOLVER CLASSES */\\n\\t\\t...${nameMap.pascalCaseName}Resolvers,`\n )\n }\n\n await this.writeFile(allServiceIdxPath, allIdxFileTxt, nameMap)\n }\n\n /**\n * 엔티티 타입 텍스트\n * @param entityColumns\n * @returns\n */\n createTypeText(entityColumns: EntityColumn[]) {\n let typeText = sereviceType\n\n let newTypeColumns = entityColumns.map(column => {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n let colName = camelCase(column.name)\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n })\n\n typeText = typeText.replace(/{{newTypeColumns}}/g, newTypeColumns.join('\\n'))\n\n let patchTypeColumns = entityColumns.map(column => {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n // patch ?\n column.nullable = true\n\n let colName = camelCase(column.name)\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n })\n\n typeText = typeText.replace(/{{patchTypeColumns}}/g, patchTypeColumns.join('\\n'))\n\n return typeText\n }\n\n /**\n * 엔티티 생성 텍스트\n * @param entity\n * @param entityColumns\n * @returns\n */\n createEntityText(entity: Entity, entityColumns: EntityColumn[]) {\n let entityText = serviceEntity\n\n // 컬럼 정렬\n let sortedCols: EntityColumn[] = entityColumns.sort(function (a, b) {\n return a.rank - b.rank\n })\n\n // 컬럼 정보 txt 변환\n let entityColsText: string[] = sortedCols.map(x => {\n return this.columnToEntityColumn(x)\n })\n\n if (['COPY', 'JSON'].includes(entity.dataProp)) {\n entityColsText.push(`\n @VersionColumn({ default: 1 })\n @Field({ nullable: true })\n dataRevisionNo?: number = 1`)\n }\n\n entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\\n'))\n\n // index 정보\n let indexAnn = ``\n let sortedIdxCols: EntityColumn[] = entityColumns\n .filter(x => x.uniqRank && x.uniqRank > 0)\n .sort(function (a, b) {\n return a.uniqRank - b.uniqRank\n })\n\n if (sortedIdxCols.length > 0) {\n indexAnn = `@Index('ix_{{snakeCase name}}_0', ({{camelCase name}}: {{pascalCase name}}) => [{{indexColumns}}], { unique: true })`\n\n let idxColumns = sortedIdxCols.map(x => {\n let colName = x.name\n if (x.name == 'domain_id') colName = 'domain'\n if (x.name == 'creator_id') colName = 'creator'\n if (x.name == 'updater_id') colName = 'updater'\n\n return '{{camelCase name}}.' + camelCase(colName)\n })\n\n indexAnn = indexAnn.replace(/{{indexColumns}}/g, idxColumns.join(','))\n }\n entityText = entityText.replace(/{{indexAnn}}/g, indexAnn)\n\n return entityText\n }\n\n /**\n * 이력관리 엔티티 생성 텍스트\n * @param entity\n * @param entityColumns\n * @returns\n */\n createHistoryEntityText(entity: Entity, entityColumns: EntityColumn[]) {\n let entityText = entity.dataProp == 'JSON' ? serviceEntityHistJson : serviceEntityHistCopy\n\n // 컬럼 정렬\n let sortedCols: EntityColumn[] = entityColumns.sort(function (a, b) {\n return a.rank - b.rank\n })\n\n // 컬럼 정보 txt 변환\n let entityColsText: string[] = sortedCols.map(x => {\n return this.columnToEntityColumn(x)\n })\n\n entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\\n'))\n return entityText\n }\n\n /**\n * EntityColumn to entity column Text\n * @param column\n * @returns\n */\n columnToEntityColumn(column: EntityColumn) {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let colType: string = column.colType\n if (column.colType == 'double') colType = 'double precision'\n if (column.colType == 'long') colType = 'bigint'\n if (column.colType == 'string') colType = 'character varying'\n if (column.colType == 'datetime') colType = 'timestamp without time zone'\n\n let colSize: string = ''\n if (column.colType == 'string') {\n //@ts-ignore\n colSize = column.colSize\n }\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n let colName = camelCase(column.name)\n\n let columnAnn = `@Column({name:'${column.name}', type: '${colType}', nullable: ${column.nullable} ${colSize.length == 0 ? '' : ',length:' + colSize} })`\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + columnAnn + '\\n ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n }\n\n getFieldType(column: EntityColumn) {\n let fieldType: string = ''\n\n if (column.colType == 'double') fieldType = 'Float'\n if (column.colType == 'float') fieldType = 'Float'\n if (column.colType == 'long') fieldType = 'Int'\n if (column.colType == 'integer') fieldType = 'Int'\n\n return fieldType\n }\n\n getColTxtType(column: EntityColumn) {\n let colTxtType: string = column.colType\n if (column.colType == 'decimal') colTxtType = 'number'\n if (column.colType == 'double') colTxtType = 'number'\n if (column.colType == 'float') colTxtType = 'number'\n if (column.colType == 'integer') colTxtType = 'number'\n if (column.colType == 'long') colTxtType = 'number'\n if (column.colType == 'datetime') colTxtType = 'Date'\n if (column.colType == 'date') colTxtType = 'Date'\n if (column.colType == 'text') colTxtType = 'string'\n return colTxtType\n }\n\n /**\n * 파일 생성\n * @param filePath\n * @param fileText\n * @param nameMap\n */\n async writeFile(filePath: string, fileText: string, nameMap: any) {\n await fs.writeFileSync(filePath, this.replaceNamesMap(fileText, nameMap), 'utf8')\n }\n\n /**\n * 문자열 치환\n * @param text\n * @param nameMap\n * @returns\n */\n replaceNamesMap(text: string, nameMap: any) {\n return text\n .replace(/{{pascalCase name}}/g, nameMap.pascalCaseName)\n .replace(/{{camelCase name}}/g, nameMap.camelCaseName)\n .replace(/{{snakeCase name}}/g, nameMap.snakeCaseName)\n .replace(/{{pluralPascalCase name}}/g, nameMap.pluralPascalCaseName)\n .replace(/{{pluralCamelCase name}}/g, nameMap.pluralCamelCaseName)\n .replace(/{{tableName}}/g, nameMap.tableName)\n .replace(/{{name}}/g, nameMap.name)\n }\n\n /**\n * 서비스 경로 만들기\n * @param appRootPath\n * @param moduleName\n * @param serviceName\n */\n async createServicePath(appRootPath: string, moduleName: string, serviceName: string) {\n let path: string = appRootPath + '/' + 'packages'\n await this.createDir(path)\n\n path = path + '/' + moduleName\n await this.createDir(path)\n\n path = path + '/server'\n await this.createDir(path)\n\n path = path + '/service'\n await this.createDir(path)\n\n path = path + '/' + serviceName\n await this.createDir(path)\n }\n\n /**\n * 프로젝트 Root Path 구하기\n * @returns String\n */\n getProjectRootPath() {\n let appPath: string = process.env.PWD\n let splitPath: string[] = appPath.split('/')\n let pathArr: string[] = []\n for (let i = 0; i < splitPath.length; i++) {\n if (splitPath[i] == 'packages') {\n break\n }\n\n pathArr.push(splitPath[i])\n }\n\n return pathArr.join('/')\n }\n\n /**\n * 디렉토리 생성\n * @param path\n */\n async createDir(path: string) {\n if ((await this.existsPath(path)) == false) fs.mkdirSync(path)\n }\n\n /**\n * Path 존재 여부\n * @param path\n * @returns\n */\n async existsPath(path: string) {\n return await fs.existsSync(path)\n }\n}\n\n/* all service index text index.ts */\nconst allIndex = `\n/* EXPORT ENTITY TYPES */\n\n/* IMPORT ENTITIES AND RESOLVERS */\n\nexport const entities = [ \n /* ENTITIES */\n] \n\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ] \n}\n\nexport const subscribers = [\n /* SUBSCRIBERS */\n]\n`\n\n/* service index text index.ts */\nconst serviceIndex = `\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}Query } from './{{name}}-query'\nimport { {{pascalCase name}}Mutation } from './{{name}}-mutation'\n\nexport const entities = [{{pascalCase name}}]\nexport const resolvers = [{{pascalCase name}}Query, {{pascalCase name}}Mutation]\n`\n\n/* service index text index.ts */\nconst serviceHistoryIndex = `\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}Query } from './{{name}}-query'\nimport { {{pascalCase name}}HistoryQuery } from './{{name}}-history-query'\nimport { {{pascalCase name}}Mutation } from './{{name}}-mutation'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { {{pascalCase name}}HistoryEntitySubscriber } from './event-subscriber'\n\nexport const entities = [{{pascalCase name}}, {{pascalCase name}}History]\nexport const resolvers = [{{pascalCase name}}Query, {{pascalCase name}}HistoryQuery, {{pascalCase name}}Mutation]\nexport const subscribers = [{{pascalCase name}}HistoryEntitySubscriber]\n\n`\n\n/* service Query text {{name}}-query.ts */\nconst serviceQuery = `\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, ListParam, convertListParams, getRepository, getQueryBuilderFromListParams } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}List } from './{{name}}-type'\n\n@Resolver({{pascalCase name}})\nexport class {{pascalCase name}}Query {\n @Query(returns => {{pascalCase name}}, { description: 'To fetch a {{pascalCase name}}' })\n async {{camelCase name}}(@Arg('id') id: string, @Ctx() context: any): Promise<{{pascalCase name}}> {\n const { domain } = context.state\n return await getRepository({{pascalCase name}}).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => {{pascalCase name}}List, { description: 'To fetch multiple {{pluralPascalCase name}}' })\n async {{pluralCamelCase name}}(@Args() params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}List> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository({{pascalCase name}})\n })\n\n const convertedParams = convertListParams(params, domain.id)\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<Domain> {\n return await getRepository(Domain).findOneBy({id:{{camelCase name}}.domainId})\n }\n\n @FieldResolver(type => User)\n async updater(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}.updaterId})\n }\n\n @FieldResolver(type => User)\n async creator(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}.creatorId})\n }\n}\n`\n/* service Query text {{name}}-query.ts */\nconst serviceHistoryQuery = `\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, ListParam, convertListParams, getRepository, getQueryBuilderFromListParams } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { {{pascalCase name}}HistoryList } from './{{name}}-history-type'\n\n@Resolver({{pascalCase name}}History)\nexport class {{pascalCase name}}HistoryQuery {\n @Query(returns => {{pascalCase name}}History, { description: 'To fetch a {{pascalCase name}}History' })\n async {{camelCase name}}History(@Arg('id') id: string, @Ctx() context: any): Promise<{{pascalCase name}}History> {\n const { domain } = context.state\n return await getRepository({{pascalCase name}}History).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => {{pascalCase name}}HistoryList, { description: 'To fetch multiple {{pluralPascalCase name}}History' })\n async {{camelCase name}}Histories(@Args() params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}HistoryList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository({{pascalCase name}}History)\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<Domain> {\n return await getRepository(Domain).findOneBy({id:{{camelCase name}}History.domainId})\n }\n\n @FieldResolver(type => User)\n async updater(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}History.updaterId})\n }\n\n @FieldResolver(type => User)\n async creator(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}History.creatorId})\n }\n}\n`\n/* service mutation text {{name}}-mutation.ts */\nconst serviceMutation = `\nimport { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { {{pascalCase name}} } from './{{name}}'\nimport { New{{pascalCase name}}, {{pascalCase name}}Patch } from './{{name}}-type'\nimport { getRepository } from '@things-factory/shell'\n\n@Resolver({{pascalCase name}})\nexport class {{pascalCase name}}Mutation {\n @Directive('@transaction')\n @Mutation(returns => {{pascalCase name}}, { description: 'To create new {{pascalCase name}}' })\n async create{{pascalCase name}}(@Arg('{{camelCase name}}') {{camelCase name}}: New{{pascalCase name}}, @Ctx() context: any): Promise<{{pascalCase name}}> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository({{pascalCase name}}).save({\n ...{{camelCase name}},\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => {{pascalCase name}}, { description: 'To modify {{pascalCase name}} information' })\n async update{{pascalCase name}}(\n @Arg('id') id: string,\n @Arg('patch') patch: {{pascalCase name}}Patch,\n @Ctx() context: any\n ): Promise<{{pascalCase name}}> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository({{pascalCase name}})\n const {{camelCase name}} = await repository.findOne(\n {\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'updater', 'creator']\n }\n )\n\n return await repository.save({\n ...{{camelCase name}},\n ...patch,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => [{{pascalCase name}}], { description: \"To modify multiple {{pluralPascalCase name}}' information\" })\n async updateMultiple{{pascalCase name}}(\n @Arg('patches', type => [{{pascalCase name}}Patch]) patches: {{pascalCase name}}Patch[],\n @Ctx() context: any\n ): Promise<{{pascalCase name}}[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const {{camelCase name}}Repo = tx.getRepository({{pascalCase name}})\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await {{camelCase name}}Repo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updRecord = _updateRecords[i]\n const {{camelCase name}} = await {{camelCase name}}Repo.findOne({\n where: { domain: { id: domain.id }, id:updRecord.id },\n relations: ['domain', 'updater', 'creator']\n })\n \n const result = await {{camelCase name}}Repo.save({\n ...{{camelCase name}},\n ...updRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete {{pascalCase name}}' })\n async delete{{pascalCase name}}(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {\n const { domain, tx, user } = context.state\n await tx.getRepository({{pascalCase name}}).remove({ domain, id, updater:user })\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple {{camelCase name}}s' })\n async delete{{pluralPascalCase name}}(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: any\n ): Promise<boolean> {\n const { domain, tx, user } = context.state\n\n let delEntitis = ids.map(id=>{\n return {domain,id,updater:user}\n })\n\n await tx.getRepository({{pascalCase name}}).remove(delEntitis)\n\n return true\n }\n}\n`\n/* service type text {{name}}-type.ts */\nconst sereviceType = `\nimport { ObjectType, Field, InputType, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@InputType()\nexport class New{{pascalCase name}} {\n{{newTypeColumns}}\n}\n\n@InputType()\nexport class {{pascalCase name}}Patch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n{{patchTypeColumns}}\n\n @Field()\n cuFlag: string\n}\n\n@ObjectType()\nexport class {{pascalCase name}}List {\n @Field(type => [{{pascalCase name}}])\n items: {{pascalCase name}}[]\n\n @Field(type => Int)\n total: number\n}\n`\n/* service type text {{name}}-type.ts */\nconst sereviceHistoryType = `\nimport { ObjectType, Field, InputType, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { {{pascalCase name}}History } from './{{name}}-history'\n\n@ObjectType()\nexport class {{pascalCase name}}HistoryList {\n @Field(type => [{{pascalCase name}}History])\n items: {{pascalCase name}}History[]\n\n @Field(type => Int)\n total: number\n}\n`\n\n/* service entity {{name}}.ts */\nconst serviceEntity = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n@Entity('{{tableName}}')\n{{indexAnn}}\n@ObjectType({ description: 'Entity for {{pascalCase name}}' })\nexport class {{pascalCase name}} {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.domain)\n domainId: string\n\n{{entityColumns}}\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.updater)\n updaterId?: string\n}\n`\n\n/* service entity {{name}}-history.ts */\nconst serviceEntityHistCopy = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\n\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@Entity('{{tableName}}_histories')\n@Index('ix_{{snakeCase name}}_histories_0', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId,{{camelCase name}}History.dataRevisionNo], { unique: true })\n@Index('ix_{{snakeCase name}}_histories_1', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_2', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_3', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId, {{camelCase name}}History.dataRevisionNo], { unique: true })\n@ObjectType({ description: 'Entity for {{pascalCase name}}History' })\nexport class {{pascalCase name}}History implements HistoryEntityInterface<{{pascalCase name}}>{\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.domain)\n domainId: string\n\n @HistoryOriginalIdColumn({type: 'character varying', nullable: false ,length:40})\n @Field({ nullable: false })\n public originalId!: string\n\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : 'smallint',\n enum: HistoryActionType\n })\n @Field({ nullable: false })\n public dataRevisionAction!: HistoryActionType\n\n @Column({ default: 1, nullable: false })\n @Field({ nullable: false })\n dataRevisionNo?: number = 1\n\n{{entityColumns}}\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)\n updaterId?: string\n}\n`\n\n/* service entity {{name}}-history.ts */\nconst serviceEntityHistJson = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\n\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@Entity('{{tableName}}_histories')\n@Index('ix_{{snakeCase name}}_histories_0', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId,{{camelCase name}}History.dataRevisionNo], { unique: true })\n@Index('ix_{{snakeCase name}}_histories_1', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_2', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_3', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId, {{camelCase name}}History.dataRevisionNo], { unique: true })\n@ObjectType({ description: 'Entity for {{pascalCase name}}History' })\nexport class {{pascalCase name}}History implements HistoryEntityInterface<{{pascalCase name}}>{\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.domain)\n domainId: string\n\n @HistoryOriginalIdColumn({type: 'character varying', nullable: false ,length:40})\n @Field({ nullable: false })\n public originalId!: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : 'smallint',\n enum: HistoryActionType\n })\n @Field({ nullable: false })\n public dataRevisionAction!: HistoryActionType\n\n\n @Column({ default: 1, nullable: false })\n @Field({ nullable: false })\n dataRevisionNo?: number = 1\n\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, { nullable: true })\n historyJson?: any\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field({ nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)\n updaterId?: string\n}\n`\n\n/* service entity subscriber event-subscriber.ts */\nconst serviceEntitySubscriber = `\nimport { EventSubscriber } from 'typeorm'\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { getRepository } from '@things-factory/shell'\n\n@EventSubscriber()\nexport class {{pascalCase name}}HistoryEntitySubscriber extends HistoryEntitySubscriber<{{pascalCase name}},{{pascalCase name}}History> {\n public get entity() {\n return {{pascalCase name}}\n }\n\n public get historyEntity() {\n return {{pascalCase name}}History\n }\n\n {{entityToJson}}\n\n async beforeRemoveHistory(history:{{pascalCase name}}History,entity:{{pascalCase name}}){\n let repo = getRepository({{pascalCase name}}History);\n const revNo = await repo.createQueryBuilder()\n .select('max(data_revision_no)', 'rev_no')\n .where('domain_id = :domainId', { domainId: entity.domain.id })\n .andWhere('original_id = :originalId', { originalId: entity.id })\n .getRawOne()\n \n history.dataRevisionNo = revNo ? revNo.rev_no + 1 : 1;\n return history;\n }\n}\n`\n"]}
|
|
1
|
+
{"version":3,"file":"create-service.js","sourceRoot":"","sources":["../../../server/service/tool-entity/create-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Query, Resolver } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport { Entity, EntityColumn } from '@things-factory/resource-base'\n\nconst { camelCase, startCase, snakeCase, kebabCase } = require('lodash')\nconst { plural } = require('pluralize')\nconst fs = require('fs')\n\n@Resolver()\nexport class OperatoToolCreateService {\n @Query(returns => Boolean, { description: 'Operato Tool Create Service' })\n async toolCreateService(@Arg('id') id: string, @Ctx() context: any): Promise<Boolean> {\n const { domain } = context.state\n // Entity 조회\n const entity: Entity = await getRepository(Entity).findOne({\n where: {\n id\n }\n })\n\n // Entity 컬럼 조회\n const entityColumns: EntityColumn[] = await getRepository(EntityColumn).find({\n where: {\n domain: { id: domain.id },\n entity: { id: entity.id }\n }\n })\n\n let { name = '', bundle = '' } = entity || {}\n\n // 프로젝트 Root Path 구하기\n let appRootPath: string = this.getProjectRootPath()\n let serviceName: string = kebabCase(name)\n // 서비스 경로 생성\n await this.createServicePath(appRootPath, bundle, serviceName)\n\n // 서비스 파일 생성\n await this.createServiceFiles(appRootPath, bundle, name, serviceName, entity, entityColumns)\n\n return true\n }\n\n /**\n * 서비스 연관 파일 생성\n * @param appRootPath\n * @param moduleName\n * @param name\n * @param serviceName\n * @param entity\n * @param entityColumns\n */\n async createServiceFiles(\n appRootPath: string,\n moduleName: string,\n name: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[]\n ) {\n // 이름 케이스 워드 만들기\n let nameMap = {\n name: serviceName,\n tableName: entity.tableName,\n pascalCaseName: startCase(camelCase(name)).replace(/ /g, ''),\n camelCaseName: camelCase(name),\n snakeCaseName: snakeCase(name),\n pluralPascalCaseName: startCase(camelCase(plural(name))).replace(/ /g, ''),\n pluralCamelCaseName: camelCase(plural(name))\n }\n let servicePath = `${appRootPath}/packages/${moduleName}/server/service/`\n\n if (['JSON', 'COPY'].includes(entity.dataProp)) {\n await this.createHistoryServiceFiles(servicePath, serviceName, entity, entityColumns, nameMap)\n } else {\n await this.createNoHistoryServiceFiels(servicePath, serviceName, entity, entityColumns, nameMap)\n }\n }\n\n async createHistoryServiceFiles(\n servicePath: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[],\n nameMap: any\n ) {\n // 서비스 연관 파일 생성\n await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceHistoryIndex, nameMap)\n\n // Entity\n let entityText = this.createEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}.ts`, entityText, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-query.ts`, serviceQuery, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-mutation.ts`, serviceMutation, nameMap)\n // TYPE\n let typeText = this.createTypeText(entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap)\n\n // 이력관리 entity 생성\n let historyText = this.createHistoryEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history.ts`, historyText, nameMap)\n let entitySubscriberEntityToJson = ''\n if (entity.dataProp == 'JSON') {\n entitySubscriberEntityToJson = `\n public createHistoryEntity(manager, entity) {\n let history = manager.create(this.historyEntity, entity);\n history.historyJson = JSON.stringify(entity);\n return history;\n }\n `\n await this.writeFile(servicePath + `${serviceName}/event-subscriber.ts`, serviceEntitySubscriber, nameMap)\n } else {\n entitySubscriberEntityToJson = ''\n }\n let subscriberTxt = serviceEntitySubscriber.replace(/{{entityToJson}}/g, entitySubscriberEntityToJson)\n await this.writeFile(servicePath + `${serviceName}/event-subscriber.ts`, subscriberTxt, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history-query.ts`, serviceHistoryQuery, nameMap)\n // TYPE\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-history-type.ts`, sereviceHistoryType, nameMap)\n\n // 전체 서비스 index.ts 파일\n let allServiceIdxPath = servicePath + 'index.ts'\n if ((await this.existsPath(allServiceIdxPath)) == false) {\n await this.writeFile(allServiceIdxPath, allIndex, nameMap)\n }\n\n let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8')\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}-history'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}-history'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}'`\n )\n }\n\n if (\n allIdxFileTxt.indexOf(\n `import { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers, subscribers as ${nameMap.pascalCaseName}EntitySubscribers } from './${nameMap.name}'`\n ) < 0\n ) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* IMPORT ENTITIES AND RESOLVERS \\*\\//,\n `/* IMPORT ENTITIES AND RESOLVERS */\\nimport { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers, subscribers as ${nameMap.pascalCaseName}EntitySubscribers } from './${nameMap.name}'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Entities,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* ENTITIES \\*\\//,\n `/* ENTITIES */\\n\\t...${nameMap.pascalCaseName}Entities,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Resolvers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* RESOLVER CLASSES \\*\\//,\n `/* RESOLVER CLASSES */\\n\\t\\t...${nameMap.pascalCaseName}Resolvers,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}EntitySubscribers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* SUBSCRIBERS \\*\\//,\n `/* SUBSCRIBERS */\\n\\t\\t...${nameMap.pascalCaseName}EntitySubscribers,`\n )\n }\n\n await this.writeFile(allServiceIdxPath, allIdxFileTxt, nameMap)\n }\n\n async createNoHistoryServiceFiels(\n servicePath: string,\n serviceName: string,\n entity: Entity,\n entityColumns: EntityColumn[],\n nameMap: any\n ) {\n // 서비스 연관 파일 생성\n await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceIndex, nameMap)\n\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-query.ts`, serviceQuery, nameMap)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-mutation.ts`, serviceMutation, nameMap)\n\n // Entity\n let entityText = this.createEntityText(entity, entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}.ts`, entityText, nameMap)\n\n // TYPE\n let typeText = this.createTypeText(entityColumns)\n await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap)\n\n // 전체 서비스 index.ts 파일\n let allServiceIdxPath = servicePath + 'index.ts'\n if ((await this.existsPath(allServiceIdxPath)) == false) {\n await this.writeFile(allServiceIdxPath, allIndex, nameMap)\n }\n\n let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8')\n\n if (allIdxFileTxt.indexOf(`export * from './${nameMap.name}/${nameMap.name}'`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* EXPORT ENTITY TYPES \\*\\//,\n `/* EXPORT ENTITY TYPES */\\nexport * from './${nameMap.name}/${nameMap.name}'`\n )\n }\n\n if (\n allIdxFileTxt.indexOf(\n `import { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers } from './${nameMap.name}'`\n ) < 0\n ) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* IMPORT ENTITIES AND RESOLVERS \\*\\//,\n `/* IMPORT ENTITIES AND RESOLVERS */\\nimport { entities as ${nameMap.pascalCaseName}Entities, resolvers as ${nameMap.pascalCaseName}Resolvers } from './${nameMap.name}'`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Entities,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* ENTITIES \\*\\//,\n `/* ENTITIES */\\n\\t...${nameMap.pascalCaseName}Entities,`\n )\n }\n\n if (allIdxFileTxt.indexOf(`...${nameMap.pascalCaseName}Resolvers,`) < 0) {\n allIdxFileTxt = allIdxFileTxt.replace(\n /\\/\\* RESOLVER CLASSES \\*\\//,\n `/* RESOLVER CLASSES */\\n\\t\\t...${nameMap.pascalCaseName}Resolvers,`\n )\n }\n\n await this.writeFile(allServiceIdxPath, allIdxFileTxt, nameMap)\n }\n\n /**\n * 엔티티 타입 텍스트\n * @param entityColumns\n * @returns\n */\n createTypeText(entityColumns: EntityColumn[]) {\n let typeText = sereviceType\n\n let newTypeColumns = entityColumns.map(column => {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n let colName = camelCase(column.name)\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n })\n\n typeText = typeText.replace(/{{newTypeColumns}}/g, newTypeColumns.join('\\n'))\n\n let patchTypeColumns = entityColumns.map(column => {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n // patch ?\n column.nullable = true\n\n let colName = camelCase(column.name)\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n })\n\n typeText = typeText.replace(/{{patchTypeColumns}}/g, patchTypeColumns.join('\\n'))\n\n return typeText\n }\n\n /**\n * 엔티티 생성 텍스트\n * @param entity\n * @param entityColumns\n * @returns\n */\n createEntityText(entity: Entity, entityColumns: EntityColumn[]) {\n let entityText = serviceEntity\n\n // 컬럼 정렬\n let sortedCols: EntityColumn[] = entityColumns.sort(function (a, b) {\n return a.rank - b.rank\n })\n\n // 컬럼 정보 txt 변환\n let entityColsText: string[] = sortedCols.map(x => {\n return this.columnToEntityColumn(x)\n })\n\n if (['COPY', 'JSON'].includes(entity.dataProp)) {\n entityColsText.push(`\n @VersionColumn({ default: 1 })\n @Field({ nullable: true })\n dataRevisionNo?: number = 1`)\n }\n\n entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\\n'))\n\n // index 정보\n let indexAnn = ``\n let sortedIdxCols: EntityColumn[] = entityColumns\n .filter(x => x.uniqRank && x.uniqRank > 0)\n .sort(function (a, b) {\n return a.uniqRank - b.uniqRank\n })\n\n if (sortedIdxCols.length > 0) {\n indexAnn = `@Index('ix_{{snakeCase name}}_0', ({{camelCase name}}: {{pascalCase name}}) => [{{indexColumns}}], { unique: true })`\n\n let idxColumns = sortedIdxCols.map(x => {\n let colName = x.name\n if (x.name == 'domain_id') colName = 'domain'\n if (x.name == 'creator_id') colName = 'creator'\n if (x.name == 'updater_id') colName = 'updater'\n\n return '{{camelCase name}}.' + camelCase(colName)\n })\n\n indexAnn = indexAnn.replace(/{{indexColumns}}/g, idxColumns.join(','))\n }\n entityText = entityText.replace(/{{indexAnn}}/g, indexAnn)\n\n return entityText\n }\n\n /**\n * 이력관리 엔티티 생성 텍스트\n * @param entity\n * @param entityColumns\n * @returns\n */\n createHistoryEntityText(entity: Entity, entityColumns: EntityColumn[]) {\n let entityText = entity.dataProp == 'JSON' ? serviceEntityHistJson : serviceEntityHistCopy\n\n // 컬럼 정렬\n let sortedCols: EntityColumn[] = entityColumns.sort(function (a, b) {\n return a.rank - b.rank\n })\n\n // 컬럼 정보 txt 변환\n let entityColsText: string[] = sortedCols.map(x => {\n return this.columnToEntityColumn(x)\n })\n\n entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\\n'))\n return entityText\n }\n\n /**\n * EntityColumn to entity column Text\n * @param column\n * @returns\n */\n columnToEntityColumn(column: EntityColumn) {\n if (column.name == 'id') return ''\n if (column.name == 'domain_id') return ''\n if (column.name == 'created_at') return ''\n if (column.name == 'updated_at') return ''\n if (column.name == 'creator_id') return ''\n if (column.name == 'updater_id') return ''\n\n let colType: string = column.colType\n if (column.colType == 'double') colType = 'double precision'\n if (column.colType == 'long') colType = 'bigint'\n if (column.colType == 'string') colType = 'character varying'\n if (column.colType == 'datetime') colType = 'timestamp without time zone'\n\n let colSize: string = ''\n if (column.colType == 'string') {\n //@ts-ignore\n colSize = column.colSize\n }\n\n let fieldType: string = this.getFieldType(column)\n let colTxtType: string = this.getColTxtType(column)\n\n let colName = camelCase(column.name)\n\n let columnAnn = `@Column({name:'${column.name}', type: '${colType}', nullable: ${column.nullable} ${colSize.length == 0 ? '' : ',length:' + colSize} })`\n let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`\n let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`\n\n return ' ' + columnAnn + '\\n ' + fieldAnn + '\\n ' + columnTxt + '\\n'\n }\n\n getFieldType(column: EntityColumn) {\n let fieldType: string = ''\n\n if (column.colType == 'double') fieldType = 'Float'\n if (column.colType == 'float') fieldType = 'Float'\n if (column.colType == 'long') fieldType = 'Int'\n if (column.colType == 'integer') fieldType = 'Int'\n\n return fieldType\n }\n\n getColTxtType(column: EntityColumn) {\n let colTxtType: string = column.colType\n if (column.colType == 'decimal') colTxtType = 'number'\n if (column.colType == 'double') colTxtType = 'number'\n if (column.colType == 'float') colTxtType = 'number'\n if (column.colType == 'integer') colTxtType = 'number'\n if (column.colType == 'long') colTxtType = 'number'\n if (column.colType == 'datetime') colTxtType = 'Date'\n if (column.colType == 'date') colTxtType = 'Date'\n if (column.colType == 'text') colTxtType = 'string'\n return colTxtType\n }\n\n /**\n * 파일 생성\n * @param filePath\n * @param fileText\n * @param nameMap\n */\n async writeFile(filePath: string, fileText: string, nameMap: any) {\n await fs.writeFileSync(filePath, this.replaceNamesMap(fileText, nameMap), 'utf8')\n }\n\n /**\n * 문자열 치환\n * @param text\n * @param nameMap\n * @returns\n */\n replaceNamesMap(text: string, nameMap: any) {\n return text\n .replace(/{{pascalCase name}}/g, nameMap.pascalCaseName)\n .replace(/{{camelCase name}}/g, nameMap.camelCaseName)\n .replace(/{{snakeCase name}}/g, nameMap.snakeCaseName)\n .replace(/{{pluralPascalCase name}}/g, nameMap.pluralPascalCaseName)\n .replace(/{{pluralCamelCase name}}/g, nameMap.pluralCamelCaseName)\n .replace(/{{tableName}}/g, nameMap.tableName)\n .replace(/{{name}}/g, nameMap.name)\n }\n\n /**\n * 서비스 경로 만들기\n * @param appRootPath\n * @param moduleName\n * @param serviceName\n */\n async createServicePath(appRootPath: string, moduleName: string, serviceName: string) {\n let path: string = appRootPath + '/' + 'packages'\n await this.createDir(path)\n\n path = path + '/' + moduleName\n await this.createDir(path)\n\n path = path + '/server'\n await this.createDir(path)\n\n path = path + '/service'\n await this.createDir(path)\n\n path = path + '/' + serviceName\n await this.createDir(path)\n }\n\n /**\n * 프로젝트 Root Path 구하기\n * @returns String\n */\n getProjectRootPath() {\n let appPath: string = process.env.PWD\n let splitPath: string[] = appPath.split('/')\n let pathArr: string[] = []\n for (let i = 0; i < splitPath.length; i++) {\n if (splitPath[i] == 'packages') {\n break\n }\n\n pathArr.push(splitPath[i])\n }\n\n return pathArr.join('/')\n }\n\n /**\n * 디렉토리 생성\n * @param path\n */\n async createDir(path: string) {\n if ((await this.existsPath(path)) == false) fs.mkdirSync(path)\n }\n\n /**\n * Path 존재 여부\n * @param path\n * @returns\n */\n async existsPath(path: string) {\n return await fs.existsSync(path)\n }\n}\n\n/* all service index text index.ts */\nconst allIndex = `\n/* EXPORT ENTITY TYPES */\n\n/* IMPORT ENTITIES AND RESOLVERS */\n\nexport const entities = [ \n /* ENTITIES */\n] \n\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ] \n}\n\nexport const subscribers = [\n /* SUBSCRIBERS */\n]\n`\n\n/* service index text index.ts */\nconst serviceIndex = `\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}Query } from './{{name}}-query'\nimport { {{pascalCase name}}Mutation } from './{{name}}-mutation'\n\nexport const entities = [{{pascalCase name}}]\nexport const resolvers = [{{pascalCase name}}Query, {{pascalCase name}}Mutation]\n`\n\n/* service index text index.ts */\nconst serviceHistoryIndex = `\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}Query } from './{{name}}-query'\nimport { {{pascalCase name}}HistoryQuery } from './{{name}}-history-query'\nimport { {{pascalCase name}}Mutation } from './{{name}}-mutation'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { {{pascalCase name}}HistoryEntitySubscriber } from './event-subscriber'\n\nexport const entities = [{{pascalCase name}}, {{pascalCase name}}History]\nexport const resolvers = [{{pascalCase name}}Query, {{pascalCase name}}HistoryQuery, {{pascalCase name}}Mutation]\nexport const subscribers = [{{pascalCase name}}HistoryEntitySubscriber]\n\n`\n\n/* service Query text {{name}}-query.ts */\nconst serviceQuery = `\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, ListParam, convertListParams, getRepository, getQueryBuilderFromListParams } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}List } from './{{name}}-type'\n\n@Resolver({{pascalCase name}})\nexport class {{pascalCase name}}Query {\n @Query(returns => {{pascalCase name}}, { description: 'To fetch a {{pascalCase name}}' })\n async {{camelCase name}}(@Arg('id') id: string, @Ctx() context: any): Promise<{{pascalCase name}}> {\n const { domain } = context.state\n return await getRepository({{pascalCase name}}).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => {{pascalCase name}}List, { description: 'To fetch multiple {{pluralPascalCase name}}' })\n async {{pluralCamelCase name}}(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}List> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository({{pascalCase name}})\n })\n\n const convertedParams = convertListParams(params, domain.id)\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<Domain> {\n return await getRepository(Domain).findOneBy({id:{{camelCase name}}.domainId})\n }\n\n @FieldResolver(type => User)\n async updater(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}.updaterId})\n }\n\n @FieldResolver(type => User)\n async creator(@Root() {{camelCase name}}: {{pascalCase name}}): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}.creatorId})\n }\n}\n`\n/* service Query text {{name}}-query.ts */\nconst serviceHistoryQuery = `\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Domain, ListParam, convertListParams, getRepository, getQueryBuilderFromListParams } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { {{pascalCase name}}HistoryList } from './{{name}}-history-type'\n\n@Resolver({{pascalCase name}}History)\nexport class {{pascalCase name}}HistoryQuery {\n @Query(returns => {{pascalCase name}}History, { description: 'To fetch a {{pascalCase name}}History' })\n async {{camelCase name}}History(@Arg('id') id: string, @Ctx() context: any): Promise<{{pascalCase name}}History> {\n const { domain } = context.state\n return await getRepository({{pascalCase name}}History).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => {{pascalCase name}}HistoryList, { description: 'To fetch multiple {{pluralPascalCase name}}History' })\n async {{camelCase name}}Histories(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<{{pascalCase name}}HistoryList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository({{pascalCase name}}History)\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<Domain> {\n return await getRepository(Domain).findOneBy({id:{{camelCase name}}History.domainId})\n }\n\n @FieldResolver(type => User)\n async updater(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}History.updaterId})\n }\n\n @FieldResolver(type => User)\n async creator(@Root() {{camelCase name}}History: {{pascalCase name}}History): Promise<User> {\n return await getRepository(User).findOneBy({id:{{camelCase name}}History.creatorId})\n }\n}\n`\n/* service mutation text {{name}}-mutation.ts */\nconst serviceMutation = `\nimport { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { {{pascalCase name}} } from './{{name}}'\nimport { New{{pascalCase name}}, {{pascalCase name}}Patch } from './{{name}}-type'\nimport { getRepository } from '@things-factory/shell'\n\n@Resolver({{pascalCase name}})\nexport class {{pascalCase name}}Mutation {\n @Directive('@transaction')\n @Mutation(returns => {{pascalCase name}}, { description: 'To create new {{pascalCase name}}' })\n async create{{pascalCase name}}(@Arg('{{camelCase name}}') {{camelCase name}}: New{{pascalCase name}}, @Ctx() context: any): Promise<{{pascalCase name}}> {\n const { domain, user, tx } = context.state\n\n return await tx.getRepository({{pascalCase name}}).save({\n ...{{camelCase name}},\n domain,\n creator: user,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => {{pascalCase name}}, { description: 'To modify {{pascalCase name}} information' })\n async update{{pascalCase name}}(\n @Arg('id') id: string,\n @Arg('patch') patch: {{pascalCase name}}Patch,\n @Ctx() context: any\n ): Promise<{{pascalCase name}}> {\n const { domain, user, tx } = context.state\n\n const repository = tx.getRepository({{pascalCase name}})\n const {{camelCase name}} = await repository.findOne(\n {\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'updater', 'creator']\n }\n )\n\n return await repository.save({\n ...{{camelCase name}},\n ...patch,\n updater: user\n })\n }\n\n @Directive('@transaction')\n @Mutation(returns => [{{pascalCase name}}], { description: \"To modify multiple {{pluralPascalCase name}}' information\" })\n async updateMultiple{{pascalCase name}}(\n @Arg('patches', type => [{{pascalCase name}}Patch]) patches: {{pascalCase name}}Patch[],\n @Ctx() context: any\n ): Promise<{{pascalCase name}}[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const {{camelCase name}}Repo = tx.getRepository({{pascalCase name}})\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await {{camelCase name}}Repo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updRecord = _updateRecords[i]\n const {{camelCase name}} = await {{camelCase name}}Repo.findOne({\n where: { domain: { id: domain.id }, id:updRecord.id },\n relations: ['domain', 'updater', 'creator']\n })\n \n const result = await {{camelCase name}}Repo.save({\n ...{{camelCase name}},\n ...updRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete {{pascalCase name}}' })\n async delete{{pascalCase name}}(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {\n const { domain, tx, user } = context.state\n await tx.getRepository({{pascalCase name}}).remove({ domain, id, updater:user })\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple {{camelCase name}}s' })\n async delete{{pluralPascalCase name}}(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: any\n ): Promise<boolean> {\n const { domain, tx, user } = context.state\n\n let delEntitis = ids.map(id=>{\n return {domain,id,updater:user}\n })\n\n await tx.getRepository({{pascalCase name}}).remove(delEntitis)\n\n return true\n }\n}\n`\n/* service type text {{name}}-type.ts */\nconst sereviceType = `\nimport { ObjectType, Field, InputType, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@InputType()\nexport class New{{pascalCase name}} {\n{{newTypeColumns}}\n}\n\n@InputType()\nexport class {{pascalCase name}}Patch {\n @Field(type => ID, { nullable: true })\n id?: string\n\n{{patchTypeColumns}}\n\n @Field()\n cuFlag: string\n}\n\n@ObjectType()\nexport class {{pascalCase name}}List {\n @Field(type => [{{pascalCase name}}])\n items: {{pascalCase name}}[]\n\n @Field(type => Int)\n total: number\n}\n`\n/* service type text {{name}}-type.ts */\nconst sereviceHistoryType = `\nimport { ObjectType, Field, InputType, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { {{pascalCase name}}History } from './{{name}}-history'\n\n@ObjectType()\nexport class {{pascalCase name}}HistoryList {\n @Field(type => [{{pascalCase name}}History])\n items: {{pascalCase name}}History[]\n\n @Field(type => Int)\n total: number\n}\n`\n\n/* service entity {{name}}.ts */\nconst serviceEntity = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n@Entity('{{tableName}}')\n{{indexAnn}}\n@ObjectType({ description: 'Entity for {{pascalCase name}}' })\nexport class {{pascalCase name}} {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.domain)\n domainId: string\n\n{{entityColumns}}\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.updater)\n updaterId?: string\n}\n`\n\n/* service entity {{name}}-history.ts */\nconst serviceEntityHistCopy = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\n\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@Entity('{{tableName}}_histories')\n@Index('ix_{{snakeCase name}}_histories_0', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId,{{camelCase name}}History.dataRevisionNo], { unique: true })\n@Index('ix_{{snakeCase name}}_histories_1', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_2', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_3', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId, {{camelCase name}}History.dataRevisionNo], { unique: true })\n@ObjectType({ description: 'Entity for {{pascalCase name}}History' })\nexport class {{pascalCase name}}History implements HistoryEntityInterface<{{pascalCase name}}>{\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.domain)\n domainId: string\n\n @HistoryOriginalIdColumn({type: 'character varying', nullable: false ,length:40})\n @Field({ nullable: false })\n public originalId!: string\n\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : 'smallint',\n enum: HistoryActionType\n })\n @Field({ nullable: false })\n public dataRevisionAction!: HistoryActionType\n\n @Column({ default: 1, nullable: false })\n @Field({ nullable: false })\n dataRevisionNo?: number = 1\n\n{{entityColumns}}\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)\n updaterId?: string\n}\n`\n\n/* service entity {{name}}-history.ts */\nconst serviceEntityHistJson = `\nimport {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n PrimaryGeneratedColumn,\n VersionColumn\n} from 'typeorm'\n\nimport {\n HistoryActionColumn,\n HistoryActionType,\n HistoryEntityInterface,\n HistoryOriginalIdColumn\n} from '@operato/typeorm-history'\n\nimport { ObjectType, Field, Int, ID, Float, registerEnumType } from 'type-graphql'\n\nimport { config } from '@things-factory/env'\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nimport { {{pascalCase name}} } from './{{name}}'\n\n@Entity('{{tableName}}_histories')\n@Index('ix_{{snakeCase name}}_histories_0', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId,{{camelCase name}}History.dataRevisionNo], { unique: true })\n@Index('ix_{{snakeCase name}}_histories_1', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_2', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId ], { unique: false })\n@Index('ix_{{snakeCase name}}_histories_3', ({{camelCase name}}History: {{pascalCase name}}History) => [{{camelCase name}}History.domain, {{camelCase name}}History.originalId, {{camelCase name}}History.dataRevisionNo], { unique: true })\n@ObjectType({ description: 'Entity for {{pascalCase name}}History' })\nexport class {{pascalCase name}}History implements HistoryEntityInterface<{{pascalCase name}}>{\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain, {\n createForeignKeyConstraints: false\n })\n @Field({ nullable: false })\n domain: Domain\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.domain)\n domainId: string\n\n @HistoryOriginalIdColumn({type: 'character varying', nullable: false ,length:40})\n @Field({ nullable: false })\n public originalId!: string\n\n @HistoryActionColumn({\n nullable: false,\n type:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'enum'\n : DATABASE_TYPE == 'oracle'\n ? 'varchar2'\n : 'smallint',\n enum: HistoryActionType\n })\n @Field({ nullable: false })\n public dataRevisionAction!: HistoryActionType\n\n\n @Column({ default: 1, nullable: false })\n @Field({ nullable: false })\n dataRevisionNo?: number = 1\n\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, { nullable: true })\n historyJson?: any\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)\n creatorId?: string\n\n @ManyToOne(type => User, {\n createForeignKeyConstraints: false,\n nullable: true\n })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)\n updaterId?: string\n}\n`\n\n/* service entity subscriber event-subscriber.ts */\nconst serviceEntitySubscriber = `\nimport { EventSubscriber } from 'typeorm'\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { {{pascalCase name}} } from './{{name}}'\nimport { {{pascalCase name}}History } from './{{name}}-history'\nimport { getRepository } from '@things-factory/shell'\n\n@EventSubscriber()\nexport class {{pascalCase name}}HistoryEntitySubscriber extends HistoryEntitySubscriber<{{pascalCase name}},{{pascalCase name}}History> {\n public get entity() {\n return {{pascalCase name}}\n }\n\n public get historyEntity() {\n return {{pascalCase name}}History\n }\n\n {{entityToJson}}\n\n async beforeRemoveHistory(history:{{pascalCase name}}History,entity:{{pascalCase name}}){\n let repo = getRepository({{pascalCase name}}History);\n const revNo = await repo.createQueryBuilder()\n .select('max(data_revision_no)', 'rev_no')\n .where('domain_id = :domainId', { domainId: entity.domain.id })\n .andWhere('original_id = :originalId', { originalId: entity.id })\n .getRawOne()\n \n history.dataRevisionNo = revNo ? revNo.rev_no + 1 : 1;\n return history;\n }\n}\n`\n"]}
|