@things-factory/operato-tools 8.0.0-alpha.8 → 8.0.0-beta.0
Sign up to get free protection for your applications and to get access to all the features.
- package/_index.html +1 -1
- package/dist-server/service/tool-entity/create-service.js +18 -8
- package/dist-server/service/tool-entity/create-service.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/installer/docker-compose.yml +5 -0
- package/package.json +4 -4
- package/server/service/tool-entity/create-service.ts +18 -8
- package/views/auth-page.html +1 -1
- package/views/public/home.html +1 -1
package/_index.html
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
<meta charset="utf-8" />
|
5
5
|
<title>Operato Tools</title>
|
6
6
|
<meta name="generator" content="Things Factory Starter Kit" />
|
7
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
|
8
8
|
<meta name="description" content="Reimagining Software" />
|
9
9
|
|
10
10
|
<base href="/" />
|
@@ -864,16 +864,21 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
864
864
|
@Field({ nullable: false })
|
865
865
|
public originalId!: string
|
866
866
|
|
867
|
-
|
868
867
|
@HistoryActionColumn({
|
869
868
|
nullable: false,
|
870
869
|
type:
|
871
870
|
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
872
871
|
? 'enum'
|
873
872
|
: DATABASE_TYPE == 'oracle'
|
874
|
-
|
875
|
-
|
876
|
-
|
873
|
+
? 'varchar2'
|
874
|
+
: DATABASE_TYPE == 'mssql'
|
875
|
+
? 'nvarchar'
|
876
|
+
: 'varchar',
|
877
|
+
enum:
|
878
|
+
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
879
|
+
? HistoryActionType
|
880
|
+
: undefined,
|
881
|
+
length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined: 32
|
877
882
|
})
|
878
883
|
@Field({ nullable: false })
|
879
884
|
public dataRevisionAction!: HistoryActionType
|
@@ -975,14 +980,19 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
975
980
|
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
976
981
|
? 'enum'
|
977
982
|
: DATABASE_TYPE == 'oracle'
|
978
|
-
|
979
|
-
|
980
|
-
|
983
|
+
? 'varchar2'
|
984
|
+
: DATABASE_TYPE == 'mssql'
|
985
|
+
? 'nvarchar'
|
986
|
+
: 'varchar',
|
987
|
+
enum:
|
988
|
+
DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
|
989
|
+
? HistoryActionType
|
990
|
+
: undefined,
|
991
|
+
length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined: 32
|
981
992
|
})
|
982
993
|
@Field({ nullable: false })
|
983
994
|
public dataRevisionAction!: HistoryActionType
|
984
995
|
|
985
|
-
|
986
996
|
@Column({ default: 1, nullable: false })
|
987
997
|
@Field({ nullable: false })
|
988
998
|
dataRevisionNo?: number = 1
|
@@ -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(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"]}
|
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 @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 : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined: 32\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 : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n enum:\n DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? HistoryActionType\n : undefined,\n length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined: 32\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 @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"]}
|