@saltcorn/admin-models 1.6.0 → 1.7.0-alpha.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.
- package/cjs/index.cjs +18 -0
- package/cjs/models/backup.cjs +18 -0
- package/cjs/models/config-check.cjs +18 -0
- package/cjs/models/pack.cjs +18 -0
- package/cjs/models/snapshot.cjs +18 -0
- package/cjs/models/tenant.cjs +18 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -18
- package/dist/index.js.map +1 -1
- package/dist/models/backup.d.ts +3 -2
- package/dist/models/backup.d.ts.map +1 -1
- package/dist/models/backup.js +175 -167
- package/dist/models/backup.js.map +1 -1
- package/dist/models/config-check.d.ts +2 -1
- package/dist/models/config-check.d.ts.map +1 -1
- package/dist/models/config-check.js +16 -23
- package/dist/models/config-check.js.map +1 -1
- package/dist/models/pack.d.ts +2 -1
- package/dist/models/pack.d.ts.map +1 -1
- package/dist/models/pack.js +121 -150
- package/dist/models/pack.js.map +1 -1
- package/dist/models/snapshot.d.ts +1 -1
- package/dist/models/snapshot.d.ts.map +1 -1
- package/dist/models/snapshot.js +26 -29
- package/dist/models/snapshot.js.map +1 -1
- package/dist/models/tenant.d.ts +1 -1
- package/dist/models/tenant.d.ts.map +1 -1
- package/dist/models/tenant.js +43 -48
- package/dist/models/tenant.js.map +1 -1
- package/dist/tests/backup.test.d.ts +2 -0
- package/dist/tests/backup.test.d.ts.map +1 -0
- package/dist/tests/backup.test.js +201 -0
- package/dist/tests/backup.test.js.map +1 -0
- package/dist/tests/cfgcheck.test.d.ts +2 -0
- package/dist/tests/cfgcheck.test.d.ts.map +1 -0
- package/dist/tests/cfgcheck.test.js +32 -0
- package/dist/tests/cfgcheck.test.js.map +1 -0
- package/dist/tests/pack.test.d.ts +2 -0
- package/dist/tests/pack.test.d.ts.map +1 -0
- package/dist/tests/pack.test.js +769 -0
- package/dist/tests/pack.test.js.map +1 -0
- package/dist/tests/random.test.d.ts +2 -0
- package/dist/tests/random.test.d.ts.map +1 -0
- package/dist/tests/random.test.js +150 -0
- package/dist/tests/random.test.js.map +1 -0
- package/dist/tests/tenant.test.d.ts +2 -0
- package/dist/tests/tenant.test.d.ts.map +1 -0
- package/dist/tests/tenant.test.js +106 -0
- package/dist/tests/tenant.test.js.map +1 -0
- package/gen-cjs-shims.cjs +71 -0
- package/package.json +31 -27
package/dist/models/pack.js
CHANGED
|
@@ -1,68 +1,33 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Packs
|
|
4
3
|
* @category saltcorn-admin-models
|
|
5
4
|
* @module pack
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
-
};
|
|
43
|
-
const table_1 = __importDefault(require("@saltcorn/data/models/table"));
|
|
44
|
-
const index_1 = __importDefault(require("@saltcorn/data/db/index"));
|
|
45
|
-
const view_1 = __importDefault(require("@saltcorn/data/models/view"));
|
|
46
|
-
const field_1 = __importDefault(require("@saltcorn/data/models/field"));
|
|
47
|
-
const trigger_1 = __importDefault(require("@saltcorn/data/models/trigger"));
|
|
48
|
-
const workflow_step_1 = __importDefault(require("@saltcorn/data/models/workflow_step"));
|
|
49
|
-
const { getState } = require("@saltcorn/data/db/state");
|
|
50
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
51
|
-
const page_1 = __importDefault(require("@saltcorn/data/models/page"));
|
|
52
|
-
const page_group_1 = __importDefault(require("@saltcorn/data/models/page_group"));
|
|
53
|
-
const table_constraints_1 = __importDefault(require("@saltcorn/data/models/table_constraints"));
|
|
54
|
-
const role_1 = __importDefault(require("@saltcorn/data/models/role"));
|
|
55
|
-
const library_1 = __importDefault(require("@saltcorn/data/models/library"));
|
|
56
|
-
const tag_1 = __importDefault(require("@saltcorn/data/models/tag"));
|
|
57
|
-
const tag_entry_1 = __importDefault(require("@saltcorn/data/models/tag_entry"));
|
|
58
|
-
const model_1 = __importDefault(require("@saltcorn/data/models/model"));
|
|
59
|
-
const model_instance_1 = __importDefault(require("@saltcorn/data/models/model_instance"));
|
|
60
|
-
const eventlog_1 = __importDefault(require("@saltcorn/data/models/eventlog"));
|
|
61
|
-
const user_1 = __importDefault(require("@saltcorn/data/models/user"));
|
|
62
|
-
const config_1 = __importDefault(require("@saltcorn/data/models/config"));
|
|
63
|
-
const { save_menu_items } = config_1.default;
|
|
64
|
-
const lodash_1 = require("lodash");
|
|
65
|
-
const { isStale, getFetchProxyOptions } = require("@saltcorn/data/utils");
|
|
6
|
+
import Table from "@saltcorn/data/models/table";
|
|
7
|
+
import db from "@saltcorn/data/db/index";
|
|
8
|
+
import View from "@saltcorn/data/models/view";
|
|
9
|
+
import Field from "@saltcorn/data/models/field";
|
|
10
|
+
import Trigger from "@saltcorn/data/models/trigger";
|
|
11
|
+
import WorkflowStep from "@saltcorn/data/models/workflow_step";
|
|
12
|
+
import { getState } from "@saltcorn/data/db/state";
|
|
13
|
+
import fetchLib from "node-fetch";
|
|
14
|
+
const fetch = fetchLib; // NodeNext default-import interop for node-fetch
|
|
15
|
+
import Page from "@saltcorn/data/models/page";
|
|
16
|
+
import PageGroup from "@saltcorn/data/models/page_group";
|
|
17
|
+
import TableConstraint from "@saltcorn/data/models/table_constraints";
|
|
18
|
+
import Role from "@saltcorn/data/models/role";
|
|
19
|
+
import Library from "@saltcorn/data/models/library";
|
|
20
|
+
import Tag from "@saltcorn/data/models/tag";
|
|
21
|
+
import TagEntry from "@saltcorn/data/models/tag_entry";
|
|
22
|
+
import Model from "@saltcorn/data/models/model";
|
|
23
|
+
import ModelInstance from "@saltcorn/data/models/model_instance";
|
|
24
|
+
import EventLog from "@saltcorn/data/models/eventlog";
|
|
25
|
+
import User from "@saltcorn/data/models/user";
|
|
26
|
+
import * as config from "@saltcorn/data/models/config";
|
|
27
|
+
const { save_menu_items } = config;
|
|
28
|
+
import lodash from "lodash";
|
|
29
|
+
const { isEqual } = lodash;
|
|
30
|
+
import { isStale, getFetchProxyOptions } from "@saltcorn/data/utils";
|
|
66
31
|
/**
|
|
67
32
|
* Table Pack
|
|
68
33
|
* @function
|
|
@@ -71,7 +36,7 @@ const { isStale, getFetchProxyOptions } = require("@saltcorn/data/utils");
|
|
|
71
36
|
const table_pack = async (nameOrTable) => {
|
|
72
37
|
// todo check this change
|
|
73
38
|
const table = typeof nameOrTable === "string"
|
|
74
|
-
?
|
|
39
|
+
? Table.findOne({ name: nameOrTable })
|
|
75
40
|
: nameOrTable;
|
|
76
41
|
if (!table)
|
|
77
42
|
throw new Error(`Unable to find table '${nameOrTable}'`);
|
|
@@ -82,7 +47,7 @@ const table_pack = async (nameOrTable) => {
|
|
|
82
47
|
return o;
|
|
83
48
|
};
|
|
84
49
|
//const triggers = await Trigger.find({ table_id: table.id });
|
|
85
|
-
const constraints = await
|
|
50
|
+
const constraints = await TableConstraint.find({ table_id: table.id });
|
|
86
51
|
return {
|
|
87
52
|
name: table.name,
|
|
88
53
|
description: table.description,
|
|
@@ -94,6 +59,7 @@ const table_pack = async (nameOrTable) => {
|
|
|
94
59
|
provider_name: table.provider_name,
|
|
95
60
|
provider_cfg: table.provider_cfg,
|
|
96
61
|
ownership_formula: table.ownership_formula,
|
|
62
|
+
rls_enabled: table.rls_enabled,
|
|
97
63
|
fields: fields.map((f) => strip_ids(f.toJson)),
|
|
98
64
|
//triggers: triggers.map((tr) => tr.toJson),
|
|
99
65
|
constraints: constraints.map((c) => c.toJson),
|
|
@@ -107,10 +73,10 @@ const table_pack = async (nameOrTable) => {
|
|
|
107
73
|
* @param name
|
|
108
74
|
*/
|
|
109
75
|
const view_pack = async (name) => {
|
|
110
|
-
const view = typeof name === "string" ? await
|
|
76
|
+
const view = typeof name === "string" ? await View.findOne({ name }) : name;
|
|
111
77
|
if (!view)
|
|
112
78
|
throw new Error(`Unable to find view '${name}'`);
|
|
113
|
-
const table =
|
|
79
|
+
const table = Table.findOne({ id: view.table_id });
|
|
114
80
|
//if (!table)
|
|
115
81
|
// throw new Error(`Unable to find table with id '${view.table_id}'`);
|
|
116
82
|
return {
|
|
@@ -132,7 +98,7 @@ const view_pack = async (name) => {
|
|
|
132
98
|
* @param name
|
|
133
99
|
*/
|
|
134
100
|
const plugin_pack = async (name) => {
|
|
135
|
-
const Plugin = (await
|
|
101
|
+
const Plugin = (await import("@saltcorn/data/models/plugin")).default;
|
|
136
102
|
const plugin = await Plugin.findOne({ name });
|
|
137
103
|
if (!plugin)
|
|
138
104
|
throw new Error(`Unable to find plugin '${name}'`);
|
|
@@ -160,7 +126,7 @@ const plugin_pack = async (name) => {
|
|
|
160
126
|
* @param name name of the page
|
|
161
127
|
*/
|
|
162
128
|
const page_pack = async (name) => {
|
|
163
|
-
const page = typeof name === "string" ?
|
|
129
|
+
const page = typeof name === "string" ? Page.findOne({ name }) : name;
|
|
164
130
|
if (!page)
|
|
165
131
|
throw new Error(`Unable to find page '${name}'`);
|
|
166
132
|
const root_page_for_roles = await page.is_root_page_for_roles();
|
|
@@ -181,7 +147,7 @@ const page_pack = async (name) => {
|
|
|
181
147
|
* @param name name of the page group
|
|
182
148
|
*/
|
|
183
149
|
const page_group_pack = async (name) => {
|
|
184
|
-
const group =
|
|
150
|
+
const group = PageGroup.findOne({ name });
|
|
185
151
|
if (!group)
|
|
186
152
|
throw new Error(`Unable to find page group '${name}'`);
|
|
187
153
|
return {
|
|
@@ -191,7 +157,7 @@ const page_group_pack = async (name) => {
|
|
|
191
157
|
random_allocation: group.random_allocation,
|
|
192
158
|
members: group.members.map((m) => {
|
|
193
159
|
// could get slow (caching ?)
|
|
194
|
-
const page =
|
|
160
|
+
const page = Page.findOne({ id: m.page_id });
|
|
195
161
|
if (!page)
|
|
196
162
|
throw new Error(`Unable to find page '${m.page_id}'`);
|
|
197
163
|
return {
|
|
@@ -209,7 +175,7 @@ const page_group_pack = async (name) => {
|
|
|
209
175
|
* @param name
|
|
210
176
|
*/
|
|
211
177
|
const library_pack = async (name) => {
|
|
212
|
-
const lib = await
|
|
178
|
+
const lib = await Library.findOne({ name });
|
|
213
179
|
return lib.toJson;
|
|
214
180
|
};
|
|
215
181
|
const orderWorkflowSteps = (steps) => {
|
|
@@ -318,10 +284,10 @@ const orderWorkflowSteps = (steps) => {
|
|
|
318
284
|
* @param name
|
|
319
285
|
*/
|
|
320
286
|
const trigger_pack = async (name) => {
|
|
321
|
-
const trig = typeof name === "string" ? await
|
|
287
|
+
const trig = typeof name === "string" ? await Trigger.findOne({ name }) : name;
|
|
322
288
|
const pack = trig.toJson;
|
|
323
289
|
if (trig.action === "Workflow") {
|
|
324
|
-
const steps = await
|
|
290
|
+
const steps = await WorkflowStep.find({ trigger_id: trig.id });
|
|
325
291
|
const ordered = orderWorkflowSteps(steps.map((s) => s.toJson));
|
|
326
292
|
pack.steps = ordered;
|
|
327
293
|
}
|
|
@@ -334,7 +300,7 @@ const trigger_pack = async (name) => {
|
|
|
334
300
|
* @returns {Promise<object>}
|
|
335
301
|
*/
|
|
336
302
|
const role_pack = async (role) => {
|
|
337
|
-
return await
|
|
303
|
+
return await Role.findOne({ role });
|
|
338
304
|
};
|
|
339
305
|
/**
|
|
340
306
|
* 'page/view/table/trigger' ids are replaced by names
|
|
@@ -342,32 +308,32 @@ const role_pack = async (role) => {
|
|
|
342
308
|
* @returns
|
|
343
309
|
*/
|
|
344
310
|
const tag_pack = async (name) => {
|
|
345
|
-
const tag = typeof name === "string" ? await
|
|
311
|
+
const tag = typeof name === "string" ? await Tag.findOne({ name }) : name;
|
|
346
312
|
if (!tag)
|
|
347
313
|
throw new Error(`Unable to find tag '${name}'`);
|
|
348
314
|
const entries = await tag.getEntries();
|
|
349
315
|
const withNames = entries.map((e) => {
|
|
350
316
|
const result = {};
|
|
351
317
|
if (e.page_id) {
|
|
352
|
-
const page =
|
|
318
|
+
const page = Page.findOne({ id: e.page_id });
|
|
353
319
|
if (!page)
|
|
354
320
|
throw new Error(`Unable to find page '${e.page_id}'`);
|
|
355
321
|
result.page_name = page.name;
|
|
356
322
|
}
|
|
357
323
|
if (e.view_id) {
|
|
358
|
-
const view =
|
|
324
|
+
const view = View.findOne({ id: e.view_id });
|
|
359
325
|
if (!view)
|
|
360
326
|
throw new Error(`Unable to find view '${e.view_id}'`);
|
|
361
327
|
result.view_name = view.name;
|
|
362
328
|
}
|
|
363
329
|
if (e.table_id) {
|
|
364
|
-
const table =
|
|
330
|
+
const table = Table.findOne({ id: e.table_id });
|
|
365
331
|
if (!table)
|
|
366
332
|
throw new Error(`Unable to find table '${e.table_id}'`);
|
|
367
333
|
result.table_name = table.name;
|
|
368
334
|
}
|
|
369
335
|
if (e.trigger_id) {
|
|
370
|
-
const trigger =
|
|
336
|
+
const trigger = Trigger.findOne({ id: e.trigger_id });
|
|
371
337
|
if (!trigger)
|
|
372
338
|
throw new Error(`Unable to find trigger '${e.trigger_id}'`);
|
|
373
339
|
result.trigger_name = trigger.name;
|
|
@@ -386,10 +352,10 @@ const tag_pack = async (name) => {
|
|
|
386
352
|
* @returns
|
|
387
353
|
*/
|
|
388
354
|
const model_pack = async (name, tableName) => {
|
|
389
|
-
const table =
|
|
355
|
+
const table = Table.findOne({ name: tableName });
|
|
390
356
|
if (!table)
|
|
391
357
|
throw new Error(`Model-table '${tableName}' not found`);
|
|
392
|
-
const model = await
|
|
358
|
+
const model = await Model.findOne({ name, table_id: table.id });
|
|
393
359
|
if (!model)
|
|
394
360
|
throw new Error(`Model '${name}' not found`);
|
|
395
361
|
return model.toJson;
|
|
@@ -402,13 +368,13 @@ const model_pack = async (name, tableName) => {
|
|
|
402
368
|
* @returns
|
|
403
369
|
*/
|
|
404
370
|
const model_instance_pack = async (instanceName, modelName, tableName) => {
|
|
405
|
-
const table =
|
|
371
|
+
const table = Table.findOne({ name: tableName });
|
|
406
372
|
if (!table)
|
|
407
373
|
throw new Error(`Model-table '${tableName}' not found`);
|
|
408
|
-
const model = await
|
|
374
|
+
const model = await Model.findOne({ name: modelName, table_id: table.id });
|
|
409
375
|
if (!model)
|
|
410
376
|
throw new Error(`Unable to find model '${modelName}'`);
|
|
411
|
-
const instance = await
|
|
377
|
+
const instance = await ModelInstance.findOne({
|
|
412
378
|
name: instanceName,
|
|
413
379
|
model_id: model.id,
|
|
414
380
|
});
|
|
@@ -432,7 +398,7 @@ const event_log_pack = async (eventLog) => {
|
|
|
432
398
|
const userId = result.user_id;
|
|
433
399
|
if (result.user_id)
|
|
434
400
|
delete result.user_id;
|
|
435
|
-
const user = await
|
|
401
|
+
const user = await User.findOne({ id: userId });
|
|
436
402
|
if (user)
|
|
437
403
|
result.user_email = user.email;
|
|
438
404
|
}
|
|
@@ -444,16 +410,16 @@ const event_log_pack = async (eventLog) => {
|
|
|
444
410
|
*/
|
|
445
411
|
const can_install_pack = async (pack) => {
|
|
446
412
|
const warns = new Array();
|
|
447
|
-
const allViews = (await
|
|
413
|
+
const allViews = (await View.find()).map((t) => ({
|
|
448
414
|
name: t.name,
|
|
449
|
-
table:
|
|
415
|
+
table: Table.findOne({ id: t.table_id })?.name,
|
|
450
416
|
}));
|
|
451
417
|
for (const pt of pack.tables || []) {
|
|
452
|
-
const matchTable =
|
|
418
|
+
const matchTable = Table.findOne({ name: pt.name });
|
|
453
419
|
if (!matchTable)
|
|
454
420
|
continue;
|
|
455
421
|
//failure conditions: existing field with different type (warn)
|
|
456
|
-
pt.fields.forEach((f) => {
|
|
422
|
+
(pt.fields || []).forEach((f) => {
|
|
457
423
|
const ex = matchTable.getField(f.name);
|
|
458
424
|
if (ex && ex.type_name !== f.type) {
|
|
459
425
|
warns.push(`Clashing field types for ${f.name} on table ${pt.name}`);
|
|
@@ -463,8 +429,8 @@ const can_install_pack = async (pack) => {
|
|
|
463
429
|
const matchViews = allViews.filter((dbt) => (pack.views || []).some((pv) => pv.name === dbt.name && dbt.table && pv.table !== dbt.table));
|
|
464
430
|
pack.tables.forEach((t) => {
|
|
465
431
|
if (t.name === "users") {
|
|
466
|
-
const userTable =
|
|
467
|
-
t.fields.forEach((f) => {
|
|
432
|
+
const userTable = Table.findOne({ name: "users" });
|
|
433
|
+
(t.fields || []).forEach((f) => {
|
|
468
434
|
if (f.required) {
|
|
469
435
|
const ex = userTable?.getField(f.name);
|
|
470
436
|
if (!ex || !ex.required)
|
|
@@ -488,22 +454,22 @@ const can_install_pack = async (pack) => {
|
|
|
488
454
|
*/
|
|
489
455
|
const uninstall_pack = async (pack, name) => {
|
|
490
456
|
for (const pageGroupSpec of pack.page_groups || []) {
|
|
491
|
-
const pageGroup =
|
|
457
|
+
const pageGroup = PageGroup.findOne({ name: pageGroupSpec.name });
|
|
492
458
|
if (pageGroup)
|
|
493
459
|
await pageGroup.delete();
|
|
494
460
|
}
|
|
495
461
|
for (const pageSpec of pack.pages || []) {
|
|
496
|
-
const page =
|
|
462
|
+
const page = Page.findOne({ name: pageSpec.name });
|
|
497
463
|
if (page)
|
|
498
464
|
await page.delete();
|
|
499
465
|
}
|
|
500
466
|
for (const viewSpec of pack.views) {
|
|
501
|
-
const view =
|
|
467
|
+
const view = View.findOne({ name: viewSpec.name });
|
|
502
468
|
if (view)
|
|
503
469
|
await view.delete();
|
|
504
470
|
}
|
|
505
471
|
for (const tableSpec of pack.tables) {
|
|
506
|
-
const table =
|
|
472
|
+
const table = Table.findOne({ name: tableSpec.name });
|
|
507
473
|
if (table && table.name === "users")
|
|
508
474
|
continue;
|
|
509
475
|
if (table) {
|
|
@@ -512,14 +478,14 @@ const uninstall_pack = async (pack, name) => {
|
|
|
512
478
|
if (field.is_fkey)
|
|
513
479
|
await field.delete();
|
|
514
480
|
}
|
|
515
|
-
const triggers =
|
|
481
|
+
const triggers = Trigger.find({ table_id: table.id });
|
|
516
482
|
for (const trigger of triggers) {
|
|
517
483
|
await trigger.delete();
|
|
518
484
|
}
|
|
519
485
|
}
|
|
520
486
|
}
|
|
521
487
|
for (const tableSpec of pack.tables) {
|
|
522
|
-
const table =
|
|
488
|
+
const table = Table.findOne({ name: tableSpec.name });
|
|
523
489
|
if (table && table.name !== "users")
|
|
524
490
|
await table.delete();
|
|
525
491
|
}
|
|
@@ -595,7 +561,7 @@ const filter_pack = (pack, options) => {
|
|
|
595
561
|
* @param bare_tables
|
|
596
562
|
*/
|
|
597
563
|
const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false) => {
|
|
598
|
-
const Plugin = (await
|
|
564
|
+
const Plugin = (await import("@saltcorn/data/models/plugin")).default;
|
|
599
565
|
for (const plugin of pack.plugins) {
|
|
600
566
|
if (plugin.source === "npm" && plugin.name.startsWith("@saltcorn/"))
|
|
601
567
|
plugin.name = plugin.name.replace("@saltcorn/", "");
|
|
@@ -613,18 +579,18 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
613
579
|
}
|
|
614
580
|
for (const role of pack.roles || []) {
|
|
615
581
|
role.id = old_to_new_role(role.id);
|
|
616
|
-
const existing = await
|
|
582
|
+
const existing = await Role.findOne({ id: role.id });
|
|
617
583
|
if (existing)
|
|
618
584
|
await existing.update(role);
|
|
619
585
|
else
|
|
620
|
-
await
|
|
586
|
+
await Role.create(role);
|
|
621
587
|
}
|
|
622
588
|
for (const lib of pack.library || []) {
|
|
623
|
-
const exisiting = await
|
|
589
|
+
const exisiting = await Library.findOne({ name: lib.name });
|
|
624
590
|
if (exisiting)
|
|
625
591
|
await exisiting.update(lib);
|
|
626
592
|
else
|
|
627
|
-
await
|
|
593
|
+
await Library.create(lib);
|
|
628
594
|
}
|
|
629
595
|
// create tables (users skipped because created by other ways)
|
|
630
596
|
// tables with a provider go last because they can depend on presence
|
|
@@ -634,8 +600,8 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
634
600
|
const { id, ownership_field_id, ownership_field_name, triggers, constraints, fields, ...updrow } = tableSpec;
|
|
635
601
|
if (tableSpec.name !== "users") {
|
|
636
602
|
let tbl_pk;
|
|
637
|
-
const existing =
|
|
638
|
-
getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${
|
|
603
|
+
const existing = Table.findOne({ name: tableSpec.name });
|
|
604
|
+
getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${db.getTenantSchema()}`);
|
|
639
605
|
if (existing) {
|
|
640
606
|
tbl_pk = await existing.getField(existing.pk_name);
|
|
641
607
|
await existing.update(updrow);
|
|
@@ -643,34 +609,34 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
643
609
|
else {
|
|
644
610
|
tableSpec.min_role_read = old_to_new_role(tableSpec.min_role_read);
|
|
645
611
|
tableSpec.min_role_write = old_to_new_role(tableSpec.min_role_write);
|
|
646
|
-
const table = await
|
|
612
|
+
const table = await Table.create(tableSpec.name, tableSpec);
|
|
647
613
|
[tbl_pk] = table.getFields();
|
|
648
614
|
} //set pk
|
|
649
|
-
const pack_pk = tableSpec.fields.find((f) => f.primary_key);
|
|
615
|
+
const pack_pk = (tableSpec.fields || []).find((f) => f.primary_key);
|
|
650
616
|
if (pack_pk && tbl_pk) {
|
|
651
617
|
await tbl_pk.update(pack_pk);
|
|
652
618
|
}
|
|
653
619
|
}
|
|
654
620
|
else {
|
|
655
|
-
await
|
|
621
|
+
await User.table.update(updrow);
|
|
656
622
|
}
|
|
657
623
|
}
|
|
658
624
|
await getState().refresh_tables(true);
|
|
659
625
|
for (const tableSpec of pack.tables) {
|
|
660
|
-
const _table =
|
|
626
|
+
const _table = Table.findOne({ name: tableSpec.name });
|
|
661
627
|
if (!_table)
|
|
662
628
|
throw new Error(`Unable to find table '${tableSpec.name}'`);
|
|
663
629
|
const exfields = _table.getFields();
|
|
664
630
|
if (!_table.provider_name)
|
|
665
|
-
for (const field of tableSpec.fields) {
|
|
631
|
+
for (const field of tableSpec.fields || []) {
|
|
666
632
|
const exfield = exfields.find((f) => f.name === field.name);
|
|
667
633
|
if (!((_table.name === "users" &&
|
|
668
634
|
(field.name === "email" || field.name === "role_id")) ||
|
|
669
635
|
exfield)) {
|
|
670
636
|
if (_table.name === "users" && field.required)
|
|
671
|
-
await
|
|
637
|
+
await Field.create({ table: _table, ...field, required: false }, bare_tables);
|
|
672
638
|
else
|
|
673
|
-
await
|
|
639
|
+
await Field.create({ table: _table, ...field }, bare_tables);
|
|
674
640
|
}
|
|
675
641
|
else if (exfield &&
|
|
676
642
|
!(_table.name === "users" &&
|
|
@@ -682,33 +648,38 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
682
648
|
}
|
|
683
649
|
for (const { table, ...trigger } of tableSpec.triggers || []) {
|
|
684
650
|
trigger.min_role = old_to_new_role(trigger.min_role);
|
|
685
|
-
await
|
|
651
|
+
await Trigger.create({ table: _table, ...trigger }); //legacy, not in new packs
|
|
686
652
|
}
|
|
687
653
|
const existing_constraints = _table.constraints;
|
|
688
654
|
for (const constraint of tableSpec.constraints || []) {
|
|
689
655
|
if (!existing_constraints.find((excon) => excon.type === constraint.type &&
|
|
690
|
-
|
|
691
|
-
await
|
|
656
|
+
isEqual(excon.configuration, constraint.configuration)))
|
|
657
|
+
await TableConstraint.create({ table: _table, ...constraint });
|
|
692
658
|
}
|
|
693
659
|
if (tableSpec.ownership_field_name) {
|
|
694
|
-
const owner_field = await
|
|
660
|
+
const owner_field = await Field.findOne({
|
|
695
661
|
table_id: _table.id,
|
|
696
662
|
name: tableSpec.ownership_field_name,
|
|
697
663
|
});
|
|
698
664
|
await _table.update({ ownership_field_id: owner_field.id });
|
|
699
665
|
}
|
|
666
|
+
else if (tableSpec.rls_enabled && tableSpec.ownership_formula) {
|
|
667
|
+
const freshTable = Table.findOne({ name: _table.name });
|
|
668
|
+
if (freshTable)
|
|
669
|
+
await freshTable.enableOwnershipRLS();
|
|
670
|
+
}
|
|
700
671
|
}
|
|
701
672
|
await getState().refresh_tables(true);
|
|
702
673
|
for (const viewSpec of pack.views) {
|
|
703
674
|
viewSpec.min_role = old_to_new_role(viewSpec.min_role);
|
|
704
675
|
const { table, on_menu, menu_label, on_root_page, ...viewNoTable } = viewSpec;
|
|
705
|
-
const vtable =
|
|
706
|
-
const existing =
|
|
676
|
+
const vtable = Table.findOne({ name: table });
|
|
677
|
+
const existing = View.findOne({ name: viewNoTable.name });
|
|
707
678
|
if (existing?.id) {
|
|
708
|
-
await
|
|
679
|
+
await View.update(viewNoTable, existing.id);
|
|
709
680
|
}
|
|
710
681
|
else {
|
|
711
|
-
await
|
|
682
|
+
await View.create({
|
|
712
683
|
...viewNoTable,
|
|
713
684
|
table_id: vtable ? vtable.id : null,
|
|
714
685
|
});
|
|
@@ -725,22 +696,22 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
725
696
|
for (const triggerSpec of pack.triggers || []) {
|
|
726
697
|
triggerSpec.min_role = old_to_new_role(triggerSpec.min_role);
|
|
727
698
|
let id;
|
|
728
|
-
const existing = await
|
|
699
|
+
const existing = await Trigger.findOne({ name: triggerSpec.name });
|
|
729
700
|
if (existing) {
|
|
730
701
|
const { table_name, steps, ...tsNoTableName } = triggerSpec;
|
|
731
702
|
if (table_name)
|
|
732
|
-
tsNoTableName.table_id =
|
|
733
|
-
await
|
|
703
|
+
tsNoTableName.table_id = Table.findOne({ name: table_name })?.id;
|
|
704
|
+
await Trigger.update(existing.id, tsNoTableName);
|
|
734
705
|
id = existing.id;
|
|
735
706
|
}
|
|
736
707
|
else {
|
|
737
|
-
const newTrigger = await
|
|
708
|
+
const newTrigger = await Trigger.create(triggerSpec);
|
|
738
709
|
id = newTrigger.id;
|
|
739
710
|
}
|
|
740
711
|
if (triggerSpec.action === "Workflow" && triggerSpec.steps) {
|
|
741
|
-
await
|
|
712
|
+
await WorkflowStep.deleteForTrigger(id);
|
|
742
713
|
for (const step of triggerSpec.steps) {
|
|
743
|
-
await
|
|
714
|
+
await WorkflowStep.create({ ...step, trigger_id: id });
|
|
744
715
|
}
|
|
745
716
|
}
|
|
746
717
|
}
|
|
@@ -748,11 +719,11 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
748
719
|
for (const pageFullSpec of pack.pages || []) {
|
|
749
720
|
pageFullSpec.min_role = old_to_new_role(pageFullSpec.min_role);
|
|
750
721
|
const { root_page_for_roles, menu_label, ...pageSpec } = pageFullSpec;
|
|
751
|
-
const existing =
|
|
722
|
+
const existing = Page.findOne({ name: pageSpec.name });
|
|
752
723
|
if (existing?.id)
|
|
753
|
-
await
|
|
724
|
+
await Page.update(existing.id, pageSpec);
|
|
754
725
|
else
|
|
755
|
-
await
|
|
726
|
+
await Page.create(pageSpec);
|
|
756
727
|
for (const role of root_page_for_roles || []) {
|
|
757
728
|
const current_root = getState().getConfigCopy(role + "_home", "");
|
|
758
729
|
if (!current_root || current_root === "")
|
|
@@ -770,19 +741,19 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
770
741
|
for (const pageGroupSpec of pack.page_groups || []) {
|
|
771
742
|
pageGroupSpec.min_role = old_to_new_role(pageGroupSpec.min_role);
|
|
772
743
|
const { members, ...pageGroupNoMembers } = pageGroupSpec;
|
|
773
|
-
let existing =
|
|
744
|
+
let existing = PageGroup.findOne({ name: pageGroupSpec.name });
|
|
774
745
|
if (existing?.id) {
|
|
775
746
|
await existing.clearMembers(); // or merge ?
|
|
776
|
-
await
|
|
747
|
+
await PageGroup.update(existing.id, pageGroupNoMembers);
|
|
777
748
|
}
|
|
778
749
|
else
|
|
779
|
-
existing = await
|
|
750
|
+
existing = await PageGroup.create(pageGroupNoMembers);
|
|
780
751
|
const group = existing;
|
|
781
752
|
if (!group)
|
|
782
753
|
throw new Error(`Unable to create page group '${pageGroupSpec.name}'`);
|
|
783
754
|
for (const member of members || []) {
|
|
784
755
|
const { page_name, ...memberNoPageName } = member;
|
|
785
|
-
const page =
|
|
756
|
+
const page = Page.findOne({ name: page_name });
|
|
786
757
|
if (!page)
|
|
787
758
|
throw new Error(`Unable to find page '${member.page_name}'`);
|
|
788
759
|
await group.addMember({ ...memberNoPageName, page_id: page.id });
|
|
@@ -793,25 +764,25 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
793
764
|
? tag.entries.map((e) => {
|
|
794
765
|
const result = {};
|
|
795
766
|
if (e.page_name) {
|
|
796
|
-
const page =
|
|
767
|
+
const page = Page.findOne({ name: e.page_name });
|
|
797
768
|
if (!page)
|
|
798
769
|
throw new Error(`Unable to find page '${e.page_name}'`);
|
|
799
770
|
result.page_id = page.id;
|
|
800
771
|
}
|
|
801
772
|
if (e.view_name) {
|
|
802
|
-
const view =
|
|
773
|
+
const view = View.findOne({ name: e.view_name });
|
|
803
774
|
if (!view)
|
|
804
775
|
throw new Error(`Unable to find view '${e.view_name}'`);
|
|
805
776
|
result.view_id = view.id;
|
|
806
777
|
}
|
|
807
778
|
if (e.table_name) {
|
|
808
|
-
const table =
|
|
779
|
+
const table = Table.findOne({ name: e.table_name });
|
|
809
780
|
if (!table)
|
|
810
781
|
throw new Error(`Unable to find table '${e.table_name}'`);
|
|
811
782
|
result.table_id = table.id;
|
|
812
783
|
}
|
|
813
784
|
if (e.trigger_name) {
|
|
814
|
-
const trigger =
|
|
785
|
+
const trigger = Trigger.findOne({ name: e.trigger_name });
|
|
815
786
|
if (!trigger)
|
|
816
787
|
throw new Error(`Unable to find trigger '${e.trigger_name}'`);
|
|
817
788
|
result.trigger_id = trigger.id;
|
|
@@ -819,17 +790,17 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
819
790
|
return result;
|
|
820
791
|
})
|
|
821
792
|
: undefined;
|
|
822
|
-
const existing = await
|
|
793
|
+
const existing = await Tag.findOne({ name: tag.name });
|
|
823
794
|
if (!existing)
|
|
824
|
-
await
|
|
795
|
+
await Tag.create({ name: tag.name, entries });
|
|
825
796
|
else {
|
|
826
797
|
for (const entry of entries || []) {
|
|
827
|
-
await
|
|
798
|
+
await TagEntry.create({ tag_id: existing.id, ...entry });
|
|
828
799
|
}
|
|
829
800
|
}
|
|
830
801
|
}
|
|
831
802
|
for (const model of pack.models || []) {
|
|
832
|
-
const mTbl =
|
|
803
|
+
const mTbl = Table.findOne({ name: model.table_name });
|
|
833
804
|
if (!mTbl)
|
|
834
805
|
throw new Error(`Unable to find table '${model.table_name}'`);
|
|
835
806
|
if (!mTbl.id)
|
|
@@ -839,13 +810,13 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
839
810
|
if (table_name === mTbl.name)
|
|
840
811
|
cfg.table_id = mTbl.id;
|
|
841
812
|
else {
|
|
842
|
-
const cfgTbl =
|
|
813
|
+
const cfgTbl = Table.findOne({ name: table_name });
|
|
843
814
|
if (!cfgTbl)
|
|
844
815
|
throw new Error(`Unable to find table '${table_name}'`);
|
|
845
816
|
cfg.table_id = cfgTbl.id;
|
|
846
817
|
}
|
|
847
818
|
}
|
|
848
|
-
const existing = await
|
|
819
|
+
const existing = await Model.findOne({
|
|
849
820
|
name: model.name,
|
|
850
821
|
table_id: mTbl.id,
|
|
851
822
|
});
|
|
@@ -855,7 +826,7 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
855
826
|
configuration: cfg,
|
|
856
827
|
});
|
|
857
828
|
else
|
|
858
|
-
await
|
|
829
|
+
await Model.create({
|
|
859
830
|
name: model.name,
|
|
860
831
|
table_id: mTbl.id,
|
|
861
832
|
modelpattern: model.modelpattern,
|
|
@@ -863,10 +834,10 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
863
834
|
});
|
|
864
835
|
}
|
|
865
836
|
for (const modelInst of pack.model_instances || []) {
|
|
866
|
-
const table =
|
|
837
|
+
const table = Table.findOne({ name: modelInst.table_name });
|
|
867
838
|
if (!table)
|
|
868
839
|
throw new Error(`Unable to find table '${modelInst.table_name}'`);
|
|
869
|
-
const model = await
|
|
840
|
+
const model = await Model.findOne({
|
|
870
841
|
name: modelInst.model_name,
|
|
871
842
|
table_id: table.id,
|
|
872
843
|
});
|
|
@@ -874,7 +845,7 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
874
845
|
throw new Error(`Unable to find table '${modelInst.model_name}'`);
|
|
875
846
|
const { model_name, ...mICfg } = modelInst;
|
|
876
847
|
mICfg.model_id = model.id;
|
|
877
|
-
const existing = await
|
|
848
|
+
const existing = await ModelInstance.findOne({
|
|
878
849
|
name: modelInst.name,
|
|
879
850
|
model_id: model.id,
|
|
880
851
|
});
|
|
@@ -883,20 +854,20 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
883
854
|
await existing.update(updrow);
|
|
884
855
|
}
|
|
885
856
|
else
|
|
886
|
-
await
|
|
857
|
+
await ModelInstance.create(mICfg);
|
|
887
858
|
}
|
|
888
859
|
for (const eventLog of pack.event_logs || []) {
|
|
889
860
|
const { user_email, ...rest } = eventLog;
|
|
890
861
|
const eventLogCfg = rest;
|
|
891
862
|
if (user_email) {
|
|
892
|
-
const user = await
|
|
863
|
+
const user = await User.findOne({ email: user_email });
|
|
893
864
|
if (user)
|
|
894
865
|
eventLogCfg.user_id = user.id;
|
|
895
866
|
else {
|
|
896
867
|
getState().log(3, `User '${user_email}' not found for event log ${eventLog.event_type}`);
|
|
897
868
|
}
|
|
898
869
|
}
|
|
899
|
-
await
|
|
870
|
+
await EventLog.create(eventLogCfg);
|
|
900
871
|
}
|
|
901
872
|
if (pack.config) {
|
|
902
873
|
const state = getState();
|
|
@@ -958,7 +929,7 @@ const fetch_available_packs_from_store = async () => {
|
|
|
958
929
|
//const { getState } = require("../db/state");
|
|
959
930
|
const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
|
|
960
931
|
//console.log(`[fetch_available_packs_from_store] packs_store_endpoint:%s`, packs_store_endpoint);
|
|
961
|
-
const response = await (
|
|
932
|
+
const response = await fetch(
|
|
962
933
|
//"http://store.saltcorn.com/api/packs?fields=name,description"
|
|
963
934
|
packs_store_endpoint + "?fields=name,description", getFetchProxyOptions());
|
|
964
935
|
const json = await response.json();
|
|
@@ -973,7 +944,7 @@ const fetch_pack_by_name = async (name) => {
|
|
|
973
944
|
//const { getState } = require("../db/state");
|
|
974
945
|
const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
|
|
975
946
|
//console.log(`[fetch_pack_by_name] packs_store_endpoint:%s`, packs_store_endpoint);
|
|
976
|
-
const response = await (
|
|
947
|
+
const response = await fetch(
|
|
977
948
|
//"http://store.saltcorn.com/api/packs?name=" + encodeURIComponent(name)
|
|
978
949
|
packs_store_endpoint + "?name=" + encodeURIComponent(name), getFetchProxyOptions());
|
|
979
950
|
const json = await response.json();
|
|
@@ -1026,7 +997,7 @@ const create_pack_from_tag = async (tag) => {
|
|
|
1026
997
|
return pack;
|
|
1027
998
|
//TODO add models, plugins
|
|
1028
999
|
};
|
|
1029
|
-
|
|
1000
|
+
export default {
|
|
1030
1001
|
table_pack,
|
|
1031
1002
|
view_pack,
|
|
1032
1003
|
plugin_pack,
|