lemon-core 4.2.6 → 4.3.0

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.
Files changed (38) hide show
  1. package/README.md +1 -0
  2. package/dist/cores/lambda/index.d.ts +1 -0
  3. package/dist/cores/lambda/index.js +6 -3
  4. package/dist/cores/lambda/index.js.map +1 -1
  5. package/dist/cores/lambda/lambda-web-handler.js.map +1 -1
  6. package/dist/cores/storage/proxy-storage-service.js +2 -1
  7. package/dist/cores/storage/proxy-storage-service.js.map +1 -1
  8. package/dist/extended/abstract-service.d.ts +4 -0
  9. package/dist/extended/abstract-service.js +4 -0
  10. package/dist/extended/abstract-service.js.map +1 -1
  11. package/dist/extended/cores/abstract-controllers.d.ts +170 -0
  12. package/dist/extended/cores/abstract-controllers.js +533 -0
  13. package/dist/extended/cores/abstract-controllers.js.map +1 -0
  14. package/dist/extended/cores/abstract-rest-apis.d.ts +141 -0
  15. package/dist/extended/cores/abstract-rest-apis.js +202 -0
  16. package/dist/extended/cores/abstract-rest-apis.js.map +1 -0
  17. package/dist/extended/cores/abstract-services.d.ts +810 -0
  18. package/dist/extended/cores/abstract-services.js +2181 -0
  19. package/dist/extended/cores/abstract-services.js.map +1 -0
  20. package/dist/extended/cores/browser-cache.d.ts +2 -0
  21. package/dist/extended/cores/browser-cache.js +34 -0
  22. package/dist/extended/cores/browser-cache.js.map +1 -0
  23. package/dist/extended/cores/commons.d.ts +129 -0
  24. package/dist/extended/cores/commons.js +185 -0
  25. package/dist/extended/cores/commons.js.map +1 -0
  26. package/dist/extended/cores/index.d.ts +15 -0
  27. package/dist/extended/cores/index.js +32 -0
  28. package/dist/extended/cores/index.js.map +1 -0
  29. package/dist/extended/cores/types.d.ts +236 -0
  30. package/dist/extended/cores/types.js +3 -0
  31. package/dist/extended/cores/types.js.map +1 -0
  32. package/dist/generated/field-registry.d.ts +4 -2
  33. package/dist/generated/field-registry.js +6 -2
  34. package/dist/generated/field-registry.js.map +1 -1
  35. package/dist/index.d.ts +8 -0
  36. package/dist/index.js +18 -1
  37. package/dist/index.js.map +1 -1
  38. package/package.json +1 -1
@@ -0,0 +1,533 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractCRUDController = exports.GeneralWEBController = exports.AbstractTransformer = void 0;
4
+ /**
5
+ * `abstract-controllers.ts`
6
+ * - pre-coded Model basic CRUD with backend-service and backend-proxy on GeneralWEBController.
7
+ *
8
+ * @author Steve <steve@lemoncloud.io>
9
+ * @date 2022-06-21 optimized w/ `abstract-services`
10
+ * @date 2022-06-24 fixed some failures.
11
+ * @date 2022-06-28 supports `doGetList` w/ search-id.
12
+ * @date 2022-08-02 use `nextId()` w/ `manager.initialNo`.
13
+ * @date 2022-08-03 improved `transformer` w/ helpers.
14
+ * @date 2022-08-09 opt w/ `session-token` in CRUD.
15
+ * @date 2022-09-21 optimized the model management.
16
+ * @date 2022-11-09 param `isCreate` in `bodyToModel`, and support `GET /<type>/<cmd>/admin`
17
+ * @date 2022-11-11 cleanup and optimized names.
18
+ * @date 2022-12-29 optimized with `lemon-core@3.2.1`
19
+ * @date 2023-01-18 optimized with `lemon-core@3.2.4`
20
+ * @date 2023-01-20 optimized `doSearch()` w/ `SearchParam()`
21
+ * @date 2023-02-09 optimized `doPutBulk()`, and `doPostBulk()`
22
+ * @date 2023-02-13 optimized `doList()` to support `stereo` filter.
23
+ * @date 2023-02-15 optimized with `lemon-core@3.2.5`
24
+ * @date 2023-05-31 optimized to use `cores` in `modelAsView()` & `makeModelBase()`
25
+ * @date 2023-09-15 optimized to use `hasCores` in `modelAsView()`
26
+ * @date 2023-09-27 optimized `doList()` to parse param.
27
+ * @date 2023-11-06 optimized `onAfterSave()` for post-processing.
28
+ * @date 2025-04-10 optimized `errScope` per each handler.
29
+ * @date 2025-08-01 optimized `canDo()` for better security.
30
+ * @date 2025-09-03 optimized `makeModelBase()` to have `type` default.
31
+ * @date 2026-02-03 optimized `modelAsView()` to show cores in local.
32
+ * @date 2026-04-09 optimized `types` to fix `ModelType` cast error.
33
+ *
34
+ * @copyright (C) 2022 LemonCloud Co Ltd. - All Rights Reserved.
35
+ * @origin `@lemoncloud/lemon-templates-api/cores`
36
+ */
37
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
+ const engine_1 = require("../../engine/");
39
+ const helpers_1 = require("../../helpers/");
40
+ const commons_1 = require("./commons");
41
+ const test_helper_1 = require("../../common/test-helper");
42
+ const tools_1 = require("../../tools/");
43
+ const controllers_1 = require("../../controllers/");
44
+ Object.defineProperty(exports, "GeneralWEBController", { enumerable: true, get: function () { return controllers_1.GeneralWEBController; } });
45
+ const lemon_model_1 = require("lemon-model");
46
+ Object.defineProperty(exports, "AbstractTransformer", { enumerable: true, get: function () { return lemon_model_1.AbstractTransformer; } });
47
+ /**
48
+ * convert as id string.
49
+ */
50
+ const _id = (id) => (id === '' || id === 0 ? '' : commons_1.$T.S2(id));
51
+ /**
52
+ * class: `AbstractCRUDController`
53
+ * - abstract high level class not to create directly.
54
+ */
55
+ class AbstractCRUDController extends controllers_1.GeneralWEBController {
56
+ /**
57
+ * service instances
58
+ */
59
+ service;
60
+ /**
61
+ * namespace for log(print)
62
+ */
63
+ logNS;
64
+ /**
65
+ * my model manager
66
+ */
67
+ manager;
68
+ /**
69
+ * transformer between model and view.
70
+ */
71
+ transformer;
72
+ /** options in creation */
73
+ options;
74
+ /**
75
+ * public constructor
76
+ *
77
+ * @param type - api controller's type name (ex: tests for `/tests`)
78
+ * @param service - backend service
79
+ * @param manager - my model manager in backend-service
80
+ * @param transformer - GeneralCRUDWEBControllerOptions
81
+ */
82
+ constructor(type, service, manager, transformer, options) {
83
+ super(type);
84
+ this.logNS = engine_1.$U.NS(type, 'yellow');
85
+ (0, engine_1._log)(this.logNS, `AbstractCRUDController(${type})...`);
86
+ this.service = service;
87
+ this.manager = manager;
88
+ this.transformer = transformer;
89
+ this.options = options;
90
+ }
91
+ /**
92
+ * get the manager's type (= model-type)
93
+ */
94
+ get modelType() {
95
+ return this.manager.type;
96
+ }
97
+ /**
98
+ * get config of using session.
99
+ */
100
+ get confUseSession() {
101
+ // _log(this.logNS, `! STAGE =`, $U.env('STAGE'));
102
+ const STAGE = engine_1.$U.env('STAGE');
103
+ if (STAGE === 'local')
104
+ return false;
105
+ const useSession = this.options?.useSession ?? this.service.isUseSession();
106
+ return useSession;
107
+ }
108
+ /**
109
+ * get config of using session.
110
+ */
111
+ get confThrowable() {
112
+ return this.options?.throwable ?? true;
113
+ }
114
+ /**
115
+ * model transformer from model to view
116
+ */
117
+ modelAsView(model, options) {
118
+ const isLocal = engine_1.$U.env('STAGE') === 'local';
119
+ const useOnlyDefined = options?.useOnlyDefined ?? true;
120
+ const hasCores = options?.hasCores ?? (isLocal ? true : this.confUseSession); // show cores in local always.
121
+ // show `cores` model { sid, gid uid } if using session.
122
+ const view = this.transformer.modelAsView(model, hasCores);
123
+ return useOnlyDefined ? this.transformer.onlyDefined(view) : view;
124
+ }
125
+ /**
126
+ * model transformer from body to body
127
+ */
128
+ bodyToModel(body, isCreate) {
129
+ return this.transformer.bodyToModel(body, isCreate);
130
+ }
131
+ /**
132
+ * from `identity-token`, make base of model { sid, uid }
133
+ * @param proxy the current proxy.
134
+ * @returns base model
135
+ */
136
+ async makeModelBase(proxy, options) {
137
+ const parent = options?.parent ?? null;
138
+ const useSession = options?.useSession ?? this.confUseSession;
139
+ const throwable = options?.throwable ?? this.confThrowable;
140
+ const $model = (0, test_helper_1.onlyDefined)({
141
+ type: this.manager.type,
142
+ });
143
+ return proxy.makeModelBase($model, { parent, useSession, throwable });
144
+ }
145
+ /** load yml as model list */
146
+ async loadMockData(name, base = null) {
147
+ const file = base ? `${base}/${name}.yml` : `${name}.yml`;
148
+ const $ret = await this.loadFromFile(file);
149
+ const list = $ret?.list.map(N => ({ ...N }));
150
+ return list;
151
+ }
152
+ /**
153
+ * load mock-model from `.yml` file.
154
+ */
155
+ async loadFromFile(file) {
156
+ if (!file)
157
+ throw new Error(`@file (string) is required!`);
158
+ const isObjKey = (k) => /^[A-Z]+/.test(k);
159
+ const { conf, data } = (0, tools_1.loadDataYml)(file);
160
+ const $id = {
161
+ '': commons_1.$T.N(conf?.$id, 1000), // global starting seq of id
162
+ };
163
+ const _num = (v, def = 0) => typeof v === 'boolean' || typeof v === 'number' || typeof v === 'string' ? commons_1.$T.N(v, def) : def;
164
+ const _id = (type, id = 0, auto = false) => {
165
+ if ($id[type] === undefined) {
166
+ $id[type] = $id['']; // each starts of `type`.
167
+ $id[''] += 10000; // shift by 10k.
168
+ }
169
+ const no = $id[type] + (auto ? 1 : id) - (auto ? 0 : $id[type] % 10000);
170
+ $id[type] = Math.max($id[type], no); // save the last
171
+ return `${no}`;
172
+ };
173
+ const _mock = (data, type, i) => Object.entries(data).reduce((M, [k, N]) => {
174
+ if (k === 'id') {
175
+ M[k] = _id(M.type, _num(N, 0) || i || 0, N === 0 ? true : false);
176
+ }
177
+ else if (isObjKey(k)) {
178
+ const type = k.charAt(0).toLowerCase() + k.substring(1, k.length - 1);
179
+ const inner = Array.isArray(N) ? N.map((N, i) => _mock(N, N.type || type, i)) : _mock(N, type);
180
+ M[k] = inner;
181
+ }
182
+ else if (/^[_]+/.test(k)) {
183
+ const type = k.substring(1);
184
+ const refId = _id(type, _num(N, 0));
185
+ M[`${type}Id`] = refId;
186
+ }
187
+ else {
188
+ M[k] = N;
189
+ }
190
+ return M;
191
+ }, { type: type });
192
+ //! load as list of mock-model.
193
+ const mock = Array.isArray(data) ? data.map((N, i) => _mock(N, N.type || 'root', i)) : _mock(data, 'root');
194
+ const list = Array.isArray(mock) ? mock : [mock];
195
+ //! returns as mock-model.
196
+ const result = engine_1.$U.copy_node(conf);
197
+ return { ...result, list };
198
+ }
199
+ /**
200
+ * say hello
201
+ */
202
+ hello = () => `api:${this.type()}/${this.manager.hello()}`;
203
+ /**
204
+ * GET /<typeName>
205
+ * - list types
206
+ *
207
+ * ```sh
208
+ * $ http ':8888/<typeName>'
209
+ */
210
+ doList = async (id, param, body, $ctx) => {
211
+ const errScope = `doList(${this.type()}/${id ?? ''})`;
212
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
213
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
214
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
215
+ // request search
216
+ return this.service.guardProxy($ctx, async (proxy) => {
217
+ //WARN - has no internal properties like `sid`, `uid`
218
+ //TODO - `stereo` 같은 경우가 모델 생성시 필수값일때, 쿼리와 겹침. (not-exists) 개선필요함 @230926
219
+ const model = param ? this.bodyToModel(param, true) : null; // could have all
220
+ const useSession = this.confUseSession;
221
+ const $prxy = proxy.getManagerProxy(this.modelType);
222
+ const { $page, $param } = $prxy.packSearchParam(param, model, { useSession });
223
+ (0, engine_1._log)(this.logNS, `>> $param =`, engine_1.$U.json($param));
224
+ //* search from manager.
225
+ const $res = await this.manager.list($page, $param);
226
+ //* for internal test, list can be `SearchBody`
227
+ const list = Array.isArray($res.list) ? $res.list.map(model => this.modelAsView(model)) : $res.list;
228
+ const total = $res?.total ?? list.length;
229
+ // return as view
230
+ return { total, limit: $page.limit, page: $page.page, list };
231
+ });
232
+ };
233
+ /**
234
+ * list types by id
235
+ * - id means the search(query) id to use.
236
+ *
237
+ * ```sh
238
+ * $ http ':8888/<typeName>/<id>/list'
239
+ */
240
+ doGetList = async (id, param, body, $ctx) => {
241
+ const errScope = `doGetList(${this.type()}/${id ?? ''})`;
242
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
243
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
244
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
245
+ id = id === '0' ? '' : commons_1.$T.S2(id).trim();
246
+ // STEP.0 validate paramters.
247
+ if (id)
248
+ throw new Error(`@id[${id ?? ''}](string) is invalid - ${errScope}`);
249
+ // redirect to list()
250
+ return this.doList(id, param, body, $ctx);
251
+ };
252
+ /**
253
+ * internal admin command
254
+ */
255
+ doGetAdmin = async (id, param, body, $ctx) => {
256
+ const errScope = `doGetAdmin(${this.type()}/${id ?? ''})`;
257
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
258
+ $ctx && (0, engine_1._log)(this.logNS, `> context =`, engine_1.$U.json($ctx));
259
+ const save = commons_1.$T.B(param?.save, param?.save === '' ? 1 : 0);
260
+ const clear = commons_1.$T.B(param?.clear, param?.clear === '' ? 1 : 0);
261
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
262
+ return this.service.guardProxy($ctx, async (proxy) => {
263
+ const hasAdmin = proxy.hasAdminRole();
264
+ if (!hasAdmin && id)
265
+ throw new Error(`403 NOT ALLOWED - only for admin @${errScope}`);
266
+ const hello = this.hello();
267
+ //* initialize models w/ running environment.
268
+ if (id === 'initialize') {
269
+ //$ http ':8888/<type>/initialize/admin?clear'
270
+ const list0 = await this.loadMockData(this.manager.type, 'initial');
271
+ const list1 = list0.map(N => this.bodyToModel(N, true));
272
+ const list2 = await (0, helpers_1.my_parrallel)(list1, async (N) => {
273
+ if (save)
274
+ return this.manager.prepare(N.id, N, true);
275
+ else if (clear)
276
+ return this.manager.delete(N.id, true);
277
+ return N;
278
+ });
279
+ const list3 = list2.map(N => this.modelAsView(N));
280
+ return { id, list: list3 };
281
+ }
282
+ else if (id) {
283
+ const $prxy = proxy.getManagerProxy(this.modelType);
284
+ const model = await $prxy.get(id);
285
+ return this.modelAsView(model);
286
+ }
287
+ // returns default.
288
+ return { id, hello, param, body, context: { clientIp: $ctx.clientIp } };
289
+ });
290
+ };
291
+ /**
292
+ * read a `MyModel`
293
+ *
294
+ * ```sh
295
+ * $ http ':8888/<typeName>/1'
296
+ */
297
+ doGet = async (id, param, body, $ctx) => {
298
+ const errScope = `doGet(${this.type()}/${id ?? ''})`;
299
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
300
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
301
+ // body && _log(this.logNS, `> body =`, $U.json(body));
302
+ id = id === '0' ? '' : commons_1.$T.S2(id).trim();
303
+ // STEP.0 validate paramters.
304
+ if (!id)
305
+ throw new Error(`@id (string) is required - ${errScope}`);
306
+ //* runs in guarded prxy.
307
+ return this.service.guardProxy($ctx, async (proxy) => {
308
+ // STEP.1 read model.
309
+ const $prxy = proxy.getManagerProxy(this.modelType);
310
+ const model = await $prxy.get(id, false);
311
+ if (!model?.id)
312
+ throw new Error(`404 NOT FOUND - not found @${errScope}`);
313
+ if (!proxy.canDo('read', model, { errScope }))
314
+ return null; // no permission to read.
315
+ // STEP.2 returns as view.
316
+ if (model?.deletedAt > 0)
317
+ throw new Error(`404 NOT FOUND - deleted at ${engine_1.$U.ts(model.deletedAt)} @${errScope}`);
318
+ return this.modelAsView(model);
319
+ });
320
+ };
321
+ /**
322
+ * create(or insert) a `MyModel`
323
+ * - `id` must be empty (or '0')
324
+ *
325
+ * ```sh
326
+ * $ http POST ':8888/<typeName>/0' "key"="modelValue"
327
+ */
328
+ async doPost(id, param, body, $ctx) {
329
+ const errScope = `doPost(${this.type()}/${id ?? ''})`;
330
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
331
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
332
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
333
+ id = id === '0' ? '' : commons_1.$T.S2(id).trim();
334
+ const isLocal = $ctx?.domain === 'localhost';
335
+ // STEP.0 validate paramters.
336
+ if (id && !isLocal)
337
+ throw new Error(`@id (string) is invalid - ${errScope}`);
338
+ if (body && Array.isArray(body))
339
+ return this.doPostBulk(id, param, body, $ctx); //! route to `/bulk`
340
+ // STEP.1 (TODO) validate user, and transform to model.
341
+ const toCreate = this.bodyToModel(body, true);
342
+ if (!toCreate)
343
+ throw new Error(`@body is required - ${errScope}`);
344
+ if (id)
345
+ toCreate.id = id;
346
+ // STEP.2 run main
347
+ return this.service.guardProxy($ctx, async (proxy) => {
348
+ const $base = await this.makeModelBase(proxy);
349
+ if (!$base.type)
350
+ throw new Error(`.type (ModelType) is missing - ${errScope}`); // confirm type explicitly.
351
+ const $prxy = proxy.getManagerProxy(this.modelType);
352
+ const $valid = await $prxy.validateModel(toCreate, null);
353
+ if (!proxy.canDo('create', { ...$valid, ...$base }, { errScope }))
354
+ return null; // no permission to create.
355
+ const $saves = await $prxy.onBeforeSave($valid, null);
356
+ const $saved = await $prxy.makeModel({ ...$saves, ...$base }, false); //WARN! - already validated.
357
+ const $final = await $prxy.onAfterSave($saved, null);
358
+ return this.modelAsView($final);
359
+ });
360
+ }
361
+ /**
362
+ * create(or insert) multi `MyModel`
363
+ * - `id` must be empty (or '0')
364
+ *
365
+ * ```sh
366
+ * $ http POST ':8888/<typeName>/0/bulk' "key"="modelValue"
367
+ */
368
+ doPostBulk = async (id, param, body, $ctx) => {
369
+ const errScope = `doPostBulk(${this.type()}/${id ?? ''})`;
370
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
371
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
372
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
373
+ id = id === '0' ? '' : commons_1.$T.S2(id);
374
+ // STEP.0 validate paramters.
375
+ if (id)
376
+ throw new Error(`@id (string) is invalid - ${errScope}`);
377
+ const list = Array.isArray(body) ? body : body?.list;
378
+ if (!list || !Array.isArray(list))
379
+ throw new Error(`@body (array) is required - ${errScope}`);
380
+ // STEP.1 transform to models.
381
+ const models = list.map(N => ({
382
+ ...this.bodyToModel(N, true),
383
+ id: _id(N?.id),
384
+ }));
385
+ // STEP.2 run main...
386
+ return this.service.guardProxy($ctx, async (proxy) => {
387
+ const $base = await this.makeModelBase(proxy);
388
+ if (!$base.type)
389
+ throw new Error(`.type (ModelType) is missing - ${errScope}`); // confirm type explicitly.
390
+ const $prxy = proxy.getManagerProxy(this.modelType);
391
+ const _can = (model) => proxy.canDo('create', { ...model, ...$base }, { errScope });
392
+ const $valid = await Promise.all(models.map(N => $prxy.validateModel(N, null).then(N => (_can(N) ? N : null))));
393
+ //* only for all validated models.
394
+ const filtered = await (0, helpers_1.my_sequence)($valid, async (validated) => {
395
+ const filtered = await $prxy.onBeforeSave(validated, null);
396
+ const created = await $prxy.makeModel({ ...filtered, ...$base }, false); //WARN! - already validated.
397
+ return $prxy.onAfterSave(created, null);
398
+ });
399
+ return filtered.map(created => this.modelAsView(created));
400
+ });
401
+ };
402
+ /**
403
+ * update a `MyModel`
404
+ *
405
+ * ```sh
406
+ * $ http PUT ':8888/<typeName>/1000002' name="test-update"
407
+ */
408
+ doPut = async (id, param, body, $ctx) => {
409
+ const errScope = `doPut(${this.type()}/${id ?? ''})`;
410
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
411
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
412
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
413
+ id = id === '0' ? '' : commons_1.$T.S2(id).trim();
414
+ // STEP.0 validate paramters.
415
+ if (!id)
416
+ throw new Error(`@id (string) is required - ${errScope}`);
417
+ // STEP.1 (TODO) validate user, and transform to model.
418
+ const toUpdate = this.bodyToModel({ ...body, id });
419
+ if (!toUpdate)
420
+ throw new Error(`@body is required - ${errScope}`);
421
+ // STEP.2 run main
422
+ return this.service.guardProxy($ctx, async (proxy) => {
423
+ const $prxy = proxy.getManagerProxy(this.modelType);
424
+ const $org = await $prxy.get(id, false);
425
+ if (!$org?.id)
426
+ throw new Error(`404 NOT FOUND - not found @${errScope}`);
427
+ if ($org?.deletedAt)
428
+ throw new Error(`404 NOT FOUND - deleted @${errScope}`);
429
+ if (!proxy.canDo('update', $org, { errScope }))
430
+ return null; // no permission to update.
431
+ // STEP.3 validate and update.
432
+ const $valid = await $prxy.validateModel(toUpdate, id);
433
+ const $saves = await $prxy.onBeforeSave($valid, $org);
434
+ const $saved = await $prxy.set(id, $saves);
435
+ const $final = await $prxy.onAfterSave($saved, $org);
436
+ return this.modelAsView($final);
437
+ });
438
+ };
439
+ /**
440
+ * bulk update a `TypeModel`
441
+ *
442
+ * ```sh
443
+ * $ http PUT ':8888/types/0/bulk'
444
+ */
445
+ doPutBulk = async (id, param, body, $ctx) => {
446
+ const errScope = `doPutBulk(${this.type()}/${id ?? ''})`;
447
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
448
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
449
+ id = id === '0' ? '' : commons_1.$T.S2(id);
450
+ const parrallel = commons_1.$T.N(param?.parrallel, 10);
451
+ const list = Array.isArray(body) ? body : body?.list;
452
+ if (!list || !Array.isArray(list))
453
+ throw new Error(`@body.list (array) is required - ${errScope}`);
454
+ // transform to models
455
+ const models = list.map(N => ({
456
+ ...this.bodyToModel(N),
457
+ id: _id(N?.id),
458
+ }));
459
+ // runs in guarded proxy.
460
+ const $res = await this.service.guardProxy($ctx, async (proxy) => {
461
+ const $prxy = proxy.getManagerProxy(this.modelType);
462
+ if (!$prxy)
463
+ throw new Error(`.model-type[${this.modelType}] is required - ${errScope}`);
464
+ const _can = async (N, i) => {
465
+ const errScope = `doPutBulk(${this.type()}:${i}/${N?.id ?? ''})`;
466
+ const model = N?.id ? await $prxy.get(N?.id, false) : null;
467
+ if (!model?.id)
468
+ throw new Error(`404 NOT FOUND - not found @${errScope}`);
469
+ if (model?.deletedAt)
470
+ throw new Error(`404 NOT FOUND - deleted @${errScope}`);
471
+ if (!proxy.canDo('update', model, { errScope }))
472
+ return null; // no permission to update.
473
+ // return model;
474
+ return N; // 업데이트할 새 데이터를 반환 (기존 model이 아님)
475
+ };
476
+ const list = await Promise.all(models.map(N => _can(N)));
477
+ //* validate and update.
478
+ const $res = await (0, helpers_1.my_parrallel)(list, async (model, i) => {
479
+ if (!model?.id)
480
+ throw new Error(`.id (string) is required at idx[${i}] - ${errScope}`);
481
+ const $org = await $prxy.get(model.id);
482
+ const $valid = await $prxy.validateModel(model, model.id);
483
+ const $saves = await $prxy.onBeforeSave($valid, $org);
484
+ const $saved = await $prxy.set(model.id, $saves);
485
+ return $prxy.onAfterSave($saved, $org);
486
+ }, parrallel);
487
+ // returns.
488
+ return $res;
489
+ });
490
+ // prepare the response.
491
+ const views = $res.map((N) => this.modelAsView(N));
492
+ const length = views.length;
493
+ // FINAL. convert to view
494
+ return { total: length, limit: length, list: views };
495
+ };
496
+ /**
497
+ * delete a `MyModel`
498
+ *
499
+ * ```sh
500
+ * $ http DELETE ':8888/<typeName>/1000003'
501
+ */
502
+ doDelete = async (id, param, body, $ctx) => {
503
+ const errScope = `doDelete(${this.type()}/${id ?? ''})`;
504
+ (0, engine_1._log)(this.logNS, `${errScope}...`);
505
+ param && (0, engine_1._log)(this.logNS, `> param =`, engine_1.$U.json(param));
506
+ body && (0, engine_1._log)(this.logNS, `> body =`, engine_1.$U.json(body));
507
+ id = id === '0' ? '' : commons_1.$T.S2(id).trim();
508
+ const isLocal = $ctx?.domain === 'localhost';
509
+ const destroy = !!commons_1.$T.B(param?.destroy, param?.destroy === '' ? 1 : 0);
510
+ // STEP.0 validate paramters.
511
+ if (!id)
512
+ throw new Error(`@id (string) is required - ${errScope}`);
513
+ // STEP.2 run main
514
+ return this.service.guardProxy($ctx, async (proxy) => {
515
+ const $prxy = proxy.getManagerProxy(this.modelType);
516
+ const model = await $prxy.get(id, false);
517
+ if (!model?.id)
518
+ throw new Error(`404 NOT FOUND - not found @${errScope}`);
519
+ if (!destroy && model?.deletedAt)
520
+ throw new Error(`404 NOT FOUND - deleted @${errScope}`);
521
+ if (!proxy.canDo('delete', model, { errScope }))
522
+ return null; // no permission to update.
523
+ const deleted = await $prxy.$mgr.delete(id, isLocal && destroy);
524
+ const $final = await $prxy.onAfterSave(null, deleted);
525
+ return this.modelAsView($final || deleted);
526
+ });
527
+ };
528
+ }
529
+ exports.AbstractCRUDController = AbstractCRUDController;
530
+ //WARN! - do not export as default.
531
+ // default export
532
+ // export default AbstractCRUDController;
533
+ //# sourceMappingURL=abstract-controllers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-controllers.js","sourceRoot":"","sources":["../../../src/extended/cores/abstract-controllers.ts"],"names":[],"mappings":"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"}