@things-factory/operato-tools 7.0.1-beta.0 → 7.0.1-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/pages/generator/meta-generator-page.js +5 -5
- package/client/themes/app-theme.css +11 -11
- 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 +33 -29
- 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 +331 -309
|
@@ -82,7 +82,7 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
|
82
82
|
border-radius: 9px 9px 0 0;
|
|
83
83
|
border-right: 1px solid rgba(0, 0, 0, 0.4);
|
|
84
84
|
text-transform: capitalize;
|
|
85
|
-
color: var(--
|
|
85
|
+
color: var(--md-sys-color-on-primary);
|
|
86
86
|
opacity: 0.7;
|
|
87
87
|
cursor: pointer;
|
|
88
88
|
}
|
|
@@ -98,7 +98,7 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
|
98
98
|
flex-direction: column;
|
|
99
99
|
background-color: var(--md-sys-color-surface);
|
|
100
100
|
border-radius: 0 var(--border-radius) var(--border-radius) var(--border-radius);
|
|
101
|
-
border: var(--border-
|
|
101
|
+
border: var(--border-dim-color);
|
|
102
102
|
border-width: 0 1px 1px 1px;
|
|
103
103
|
box-shadow: var(--box-shadow);
|
|
104
104
|
overflow: auto;
|
|
@@ -145,7 +145,7 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
input {
|
|
148
|
-
border: var(--border-
|
|
148
|
+
border: var(--border-dim-color);
|
|
149
149
|
border-radius: var(--border-radius);
|
|
150
150
|
margin: var(--input-margin);
|
|
151
151
|
padding: var(--input-padding);
|
|
@@ -157,7 +157,7 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
|
157
157
|
flex-direction: column;
|
|
158
158
|
|
|
159
159
|
font: var(--label-font);
|
|
160
|
-
color: var(--label-color);
|
|
160
|
+
color: var(--label-color, var(--md-sys-color-on-surface));
|
|
161
161
|
}
|
|
162
162
|
input[type='checkbox'] {
|
|
163
163
|
min-width: 25px;
|
|
@@ -171,7 +171,7 @@ class MetaGeneratorPage extends MenuConfigTabMixin(
|
|
|
171
171
|
|
|
172
172
|
select {
|
|
173
173
|
border: 0;
|
|
174
|
-
border-bottom: var(--border-
|
|
174
|
+
border-bottom: var(--border-dim-color);
|
|
175
175
|
padding: var(--input-padding);
|
|
176
176
|
font: var(--input-font);
|
|
177
177
|
color: var(--primary-text-color);
|
|
@@ -4,11 +4,11 @@ body {
|
|
|
4
4
|
--primary-color: rgb(var(--primary-color-rgb));
|
|
5
5
|
--secondary-color-rgb: 57, 78, 100;
|
|
6
6
|
--secondary-color: rgb(var(--secondary-color-rgb));
|
|
7
|
-
--focus-color: var(--
|
|
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
10
|
:#f4f7fb;
|
|
11
|
-
--
|
|
11
|
+
--md-sys-color-on-primary: #fff;
|
|
12
12
|
--theme-black-color: rgba(0, 0, 0, 0.9);
|
|
13
13
|
|
|
14
14
|
--focus-background-color: var(--md-sys-color-primary);
|
|
@@ -26,7 +26,7 @@ body {
|
|
|
26
26
|
|
|
27
27
|
/* common style */
|
|
28
28
|
--border-radius: 4px;
|
|
29
|
-
--border-
|
|
29
|
+
--border-dim-color: 1px solid rgba(0, 0, 0, 0.15);
|
|
30
30
|
--border-light-color: 1px solid rgba(255, 255, 255, 0.3);
|
|
31
31
|
|
|
32
32
|
--box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.1);
|
|
@@ -69,12 +69,12 @@ body {
|
|
|
69
69
|
--icon-tiny-size: 24px;
|
|
70
70
|
--icon-default-size: 36px;
|
|
71
71
|
--icon-big-size: 48px;
|
|
72
|
-
--icon-default-color: var(--
|
|
72
|
+
--icon-default-color: var(--md-sys-color-on-primary);
|
|
73
73
|
|
|
74
74
|
/* material design component themes */
|
|
75
|
-
--mdc-theme-on-primary: var(--
|
|
75
|
+
--mdc-theme-on-primary: var(--md-sys-color-on-primary);
|
|
76
76
|
--mdc-theme-primary: var(--secondary-text-color);
|
|
77
|
-
--mdc-theme-on-secondary: var(--
|
|
77
|
+
--mdc-theme-on-secondary: var(--md-sys-color-on-primary);
|
|
78
78
|
--mdc-theme-secondary: var(--md-sys-color-primary);
|
|
79
79
|
--mdc-button-outline-color: var(--md-sys-color-primary);
|
|
80
80
|
--mdc-danger-button-primary-color: var(--status-danger-color);
|
|
@@ -85,9 +85,9 @@ body {
|
|
|
85
85
|
--md-fab-container-color: var(--md-sys-color-primary);
|
|
86
86
|
--md-fab-icon-color: var(--focus-color);
|
|
87
87
|
|
|
88
|
-
--md-theme-on-primary: var(--
|
|
88
|
+
--md-theme-on-primary: var(--md-sys-color-on-primary);
|
|
89
89
|
--md-theme-primary: var(--secondary-text-color);
|
|
90
|
-
--md-theme-on-secondary: var(--
|
|
90
|
+
--md-theme-on-secondary: var(--md-sys-color-on-primary);
|
|
91
91
|
--md-theme-secondary: var(--md-sys-color-primary);
|
|
92
92
|
--md-button-outline-color: var(--md-sys-color-primary);
|
|
93
93
|
--md-danger-button-primary-color: var(--status-danger-color);
|
|
@@ -98,7 +98,7 @@ body {
|
|
|
98
98
|
/* button style */
|
|
99
99
|
--button-background-color: #fafbfc;
|
|
100
100
|
--button-background-focus-color: var(--md-sys-color-primary);
|
|
101
|
-
--button-border: var(--border-
|
|
101
|
+
--button-border: var(--border-dim-color);
|
|
102
102
|
--button-border-radius: var(--border-radius);
|
|
103
103
|
--button-margin: var(--margin-default) var(--margin-default) var(--margin-default) 0;
|
|
104
104
|
--button-padding: calc(var(--padding-narrow) * 1.5) var(--padding-wide);
|
|
@@ -108,13 +108,13 @@ body {
|
|
|
108
108
|
--button-active-box-shadow: 1px 1px 1px 0px rgba(0, 0, 0, 0.2);
|
|
109
109
|
--button-activ-border: 1px solid var(--md-sys-color-primary);
|
|
110
110
|
--button-activ-background-color: var(--md-sys-color-primary);
|
|
111
|
-
--button-activ-color: var(--
|
|
111
|
+
--button-activ-color: var(--md-sys-color-on-primary);
|
|
112
112
|
--iconbtn-padding: var(--padding-narrow);
|
|
113
113
|
|
|
114
114
|
--button-primary-background-color: var(--md-sys-color-primary);
|
|
115
115
|
--button-primary-active-background-color: var(--status-success-color);
|
|
116
116
|
--button-primary-padding: var(--margin-default) var(--margin-wide);
|
|
117
|
-
--button-primary-color: var(--
|
|
117
|
+
--button-primary-color: var(--md-sys-color-on-primary);
|
|
118
118
|
--button-primary-font: bold 16px var(--theme-font);
|
|
119
119
|
|
|
120
120
|
/* table style */
|
|
@@ -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 */
|