@saltcorn/admin-models 1.6.3-beta.1 → 1.7.0-alpha.1
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-retention.cjs +18 -0
- package/cjs/models/backup.cjs +18 -0
- package/cjs/models/config-check.cjs +18 -0
- package/cjs/models/file-globs.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/cjs/models/zip-extract.cjs +18 -0
- package/cjs/models/zip-format.cjs +18 -0
- package/cjs/models/zip-worker.cjs +18 -0
- package/cjs/models/zip-writer.cjs +18 -0
- package/cjs/models/zip.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-retention.d.ts +57 -0
- package/dist/models/backup-retention.d.ts.map +1 -0
- package/dist/models/backup-retention.js +108 -0
- package/dist/models/backup-retention.js.map +1 -0
- package/dist/models/backup.d.ts +7 -3
- package/dist/models/backup.d.ts.map +1 -1
- package/dist/models/backup.js +479 -409
- 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/file-globs.d.ts +34 -0
- package/dist/models/file-globs.d.ts.map +1 -0
- package/dist/models/file-globs.js +47 -0
- package/dist/models/file-globs.js.map +1 -0
- package/dist/models/pack.d.ts +3 -2
- package/dist/models/pack.d.ts.map +1 -1
- package/dist/models/pack.js +147 -151
- 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 +45 -48
- package/dist/models/tenant.js.map +1 -1
- package/dist/models/zip-extract.d.ts +14 -0
- package/dist/models/zip-extract.d.ts.map +1 -0
- package/dist/models/zip-extract.js +110 -0
- package/dist/models/zip-extract.js.map +1 -0
- package/dist/models/zip-format.d.ts +57 -0
- package/dist/models/zip-format.d.ts.map +1 -0
- package/dist/models/zip-format.js +106 -0
- package/dist/models/zip-format.js.map +1 -0
- package/dist/models/zip-worker.d.ts +2 -0
- package/dist/models/zip-worker.d.ts.map +1 -0
- package/dist/models/zip-worker.js +177 -0
- package/dist/models/zip-worker.js.map +1 -0
- package/dist/models/zip-writer.d.ts +75 -0
- package/dist/models/zip-writer.d.ts.map +1 -0
- package/dist/models/zip-writer.js +321 -0
- package/dist/models/zip-writer.js.map +1 -0
- package/dist/models/zip.d.ts +101 -0
- package/dist/models/zip.d.ts.map +1 -0
- package/dist/models/zip.js +211 -0
- package/dist/models/zip.js.map +1 -0
- package/dist/tests/backup-retention.test.d.ts +2 -0
- package/dist/tests/backup-retention.test.d.ts.map +1 -0
- package/dist/tests/backup-retention.test.js +134 -0
- package/dist/tests/backup-retention.test.js.map +1 -0
- 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 +385 -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/file-globs.test.d.ts +2 -0
- package/dist/tests/file-globs.test.d.ts.map +1 -0
- package/dist/tests/file-globs.test.js +66 -0
- package/dist/tests/file-globs.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 +780 -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/dist/tests/zip.test.d.ts +2 -0
- package/dist/tests/zip.test.d.ts.map +1 -0
- package/dist/tests/zip.test.js +319 -0
- package/dist/tests/zip.test.js.map +1 -0
- package/gen-cjs-shims.cjs +71 -0
- package/package.json +39 -29
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
|
}
|
|
@@ -594,8 +560,11 @@ const filter_pack = (pack, options) => {
|
|
|
594
560
|
* @param loadAndSaveNewPlugin
|
|
595
561
|
* @param bare_tables
|
|
596
562
|
*/
|
|
597
|
-
const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false) => {
|
|
598
|
-
const
|
|
563
|
+
const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false, onLog) => {
|
|
564
|
+
const log = (msg) => onLog?.(msg);
|
|
565
|
+
const Plugin = (await import("@saltcorn/data/models/plugin")).default;
|
|
566
|
+
if (pack.plugins?.length)
|
|
567
|
+
log("Restoring plugins");
|
|
599
568
|
for (const plugin of pack.plugins) {
|
|
600
569
|
if (plugin.source === "npm" && plugin.name.startsWith("@saltcorn/"))
|
|
601
570
|
plugin.name = plugin.name.replace("@saltcorn/", "");
|
|
@@ -611,31 +580,37 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
611
580
|
}
|
|
612
581
|
}
|
|
613
582
|
}
|
|
583
|
+
if (pack.roles?.length)
|
|
584
|
+
log("Restoring roles");
|
|
614
585
|
for (const role of pack.roles || []) {
|
|
615
586
|
role.id = old_to_new_role(role.id);
|
|
616
|
-
const existing = await
|
|
587
|
+
const existing = await Role.findOne({ id: role.id });
|
|
617
588
|
if (existing)
|
|
618
589
|
await existing.update(role);
|
|
619
590
|
else
|
|
620
|
-
await
|
|
591
|
+
await Role.create(role);
|
|
621
592
|
}
|
|
593
|
+
if (pack.library?.length)
|
|
594
|
+
log("Restoring library");
|
|
622
595
|
for (const lib of pack.library || []) {
|
|
623
|
-
const exisiting = await
|
|
596
|
+
const exisiting = await Library.findOne({ name: lib.name });
|
|
624
597
|
if (exisiting)
|
|
625
598
|
await exisiting.update(lib);
|
|
626
599
|
else
|
|
627
|
-
await
|
|
600
|
+
await Library.create(lib);
|
|
628
601
|
}
|
|
629
602
|
// create tables (users skipped because created by other ways)
|
|
630
603
|
// tables with a provider go last because they can depend on presence
|
|
631
604
|
// of other tables
|
|
632
605
|
const packTables = pack.tables.sort((left, right) => left.provider_name ? 1 : right.provider_name ? -1 : 0);
|
|
606
|
+
if (packTables.length)
|
|
607
|
+
log("Restoring table definitions");
|
|
633
608
|
for (const tableSpec of packTables) {
|
|
634
609
|
const { id, ownership_field_id, ownership_field_name, triggers, constraints, fields, ...updrow } = tableSpec;
|
|
635
610
|
if (tableSpec.name !== "users") {
|
|
636
611
|
let tbl_pk;
|
|
637
|
-
const existing =
|
|
638
|
-
getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${
|
|
612
|
+
const existing = Table.findOne({ name: tableSpec.name });
|
|
613
|
+
getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${db.getTenantSchema()}`);
|
|
639
614
|
if (existing) {
|
|
640
615
|
tbl_pk = await existing.getField(existing.pk_name);
|
|
641
616
|
await existing.update(updrow);
|
|
@@ -643,34 +618,34 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
643
618
|
else {
|
|
644
619
|
tableSpec.min_role_read = old_to_new_role(tableSpec.min_role_read);
|
|
645
620
|
tableSpec.min_role_write = old_to_new_role(tableSpec.min_role_write);
|
|
646
|
-
const table = await
|
|
621
|
+
const table = await Table.create(tableSpec.name, tableSpec);
|
|
647
622
|
[tbl_pk] = table.getFields();
|
|
648
623
|
} //set pk
|
|
649
|
-
const pack_pk = tableSpec.fields.find((f) => f.primary_key);
|
|
624
|
+
const pack_pk = (tableSpec.fields || []).find((f) => f.primary_key);
|
|
650
625
|
if (pack_pk && tbl_pk) {
|
|
651
626
|
await tbl_pk.update(pack_pk);
|
|
652
627
|
}
|
|
653
628
|
}
|
|
654
629
|
else {
|
|
655
|
-
await
|
|
630
|
+
await User.table.update(updrow);
|
|
656
631
|
}
|
|
657
632
|
}
|
|
658
633
|
await getState().refresh_tables(true);
|
|
659
634
|
for (const tableSpec of pack.tables) {
|
|
660
|
-
const _table =
|
|
635
|
+
const _table = Table.findOne({ name: tableSpec.name });
|
|
661
636
|
if (!_table)
|
|
662
637
|
throw new Error(`Unable to find table '${tableSpec.name}'`);
|
|
663
638
|
const exfields = _table.getFields();
|
|
664
639
|
if (!_table.provider_name)
|
|
665
|
-
for (const field of tableSpec.fields) {
|
|
640
|
+
for (const field of tableSpec.fields || []) {
|
|
666
641
|
const exfield = exfields.find((f) => f.name === field.name);
|
|
667
642
|
if (!((_table.name === "users" &&
|
|
668
643
|
(field.name === "email" || field.name === "role_id")) ||
|
|
669
644
|
exfield)) {
|
|
670
645
|
if (_table.name === "users" && field.required)
|
|
671
|
-
await
|
|
646
|
+
await Field.create({ table: _table, ...field, required: false }, bare_tables);
|
|
672
647
|
else
|
|
673
|
-
await
|
|
648
|
+
await Field.create({ table: _table, ...field }, bare_tables);
|
|
674
649
|
}
|
|
675
650
|
else if (exfield &&
|
|
676
651
|
!(_table.name === "users" &&
|
|
@@ -682,33 +657,40 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
682
657
|
}
|
|
683
658
|
for (const { table, ...trigger } of tableSpec.triggers || []) {
|
|
684
659
|
trigger.min_role = old_to_new_role(trigger.min_role);
|
|
685
|
-
await
|
|
660
|
+
await Trigger.create({ table: _table, ...trigger }); //legacy, not in new packs
|
|
686
661
|
}
|
|
687
662
|
const existing_constraints = _table.constraints;
|
|
688
663
|
for (const constraint of tableSpec.constraints || []) {
|
|
689
664
|
if (!existing_constraints.find((excon) => excon.type === constraint.type &&
|
|
690
|
-
|
|
691
|
-
await
|
|
665
|
+
isEqual(excon.configuration, constraint.configuration)))
|
|
666
|
+
await TableConstraint.create({ table: _table, ...constraint });
|
|
692
667
|
}
|
|
693
668
|
if (tableSpec.ownership_field_name) {
|
|
694
|
-
const owner_field = await
|
|
669
|
+
const owner_field = await Field.findOne({
|
|
695
670
|
table_id: _table.id,
|
|
696
671
|
name: tableSpec.ownership_field_name,
|
|
697
672
|
});
|
|
698
673
|
await _table.update({ ownership_field_id: owner_field.id });
|
|
699
674
|
}
|
|
675
|
+
else if (tableSpec.rls_enabled && tableSpec.ownership_formula) {
|
|
676
|
+
const freshTable = Table.findOne({ name: _table.name });
|
|
677
|
+
if (freshTable)
|
|
678
|
+
await freshTable.enableOwnershipRLS();
|
|
679
|
+
}
|
|
700
680
|
}
|
|
701
681
|
await getState().refresh_tables(true);
|
|
682
|
+
if (pack.views?.length)
|
|
683
|
+
log("Restoring views");
|
|
702
684
|
for (const viewSpec of pack.views) {
|
|
703
685
|
viewSpec.min_role = old_to_new_role(viewSpec.min_role);
|
|
704
686
|
const { table, on_menu, menu_label, on_root_page, ...viewNoTable } = viewSpec;
|
|
705
|
-
const vtable =
|
|
706
|
-
const existing =
|
|
687
|
+
const vtable = Table.findOne({ name: table });
|
|
688
|
+
const existing = View.findOne({ name: viewNoTable.name });
|
|
707
689
|
if (existing?.id) {
|
|
708
|
-
await
|
|
690
|
+
await View.update(viewNoTable, existing.id);
|
|
709
691
|
}
|
|
710
692
|
else {
|
|
711
|
-
await
|
|
693
|
+
await View.create({
|
|
712
694
|
...viewNoTable,
|
|
713
695
|
table_id: vtable ? vtable.id : null,
|
|
714
696
|
});
|
|
@@ -722,37 +704,41 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
722
704
|
});
|
|
723
705
|
}
|
|
724
706
|
await getState().refresh_views(true);
|
|
707
|
+
if (pack.triggers?.length)
|
|
708
|
+
log("Restoring triggers");
|
|
725
709
|
for (const triggerSpec of pack.triggers || []) {
|
|
726
710
|
triggerSpec.min_role = old_to_new_role(triggerSpec.min_role);
|
|
727
711
|
let id;
|
|
728
|
-
const existing = await
|
|
712
|
+
const existing = await Trigger.findOne({ name: triggerSpec.name });
|
|
729
713
|
if (existing) {
|
|
730
714
|
const { table_name, steps, ...tsNoTableName } = triggerSpec;
|
|
731
715
|
if (table_name)
|
|
732
|
-
tsNoTableName.table_id =
|
|
733
|
-
await
|
|
716
|
+
tsNoTableName.table_id = Table.findOne({ name: table_name })?.id;
|
|
717
|
+
await Trigger.update(existing.id, tsNoTableName);
|
|
734
718
|
id = existing.id;
|
|
735
719
|
}
|
|
736
720
|
else {
|
|
737
|
-
const newTrigger = await
|
|
721
|
+
const newTrigger = await Trigger.create(triggerSpec);
|
|
738
722
|
id = newTrigger.id;
|
|
739
723
|
}
|
|
740
724
|
if (triggerSpec.action === "Workflow" && triggerSpec.steps) {
|
|
741
|
-
await
|
|
725
|
+
await WorkflowStep.deleteForTrigger(id);
|
|
742
726
|
for (const step of triggerSpec.steps) {
|
|
743
|
-
await
|
|
727
|
+
await WorkflowStep.create({ ...step, trigger_id: id });
|
|
744
728
|
}
|
|
745
729
|
}
|
|
746
730
|
}
|
|
747
731
|
await getState().refresh_triggers(true);
|
|
732
|
+
if (pack.pages?.length)
|
|
733
|
+
log("Restoring pages");
|
|
748
734
|
for (const pageFullSpec of pack.pages || []) {
|
|
749
735
|
pageFullSpec.min_role = old_to_new_role(pageFullSpec.min_role);
|
|
750
736
|
const { root_page_for_roles, menu_label, ...pageSpec } = pageFullSpec;
|
|
751
|
-
const existing =
|
|
737
|
+
const existing = Page.findOne({ name: pageSpec.name });
|
|
752
738
|
if (existing?.id)
|
|
753
|
-
await
|
|
739
|
+
await Page.update(existing.id, pageSpec);
|
|
754
740
|
else
|
|
755
|
-
await
|
|
741
|
+
await Page.create(pageSpec);
|
|
756
742
|
for (const role of root_page_for_roles || []) {
|
|
757
743
|
const current_root = getState().getConfigCopy(role + "_home", "");
|
|
758
744
|
if (!current_root || current_root === "")
|
|
@@ -767,51 +753,55 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
767
753
|
});
|
|
768
754
|
}
|
|
769
755
|
await getState().refresh_pages(true);
|
|
756
|
+
if (pack.page_groups?.length)
|
|
757
|
+
log("Restoring page groups");
|
|
770
758
|
for (const pageGroupSpec of pack.page_groups || []) {
|
|
771
759
|
pageGroupSpec.min_role = old_to_new_role(pageGroupSpec.min_role);
|
|
772
760
|
const { members, ...pageGroupNoMembers } = pageGroupSpec;
|
|
773
|
-
let existing =
|
|
761
|
+
let existing = PageGroup.findOne({ name: pageGroupSpec.name });
|
|
774
762
|
if (existing?.id) {
|
|
775
763
|
await existing.clearMembers(); // or merge ?
|
|
776
|
-
await
|
|
764
|
+
await PageGroup.update(existing.id, pageGroupNoMembers);
|
|
777
765
|
}
|
|
778
766
|
else
|
|
779
|
-
existing = await
|
|
767
|
+
existing = await PageGroup.create(pageGroupNoMembers);
|
|
780
768
|
const group = existing;
|
|
781
769
|
if (!group)
|
|
782
770
|
throw new Error(`Unable to create page group '${pageGroupSpec.name}'`);
|
|
783
771
|
for (const member of members || []) {
|
|
784
772
|
const { page_name, ...memberNoPageName } = member;
|
|
785
|
-
const page =
|
|
773
|
+
const page = Page.findOne({ name: page_name });
|
|
786
774
|
if (!page)
|
|
787
775
|
throw new Error(`Unable to find page '${member.page_name}'`);
|
|
788
776
|
await group.addMember({ ...memberNoPageName, page_id: page.id });
|
|
789
777
|
}
|
|
790
778
|
}
|
|
779
|
+
if (pack.tags?.length)
|
|
780
|
+
log("Restoring tags");
|
|
791
781
|
for (const tag of pack.tags || []) {
|
|
792
782
|
const entries = tag.entries
|
|
793
783
|
? tag.entries.map((e) => {
|
|
794
784
|
const result = {};
|
|
795
785
|
if (e.page_name) {
|
|
796
|
-
const page =
|
|
786
|
+
const page = Page.findOne({ name: e.page_name });
|
|
797
787
|
if (!page)
|
|
798
788
|
throw new Error(`Unable to find page '${e.page_name}'`);
|
|
799
789
|
result.page_id = page.id;
|
|
800
790
|
}
|
|
801
791
|
if (e.view_name) {
|
|
802
|
-
const view =
|
|
792
|
+
const view = View.findOne({ name: e.view_name });
|
|
803
793
|
if (!view)
|
|
804
794
|
throw new Error(`Unable to find view '${e.view_name}'`);
|
|
805
795
|
result.view_id = view.id;
|
|
806
796
|
}
|
|
807
797
|
if (e.table_name) {
|
|
808
|
-
const table =
|
|
798
|
+
const table = Table.findOne({ name: e.table_name });
|
|
809
799
|
if (!table)
|
|
810
800
|
throw new Error(`Unable to find table '${e.table_name}'`);
|
|
811
801
|
result.table_id = table.id;
|
|
812
802
|
}
|
|
813
803
|
if (e.trigger_name) {
|
|
814
|
-
const trigger =
|
|
804
|
+
const trigger = Trigger.findOne({ name: e.trigger_name });
|
|
815
805
|
if (!trigger)
|
|
816
806
|
throw new Error(`Unable to find trigger '${e.trigger_name}'`);
|
|
817
807
|
result.trigger_id = trigger.id;
|
|
@@ -819,17 +809,19 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
819
809
|
return result;
|
|
820
810
|
})
|
|
821
811
|
: undefined;
|
|
822
|
-
const existing = await
|
|
812
|
+
const existing = await Tag.findOne({ name: tag.name });
|
|
823
813
|
if (!existing)
|
|
824
|
-
await
|
|
814
|
+
await Tag.create({ name: tag.name, entries });
|
|
825
815
|
else {
|
|
826
816
|
for (const entry of entries || []) {
|
|
827
|
-
await
|
|
817
|
+
await TagEntry.create({ tag_id: existing.id, ...entry });
|
|
828
818
|
}
|
|
829
819
|
}
|
|
830
820
|
}
|
|
821
|
+
if (pack.models?.length)
|
|
822
|
+
log("Restoring models");
|
|
831
823
|
for (const model of pack.models || []) {
|
|
832
|
-
const mTbl =
|
|
824
|
+
const mTbl = Table.findOne({ name: model.table_name });
|
|
833
825
|
if (!mTbl)
|
|
834
826
|
throw new Error(`Unable to find table '${model.table_name}'`);
|
|
835
827
|
if (!mTbl.id)
|
|
@@ -839,13 +831,13 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
839
831
|
if (table_name === mTbl.name)
|
|
840
832
|
cfg.table_id = mTbl.id;
|
|
841
833
|
else {
|
|
842
|
-
const cfgTbl =
|
|
834
|
+
const cfgTbl = Table.findOne({ name: table_name });
|
|
843
835
|
if (!cfgTbl)
|
|
844
836
|
throw new Error(`Unable to find table '${table_name}'`);
|
|
845
837
|
cfg.table_id = cfgTbl.id;
|
|
846
838
|
}
|
|
847
839
|
}
|
|
848
|
-
const existing = await
|
|
840
|
+
const existing = await Model.findOne({
|
|
849
841
|
name: model.name,
|
|
850
842
|
table_id: mTbl.id,
|
|
851
843
|
});
|
|
@@ -855,18 +847,20 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
855
847
|
configuration: cfg,
|
|
856
848
|
});
|
|
857
849
|
else
|
|
858
|
-
await
|
|
850
|
+
await Model.create({
|
|
859
851
|
name: model.name,
|
|
860
852
|
table_id: mTbl.id,
|
|
861
853
|
modelpattern: model.modelpattern,
|
|
862
854
|
configuration: cfg,
|
|
863
855
|
});
|
|
864
856
|
}
|
|
857
|
+
if (pack.model_instances?.length)
|
|
858
|
+
log("Restoring model instances");
|
|
865
859
|
for (const modelInst of pack.model_instances || []) {
|
|
866
|
-
const table =
|
|
860
|
+
const table = Table.findOne({ name: modelInst.table_name });
|
|
867
861
|
if (!table)
|
|
868
862
|
throw new Error(`Unable to find table '${modelInst.table_name}'`);
|
|
869
|
-
const model = await
|
|
863
|
+
const model = await Model.findOne({
|
|
870
864
|
name: modelInst.model_name,
|
|
871
865
|
table_id: table.id,
|
|
872
866
|
});
|
|
@@ -874,7 +868,7 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
874
868
|
throw new Error(`Unable to find table '${modelInst.model_name}'`);
|
|
875
869
|
const { model_name, ...mICfg } = modelInst;
|
|
876
870
|
mICfg.model_id = model.id;
|
|
877
|
-
const existing = await
|
|
871
|
+
const existing = await ModelInstance.findOne({
|
|
878
872
|
name: modelInst.name,
|
|
879
873
|
model_id: model.id,
|
|
880
874
|
});
|
|
@@ -883,20 +877,22 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
|
|
|
883
877
|
await existing.update(updrow);
|
|
884
878
|
}
|
|
885
879
|
else
|
|
886
|
-
await
|
|
880
|
+
await ModelInstance.create(mICfg);
|
|
887
881
|
}
|
|
882
|
+
if (pack.event_logs?.length)
|
|
883
|
+
log("Restoring event logs");
|
|
888
884
|
for (const eventLog of pack.event_logs || []) {
|
|
889
885
|
const { user_email, ...rest } = eventLog;
|
|
890
886
|
const eventLogCfg = rest;
|
|
891
887
|
if (user_email) {
|
|
892
|
-
const user = await
|
|
888
|
+
const user = await User.findOne({ email: user_email });
|
|
893
889
|
if (user)
|
|
894
890
|
eventLogCfg.user_id = user.id;
|
|
895
891
|
else {
|
|
896
892
|
getState().log(3, `User '${user_email}' not found for event log ${eventLog.event_type}`);
|
|
897
893
|
}
|
|
898
894
|
}
|
|
899
|
-
await
|
|
895
|
+
await EventLog.create(eventLogCfg);
|
|
900
896
|
}
|
|
901
897
|
if (pack.config) {
|
|
902
898
|
const state = getState();
|
|
@@ -958,7 +954,7 @@ const fetch_available_packs_from_store = async () => {
|
|
|
958
954
|
//const { getState } = require("../db/state");
|
|
959
955
|
const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
|
|
960
956
|
//console.log(`[fetch_available_packs_from_store] packs_store_endpoint:%s`, packs_store_endpoint);
|
|
961
|
-
const response = await (
|
|
957
|
+
const response = await fetch(
|
|
962
958
|
//"http://store.saltcorn.com/api/packs?fields=name,description"
|
|
963
959
|
packs_store_endpoint + "?fields=name,description", getFetchProxyOptions());
|
|
964
960
|
const json = await response.json();
|
|
@@ -973,7 +969,7 @@ const fetch_pack_by_name = async (name) => {
|
|
|
973
969
|
//const { getState } = require("../db/state");
|
|
974
970
|
const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
|
|
975
971
|
//console.log(`[fetch_pack_by_name] packs_store_endpoint:%s`, packs_store_endpoint);
|
|
976
|
-
const response = await (
|
|
972
|
+
const response = await fetch(
|
|
977
973
|
//"http://store.saltcorn.com/api/packs?name=" + encodeURIComponent(name)
|
|
978
974
|
packs_store_endpoint + "?name=" + encodeURIComponent(name), getFetchProxyOptions());
|
|
979
975
|
const json = await response.json();
|
|
@@ -1026,7 +1022,7 @@ const create_pack_from_tag = async (tag) => {
|
|
|
1026
1022
|
return pack;
|
|
1027
1023
|
//TODO add models, plugins
|
|
1028
1024
|
};
|
|
1029
|
-
|
|
1025
|
+
export default {
|
|
1030
1026
|
table_pack,
|
|
1031
1027
|
view_pack,
|
|
1032
1028
|
plugin_pack,
|