@saltcorn/admin-models 0.6.4-beta.2
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/dist/models/backup.d.ts +12 -0
- package/dist/models/backup.d.ts.map +1 -0
- package/dist/models/backup.js +277 -0
- package/dist/models/backup.js.map +1 -0
- package/dist/models/pack.d.ts +40 -0
- package/dist/models/pack.d.ts.map +1 -0
- package/dist/models/pack.js +407 -0
- package/dist/models/pack.js.map +1 -0
- package/dist/models/tenant.d.ts +26 -0
- package/dist/models/tenant.d.ts.map +1 -0
- package/dist/models/tenant.js +161 -0
- package/dist/models/tenant.js.map +1 -0
- package/dist/tests/actions.test.d.ts +2 -0
- package/dist/tests/actions.test.d.ts.map +1 -0
- package/dist/tests/actions.test.js +230 -0
- package/dist/tests/actions.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 +101 -0
- package/dist/tests/backup.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 +339 -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 +148 -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 +59 -0
- package/dist/tests/tenant.test.js.map +1 -0
- package/dist/tsconfig.ref.tsbuildinfo +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @category saltcorn-admin-models
|
|
4
|
+
* @module pack
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
const table_1 = __importDefault(require("@saltcorn/data/models/table"));
|
|
29
|
+
const index_1 = __importDefault(require("@saltcorn/data/db/index"));
|
|
30
|
+
const view_1 = __importDefault(require("@saltcorn/data/models/view"));
|
|
31
|
+
const field_1 = __importDefault(require("@saltcorn/data/models/field"));
|
|
32
|
+
const trigger_1 = __importDefault(require("@saltcorn/data/models/trigger"));
|
|
33
|
+
const { getState } = require("@saltcorn/data/db/state");
|
|
34
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
35
|
+
const page_1 = __importDefault(require("@saltcorn/data/models/page"));
|
|
36
|
+
const table_constraints_1 = __importDefault(require("@saltcorn/data/models/table_constraints"));
|
|
37
|
+
const role_1 = __importDefault(require("@saltcorn/data/models/role"));
|
|
38
|
+
const library_1 = __importDefault(require("@saltcorn/data/models/library"));
|
|
39
|
+
const config_1 = __importDefault(require("@saltcorn/data/models/config"));
|
|
40
|
+
const { save_menu_items } = config_1.default;
|
|
41
|
+
const { isStale } = require("@saltcorn/data/utils");
|
|
42
|
+
/**
|
|
43
|
+
* @function
|
|
44
|
+
* @param {string} name
|
|
45
|
+
* @returns {Promise<object>}
|
|
46
|
+
*/
|
|
47
|
+
const table_pack = async (name) => {
|
|
48
|
+
const table = await table_1.default.findOne({ name });
|
|
49
|
+
if (!table)
|
|
50
|
+
throw new Error(`Unable to find table '${name}'`);
|
|
51
|
+
const fields = await table.getFields();
|
|
52
|
+
const strip_ids = (o) => {
|
|
53
|
+
delete o.id;
|
|
54
|
+
delete o.table_id;
|
|
55
|
+
return o;
|
|
56
|
+
};
|
|
57
|
+
//const triggers = await Trigger.find({ table_id: table.id });
|
|
58
|
+
const constraints = await table_constraints_1.default.find({ table_id: table.id });
|
|
59
|
+
return {
|
|
60
|
+
name: table.name,
|
|
61
|
+
min_role_read: table.min_role_read,
|
|
62
|
+
min_role_write: table.min_role_write,
|
|
63
|
+
versioned: table.versioned,
|
|
64
|
+
ownership_formula: table.ownership_formula,
|
|
65
|
+
fields: fields.map((f) => strip_ids(f.toJson)),
|
|
66
|
+
//triggers: triggers.map((tr) => tr.toJson),
|
|
67
|
+
constraints: constraints.map((c) => c.toJson),
|
|
68
|
+
ownership_field_name: table.owner_fieldname_from_fields(fields),
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* @function
|
|
73
|
+
* @param {string} name
|
|
74
|
+
* @returns {Promise<object>}
|
|
75
|
+
*/
|
|
76
|
+
const view_pack = async (name) => {
|
|
77
|
+
const view = await view_1.default.findOne({ name });
|
|
78
|
+
if (!view)
|
|
79
|
+
throw new Error(`Unable to find view '${name}'`);
|
|
80
|
+
const table = await table_1.default.findOne({ id: view.table_id });
|
|
81
|
+
if (!table)
|
|
82
|
+
throw new Error(`Unable to find table with id '${view.table_id}'`);
|
|
83
|
+
return {
|
|
84
|
+
name: view.name,
|
|
85
|
+
viewtemplate: view.viewtemplate,
|
|
86
|
+
configuration: view.configuration,
|
|
87
|
+
min_role: view.min_role,
|
|
88
|
+
table: table ? table.name : null,
|
|
89
|
+
menu_label: view.menu_label,
|
|
90
|
+
default_render_page: view.default_render_page,
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* @function
|
|
95
|
+
* @param {string} name
|
|
96
|
+
* @returns {Promise<object>}
|
|
97
|
+
*/
|
|
98
|
+
const plugin_pack = async (name) => {
|
|
99
|
+
const Plugin = (await Promise.resolve().then(() => __importStar(require("@saltcorn/data/models/plugin")))).default;
|
|
100
|
+
const plugin = await Plugin.findOne({ name });
|
|
101
|
+
if (!plugin)
|
|
102
|
+
throw new Error(`Unable to find plugin '${name}'`);
|
|
103
|
+
return {
|
|
104
|
+
name: plugin.name,
|
|
105
|
+
source: plugin.source,
|
|
106
|
+
location: plugin.location,
|
|
107
|
+
configuration: plugin.configuration,
|
|
108
|
+
deploy_private_key: plugin.deploy_private_key,
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* @function
|
|
113
|
+
* @param {string} name
|
|
114
|
+
* @returns {Promise<object>}
|
|
115
|
+
*/
|
|
116
|
+
const page_pack = async (name) => {
|
|
117
|
+
const page = await page_1.default.findOne({ name });
|
|
118
|
+
const root_page_for_roles = await page.is_root_page_for_roles();
|
|
119
|
+
return {
|
|
120
|
+
name: page.name,
|
|
121
|
+
title: page.title,
|
|
122
|
+
description: page.description,
|
|
123
|
+
min_role: page.min_role,
|
|
124
|
+
layout: page.layout,
|
|
125
|
+
fixed_states: page.fixed_states,
|
|
126
|
+
menu_label: page.menu_label,
|
|
127
|
+
root_page_for_roles,
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* @function
|
|
132
|
+
* @param {string} name
|
|
133
|
+
* @returns {Promise<object>}
|
|
134
|
+
*/
|
|
135
|
+
const library_pack = async (name) => {
|
|
136
|
+
const lib = await library_1.default.findOne({ name });
|
|
137
|
+
return lib.toJson;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* @function
|
|
141
|
+
* @param {string} name
|
|
142
|
+
* @returns {Promise<object>}
|
|
143
|
+
*/
|
|
144
|
+
const trigger_pack = async (name) => {
|
|
145
|
+
const trig = await trigger_1.default.findOne({ name });
|
|
146
|
+
return trig.toJson;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* @function
|
|
150
|
+
* @param {string} role
|
|
151
|
+
* @returns {Promise<object>}
|
|
152
|
+
*/
|
|
153
|
+
const role_pack = async (role) => {
|
|
154
|
+
return await role_1.default.findOne({ role });
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* @function
|
|
158
|
+
* @param {string} pack
|
|
159
|
+
* @returns {Promise<boolean|object>}
|
|
160
|
+
*/
|
|
161
|
+
const can_install_pack = async (pack) => {
|
|
162
|
+
const warns = new Array();
|
|
163
|
+
const allTables = (await table_1.default.find()).map((t) => index_1.default.sqlsanitize(t.name.toLowerCase()));
|
|
164
|
+
const allViews = (await view_1.default.find()).map((t) => t.name);
|
|
165
|
+
const allPages = (await page_1.default.find()).map((t) => t.name);
|
|
166
|
+
const packTables = (pack.tables || []).map((t) => index_1.default.sqlsanitize(t.name.toLowerCase()));
|
|
167
|
+
const matchTables = allTables.filter((dbt) => packTables.some((pt) => pt === dbt && pt !== "users"));
|
|
168
|
+
const matchViews = allViews.filter((dbt) => (pack.views || []).some((pt) => pt.name === dbt));
|
|
169
|
+
const matchPages = allPages.filter((dbt) => (pack.pages || []).some((pt) => pt.name === dbt));
|
|
170
|
+
if (matchTables.length > 0)
|
|
171
|
+
return {
|
|
172
|
+
error: "Tables already exist: " + matchTables.join(),
|
|
173
|
+
};
|
|
174
|
+
pack.tables.forEach((t) => {
|
|
175
|
+
if (t.name === "users")
|
|
176
|
+
t.fields.forEach((f) => {
|
|
177
|
+
if (f.required) {
|
|
178
|
+
warns.push(`User field '${f.name}' is required in pack, but there are existing users. You must set a value for each user and then change the field to be required. Got to <a href="/list/users">users table data</a>.`);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
matchViews.forEach((v) => {
|
|
183
|
+
warns.push(`Clashing view ${v}.`);
|
|
184
|
+
});
|
|
185
|
+
matchPages.forEach((p) => {
|
|
186
|
+
warns.push(`Clashing page ${p}.`);
|
|
187
|
+
});
|
|
188
|
+
if (warns.length > 0)
|
|
189
|
+
return { warning: warns.join(" ") };
|
|
190
|
+
else
|
|
191
|
+
return true;
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* @function
|
|
195
|
+
* @param {string} pack
|
|
196
|
+
* @param {string} name
|
|
197
|
+
* @returns {Promise<void>}
|
|
198
|
+
*/
|
|
199
|
+
const uninstall_pack = async (pack, name) => {
|
|
200
|
+
for (const pageSpec of pack.pages || []) {
|
|
201
|
+
const page = await page_1.default.findOne({ name: pageSpec.name });
|
|
202
|
+
if (page)
|
|
203
|
+
await page.delete();
|
|
204
|
+
}
|
|
205
|
+
for (const viewSpec of pack.views) {
|
|
206
|
+
const view = await view_1.default.findOne({ name: viewSpec.name });
|
|
207
|
+
if (view)
|
|
208
|
+
await view.delete();
|
|
209
|
+
}
|
|
210
|
+
for (const tableSpec of pack.tables) {
|
|
211
|
+
const table = await table_1.default.findOne({ name: tableSpec.name });
|
|
212
|
+
if (table && table.name === "users")
|
|
213
|
+
continue;
|
|
214
|
+
if (table) {
|
|
215
|
+
const fields = await table.getFields();
|
|
216
|
+
for (const field of fields) {
|
|
217
|
+
if (field.is_fkey)
|
|
218
|
+
await field.delete();
|
|
219
|
+
}
|
|
220
|
+
const triggers = await trigger_1.default.find({ table_id: table.id });
|
|
221
|
+
for (const trigger of triggers) {
|
|
222
|
+
await trigger.delete();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
for (const tableSpec of pack.tables) {
|
|
227
|
+
const table = await table_1.default.findOne({ name: tableSpec.name });
|
|
228
|
+
if (table && table.name !== "users")
|
|
229
|
+
await table.delete();
|
|
230
|
+
}
|
|
231
|
+
if (name) {
|
|
232
|
+
const existPacks = getState().getConfigCopy("installed_packs", []);
|
|
233
|
+
await getState().setConfig("installed_packs", existPacks.filter((p) => p !== name));
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* @function
|
|
238
|
+
* @param {object} item
|
|
239
|
+
* @returns {Promise<void>}
|
|
240
|
+
*/
|
|
241
|
+
const add_to_menu = async (item) => {
|
|
242
|
+
const current_menu = getState().getConfigCopy("menu_items", []);
|
|
243
|
+
current_menu.push(item);
|
|
244
|
+
await save_menu_items(current_menu);
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* @function
|
|
248
|
+
* @param {string} pack
|
|
249
|
+
* @param {string} [name]
|
|
250
|
+
* @param {function} loadAndSaveNewPlugin
|
|
251
|
+
* @param {boolean} [bare_tables = false]
|
|
252
|
+
* @returns {Promise<void>}
|
|
253
|
+
*/
|
|
254
|
+
const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false) => {
|
|
255
|
+
const Plugin = (await Promise.resolve().then(() => __importStar(require("@saltcorn/data/models/plugin")))).default;
|
|
256
|
+
const existingPlugins = await Plugin.find({});
|
|
257
|
+
for (const plugin of pack.plugins) {
|
|
258
|
+
if (!existingPlugins.some((ep) => ep.name === plugin.name)) {
|
|
259
|
+
const p = new Plugin(plugin);
|
|
260
|
+
await loadAndSaveNewPlugin(p);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const role of pack.roles || []) {
|
|
264
|
+
await role_1.default.create(role);
|
|
265
|
+
}
|
|
266
|
+
for (const lib of pack.library || []) {
|
|
267
|
+
await library_1.default.create(lib);
|
|
268
|
+
}
|
|
269
|
+
for (const tableSpec of pack.tables) {
|
|
270
|
+
if (tableSpec.name !== "users") {
|
|
271
|
+
const table = await table_1.default.create(tableSpec.name, tableSpec);
|
|
272
|
+
const [tbl_pk] = await table.getFields();
|
|
273
|
+
//set pk
|
|
274
|
+
const pack_pk = tableSpec.fields.find((f) => f.primary_key);
|
|
275
|
+
if (pack_pk) {
|
|
276
|
+
await tbl_pk.update(pack_pk);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (const tableSpec of pack.tables) {
|
|
281
|
+
const _table = await table_1.default.findOne({ name: tableSpec.name });
|
|
282
|
+
if (!_table)
|
|
283
|
+
throw new Error(`Unable to find table '${tableSpec.name}'`);
|
|
284
|
+
const exfields = await _table.getFields();
|
|
285
|
+
for (const field of tableSpec.fields) {
|
|
286
|
+
const exfield = exfields.find((f) => f.name === field.name);
|
|
287
|
+
if (!((_table.name === "users" && field.name === "email") || exfield)) {
|
|
288
|
+
if (_table.name === "users" && field.required)
|
|
289
|
+
await field_1.default.create({ table: _table, ...field, required: false }, bare_tables);
|
|
290
|
+
else
|
|
291
|
+
await field_1.default.create({ table: _table, ...field }, bare_tables);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
for (const { table, ...trigger } of tableSpec.triggers || []) {
|
|
295
|
+
await trigger_1.default.create({ table: _table, ...trigger }); //legacy, not in new packs
|
|
296
|
+
}
|
|
297
|
+
for (const constraint of tableSpec.constraints || [])
|
|
298
|
+
await table_constraints_1.default.create({ table: _table, ...constraint });
|
|
299
|
+
if (tableSpec.ownership_field_name) {
|
|
300
|
+
const owner_field = await field_1.default.findOne({
|
|
301
|
+
table_id: _table.id,
|
|
302
|
+
name: tableSpec.ownership_field_name,
|
|
303
|
+
});
|
|
304
|
+
await _table.update({ ownership_field_id: owner_field.id });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
for (const viewSpec of pack.views) {
|
|
308
|
+
const { table, on_menu, menu_label, on_root_page, ...viewNoTable } = viewSpec;
|
|
309
|
+
const vtable = await table_1.default.findOne({ name: table });
|
|
310
|
+
await view_1.default.create({
|
|
311
|
+
...viewNoTable,
|
|
312
|
+
table_id: vtable ? vtable.id : null,
|
|
313
|
+
});
|
|
314
|
+
if (menu_label)
|
|
315
|
+
await add_to_menu({
|
|
316
|
+
label: menu_label,
|
|
317
|
+
type: "View",
|
|
318
|
+
viewname: viewSpec.name,
|
|
319
|
+
min_role: viewSpec.min_role || 10,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
for (const triggerSpec of pack.triggers || []) {
|
|
323
|
+
await trigger_1.default.create(triggerSpec);
|
|
324
|
+
}
|
|
325
|
+
for (const pageFullSpec of pack.pages || []) {
|
|
326
|
+
const { root_page_for_roles, menu_label, ...pageSpec } = pageFullSpec;
|
|
327
|
+
await page_1.default.create(pageSpec);
|
|
328
|
+
for (const role of root_page_for_roles || []) {
|
|
329
|
+
const current_root = getState().getConfigCopy(role + "_home", "");
|
|
330
|
+
if (!current_root || current_root === "")
|
|
331
|
+
await getState().setConfig(role + "_home", pageSpec.name);
|
|
332
|
+
}
|
|
333
|
+
if (menu_label)
|
|
334
|
+
await add_to_menu({
|
|
335
|
+
label: menu_label,
|
|
336
|
+
type: "Page",
|
|
337
|
+
pagename: pageSpec.name,
|
|
338
|
+
min_role: pageSpec.min_role,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
if (name) {
|
|
342
|
+
const existPacks = getState().getConfigCopy("installed_packs", []);
|
|
343
|
+
await getState().setConfig("installed_packs", [...existPacks, name]);
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
/**
|
|
347
|
+
* @function
|
|
348
|
+
* @returns {object[]}
|
|
349
|
+
*/
|
|
350
|
+
const fetch_available_packs = async () => {
|
|
351
|
+
const stored = getState().getConfigCopy("available_packs", false);
|
|
352
|
+
const stored_at = getState().getConfigCopy("available_packs_fetched_at", false);
|
|
353
|
+
//console.log("in fetch", stored_at, stored)
|
|
354
|
+
if (!stored || !stored_at || isStale(stored_at)) {
|
|
355
|
+
try {
|
|
356
|
+
const from_api = await fetch_available_packs_from_store();
|
|
357
|
+
await getState().setConfig("available_packs", from_api);
|
|
358
|
+
await getState().setConfig("available_packs_fetched_at", new Date());
|
|
359
|
+
return from_api;
|
|
360
|
+
}
|
|
361
|
+
catch (e) {
|
|
362
|
+
console.error("fetch store error", e);
|
|
363
|
+
return [];
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else
|
|
367
|
+
return stored;
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* @function
|
|
371
|
+
* @returns {Promise<object[]>}
|
|
372
|
+
*/
|
|
373
|
+
const fetch_available_packs_from_store = async () => {
|
|
374
|
+
//console.log("fetch packs");
|
|
375
|
+
const response = await (0, node_fetch_1.default)("http://store.saltcorn.com/api/packs?fields=name,description");
|
|
376
|
+
const json = await response.json();
|
|
377
|
+
return json.success;
|
|
378
|
+
};
|
|
379
|
+
/**
|
|
380
|
+
* @function
|
|
381
|
+
* @param {string} name
|
|
382
|
+
* @returns {Promise<object|null>}
|
|
383
|
+
*/
|
|
384
|
+
const fetch_pack_by_name = async (name) => {
|
|
385
|
+
const response = await (0, node_fetch_1.default)("http://store.saltcorn.com/api/packs?name=" + encodeURIComponent(name));
|
|
386
|
+
const json = await response.json();
|
|
387
|
+
if (json.success.length == 1)
|
|
388
|
+
return json.success[0];
|
|
389
|
+
else
|
|
390
|
+
return null;
|
|
391
|
+
};
|
|
392
|
+
module.exports = {
|
|
393
|
+
table_pack,
|
|
394
|
+
view_pack,
|
|
395
|
+
plugin_pack,
|
|
396
|
+
page_pack,
|
|
397
|
+
role_pack,
|
|
398
|
+
library_pack,
|
|
399
|
+
trigger_pack,
|
|
400
|
+
install_pack,
|
|
401
|
+
fetch_available_packs,
|
|
402
|
+
fetch_pack_by_name,
|
|
403
|
+
can_install_pack,
|
|
404
|
+
uninstall_pack,
|
|
405
|
+
add_to_menu,
|
|
406
|
+
};
|
|
407
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../models/pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Plugin from "@saltcorn/data/models/plugin";
|
|
2
|
+
import type { Row } from "@saltcorn/db-common/internal";
|
|
3
|
+
declare const _default: {
|
|
4
|
+
create_tenant: ({ t, plugin_loader, noSignalOrDB, loadAndSaveNewPlugin, tenant_template, }: {
|
|
5
|
+
t: string;
|
|
6
|
+
plugin_loader: Function;
|
|
7
|
+
noSignalOrDB?: boolean | undefined;
|
|
8
|
+
loadAndSaveNewPlugin?: ((plugin: Plugin) => void) | undefined;
|
|
9
|
+
tenant_template?: string | undefined;
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
insertTenant: (subdomain: string, email?: string | undefined, description?: string | undefined) => Promise<string>;
|
|
12
|
+
switchToTenant: (domain: string, newurl: string) => Promise<void>;
|
|
13
|
+
getAllTenants: () => Promise<string[]>;
|
|
14
|
+
getAllTenantRows: () => Promise<Row[]>;
|
|
15
|
+
domain_sanitize: (s: string) => string;
|
|
16
|
+
deleteTenant: (sub: string) => Promise<void>;
|
|
17
|
+
eachTenant: (f: () => Promise<any>) => Promise<void>;
|
|
18
|
+
copy_tenant_template: ({ tenant_template, target, state, loadAndSaveNewPlugin, }: {
|
|
19
|
+
tenant_template: string;
|
|
20
|
+
target: string;
|
|
21
|
+
state: any;
|
|
22
|
+
loadAndSaveNewPlugin: (plugin: Plugin) => void;
|
|
23
|
+
}) => Promise<void>;
|
|
24
|
+
};
|
|
25
|
+
export = _default;
|
|
26
|
+
//# sourceMappingURL=tenant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../models/tenant.ts"],"names":[],"mappings":"AAWA,OAAO,MAAM,MAAM,8BAA8B,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;;;;;;;;;;;;;;;;;;;;;;;AA6KxD,kBAUE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Tenant Management Data Layer Access
|
|
7
|
+
* @category saltcorn-admin-models
|
|
8
|
+
* @module tenant
|
|
9
|
+
*/
|
|
10
|
+
const index_1 = __importDefault(require("@saltcorn/data/db/index"));
|
|
11
|
+
const reset = require("@saltcorn/data/db/reset_schema");
|
|
12
|
+
const internal_1 = require("@saltcorn/db-common/internal");
|
|
13
|
+
const config_1 = __importDefault(require("@saltcorn/data/models/config"));
|
|
14
|
+
const { setConfig } = config_1.default;
|
|
15
|
+
const promises_1 = require("fs/promises");
|
|
16
|
+
const backup_1 = __importDefault(require("./backup"));
|
|
17
|
+
const { create_backup, restore } = backup_1.default;
|
|
18
|
+
const { tenants, process_send } = require("@saltcorn/data/db/state");
|
|
19
|
+
/**
|
|
20
|
+
* List all Tenants
|
|
21
|
+
* @function
|
|
22
|
+
* @returns {Promise<string[]>}
|
|
23
|
+
*/
|
|
24
|
+
const getAllTenants = async () => {
|
|
25
|
+
const tens = await index_1.default.select("_sc_tenants");
|
|
26
|
+
return tens.map(({ subdomain }) => subdomain);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* List all Tenants
|
|
30
|
+
* @function
|
|
31
|
+
* @returns {Promise<string[]>}
|
|
32
|
+
*/
|
|
33
|
+
const getAllTenantRows = async () => {
|
|
34
|
+
return await index_1.default.select("_sc_tenants");
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Insert Tenant
|
|
38
|
+
* - normalize domain name
|
|
39
|
+
* - create db schema
|
|
40
|
+
* - reset db schema (create required )
|
|
41
|
+
* @function
|
|
42
|
+
* @param {string} subdomain tenant name (subdomain)
|
|
43
|
+
* @param {string} [email] email of creator
|
|
44
|
+
* @param {string} [description] description of tenant
|
|
45
|
+
* @returns {Promise<void>}
|
|
46
|
+
*/
|
|
47
|
+
const insertTenant =
|
|
48
|
+
// TODO how to set names for arguments
|
|
49
|
+
async (subdomain, email, description) => {
|
|
50
|
+
// normalize domain name
|
|
51
|
+
const saneDomain = domain_sanitize(subdomain);
|
|
52
|
+
// add email
|
|
53
|
+
const saneEmail = typeof email !== "undefined" ? email : "";
|
|
54
|
+
// add description
|
|
55
|
+
const saneDescription = description !== "undefined" ? description : null;
|
|
56
|
+
// add info about tenant into main site
|
|
57
|
+
const id = await index_1.default.insert("_sc_tenants", { subdomain: saneDomain, email: saneEmail, description: saneDescription }, { noid: true });
|
|
58
|
+
//create schema
|
|
59
|
+
if (!index_1.default.isSQLite)
|
|
60
|
+
await index_1.default.query(`CREATE SCHEMA "${saneDomain}";`);
|
|
61
|
+
return saneDomain;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Switch to Tenant:
|
|
65
|
+
* - change current base_url
|
|
66
|
+
* @param subdomain tenant name (subdomain)
|
|
67
|
+
* @param newurl base url of tenant
|
|
68
|
+
*/
|
|
69
|
+
const switchToTenant = async (domain, newurl) => {
|
|
70
|
+
// set continuation storage
|
|
71
|
+
//db.tenantNamespace.set("tenant", saneDomain);
|
|
72
|
+
await index_1.default.runWithTenant(domain, async () => {
|
|
73
|
+
//reset schema
|
|
74
|
+
await reset(true, domain);
|
|
75
|
+
if (newurl)
|
|
76
|
+
await setConfig("base_url", newurl);
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const copy_tenant_template = async ({ tenant_template, target, state, loadAndSaveNewPlugin, }) => {
|
|
80
|
+
// TODO use a hygenic name for backup file
|
|
81
|
+
const backupFile = await index_1.default.runWithTenant(tenant_template, create_backup);
|
|
82
|
+
await index_1.default.runWithTenant(target, async () => {
|
|
83
|
+
await restore(backupFile, loadAndSaveNewPlugin, true);
|
|
84
|
+
await index_1.default.updateWhere("_sc_files", { user_id: null }, {});
|
|
85
|
+
await index_1.default.deleteWhere("users", {});
|
|
86
|
+
await index_1.default.reset_sequence("users");
|
|
87
|
+
//
|
|
88
|
+
});
|
|
89
|
+
await (0, promises_1.unlink)(backupFile);
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Delete Tenant
|
|
93
|
+
* Note! This is deleting all tenant data in database!
|
|
94
|
+
* @function
|
|
95
|
+
* @param {string} sub
|
|
96
|
+
* @returns {Promise<void>}
|
|
97
|
+
*/
|
|
98
|
+
const deleteTenant = async (sub) => {
|
|
99
|
+
const subdomain = domain_sanitize(sub);
|
|
100
|
+
// drop tenant db schema
|
|
101
|
+
await index_1.default.query(`drop schema if exists "${subdomain}" CASCADE `);
|
|
102
|
+
// delete information about tenant from main site
|
|
103
|
+
await index_1.default.deleteWhere("_sc_tenants", { subdomain });
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Sanitize Domain (Normalize domain name).
|
|
107
|
+
* - force to lower case
|
|
108
|
+
* - remove . in name
|
|
109
|
+
* @function
|
|
110
|
+
* @param {string} s
|
|
111
|
+
* @returns {string}
|
|
112
|
+
*/
|
|
113
|
+
const domain_sanitize = (s) => (0, internal_1.sqlsanitize)(s.replace(".", "").toLowerCase());
|
|
114
|
+
/**
|
|
115
|
+
* Call fuction f for each Tenant
|
|
116
|
+
* @param f - called function
|
|
117
|
+
* @returns {Promise<void>} no result
|
|
118
|
+
*/
|
|
119
|
+
const eachTenant = async (f) => {
|
|
120
|
+
await f();
|
|
121
|
+
if (index_1.default.is_it_multi_tenant()) {
|
|
122
|
+
const tenantList = await getAllTenants();
|
|
123
|
+
for (const domain of tenantList)
|
|
124
|
+
await index_1.default.runWithTenant(domain, f);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Create tenant
|
|
129
|
+
* @param {string} t
|
|
130
|
+
* @param {object} plugin_loader
|
|
131
|
+
* @param {string} newurl
|
|
132
|
+
* @param {boolean} noSignalOrDB
|
|
133
|
+
* @returns {Promise<void>}
|
|
134
|
+
*/
|
|
135
|
+
const create_tenant = async ({ t, plugin_loader, noSignalOrDB, loadAndSaveNewPlugin, tenant_template, }) => {
|
|
136
|
+
await index_1.default.runWithTenant(t, plugin_loader);
|
|
137
|
+
if (!noSignalOrDB) {
|
|
138
|
+
if (tenant_template && loadAndSaveNewPlugin) {
|
|
139
|
+
//create backup
|
|
140
|
+
await copy_tenant_template({
|
|
141
|
+
tenant_template,
|
|
142
|
+
target: t,
|
|
143
|
+
state: tenants[t],
|
|
144
|
+
loadAndSaveNewPlugin,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
process_send({ createTenant: t });
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
module.exports = {
|
|
151
|
+
create_tenant,
|
|
152
|
+
insertTenant,
|
|
153
|
+
switchToTenant,
|
|
154
|
+
getAllTenants,
|
|
155
|
+
getAllTenantRows,
|
|
156
|
+
domain_sanitize,
|
|
157
|
+
deleteTenant,
|
|
158
|
+
eachTenant,
|
|
159
|
+
copy_tenant_template,
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=tenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../models/tenant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.test.d.ts","sourceRoot":"","sources":["../../tests/actions.test.ts"],"names":[],"mappings":""}
|