@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.
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.test.d.ts","sourceRoot":"","sources":["../../tests/actions.test.ts"],"names":[],"mappings":""}