@things-factory/operato-tools 7.0.1-beta.9 → 7.0.1-rc.1
Sign up to get free protection for your applications and to get access to all the features.
- package/client/pages/generator/meta-generator-page.js +3 -2
- package/client/themes/app-theme.css +0 -14
- package/dist-server/index.d.ts +1 -0
- package/dist-server/service/index.d.ts +4 -0
- package/dist-server/service/tool-entity/create-menu.d.ts +36 -0
- package/dist-server/service/tool-entity/create-menu.js +2 -2
- package/dist-server/service/tool-entity/create-menu.js.map +1 -1
- package/dist-server/service/tool-entity/create-service.d.ts +81 -0
- package/dist-server/service/tool-entity/create-service.js +41 -37
- package/dist-server/service/tool-entity/create-service.js.map +1 -1
- package/dist-server/service/tool-entity/index.d.ts +3 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/server/service/tool-entity/create-service.ts +339 -317
@@ -76,18 +76,19 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
76
76
|
display: flex;
|
77
77
|
}
|
78
78
|
.tab {
|
79
|
-
background-color: var(--
|
79
|
+
background-color: var(--md-sys-color-secondary-container);
|
80
|
+
color: var(--md-sys-color-on-secondary-container);
|
80
81
|
margin-top: var(--margin-default);
|
81
82
|
padding: var(--padding-narrow) var(--padding-wide) 0 var(--padding-wide);
|
82
83
|
border-radius: 9px 9px 0 0;
|
83
84
|
border-right: 1px solid rgba(0, 0, 0, 0.4);
|
84
85
|
text-transform: capitalize;
|
85
|
-
color: var(--md-sys-color-on-primary);
|
86
86
|
opacity: 0.7;
|
87
87
|
cursor: pointer;
|
88
88
|
}
|
89
89
|
.tab[activate] {
|
90
90
|
background-color: var(--md-sys-color-primary);
|
91
|
+
color: var(--md-sys-color-on-primary);
|
91
92
|
box-shadow: 2px -2px 2px 0px rgba(0, 0, 0, 0.15);
|
92
93
|
opacity: 1;
|
93
94
|
font-weight: bold;
|
@@ -7,7 +7,6 @@ body {
|
|
7
7
|
--focus-color: var(--md-sys-color-on-primary);
|
8
8
|
--primary-background-color: var(--md-sys-color-secondary);
|
9
9
|
--secondary-background-color: #283644;
|
10
|
-
:#f4f7fb;
|
11
10
|
--md-sys-color-on-primary: #fff;
|
12
11
|
--theme-black-color: rgba(0, 0, 0, 0.9);
|
13
12
|
|
@@ -15,9 +14,6 @@ body {
|
|
15
14
|
--primary-text-color: #111;
|
16
15
|
--secondary-text-color: #017e7f;
|
17
16
|
|
18
|
-
--opacity-dark-color: rgba(0, 0, 0, 0.4);
|
19
|
-
--opacity-light-color: rgba(255, 255, 255, 0.8);
|
20
|
-
|
21
17
|
/* status color */
|
22
18
|
--status-success-color: #35a24a;
|
23
19
|
--status-warning-color: #ee8d03;
|
@@ -85,16 +81,6 @@ body {
|
|
85
81
|
--md-fab-container-color: var(--md-sys-color-primary);
|
86
82
|
--md-fab-icon-color: var(--focus-color);
|
87
83
|
|
88
|
-
--md-theme-on-primary: var(--md-sys-color-on-primary);
|
89
|
-
--md-theme-primary: var(--secondary-text-color);
|
90
|
-
--md-theme-on-secondary: var(--md-sys-color-on-primary);
|
91
|
-
--md-theme-secondary: var(--md-sys-color-primary);
|
92
|
-
--md-button-outline-color: var(--md-sys-color-primary);
|
93
|
-
--md-danger-button-primary-color: var(--status-danger-color);
|
94
|
-
--md-danger-button-outline-color: var(--status-danger-color);
|
95
|
-
--md-button-outline-width: 1px;
|
96
|
-
--md-button-horizontal-padding: 16px;
|
97
|
-
|
98
84
|
/* button style */
|
99
85
|
--button-background-color: #fafbfc;
|
100
86
|
--button-background-focus-color: var(--md-sys-color-primary);
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './service';
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { EntityColumn } from '@things-factory/resource-base';
|
2
|
+
export declare class OperatoToolCreateMenu {
|
3
|
+
toolCreateMenu(id: string, parent_menu_id: string, context: any): Promise<Boolean>;
|
4
|
+
/**
|
5
|
+
* 그리드 컬럼
|
6
|
+
* @param entityColumns
|
7
|
+
*/
|
8
|
+
createGridColumns(entityColumns: EntityColumn[]): string[];
|
9
|
+
/**
|
10
|
+
* 검색 컬럼
|
11
|
+
* @param entityColumns
|
12
|
+
*/
|
13
|
+
createSearchCols(entityColumns: EntityColumn[]): string[];
|
14
|
+
/**
|
15
|
+
* 그리드 정렬
|
16
|
+
* @param entityColumns
|
17
|
+
* @returns
|
18
|
+
*/
|
19
|
+
createSortCols(entityColumns: EntityColumn[]): string[];
|
20
|
+
/**
|
21
|
+
* 메뉴 데이터 생성
|
22
|
+
* @param tx
|
23
|
+
* @param domain
|
24
|
+
* @param user
|
25
|
+
* @param parent_menu_id
|
26
|
+
* @param name
|
27
|
+
* @param pageTemplate
|
28
|
+
*/
|
29
|
+
createMenuData(tx: any, domain: any, user: any, parent_menu_id: string, name: string, pageTemplate: string): Promise<void>;
|
30
|
+
/**
|
31
|
+
* json 모델 암호화
|
32
|
+
* @param template
|
33
|
+
* @returns
|
34
|
+
*/
|
35
|
+
enc(template: string): string;
|
36
|
+
}
|
@@ -220,6 +220,7 @@ let OperatoToolCreateMenu = class OperatoToolCreateMenu {
|
|
220
220
|
return encResults.join('h1z0q9i9x7q6');
|
221
221
|
}
|
222
222
|
};
|
223
|
+
exports.OperatoToolCreateMenu = OperatoToolCreateMenu;
|
223
224
|
tslib_1.__decorate([
|
224
225
|
(0, type_graphql_1.Directive)('@transaction'),
|
225
226
|
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Operato Tool Create Menu' }),
|
@@ -230,10 +231,9 @@ tslib_1.__decorate([
|
|
230
231
|
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
231
232
|
tslib_1.__metadata("design:returntype", Promise)
|
232
233
|
], OperatoToolCreateMenu.prototype, "toolCreateMenu", null);
|
233
|
-
OperatoToolCreateMenu = tslib_1.__decorate([
|
234
|
+
exports.OperatoToolCreateMenu = OperatoToolCreateMenu = tslib_1.__decorate([
|
234
235
|
(0, type_graphql_1.Resolver)()
|
235
236
|
], OperatoToolCreateMenu);
|
236
|
-
exports.OperatoToolCreateMenu = OperatoToolCreateMenu;
|
237
237
|
const modelTemplate = `
|
238
238
|
{
|
239
239
|
"menu": {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"create-menu.js","sourceRoot":"","sources":["../../../server/service/tool-entity/create-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Mutation, Directive, Resolver } from 'type-graphql'\nimport { Entity, EntityColumn } from '@things-factory/resource-base'\nimport { Menu } from '@things-factory/menu-base'\nconst { camelCase, startCase, snakeCase, kebabCase } = require('lodash')\nconst { plural } = require('pluralize')\nimport crypto from 'crypto'\n\n@Resolver()\nexport class OperatoToolCreateMenu {\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'Operato Tool Create Menu' })\n async toolCreateMenu(@Arg('id') id: string, @Arg('parent_menu_id') parent_menu_id: string, @Ctx() context: any): Promise<Boolean> {\n const { domain, user, tx } = context.state\n\n // Entity 조회\n const entity: Entity = await tx.getRepository(Entity).findOne({\n where: {\n domain: { id: domain.id },\n id\n }\n })\n\n // Entity 컬럼 조회\n const entityColumns: EntityColumn[] = await tx.getRepository(EntityColumn).find({\n where: {\n domain: { id: domain.id },\n entity: { id: entity.id }\n }\n })\n\n let { name = '' } = entity || {}\n let serviceName: string = kebabCase(name)\n\n // 이름 치환 (타이틀 , grapql 관련 서비스 )\n let pageTemplate = modelTemplate\n .replace(/{{pascalCase name}}/g, startCase(camelCase(name)).replace(/ /g, ''))\n .replace(/{{camelCase name}}/g, camelCase(name))\n .replace(/{{snakeCase name}}/g, snakeCase(name))\n .replace(/{{pluralPascalCase name}}/g, startCase(camelCase(plural(name))).replace(/ /g, ''))\n .replace(/{{pluralCamelCase name}}/g, camelCase(plural(name)))\n .replace(/{{name}}/g, name)\n\n // 이력조회 버튼 추가\n let historyButton = ''\n if (entity.dataProp == 'JSON') {\n historyButton = `\n {\n \"name\": \"history\",\n \"type\": \"basic\",\n \"label\": \"data_history\",\n \"icon\": \"history\",\n \"logic\": \"history_json\"\n }\n `\n } else if (entity.dataProp == 'COPY') {\n historyButton = `\n {\n \"name\": \"history\",\n \"type\": \"basic\",\n \"label\": \"data_history\",\n \"icon\": \"history\",\n \"logic\": \"history_copy\"\n }\n `\n }\n pageTemplate = pageTemplate.replace(/{{HistoryButton}}/g, historyButton)\n\n // 그리드 정렬\n let sortColumns = this.createSortCols(entityColumns)\n pageTemplate = pageTemplate.replace(/{{SortColumns}}/g, sortColumns.join(','))\n\n // 검색 필드\n let searchColumns = this.createSearchCols(entityColumns)\n pageTemplate = pageTemplate.replace(/{{SearchColumns}}/g, searchColumns.join(','))\n\n // 그리드 컬럼\n let gridColumns = this.createGridColumns(entityColumns)\n pageTemplate = pageTemplate.replace(/{{GridColumns}}/g, gridColumns.join(','))\n\n // 암호화\n pageTemplate = this.enc(pageTemplate)\n\n // 메뉴 생성\n await this.createMenuData(tx, domain, user, parent_menu_id, serviceName, pageTemplate)\n return true\n }\n\n /**\n * 그리드 컬럼\n * @param entityColumns\n */\n createGridColumns(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.name != 'id' && x.gridRank > 0)\n .sort(function (a, b) {\n return a.gridRank - b.gridRank\n })\n .map(x => {\n let { gridEditor = 'string', name, term, gridWidth = 0, gridAlign = 'left', nullable = false } = x\n if (gridEditor == null) gridEditor = 'string'\n if (gridAlign == null) gridAlign = 'left'\n\n // 생성 자 수정 자 기본 값\n if (name == 'updater_id' || name == 'creator_id') {\n name = name == 'updater_id' ? 'updater' : 'creator'\n return `{\"type\": \"object\",\"name\": \"${name}\",\"header\": \"${name}\",\"width\": 100,\"editable\":false, \"align\": \"center\",\"object_opt\":{\"queryName\":\"users\"}}`\n }\n // 생성 시간 수정 시간 기본 값\n if (name == 'updated_at' || name == 'created_at') {\n return `{\"type\": \"datetime\",\"name\": \"${name == 'updated_at' ? 'updatedAt' : 'createdAt'}\",\"header\": \"${name}\",\"width\": 160,\"editable\":false, \"align\": \"center\"}`\n }\n\n // 읽기 / 숨김 필드는 수정 불가\n let editable = gridEditor == 'readonly' || gridEditor == 'hidden' ? false : true\n // 히든 필드\n let hidden = gridEditor == 'hidden' ? true : false\n if (hidden == true || editable == false) {\n // 히든 필드는 문자열로 변환 숨김\n gridEditor = 'string'\n }\n\n let colTxt = `{\"type\": \"${gridEditor}\",\"name\": \"${camelCase(\n name\n )}\",\"header\": \"${term}\",\"hidden\":${hidden} ,\"editable\": ${editable},\"mandatory\": ${!nullable},\"sortable\":true ,\"align\": \"${gridAlign}\",\"width\":${gridWidth} ,\"exportable\": true`\n\n // 참조 타입이 공통 코드\n if (x.refType == 'code') {\n colTxt = colTxt + `,\"select_opt\":{\"type\":\"code\",\"name\":\"${x.refName}\"}`\n }\n\n // 참조 타입이 시나리오\n if (x.refType == 'scenario') {\n colTxt = colTxt + `,\"select_opt\":{\"type\":\"scenario\",\"name\":\"${x.refName}\"}`\n }\n\n // 참조 타입이 엔티티\n if (x.refType == 'entity') {\n colTxt = colTxt + `,\"select_opt\":{\"type\": \"entity\",\"args\": {\"queryName\": \"${camelCase(plural(x.refName))}\",\"codeField\": \"id\",\"dispField\": \"name\"}}`\n }\n colTxt = colTxt + '}'\n return colTxt\n })\n }\n\n /**\n * 검색 컬럼\n * @param entityColumns\n */\n createSearchCols(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.searchRank > 0)\n .sort(function (a, b) {\n return a.searchRank - b.searchRank\n })\n .map(x => {\n let operator = x.searchOper\n\n if (operator == 'filter') {\n return `\"${camelCase(x.name)}\"`\n }\n\n if (!operator) operator = 'eq'\n return `{\"name\": \"${camelCase(x.name)}\",\"operator\": \"${operator}\"}`\n })\n }\n\n /**\n * 그리드 정렬\n * @param entityColumns\n * @returns\n */\n createSortCols(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.sortRank > 0)\n .sort(function (a, b) {\n return a.sortRank - b.sortRank\n })\n .map(x => {\n return `{\"name\":\"${camelCase(x.name)}\",\"desc\":${x.reverseSort}}`\n })\n }\n\n /**\n * 메뉴 데이터 생성\n * @param tx\n * @param domain\n * @param user\n * @param parent_menu_id\n * @param name\n * @param pageTemplate\n */\n async createMenuData(tx: any, domain: any, user: any, parent_menu_id: string, name: string, pageTemplate: string) {\n // 상위 메뉴\n let parentMenu = await tx.getRepository(Menu).findOne({\n where: {\n domain: { id: domain.id },\n id: parent_menu_id\n }\n })\n\n // 메뉴 랭크\n let menuRank = await tx.getRepository(Menu).query(`select coalesce(max(rank),0) as rank from menus where parent_id = '${parent_menu_id}' or id = '${parent_menu_id}'`)\n let rank = menuRank[0].rank + 10\n\n // 메뉴 저장\n let menu: Menu = new Menu()\n menu.name = name\n menu.menuType = 'SCREEN'\n menu.category = 'meta-grist-page'\n menu.rank = rank\n menu.hiddenFlag = false\n menu.routing = name\n menu.template = pageTemplate\n menu.resourceUrl = '@things-factory/meta-ui/client/pages/meta-grist-page'\n menu.parent = parentMenu\n\n await tx.getRepository(Menu).save({\n ...menu,\n domain,\n creator: user,\n updater: user\n })\n }\n\n /**\n * json 모델 암호화\n * @param template\n * @returns\n */\n enc(template: string) {\n let jsonStr = JSON.stringify(template)\n let templates = jsonStr.split(/(.{100})/).filter(O => O)\n let filters = ['aes-256-ecb', 'aes-256-cbc', 'aes-256-cfb', 'aes-256-cfb8', 'aes-256-cfb1', 'aes-256-ofb', 'aes-256-ctr', 'aes256']\n let salt = crypto.randomBytes(32).toString('hex')\n let hexKey = Buffer.from(salt, 'hex')\n let ivBase = salt.substring(0, 16)\n let iv = ['', ivBase, ivBase, ivBase, ivBase, ivBase, ivBase, ivBase]\n let filterIdx = 0\n let encResults = []\n encResults.push(salt)\n\n for (var i = 0; i < templates.length; i++, filterIdx++) {\n if (filterIdx == filters.length) filterIdx = 0\n\n let cipher = crypto.createCipheriv(filters[filterIdx], hexKey, iv[filterIdx])\n let encrypted = cipher.update(templates[i], 'utf8', 'hex')\n encrypted += cipher.final('hex')\n encResults.push(encrypted)\n }\n\n return encResults.join('h1z0q9i9x7q6')\n }\n}\n\nconst modelTemplate = `\n{\n \"menu\": {\n \"title\": \"{{name}}\",\n \"name\": \"\",\n \"desc\": \"\"\n },\n \"gql\": {\n \"query\": {\n \"list_func\": \"{{pluralCamelCase name}}\",\n \"find_one_func\":\"{{camelCase name}}\"\n },\n \"mutation\":{\n \"multiple\":{\n \"func\":\"updateMultiple{{pascalCase name}}\",\n \"type\": \"{{pascalCase name}}Patch\"\n },\n \"delete\":{\n \"func\":\"delete{{pluralPascalCase name}}\"\n }\n }\n },\n \"button\": [\n {\n \"name\":\"export\"\n },\n {\n \"name\":\"add\"\n },\n {\n \"name\":\"delete\"\n },\n {\n \"name\":\"save\"\n }\n ],\n \"grid_column\": [\n {\n \"type\": \"string\",\n \"name\": \"id\",\n \"header\": \"id\",\n \"hidden\": true,\n \"editable\": false,\n \"mandatory\": false,\n \"sortable\": false,\n \"align\": \"left\",\n \"width\": 0,\n \"exportable\": false\n },\n{{GridColumns}}\n ],\n \"grid\": {\n \"button\":[\n {{HistoryButton}}\n ],\n \"option\": {\n \"mobile_mode\": \"LIST\",\n \"desk_mode\": \"GRID\",\n \"use_row_checker\": true,\n \"pages\": [\n 20,\n 50,\n 100,\n 300\n ],\n \"view_mode\": [\n \"GRID\",\n \"LIST\",\n \"CARD\"\n ],\n \"sorters\": [\n{{SortColumns}}\n ]\n },\n \"row\": {\n \"multiple_select\": true,\n \"click\": \"select-row-toggle\"\n }\n },\n \"search\": [\n{{SearchColumns}}\n ]\n}\n`\n"]}
|
1
|
+
{"version":3,"file":"create-menu.js","sourceRoot":"","sources":["../../../server/service/tool-entity/create-menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Mutation, Directive, Resolver } from 'type-graphql'\nimport { Entity, EntityColumn } from '@things-factory/resource-base'\nimport { Menu } from '@things-factory/menu-base'\nconst { camelCase, startCase, snakeCase, kebabCase } = require('lodash')\nconst { plural } = require('pluralize')\nimport crypto from 'crypto'\n\n@Resolver()\nexport class OperatoToolCreateMenu {\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'Operato Tool Create Menu' })\n async toolCreateMenu(@Arg('id') id: string, @Arg('parent_menu_id') parent_menu_id: string, @Ctx() context: any): Promise<Boolean> {\n const { domain, user, tx } = context.state\n\n // Entity 조회\n const entity: Entity = await tx.getRepository(Entity).findOne({\n where: {\n domain: { id: domain.id },\n id\n }\n })\n\n // Entity 컬럼 조회\n const entityColumns: EntityColumn[] = await tx.getRepository(EntityColumn).find({\n where: {\n domain: { id: domain.id },\n entity: { id: entity.id }\n }\n })\n\n let { name = '' } = entity || {}\n let serviceName: string = kebabCase(name)\n\n // 이름 치환 (타이틀 , grapql 관련 서비스 )\n let pageTemplate = modelTemplate\n .replace(/{{pascalCase name}}/g, startCase(camelCase(name)).replace(/ /g, ''))\n .replace(/{{camelCase name}}/g, camelCase(name))\n .replace(/{{snakeCase name}}/g, snakeCase(name))\n .replace(/{{pluralPascalCase name}}/g, startCase(camelCase(plural(name))).replace(/ /g, ''))\n .replace(/{{pluralCamelCase name}}/g, camelCase(plural(name)))\n .replace(/{{name}}/g, name)\n\n // 이력조회 버튼 추가\n let historyButton = ''\n if (entity.dataProp == 'JSON') {\n historyButton = `\n {\n \"name\": \"history\",\n \"type\": \"basic\",\n \"label\": \"data_history\",\n \"icon\": \"history\",\n \"logic\": \"history_json\"\n }\n `\n } else if (entity.dataProp == 'COPY') {\n historyButton = `\n {\n \"name\": \"history\",\n \"type\": \"basic\",\n \"label\": \"data_history\",\n \"icon\": \"history\",\n \"logic\": \"history_copy\"\n }\n `\n }\n pageTemplate = pageTemplate.replace(/{{HistoryButton}}/g, historyButton)\n\n // 그리드 정렬\n let sortColumns = this.createSortCols(entityColumns)\n pageTemplate = pageTemplate.replace(/{{SortColumns}}/g, sortColumns.join(','))\n\n // 검색 필드\n let searchColumns = this.createSearchCols(entityColumns)\n pageTemplate = pageTemplate.replace(/{{SearchColumns}}/g, searchColumns.join(','))\n\n // 그리드 컬럼\n let gridColumns = this.createGridColumns(entityColumns)\n pageTemplate = pageTemplate.replace(/{{GridColumns}}/g, gridColumns.join(','))\n\n // 암호화\n pageTemplate = this.enc(pageTemplate)\n\n // 메뉴 생성\n await this.createMenuData(tx, domain, user, parent_menu_id, serviceName, pageTemplate)\n return true\n }\n\n /**\n * 그리드 컬럼\n * @param entityColumns\n */\n createGridColumns(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.name != 'id' && x.gridRank > 0)\n .sort(function (a, b) {\n return a.gridRank - b.gridRank\n })\n .map(x => {\n let { gridEditor = 'string', name, term, gridWidth = 0, gridAlign = 'left', nullable = false } = x\n if (gridEditor == null) gridEditor = 'string'\n if (gridAlign == null) gridAlign = 'left'\n\n // 생성 자 수정 자 기본 값\n if (name == 'updater_id' || name == 'creator_id') {\n name = name == 'updater_id' ? 'updater' : 'creator'\n return `{\"type\": \"object\",\"name\": \"${name}\",\"header\": \"${name}\",\"width\": 100,\"editable\":false, \"align\": \"center\",\"object_opt\":{\"queryName\":\"users\"}}`\n }\n // 생성 시간 수정 시간 기본 값\n if (name == 'updated_at' || name == 'created_at') {\n return `{\"type\": \"datetime\",\"name\": \"${name == 'updated_at' ? 'updatedAt' : 'createdAt'}\",\"header\": \"${name}\",\"width\": 160,\"editable\":false, \"align\": \"center\"}`\n }\n\n // 읽기 / 숨김 필드는 수정 불가\n let editable = gridEditor == 'readonly' || gridEditor == 'hidden' ? false : true\n // 히든 필드\n let hidden = gridEditor == 'hidden' ? true : false\n if (hidden == true || editable == false) {\n // 히든 필드는 문자열로 변환 숨김\n gridEditor = 'string'\n }\n\n let colTxt = `{\"type\": \"${gridEditor}\",\"name\": \"${camelCase(\n name\n )}\",\"header\": \"${term}\",\"hidden\":${hidden} ,\"editable\": ${editable},\"mandatory\": ${!nullable},\"sortable\":true ,\"align\": \"${gridAlign}\",\"width\":${gridWidth} ,\"exportable\": true`\n\n // 참조 타입이 공통 코드\n if (x.refType == 'code') {\n colTxt = colTxt + `,\"select_opt\":{\"type\":\"code\",\"name\":\"${x.refName}\"}`\n }\n\n // 참조 타입이 시나리오\n if (x.refType == 'scenario') {\n colTxt = colTxt + `,\"select_opt\":{\"type\":\"scenario\",\"name\":\"${x.refName}\"}`\n }\n\n // 참조 타입이 엔티티\n if (x.refType == 'entity') {\n colTxt = colTxt + `,\"select_opt\":{\"type\": \"entity\",\"args\": {\"queryName\": \"${camelCase(plural(x.refName))}\",\"codeField\": \"id\",\"dispField\": \"name\"}}`\n }\n colTxt = colTxt + '}'\n return colTxt\n })\n }\n\n /**\n * 검색 컬럼\n * @param entityColumns\n */\n createSearchCols(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.searchRank > 0)\n .sort(function (a, b) {\n return a.searchRank - b.searchRank\n })\n .map(x => {\n let operator = x.searchOper\n\n if (operator == 'filter') {\n return `\"${camelCase(x.name)}\"`\n }\n\n if (!operator) operator = 'eq'\n return `{\"name\": \"${camelCase(x.name)}\",\"operator\": \"${operator}\"}`\n })\n }\n\n /**\n * 그리드 정렬\n * @param entityColumns\n * @returns\n */\n createSortCols(entityColumns: EntityColumn[]) {\n return entityColumns\n .filter(x => x.sortRank > 0)\n .sort(function (a, b) {\n return a.sortRank - b.sortRank\n })\n .map(x => {\n return `{\"name\":\"${camelCase(x.name)}\",\"desc\":${x.reverseSort}}`\n })\n }\n\n /**\n * 메뉴 데이터 생성\n * @param tx\n * @param domain\n * @param user\n * @param parent_menu_id\n * @param name\n * @param pageTemplate\n */\n async createMenuData(tx: any, domain: any, user: any, parent_menu_id: string, name: string, pageTemplate: string) {\n // 상위 메뉴\n let parentMenu = await tx.getRepository(Menu).findOne({\n where: {\n domain: { id: domain.id },\n id: parent_menu_id\n }\n })\n\n // 메뉴 랭크\n let menuRank = await tx.getRepository(Menu).query(`select coalesce(max(rank),0) as rank from menus where parent_id = '${parent_menu_id}' or id = '${parent_menu_id}'`)\n let rank = menuRank[0].rank + 10\n\n // 메뉴 저장\n let menu: Menu = new Menu()\n menu.name = name\n menu.menuType = 'SCREEN'\n menu.category = 'meta-grist-page'\n menu.rank = rank\n menu.hiddenFlag = false\n menu.routing = name\n menu.template = pageTemplate\n menu.resourceUrl = '@things-factory/meta-ui/client/pages/meta-grist-page'\n menu.parent = parentMenu\n\n await tx.getRepository(Menu).save({\n ...menu,\n domain,\n creator: user,\n updater: user\n })\n }\n\n /**\n * json 모델 암호화\n * @param template\n * @returns\n */\n enc(template: string) {\n let jsonStr = JSON.stringify(template)\n let templates = jsonStr.split(/(.{100})/).filter(O => O)\n let filters = ['aes-256-ecb', 'aes-256-cbc', 'aes-256-cfb', 'aes-256-cfb8', 'aes-256-cfb1', 'aes-256-ofb', 'aes-256-ctr', 'aes256']\n let salt = crypto.randomBytes(32).toString('hex')\n let hexKey = Buffer.from(salt, 'hex')\n let ivBase = salt.substring(0, 16)\n let iv = ['', ivBase, ivBase, ivBase, ivBase, ivBase, ivBase, ivBase]\n let filterIdx = 0\n let encResults = []\n encResults.push(salt)\n\n for (var i = 0; i < templates.length; i++, filterIdx++) {\n if (filterIdx == filters.length) filterIdx = 0\n\n let cipher = crypto.createCipheriv(filters[filterIdx], hexKey, iv[filterIdx])\n let encrypted = cipher.update(templates[i], 'utf8', 'hex')\n encrypted += cipher.final('hex')\n encResults.push(encrypted)\n }\n\n return encResults.join('h1z0q9i9x7q6')\n }\n}\n\nconst modelTemplate = `\n{\n \"menu\": {\n \"title\": \"{{name}}\",\n \"name\": \"\",\n \"desc\": \"\"\n },\n \"gql\": {\n \"query\": {\n \"list_func\": \"{{pluralCamelCase name}}\",\n \"find_one_func\":\"{{camelCase name}}\"\n },\n \"mutation\":{\n \"multiple\":{\n \"func\":\"updateMultiple{{pascalCase name}}\",\n \"type\": \"{{pascalCase name}}Patch\"\n },\n \"delete\":{\n \"func\":\"delete{{pluralPascalCase name}}\"\n }\n }\n },\n \"button\": [\n {\n \"name\":\"export\"\n },\n {\n \"name\":\"add\"\n },\n {\n \"name\":\"delete\"\n },\n {\n \"name\":\"save\"\n }\n ],\n \"grid_column\": [\n {\n \"type\": \"string\",\n \"name\": \"id\",\n \"header\": \"id\",\n \"hidden\": true,\n \"editable\": false,\n \"mandatory\": false,\n \"sortable\": false,\n \"align\": \"left\",\n \"width\": 0,\n \"exportable\": false\n },\n{{GridColumns}}\n ],\n \"grid\": {\n \"button\":[\n {{HistoryButton}}\n ],\n \"option\": {\n \"mobile_mode\": \"LIST\",\n \"desk_mode\": \"GRID\",\n \"use_row_checker\": true,\n \"pages\": [\n 20,\n 50,\n 100,\n 300\n ],\n \"view_mode\": [\n \"GRID\",\n \"LIST\",\n \"CARD\"\n ],\n \"sorters\": [\n{{SortColumns}}\n ]\n },\n \"row\": {\n \"multiple_select\": true,\n \"click\": \"select-row-toggle\"\n }\n },\n \"search\": [\n{{SearchColumns}}\n ]\n}\n`\n"]}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
import { Entity, EntityColumn } from '@things-factory/resource-base';
|
2
|
+
export declare class OperatoToolCreateService {
|
3
|
+
toolCreateService(id: string, context: any): Promise<Boolean>;
|
4
|
+
/**
|
5
|
+
* 서비스 연관 파일 생성
|
6
|
+
* @param appRootPath
|
7
|
+
* @param moduleName
|
8
|
+
* @param name
|
9
|
+
* @param serviceName
|
10
|
+
* @param entity
|
11
|
+
* @param entityColumns
|
12
|
+
*/
|
13
|
+
createServiceFiles(appRootPath: string, moduleName: string, name: string, serviceName: string, entity: Entity, entityColumns: EntityColumn[]): Promise<void>;
|
14
|
+
createHistoryServiceFiles(servicePath: string, serviceName: string, entity: Entity, entityColumns: EntityColumn[], nameMap: any): Promise<void>;
|
15
|
+
createNoHistoryServiceFiels(servicePath: string, serviceName: string, entity: Entity, entityColumns: EntityColumn[], nameMap: any): Promise<void>;
|
16
|
+
/**
|
17
|
+
* 엔티티 타입 텍스트
|
18
|
+
* @param entityColumns
|
19
|
+
* @returns
|
20
|
+
*/
|
21
|
+
createTypeText(entityColumns: EntityColumn[]): string;
|
22
|
+
/**
|
23
|
+
* 엔티티 생성 텍스트
|
24
|
+
* @param entity
|
25
|
+
* @param entityColumns
|
26
|
+
* @returns
|
27
|
+
*/
|
28
|
+
createEntityText(entity: Entity, entityColumns: EntityColumn[]): string;
|
29
|
+
/**
|
30
|
+
* 이력관리 엔티티 생성 텍스트
|
31
|
+
* @param entity
|
32
|
+
* @param entityColumns
|
33
|
+
* @returns
|
34
|
+
*/
|
35
|
+
createHistoryEntityText(entity: Entity, entityColumns: EntityColumn[]): string;
|
36
|
+
/**
|
37
|
+
* EntityColumn to entity column Text
|
38
|
+
* @param column
|
39
|
+
* @returns
|
40
|
+
*/
|
41
|
+
columnToEntityColumn(column: EntityColumn): string;
|
42
|
+
getFieldType(column: EntityColumn): string;
|
43
|
+
getColTxtType(column: EntityColumn): string;
|
44
|
+
/**
|
45
|
+
* 파일 생성
|
46
|
+
* @param filePath
|
47
|
+
* @param fileText
|
48
|
+
* @param nameMap
|
49
|
+
*/
|
50
|
+
writeFile(filePath: string, fileText: string, nameMap: any): Promise<void>;
|
51
|
+
/**
|
52
|
+
* 문자열 치환
|
53
|
+
* @param text
|
54
|
+
* @param nameMap
|
55
|
+
* @returns
|
56
|
+
*/
|
57
|
+
replaceNamesMap(text: string, nameMap: any): string;
|
58
|
+
/**
|
59
|
+
* 서비스 경로 만들기
|
60
|
+
* @param appRootPath
|
61
|
+
* @param moduleName
|
62
|
+
* @param serviceName
|
63
|
+
*/
|
64
|
+
createServicePath(appRootPath: string, moduleName: string, serviceName: string): Promise<void>;
|
65
|
+
/**
|
66
|
+
* 프로젝트 Root Path 구하기
|
67
|
+
* @returns String
|
68
|
+
*/
|
69
|
+
getProjectRootPath(): string;
|
70
|
+
/**
|
71
|
+
* 디렉토리 생성
|
72
|
+
* @param path
|
73
|
+
*/
|
74
|
+
createDir(path: string): Promise<void>;
|
75
|
+
/**
|
76
|
+
* Path 존재 여부
|
77
|
+
* @param path
|
78
|
+
* @returns
|
79
|
+
*/
|
80
|
+
existsPath(path: string): Promise<any>;
|
81
|
+
}
|
@@ -11,13 +11,13 @@ const fs = require('fs');
|
|
11
11
|
let OperatoToolCreateService = class OperatoToolCreateService {
|
12
12
|
async toolCreateService(id, context) {
|
13
13
|
const { domain } = context.state;
|
14
|
-
// Entity 조회
|
14
|
+
// Entity 조회
|
15
15
|
const entity = await (0, shell_1.getRepository)(resource_base_1.Entity).findOne({
|
16
16
|
where: {
|
17
17
|
id
|
18
18
|
}
|
19
19
|
});
|
20
|
-
// Entity 컬럼 조회
|
20
|
+
// Entity 컬럼 조회
|
21
21
|
const entityColumns = await (0, shell_1.getRepository)(resource_base_1.EntityColumn).find({
|
22
22
|
where: {
|
23
23
|
domain: { id: domain.id },
|
@@ -25,12 +25,12 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
25
25
|
}
|
26
26
|
});
|
27
27
|
let { name = '', bundle = '' } = entity || {};
|
28
|
-
// 프로젝트 Root Path 구하기
|
28
|
+
// 프로젝트 Root Path 구하기
|
29
29
|
let appRootPath = this.getProjectRootPath();
|
30
30
|
let serviceName = kebabCase(name);
|
31
|
-
// 서비스 경로 생성
|
31
|
+
// 서비스 경로 생성
|
32
32
|
await this.createServicePath(appRootPath, bundle, serviceName);
|
33
|
-
// 서비스 파일 생성
|
33
|
+
// 서비스 파일 생성
|
34
34
|
await this.createServiceFiles(appRootPath, bundle, name, serviceName, entity, entityColumns);
|
35
35
|
return true;
|
36
36
|
}
|
@@ -44,7 +44,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
44
44
|
* @param entityColumns
|
45
45
|
*/
|
46
46
|
async createServiceFiles(appRootPath, moduleName, name, serviceName, entity, entityColumns) {
|
47
|
-
// 이름 케이스 워드 만들기
|
47
|
+
// 이름 케이스 워드 만들기
|
48
48
|
let nameMap = {
|
49
49
|
name: serviceName,
|
50
50
|
tableName: entity.tableName,
|
@@ -63,7 +63,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
63
63
|
}
|
64
64
|
}
|
65
65
|
async createHistoryServiceFiles(servicePath, serviceName, entity, entityColumns, nameMap) {
|
66
|
-
// 서비스 연관 파일 생성
|
66
|
+
// 서비스 연관 파일 생성
|
67
67
|
await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceHistoryIndex, nameMap);
|
68
68
|
// Entity
|
69
69
|
let entityText = this.createEntityText(entity, entityColumns);
|
@@ -73,13 +73,12 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
73
73
|
// TYPE
|
74
74
|
let typeText = this.createTypeText(entityColumns);
|
75
75
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap);
|
76
|
-
// 이력관리 entity 생성
|
76
|
+
// 이력관리 entity 생성
|
77
77
|
let historyText = this.createHistoryEntityText(entity, entityColumns);
|
78
78
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-history.ts`, historyText, nameMap);
|
79
79
|
let entitySubscriberEntityToJson = '';
|
80
80
|
if (entity.dataProp == 'JSON') {
|
81
|
-
entitySubscriberEntityToJson =
|
82
|
-
`
|
81
|
+
entitySubscriberEntityToJson = `
|
83
82
|
public createHistoryEntity(manager, entity) {
|
84
83
|
let history = manager.create(this.historyEntity, entity);
|
85
84
|
history.historyJson = JSON.stringify(entity);
|
@@ -98,7 +97,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
98
97
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-history-type.ts`, sereviceHistoryType, nameMap);
|
99
98
|
// 전체 서비스 index.ts 파일
|
100
99
|
let allServiceIdxPath = servicePath + 'index.ts';
|
101
|
-
if (await this.existsPath(allServiceIdxPath) == false) {
|
100
|
+
if ((await this.existsPath(allServiceIdxPath)) == false) {
|
102
101
|
await this.writeFile(allServiceIdxPath, allIndex, nameMap);
|
103
102
|
}
|
104
103
|
let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8');
|
@@ -123,7 +122,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
123
122
|
await this.writeFile(allServiceIdxPath, allIdxFileTxt, nameMap);
|
124
123
|
}
|
125
124
|
async createNoHistoryServiceFiels(servicePath, serviceName, entity, entityColumns, nameMap) {
|
126
|
-
// 서비스 연관 파일 생성
|
125
|
+
// 서비스 연관 파일 생성
|
127
126
|
await this.writeFile(servicePath + `${serviceName}/index.ts`, serviceIndex, nameMap);
|
128
127
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-query.ts`, serviceQuery, nameMap);
|
129
128
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-mutation.ts`, serviceMutation, nameMap);
|
@@ -135,7 +134,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
135
134
|
await this.writeFile(servicePath + `${serviceName}/${serviceName}-type.ts`, typeText, nameMap);
|
136
135
|
// 전체 서비스 index.ts 파일
|
137
136
|
let allServiceIdxPath = servicePath + 'index.ts';
|
138
|
-
if (await this.existsPath(allServiceIdxPath) == false) {
|
137
|
+
if ((await this.existsPath(allServiceIdxPath)) == false) {
|
139
138
|
await this.writeFile(allServiceIdxPath, allIndex, nameMap);
|
140
139
|
}
|
141
140
|
let allIdxFileTxt = await fs.readFileSync(allServiceIdxPath, 'utf8');
|
@@ -178,9 +177,9 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
178
177
|
let colName = camelCase(column.name);
|
179
178
|
let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`;
|
180
179
|
let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`;
|
181
|
-
return
|
180
|
+
return ' ' + fieldAnn + '\n ' + columnTxt + '\n';
|
182
181
|
});
|
183
|
-
typeText = typeText.replace(/{{newTypeColumns}}/g, newTypeColumns.join(
|
182
|
+
typeText = typeText.replace(/{{newTypeColumns}}/g, newTypeColumns.join('\n'));
|
184
183
|
let patchTypeColumns = entityColumns.map(column => {
|
185
184
|
if (column.name == 'id')
|
186
185
|
return '';
|
@@ -201,9 +200,9 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
201
200
|
let colName = camelCase(column.name);
|
202
201
|
let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`;
|
203
202
|
let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`;
|
204
|
-
return
|
203
|
+
return ' ' + fieldAnn + '\n ' + columnTxt + '\n';
|
205
204
|
});
|
206
|
-
typeText = typeText.replace(/{{patchTypeColumns}}/g, patchTypeColumns.join(
|
205
|
+
typeText = typeText.replace(/{{patchTypeColumns}}/g, patchTypeColumns.join('\n'));
|
207
206
|
return typeText;
|
208
207
|
}
|
209
208
|
/**
|
@@ -218,7 +217,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
218
217
|
let sortedCols = entityColumns.sort(function (a, b) {
|
219
218
|
return a.rank - b.rank;
|
220
219
|
});
|
221
|
-
// 컬럼 정보 txt 변환
|
220
|
+
// 컬럼 정보 txt 변환
|
222
221
|
let entityColsText = sortedCols.map(x => {
|
223
222
|
return this.columnToEntityColumn(x);
|
224
223
|
});
|
@@ -228,10 +227,12 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
228
227
|
@Field({ nullable: true })
|
229
228
|
dataRevisionNo?: number = 1`);
|
230
229
|
}
|
231
|
-
entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join(
|
230
|
+
entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\n'));
|
232
231
|
// index 정보
|
233
232
|
let indexAnn = ``;
|
234
|
-
let sortedIdxCols = entityColumns
|
233
|
+
let sortedIdxCols = entityColumns
|
234
|
+
.filter(x => x.uniqRank && x.uniqRank > 0)
|
235
|
+
.sort(function (a, b) {
|
235
236
|
return a.uniqRank - b.uniqRank;
|
236
237
|
});
|
237
238
|
if (sortedIdxCols.length > 0) {
|
@@ -246,7 +247,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
246
247
|
colName = 'updater';
|
247
248
|
return '{{camelCase name}}.' + camelCase(colName);
|
248
249
|
});
|
249
|
-
indexAnn = indexAnn.replace(/{{indexColumns}}/g, idxColumns.join(
|
250
|
+
indexAnn = indexAnn.replace(/{{indexColumns}}/g, idxColumns.join(','));
|
250
251
|
}
|
251
252
|
entityText = entityText.replace(/{{indexAnn}}/g, indexAnn);
|
252
253
|
return entityText;
|
@@ -263,11 +264,11 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
263
264
|
let sortedCols = entityColumns.sort(function (a, b) {
|
264
265
|
return a.rank - b.rank;
|
265
266
|
});
|
266
|
-
// 컬럼 정보 txt 변환
|
267
|
+
// 컬럼 정보 txt 변환
|
267
268
|
let entityColsText = sortedCols.map(x => {
|
268
269
|
return this.columnToEntityColumn(x);
|
269
270
|
});
|
270
|
-
entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join(
|
271
|
+
entityText = entityText.replace(/{{entityColumns}}/g, entityColsText.join('\n'));
|
271
272
|
return entityText;
|
272
273
|
}
|
273
274
|
/**
|
@@ -298,15 +299,17 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
298
299
|
if (column.colType == 'datetime')
|
299
300
|
colType = 'timestamp without time zone';
|
300
301
|
let colSize = '';
|
301
|
-
if (column.colType == 'string')
|
302
|
+
if (column.colType == 'string') {
|
303
|
+
//@ts-ignore
|
302
304
|
colSize = column.colSize;
|
305
|
+
}
|
303
306
|
let fieldType = this.getFieldType(column);
|
304
307
|
let colTxtType = this.getColTxtType(column);
|
305
308
|
let colName = camelCase(column.name);
|
306
309
|
let columnAnn = `@Column({name:'${column.name}', type: '${colType}', nullable: ${column.nullable} ${colSize.length == 0 ? '' : ',length:' + colSize} })`;
|
307
310
|
let fieldAnn = `@Field(${fieldType.length == 0 ? '' : 'type =>' + fieldType + ','} { nullable: ${column.nullable} })`;
|
308
311
|
let columnTxt = `${colName}${column.nullable ? '?' : ''}: ${colTxtType}`;
|
309
|
-
return
|
312
|
+
return ' ' + columnAnn + '\n ' + fieldAnn + '\n ' + columnTxt + '\n';
|
310
313
|
}
|
311
314
|
getFieldType(column) {
|
312
315
|
let fieldType = '';
|
@@ -356,7 +359,8 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
356
359
|
* @returns
|
357
360
|
*/
|
358
361
|
replaceNamesMap(text, nameMap) {
|
359
|
-
return text
|
362
|
+
return text
|
363
|
+
.replace(/{{pascalCase name}}/g, nameMap.pascalCaseName)
|
360
364
|
.replace(/{{camelCase name}}/g, nameMap.camelCaseName)
|
361
365
|
.replace(/{{snakeCase name}}/g, nameMap.snakeCaseName)
|
362
366
|
.replace(/{{pluralPascalCase name}}/g, nameMap.pluralPascalCaseName)
|
@@ -403,7 +407,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
403
407
|
* @param path
|
404
408
|
*/
|
405
409
|
async createDir(path) {
|
406
|
-
if (await this.existsPath(path) == false)
|
410
|
+
if ((await this.existsPath(path)) == false)
|
407
411
|
fs.mkdirSync(path);
|
408
412
|
}
|
409
413
|
/**
|
@@ -415,6 +419,7 @@ let OperatoToolCreateService = class OperatoToolCreateService {
|
|
415
419
|
return await fs.existsSync(path);
|
416
420
|
}
|
417
421
|
};
|
422
|
+
exports.OperatoToolCreateService = OperatoToolCreateService;
|
418
423
|
tslib_1.__decorate([
|
419
424
|
(0, type_graphql_1.Query)(returns => Boolean, { description: 'Operato Tool Create Service' }),
|
420
425
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
@@ -423,10 +428,9 @@ tslib_1.__decorate([
|
|
423
428
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
424
429
|
tslib_1.__metadata("design:returntype", Promise)
|
425
430
|
], OperatoToolCreateService.prototype, "toolCreateService", null);
|
426
|
-
OperatoToolCreateService = tslib_1.__decorate([
|
431
|
+
exports.OperatoToolCreateService = OperatoToolCreateService = tslib_1.__decorate([
|
427
432
|
(0, type_graphql_1.Resolver)()
|
428
433
|
], OperatoToolCreateService);
|
429
|
-
exports.OperatoToolCreateService = OperatoToolCreateService;
|
430
434
|
/* all service index text index.ts */
|
431
435
|
const allIndex = `
|
432
436
|
/* EXPORT ENTITY TYPES */
|
@@ -490,7 +494,7 @@ export class {{pascalCase name}}Query {
|
|
490
494
|
}
|
491
495
|
|
492
496
|
@Query(returns => {{pascalCase name}}List, { description: 'To fetch multiple {{pluralPascalCase name}}' })
|
493
|
-
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> {
|
494
498
|
const { domain } = context.state
|
495
499
|
|
496
500
|
const queryBuilder = getQueryBuilderFromListParams({
|
@@ -540,7 +544,7 @@ export class {{pascalCase name}}HistoryQuery {
|
|
540
544
|
}
|
541
545
|
|
542
546
|
@Query(returns => {{pascalCase name}}HistoryList, { description: 'To fetch multiple {{pluralPascalCase name}}History' })
|
543
|
-
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> {
|
544
548
|
const { domain } = context.state
|
545
549
|
|
546
550
|
const queryBuilder = getQueryBuilderFromListParams({
|
@@ -787,7 +791,7 @@ export class {{pascalCase name}} {
|
|
787
791
|
createForeignKeyConstraints: false,
|
788
792
|
nullable: true
|
789
793
|
})
|
790
|
-
@Field({ nullable: true })
|
794
|
+
@Field(type => User, { nullable: true })
|
791
795
|
creator?: User
|
792
796
|
|
793
797
|
@RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.creator)
|
@@ -797,7 +801,7 @@ export class {{pascalCase name}} {
|
|
797
801
|
createForeignKeyConstraints: false,
|
798
802
|
nullable: true
|
799
803
|
})
|
800
|
-
@Field({ nullable: true })
|
804
|
+
@Field(type => User, { nullable: true })
|
801
805
|
updater?: User
|
802
806
|
|
803
807
|
@RelationId(({{camelCase name}}: {{pascalCase name}}) => {{camelCase name}}.updater)
|
@@ -892,7 +896,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
892
896
|
createForeignKeyConstraints: false,
|
893
897
|
nullable: true
|
894
898
|
})
|
895
|
-
@Field({ nullable: true })
|
899
|
+
@Field(type => User, { nullable: true })
|
896
900
|
creator?: User
|
897
901
|
|
898
902
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)
|
@@ -902,7 +906,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
902
906
|
createForeignKeyConstraints: false,
|
903
907
|
nullable: true
|
904
908
|
})
|
905
|
-
@Field({ nullable: true })
|
909
|
+
@Field(type => User, { nullable: true })
|
906
910
|
updater?: User
|
907
911
|
|
908
912
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)
|
@@ -999,7 +1003,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
999
1003
|
createForeignKeyConstraints: false,
|
1000
1004
|
nullable: true
|
1001
1005
|
})
|
1002
|
-
@Field({ nullable: true })
|
1006
|
+
@Field(type => User, { nullable: true })
|
1003
1007
|
creator?: User
|
1004
1008
|
|
1005
1009
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.creator)
|
@@ -1009,7 +1013,7 @@ export class {{pascalCase name}}History implements HistoryEntityInterface<{{pas
|
|
1009
1013
|
createForeignKeyConstraints: false,
|
1010
1014
|
nullable: true
|
1011
1015
|
})
|
1012
|
-
@Field({ nullable: true })
|
1016
|
+
@Field(type => User, { nullable: true })
|
1013
1017
|
updater?: User
|
1014
1018
|
|
1015
1019
|
@RelationId(({{camelCase name}}History: {{pascalCase name}}History) => {{camelCase name}}History.updater)
|