@things-factory/operato-tools 9.0.0-beta.27 → 9.0.0-beta.29

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.
@@ -0,0 +1 @@
1
+ export * from './service';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./service"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,oDAAyB","sourcesContent":["export * from './service'\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const entities: any[];
2
+ export declare const schema: {
3
+ resolverClasses: (typeof import("./tool-entity/create-menu").OperatoToolCreateMenu | typeof import("./tool-entity/create-service").OperatoToolCreateService)[];
4
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /* EXPORT ENTITY TYPES */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.schema = exports.entities = void 0;
5
+ /* IMPORT ENTITIES AND RESOLVERS */
6
+ const tool_entity_1 = require("./tool-entity");
7
+ exports.entities = [
8
+ /* ENTITIES */
9
+ ];
10
+ exports.schema = {
11
+ resolverClasses: [
12
+ /* RESOLVER CLASSES */
13
+ ...tool_entity_1.resolvers
14
+ ]
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;AAEzB,mCAAmC;AACnC,+CAA4D;AAE/C,QAAA,QAAQ,GAAG;AACtB,cAAc;CACf,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,uBAAe;KACnB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport { resolvers as entityResolvers } from './tool-entity'\n\nexport const entities = [\n /* ENTITIES */\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...entityResolvers\n ]\n}\n"]}
@@ -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
+ }
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperatoToolCreateMenu = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const resource_base_1 = require("@things-factory/resource-base");
7
+ const menu_base_1 = require("@things-factory/menu-base");
8
+ const { camelCase, startCase, snakeCase, kebabCase } = require('lodash');
9
+ const { plural } = require('pluralize');
10
+ const crypto_1 = tslib_1.__importDefault(require("crypto"));
11
+ let OperatoToolCreateMenu = class OperatoToolCreateMenu {
12
+ async toolCreateMenu(id, parent_menu_id, context) {
13
+ const { domain, user, tx } = context.state;
14
+ // Entity 조회
15
+ const entity = await tx.getRepository(resource_base_1.Entity).findOne({
16
+ where: {
17
+ domain: { id: domain.id },
18
+ id
19
+ }
20
+ });
21
+ // Entity 컬럼 조회
22
+ const entityColumns = await tx.getRepository(resource_base_1.EntityColumn).find({
23
+ where: {
24
+ domain: { id: domain.id },
25
+ entity: { id: entity.id }
26
+ }
27
+ });
28
+ let { name = '' } = entity || {};
29
+ let serviceName = kebabCase(name);
30
+ // 이름 치환 (타이틀 , grapql 관련 서비스 )
31
+ let pageTemplate = modelTemplate
32
+ .replace(/{{pascalCase name}}/g, startCase(camelCase(name)).replace(/ /g, ''))
33
+ .replace(/{{camelCase name}}/g, camelCase(name))
34
+ .replace(/{{snakeCase name}}/g, snakeCase(name))
35
+ .replace(/{{pluralPascalCase name}}/g, startCase(camelCase(plural(name))).replace(/ /g, ''))
36
+ .replace(/{{pluralCamelCase name}}/g, camelCase(plural(name)))
37
+ .replace(/{{name}}/g, name);
38
+ // 이력조회 버튼 추가
39
+ let historyButton = '';
40
+ if (entity.dataProp == 'JSON') {
41
+ historyButton = `
42
+ {
43
+ "name": "history",
44
+ "type": "basic",
45
+ "label": "data_history",
46
+ "icon": "history",
47
+ "logic": "history_json"
48
+ }
49
+ `;
50
+ }
51
+ else if (entity.dataProp == 'COPY') {
52
+ historyButton = `
53
+ {
54
+ "name": "history",
55
+ "type": "basic",
56
+ "label": "data_history",
57
+ "icon": "history",
58
+ "logic": "history_copy"
59
+ }
60
+ `;
61
+ }
62
+ pageTemplate = pageTemplate.replace(/{{HistoryButton}}/g, historyButton);
63
+ // 그리드 정렬
64
+ let sortColumns = this.createSortCols(entityColumns);
65
+ pageTemplate = pageTemplate.replace(/{{SortColumns}}/g, sortColumns.join(','));
66
+ // 검색 필드
67
+ let searchColumns = this.createSearchCols(entityColumns);
68
+ pageTemplate = pageTemplate.replace(/{{SearchColumns}}/g, searchColumns.join(','));
69
+ // 그리드 컬럼
70
+ let gridColumns = this.createGridColumns(entityColumns);
71
+ pageTemplate = pageTemplate.replace(/{{GridColumns}}/g, gridColumns.join(','));
72
+ // 암호화
73
+ pageTemplate = this.enc(pageTemplate);
74
+ // 메뉴 생성
75
+ await this.createMenuData(tx, domain, user, parent_menu_id, serviceName, pageTemplate);
76
+ return true;
77
+ }
78
+ /**
79
+ * 그리드 컬럼
80
+ * @param entityColumns
81
+ */
82
+ createGridColumns(entityColumns) {
83
+ return entityColumns
84
+ .filter(x => x.name != 'id' && x.gridRank > 0)
85
+ .sort(function (a, b) {
86
+ return a.gridRank - b.gridRank;
87
+ })
88
+ .map(x => {
89
+ let { gridEditor = 'string', name, term, gridWidth = 0, gridAlign = 'left', nullable = false } = x;
90
+ if (gridEditor == null)
91
+ gridEditor = 'string';
92
+ if (gridAlign == null)
93
+ gridAlign = 'left';
94
+ // 생성 자 수정 자 기본 값
95
+ if (name == 'updater_id' || name == 'creator_id') {
96
+ name = name == 'updater_id' ? 'updater' : 'creator';
97
+ return `{"type": "object","name": "${name}","header": "${name}","width": 100,"editable":false, "align": "center","object_opt":{"queryName":"users"}}`;
98
+ }
99
+ // 생성 시간 수정 시간 기본 값
100
+ if (name == 'updated_at' || name == 'created_at') {
101
+ return `{"type": "datetime","name": "${name == 'updated_at' ? 'updatedAt' : 'createdAt'}","header": "${name}","width": 160,"editable":false, "align": "center"}`;
102
+ }
103
+ // 읽기 / 숨김 필드는 수정 불가
104
+ let editable = gridEditor == 'readonly' || gridEditor == 'hidden' ? false : true;
105
+ // 히든 필드
106
+ let hidden = gridEditor == 'hidden' ? true : false;
107
+ if (hidden == true || editable == false) {
108
+ // 히든 필드는 문자열로 변환 숨김
109
+ gridEditor = 'string';
110
+ }
111
+ let colTxt = `{"type": "${gridEditor}","name": "${camelCase(name)}","header": "${term}","hidden":${hidden} ,"editable": ${editable},"mandatory": ${!nullable},"sortable":true ,"align": "${gridAlign}","width":${gridWidth} ,"exportable": true`;
112
+ // 참조 타입이 공통 코드
113
+ if (x.refType == 'code') {
114
+ colTxt = colTxt + `,"select_opt":{"type":"code","name":"${x.refName}"}`;
115
+ }
116
+ // 참조 타입이 시나리오
117
+ if (x.refType == 'scenario') {
118
+ colTxt = colTxt + `,"select_opt":{"type":"scenario","name":"${x.refName}"}`;
119
+ }
120
+ // 참조 타입이 엔티티
121
+ if (x.refType == 'entity') {
122
+ colTxt = colTxt + `,"select_opt":{"type": "entity","args": {"queryName": "${camelCase(plural(x.refName))}","codeField": "id","dispField": "name"}}`;
123
+ }
124
+ colTxt = colTxt + '}';
125
+ return colTxt;
126
+ });
127
+ }
128
+ /**
129
+ * 검색 컬럼
130
+ * @param entityColumns
131
+ */
132
+ createSearchCols(entityColumns) {
133
+ return entityColumns
134
+ .filter(x => x.searchRank > 0)
135
+ .sort(function (a, b) {
136
+ return a.searchRank - b.searchRank;
137
+ })
138
+ .map(x => {
139
+ let operator = x.searchOper;
140
+ if (operator == 'filter') {
141
+ return `"${camelCase(x.name)}"`;
142
+ }
143
+ if (!operator)
144
+ operator = 'eq';
145
+ return `{"name": "${camelCase(x.name)}","operator": "${operator}"}`;
146
+ });
147
+ }
148
+ /**
149
+ * 그리드 정렬
150
+ * @param entityColumns
151
+ * @returns
152
+ */
153
+ createSortCols(entityColumns) {
154
+ return entityColumns
155
+ .filter(x => x.sortRank > 0)
156
+ .sort(function (a, b) {
157
+ return a.sortRank - b.sortRank;
158
+ })
159
+ .map(x => {
160
+ return `{"name":"${camelCase(x.name)}","desc":${x.reverseSort}}`;
161
+ });
162
+ }
163
+ /**
164
+ * 메뉴 데이터 생성
165
+ * @param tx
166
+ * @param domain
167
+ * @param user
168
+ * @param parent_menu_id
169
+ * @param name
170
+ * @param pageTemplate
171
+ */
172
+ async createMenuData(tx, domain, user, parent_menu_id, name, pageTemplate) {
173
+ // 상위 메뉴
174
+ let parentMenu = await tx.getRepository(menu_base_1.Menu).findOne({
175
+ where: {
176
+ domain: { id: domain.id },
177
+ id: parent_menu_id
178
+ }
179
+ });
180
+ // 메뉴 랭크
181
+ let menuRank = await tx.getRepository(menu_base_1.Menu).query(`select coalesce(max(rank),0) as rank from menus where parent_id = '${parent_menu_id}' or id = '${parent_menu_id}'`);
182
+ let rank = menuRank[0].rank + 10;
183
+ // 메뉴 저장
184
+ let menu = new menu_base_1.Menu();
185
+ menu.name = name;
186
+ menu.menuType = 'SCREEN';
187
+ menu.category = 'meta-grist-page';
188
+ menu.rank = rank;
189
+ menu.hiddenFlag = false;
190
+ menu.routing = name;
191
+ menu.template = pageTemplate;
192
+ menu.resourceUrl = '@things-factory/meta-ui/client/pages/meta-grist-page';
193
+ menu.parent = parentMenu;
194
+ await tx.getRepository(menu_base_1.Menu).save(Object.assign(Object.assign({}, menu), { domain, creator: user, updater: user }));
195
+ }
196
+ /**
197
+ * json 모델 암호화
198
+ * @param template
199
+ * @returns
200
+ */
201
+ enc(template) {
202
+ let jsonStr = JSON.stringify(template);
203
+ let templates = jsonStr.split(/(.{100})/).filter(O => O);
204
+ let filters = ['aes-256-ecb', 'aes-256-cbc', 'aes-256-cfb', 'aes-256-cfb8', 'aes-256-cfb1', 'aes-256-ofb', 'aes-256-ctr', 'aes256'];
205
+ let salt = crypto_1.default.randomBytes(32).toString('hex');
206
+ let hexKey = Buffer.from(salt, 'hex');
207
+ let ivBase = salt.substring(0, 16);
208
+ let iv = ['', ivBase, ivBase, ivBase, ivBase, ivBase, ivBase, ivBase];
209
+ let filterIdx = 0;
210
+ let encResults = [];
211
+ encResults.push(salt);
212
+ for (var i = 0; i < templates.length; i++, filterIdx++) {
213
+ if (filterIdx == filters.length)
214
+ filterIdx = 0;
215
+ let cipher = crypto_1.default.createCipheriv(filters[filterIdx], hexKey, iv[filterIdx]);
216
+ let encrypted = cipher.update(templates[i], 'utf8', 'hex');
217
+ encrypted += cipher.final('hex');
218
+ encResults.push(encrypted);
219
+ }
220
+ return encResults.join('h1z0q9i9x7q6');
221
+ }
222
+ };
223
+ exports.OperatoToolCreateMenu = OperatoToolCreateMenu;
224
+ tslib_1.__decorate([
225
+ (0, type_graphql_1.Directive)('@transaction'),
226
+ (0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Operato Tool Create Menu' }),
227
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
228
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('parent_menu_id')),
229
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
230
+ tslib_1.__metadata("design:type", Function),
231
+ tslib_1.__metadata("design:paramtypes", [String, String, Object]),
232
+ tslib_1.__metadata("design:returntype", Promise)
233
+ ], OperatoToolCreateMenu.prototype, "toolCreateMenu", null);
234
+ exports.OperatoToolCreateMenu = OperatoToolCreateMenu = tslib_1.__decorate([
235
+ (0, type_graphql_1.Resolver)()
236
+ ], OperatoToolCreateMenu);
237
+ const modelTemplate = `
238
+ {
239
+ "menu": {
240
+ "title": "{{name}}",
241
+ "name": "",
242
+ "desc": ""
243
+ },
244
+ "gql": {
245
+ "query": {
246
+ "list_func": "{{pluralCamelCase name}}",
247
+ "find_one_func":"{{camelCase name}}"
248
+ },
249
+ "mutation":{
250
+ "multiple":{
251
+ "func":"updateMultiple{{pascalCase name}}",
252
+ "type": "{{pascalCase name}}Patch"
253
+ },
254
+ "delete":{
255
+ "func":"delete{{pluralPascalCase name}}"
256
+ }
257
+ }
258
+ },
259
+ "button": [
260
+ {
261
+ "name":"export"
262
+ },
263
+ {
264
+ "name":"add"
265
+ },
266
+ {
267
+ "name":"delete"
268
+ },
269
+ {
270
+ "name":"save"
271
+ }
272
+ ],
273
+ "grid_column": [
274
+ {
275
+ "type": "string",
276
+ "name": "id",
277
+ "header": "id",
278
+ "hidden": true,
279
+ "editable": false,
280
+ "mandatory": false,
281
+ "sortable": false,
282
+ "align": "left",
283
+ "width": 0,
284
+ "exportable": false
285
+ },
286
+ {{GridColumns}}
287
+ ],
288
+ "grid": {
289
+ "button":[
290
+ {{HistoryButton}}
291
+ ],
292
+ "option": {
293
+ "mobile_mode": "LIST",
294
+ "desk_mode": "GRID",
295
+ "use_row_checker": true,
296
+ "pages": [
297
+ 20,
298
+ 50,
299
+ 100,
300
+ 300
301
+ ],
302
+ "view_mode": [
303
+ "GRID",
304
+ "LIST",
305
+ "CARD"
306
+ ],
307
+ "sorters": [
308
+ {{SortColumns}}
309
+ ]
310
+ },
311
+ "row": {
312
+ "multiple_select": true,
313
+ "click": "select-row-toggle"
314
+ }
315
+ },
316
+ "search": [
317
+ {{SearchColumns}}
318
+ ]
319
+ }
320
+ `;
321
+ //# sourceMappingURL=create-menu.js.map
@@ -0,0 +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"]}
@@ -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
+ }