@saltcorn/server 0.6.2-beta.1 → 0.6.2-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/routes/events.js CHANGED
@@ -25,7 +25,6 @@ module.exports = router;
25
25
  */
26
26
  router.get(
27
27
  "/",
28
- setTenant,
29
28
  isAdmin,
30
29
  error_catcher(async (req, res) => {
31
30
  res.redirect(`/actions`);
package/routes/fields.js CHANGED
@@ -22,7 +22,7 @@ const {
22
22
  } = require("@saltcorn/data/models/expression");
23
23
  const db = require("@saltcorn/data/db");
24
24
 
25
- const { setTenant, isAdmin, error_catcher } = require("./utils.js");
25
+ const { isAdmin, error_catcher } = require("./utils.js");
26
26
  const expressionBlurb = require("../markup/expression_blurb");
27
27
  const { readState } = require("@saltcorn/data/plugin-helper");
28
28
  const { wizardCardTitle } = require("../markup/forms.js");
@@ -419,7 +419,6 @@ const fieldFlow = (req) =>
419
419
  */
420
420
  router.get(
421
421
  "/:id",
422
- setTenant,
423
422
  isAdmin,
424
423
  error_catcher(async (req, res) => {
425
424
  const { id } = req.params;
@@ -472,7 +471,6 @@ router.get(
472
471
  */
473
472
  router.get(
474
473
  "/new/:table_id",
475
- setTenant,
476
474
  isAdmin,
477
475
  error_catcher(async (req, res) => {
478
476
  const { table_id } = req.params;
@@ -509,7 +507,6 @@ router.get(
509
507
  */
510
508
  router.post(
511
509
  "/delete/:id",
512
- setTenant,
513
510
  isAdmin,
514
511
  error_catcher(async (req, res) => {
515
512
  const { id } = req.params;
@@ -535,7 +532,6 @@ router.post(
535
532
  */
536
533
  router.post(
537
534
  "/",
538
- setTenant,
539
535
  isAdmin,
540
536
  error_catcher(async (req, res) => {
541
537
  const wf = fieldFlow(req);
@@ -584,7 +580,6 @@ router.post(
584
580
  */
585
581
  router.post(
586
582
  "/test-formula",
587
- setTenant,
588
583
  isAdmin,
589
584
  error_catcher(async (req, res) => {
590
585
  const { formula, tablename, stored } = req.body;
@@ -622,7 +617,6 @@ router.post(
622
617
  */
623
618
  router.post(
624
619
  "/show-calculated/:tableName/:fieldName/:fieldview",
625
- setTenant,
626
620
  isAdmin,
627
621
  error_catcher(async (req, res) => {
628
622
  const { tableName, fieldName, fieldview } = req.params;
@@ -657,7 +651,6 @@ router.post(
657
651
  */
658
652
  router.post(
659
653
  "/preview/:tableName/:fieldName/:fieldview",
660
- setTenant,
661
654
  isAdmin,
662
655
  error_catcher(async (req, res) => {
663
656
  const { tableName, fieldName, fieldview } = req.params;
@@ -722,7 +715,6 @@ router.post(
722
715
  */
723
716
  router.post(
724
717
  "/preview/:tableName/:fieldName/",
725
- setTenant,
726
718
  isAdmin,
727
719
  error_catcher(async (req, res) => {
728
720
  res.send("");
package/routes/files.js CHANGED
@@ -8,6 +8,7 @@ const Router = require("express-promise-router");
8
8
  const File = require("@saltcorn/data/models/file");
9
9
  const User = require("@saltcorn/data/models/user");
10
10
  const { getState } = require("@saltcorn/data/db/state");
11
+ const s3storage = require("../s3storage");
11
12
 
12
13
  const {
13
14
  mkTable,
@@ -16,7 +17,7 @@ const {
16
17
  post_btn,
17
18
  post_delete_btn,
18
19
  } = require("@saltcorn/markup");
19
- const { setTenant, isAdmin, error_catcher } = require("./utils.js");
20
+ const { isAdmin, error_catcher } = require("./utils.js");
20
21
  const {
21
22
  span,
22
23
  h5,
@@ -37,6 +38,11 @@ const {
37
38
  const { csrfField } = require("./utils");
38
39
  const { editRoleForm, fileUploadForm } = require("../markup/forms.js");
39
40
  const { strictParseInt } = require("@saltcorn/data/plugin-helper");
41
+ const {
42
+ send_files_page,
43
+ config_fields_form,
44
+ save_config_from_form,
45
+ } = require("../markup/admin");
40
46
 
41
47
  /**
42
48
  * @type {object}
@@ -49,9 +55,9 @@ const router = new Router();
49
55
  module.exports = router;
50
56
 
51
57
  /**
52
- * @param {*} file
53
- * @param {*} roles
54
- * @param {*} req
58
+ * @param {*} file
59
+ * @param {*} roles
60
+ * @param {*} req
55
61
  * @returns {Form}
56
62
  */
57
63
  const editFileRoleForm = (file, roles, req) =>
@@ -70,61 +76,53 @@ const editFileRoleForm = (file, roles, req) =>
70
76
  */
71
77
  router.get(
72
78
  "/",
73
- setTenant,
74
79
  isAdmin,
75
80
  error_catcher(async (req, res) => {
76
81
  const rows = await File.find({}, { orderBy: "filename" });
77
82
  const roles = await User.get_roles();
78
- res.sendWrap("Files", {
79
- above: [
80
- {
81
- type: "breadcrumbs",
82
- crumbs: [
83
- { text: req.__("Settings"), href: "/settings" },
84
- { text: req.__("Files") },
85
- ],
86
- },
87
- {
88
- type: "card",
89
- contents: [
90
- mkTable(
91
- [
92
- {
93
- label: req.__("Filename"),
94
- key: (r) =>
95
- div(
96
- { "data-inline-edit-dest-url": `/files/setname/${r.id}` },
97
- r.filename
98
- ),
99
- },
100
- { label: req.__("Size (KiB)"), key: "size_kb", align: "right" },
101
- { label: req.__("Media type"), key: (r) => r.mimetype },
102
- {
103
- label: req.__("Role to access"),
104
- key: (r) => editFileRoleForm(r, roles, req),
105
- },
106
- {
107
- label: req.__("Link"),
108
- key: (r) => link(`/files/serve/${r.id}`, req.__("Link")),
109
- },
110
- {
111
- label: req.__("Download"),
112
- key: (r) =>
113
- link(`/files/download/${r.id}`, req.__("Download")),
114
- },
115
- {
116
- label: req.__("Delete"),
117
- key: (r) =>
118
- post_delete_btn(`/files/delete/${r.id}`, req, r.filename),
119
- },
120
- ],
121
- rows,
122
- { hover: true }
123
- ),
124
- fileUploadForm(req),
125
- ],
126
- },
127
- ],
83
+ send_files_page({
84
+ res,
85
+ req,
86
+ active_sub: "Files",
87
+ contents: {
88
+ type: "card",
89
+ contents: [
90
+ mkTable(
91
+ [
92
+ {
93
+ label: req.__("Filename"),
94
+ key: (r) =>
95
+ div(
96
+ { "data-inline-edit-dest-url": `/files/setname/${r.id}` },
97
+ r.filename
98
+ ),
99
+ },
100
+ { label: req.__("Size (KiB)"), key: "size_kb", align: "right" },
101
+ { label: req.__("Media type"), key: (r) => r.mimetype },
102
+ {
103
+ label: req.__("Role to access"),
104
+ key: (r) => editFileRoleForm(r, roles, req),
105
+ },
106
+ {
107
+ label: req.__("Link"),
108
+ key: (r) => link(`/files/serve/${r.id}`, req.__("Link")),
109
+ },
110
+ {
111
+ label: req.__("Download"),
112
+ key: (r) => link(`/files/download/${r.id}`, req.__("Download")),
113
+ },
114
+ {
115
+ label: req.__("Delete"),
116
+ key: (r) =>
117
+ post_delete_btn(`/files/delete/${r.id}`, req, r.filename),
118
+ },
119
+ ],
120
+ rows,
121
+ { hover: true }
122
+ ),
123
+ fileUploadForm(req),
124
+ ],
125
+ },
128
126
  });
129
127
  })
130
128
  );
@@ -137,7 +135,6 @@ router.get(
137
135
  */
138
136
  router.get(
139
137
  "/download/:id",
140
- setTenant,
141
138
  error_catcher(async (req, res) => {
142
139
  const role = req.isAuthenticated() ? req.user.role_id : 10;
143
140
  const user_id = req.user && req.user.id;
@@ -145,7 +142,8 @@ router.get(
145
142
  const file = await File.findOne({ id });
146
143
  if (role <= file.min_role_read || (user_id && user_id === file.user_id)) {
147
144
  res.type(file.mimetype);
148
- res.download(file.location, file.filename);
145
+ if (file.s3_store) s3storage.serveObject(file, res, true);
146
+ else res.download(file.location, file.filename);
149
147
  } else {
150
148
  req.flash("warning", req.__("Not authorized"));
151
149
  res.redirect("/");
@@ -161,7 +159,6 @@ router.get(
161
159
  */
162
160
  router.get(
163
161
  "/serve/:id",
164
- setTenant,
165
162
  error_catcher(async (req, res) => {
166
163
  const role = req.isAuthenticated() ? req.user.role_id : 10;
167
164
  const user_id = req.user && req.user.id;
@@ -181,7 +178,8 @@ router.get(
181
178
  res.type(file.mimetype);
182
179
  const cacheability = file.min_role_read === 10 ? "public" : "private";
183
180
  res.set("Cache-Control", `${cacheability}, max-age=86400`);
184
- res.sendFile(file.location);
181
+ if (file.s3_store) s3storage.serveObject(file, res, false);
182
+ else res.sendFile(file.location);
185
183
  } else {
186
184
  req.flash("warning", req.__("Not authorized"));
187
185
  res.redirect("/");
@@ -197,7 +195,6 @@ router.get(
197
195
  */
198
196
  router.post(
199
197
  "/setrole/:id",
200
- setTenant,
201
198
  isAdmin,
202
199
  error_catcher(async (req, res) => {
203
200
  const { id } = req.params;
@@ -225,7 +222,6 @@ router.post(
225
222
  */
226
223
  router.post(
227
224
  "/setname/:id",
228
- setTenant,
229
225
  isAdmin,
230
226
  error_catcher(async (req, res) => {
231
227
  const { id } = req.params;
@@ -244,7 +240,6 @@ router.post(
244
240
  */
245
241
  router.post(
246
242
  "/upload",
247
- setTenant,
248
243
  error_catcher(async (req, res) => {
249
244
  let jsonResp = {};
250
245
  const min_role_upload = getState().getConfig("min_role_upload", 1);
@@ -297,12 +292,18 @@ router.post(
297
292
  */
298
293
  router.post(
299
294
  "/delete/:id",
300
- setTenant,
301
295
  isAdmin,
302
296
  error_catcher(async (req, res) => {
303
297
  const { id } = req.params;
304
298
  const f = await File.findOne({ id });
305
- const result = await f.delete();
299
+ if (!f) {
300
+ req.flash("error", "File not found");
301
+ res.redirect("/files");
302
+ return;
303
+ }
304
+ const result = await f.delete(
305
+ f.s3_store ? s3storage.unlinkObject : undefined
306
+ );
306
307
  if (result && result.error) {
307
308
  req.flash("error", result.error);
308
309
  } else {
@@ -311,3 +312,82 @@ router.post(
311
312
  res.redirect(`/files`);
312
313
  })
313
314
  );
315
+
316
+ /**
317
+ * Storage settings form definition
318
+ * @param {object} req request
319
+ * @returns {Promise<Form>} form
320
+ */
321
+ const storage_form = async (req) => {
322
+ const form = await config_fields_form({
323
+ req,
324
+ field_names: [
325
+ "storage_s3_enabled",
326
+ "storage_s3_bucket",
327
+ "storage_s3_path_prefix",
328
+ "storage_s3_endpoint",
329
+ "storage_s3_region",
330
+ "storage_s3_access_key",
331
+ "storage_s3_access_secret",
332
+ "storage_s3_secure",
333
+ ],
334
+ action: "/files/storage",
335
+ });
336
+ form.submitButtonClass = "btn-outline-primary";
337
+ form.submitLabel = req.__("Save");
338
+ form.onChange = "remove_outline(this)";
339
+ return form;
340
+ };
341
+
342
+ /**
343
+ * @name get/storage
344
+ * @function
345
+ * @memberof module:routes/admin~routes/adminRouter
346
+ */
347
+ router.get(
348
+ "/storage",
349
+ isAdmin,
350
+ error_catcher(async (req, res) => {
351
+ const form = await storage_form(req);
352
+ send_files_page({
353
+ res,
354
+ req,
355
+ active_sub: "Storage",
356
+ contents: {
357
+ type: "card",
358
+ title: req.__("Storage settings"),
359
+ contents: [renderForm(form, req.csrfToken())],
360
+ },
361
+ });
362
+ })
363
+ );
364
+
365
+ /**
366
+ * @name post/email
367
+ * @function
368
+ * @memberof module:routes/admin~routes/adminRouter
369
+ */
370
+ router.post(
371
+ "/storage",
372
+ isAdmin,
373
+ error_catcher(async (req, res) => {
374
+ const form = await storage_form(req);
375
+ form.validate(req.body);
376
+ if (form.hasErrors) {
377
+ send_admin_page({
378
+ res,
379
+ req,
380
+ active_sub: "Storage",
381
+ contents: {
382
+ type: "card",
383
+ title: req.__("Storage settings"),
384
+ contents: [renderForm(form, req.csrfToken())],
385
+ },
386
+ });
387
+ } else {
388
+ await save_config_from_form(form);
389
+ req.flash("success", req.__("Storage settings updated"));
390
+ res.redirect("/files/storage");
391
+ }
392
+ })
393
+ );
@@ -19,6 +19,7 @@ const { get_latest_npm_version } = require("@saltcorn/data/models/config");
19
19
  const packagejson = require("../package.json");
20
20
  const Trigger = require("@saltcorn/data/models/trigger");
21
21
  const { fileUploadForm } = require("../markup/forms");
22
+ const { get_base_url } = require("./utils.js");
22
23
 
23
24
  /**
24
25
  * @param {*} tables
@@ -224,6 +225,8 @@ const usersTab = async (req, users, roleMap) => {
224
225
  * @returns {Promise<div>}
225
226
  */
226
227
  const actionsTab = async (req, triggers) => {
228
+ const base_url = get_base_url(req);
229
+
227
230
  return div(
228
231
  { class: "pb-3" },
229
232
  triggers.length <= 1 &&
@@ -35,7 +35,6 @@ module.exports = router;
35
35
  */
36
36
  router.get(
37
37
  "/",
38
- setTenant,
39
38
  isAdmin,
40
39
  error_catcher(async (req, res) => {
41
40
  res.redirect(`/menu`);
@@ -43,7 +42,7 @@ router.get(
43
42
  );
44
43
 
45
44
  /**
46
- * @param {object} req
45
+ * @param {object} req
47
46
  * @returns {Form}
48
47
  */
49
48
  const languageForm = (req) =>
@@ -83,7 +82,6 @@ const languageForm = (req) =>
83
82
  */
84
83
  router.get(
85
84
  "/localizer",
86
- setTenant,
87
85
  isAdmin,
88
86
  error_catcher(async (req, res) => {
89
87
  const cfgLangs = getState().getConfig("localizer_languages");
@@ -111,13 +109,13 @@ router.get(
111
109
  },
112
110
  {
113
111
  label: req.__("Default"),
114
- key: r=>!!r.is_default
115
- ? i({
116
- class: "fas fa-check-circle text-success",
117
- })
118
- : "",
112
+ key: (r) =>
113
+ !!r.is_default
114
+ ? i({
115
+ class: "fas fa-check-circle text-success",
116
+ })
117
+ : "",
119
118
  },
120
-
121
119
  ],
122
120
  Object.values(cfgLangs)
123
121
  ),
@@ -143,7 +141,6 @@ router.get(
143
141
  */
144
142
  router.get(
145
143
  "/localizer/add-lang",
146
- setTenant,
147
144
  isAdmin,
148
145
  error_catcher(async (req, res) => {
149
146
  send_infoarch_page({
@@ -167,7 +164,6 @@ router.get(
167
164
  */
168
165
  router.get(
169
166
  "/localizer/edit/:lang",
170
- setTenant,
171
167
  isAdmin,
172
168
  error_catcher(async (req, res) => {
173
169
  const { lang } = req.params;
@@ -175,8 +171,8 @@ router.get(
175
171
  const form = languageForm(req);
176
172
  form.values = cfgLangs[lang];
177
173
  const { is_default } = form.values;
178
- const cfgStrings = getState().getConfig("localizer_strings",{});
179
- const translation = cfgStrings[lang] || {}
174
+ const cfgStrings = getState().getConfig("localizer_strings", {});
175
+ const translation = cfgStrings[lang] || {};
180
176
  const strings = getState()
181
177
  .getStringsForI18n()
182
178
  .map((s) => ({ in_default: s, translated: translation[s] || s }));
@@ -232,16 +228,14 @@ router.get(
232
228
  */
233
229
  router.post(
234
230
  "/localizer/save-string/:lang/:defstring",
235
- setTenant,
236
231
  isAdmin,
237
232
  error_catcher(async (req, res) => {
238
233
  const { lang, defstring } = req.params;
239
234
 
240
235
  const cfgStrings = getState().getConfigCopy("localizer_strings");
241
- if(cfgStrings[lang])
242
- cfgStrings[lang][defstring] = text(req.body.value)
243
- else cfgStrings[lang]={[defstring]: text(req.body.value)}
244
- await getState().setConfig("localizer_strings", cfgStrings)
236
+ if (cfgStrings[lang]) cfgStrings[lang][defstring] = text(req.body.value);
237
+ else cfgStrings[lang] = { [defstring]: text(req.body.value) };
238
+ await getState().setConfig("localizer_strings", cfgStrings);
245
239
  res.redirect(`/site-structure/localizer/edit/${lang}`);
246
240
  })
247
241
  );
@@ -254,7 +248,6 @@ router.post(
254
248
  */
255
249
  router.post(
256
250
  "/localizer/save-lang",
257
- setTenant,
258
251
  isAdmin,
259
252
  error_catcher(async (req, res) => {
260
253
  const form = languageForm(req);
package/routes/library.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  const Library = require("@saltcorn/data/models/library");
8
8
  const Router = require("express-promise-router");
9
- const { setTenant, isAdmin, error_catcher } = require("./utils.js");
9
+ const { isAdmin, error_catcher } = require("./utils.js");
10
10
  const { send_infoarch_page } = require("../markup/admin.js");
11
11
  const { mkTable, post_delete_btn } = require("@saltcorn/markup");
12
12
  const { i } = require("@saltcorn/markup/tags");
@@ -29,7 +29,6 @@ module.exports = router;
29
29
  */
30
30
  router.post(
31
31
  "/savefrombuilder",
32
- setTenant,
33
32
  isAdmin,
34
33
  error_catcher(async (req, res) => {
35
34
  await Library.create(req.body);
@@ -45,7 +44,6 @@ router.post(
45
44
  */
46
45
  router.get(
47
46
  "/list",
48
- setTenant,
49
47
  isAdmin,
50
48
  error_catcher(async (req, res) => {
51
49
  const libs = await Library.find({});
@@ -89,7 +87,6 @@ router.get(
89
87
  */
90
88
  router.post(
91
89
  "/delete/:id",
92
- setTenant,
93
90
  isAdmin,
94
91
  error_catcher(async (req, res) => {
95
92
  const { id } = req.params;
package/routes/list.js CHANGED
@@ -14,7 +14,7 @@ const db = require("@saltcorn/data/db");
14
14
  const { mkTable, h, link, post_btn } = require("@saltcorn/markup");
15
15
  const { a, script, domReady, div, text } = require("@saltcorn/markup/tags");
16
16
  const Table = require("@saltcorn/data/models/table");
17
- const { setTenant, isAdmin, error_catcher } = require("./utils");
17
+ const { isAdmin, error_catcher } = require("./utils");
18
18
  const moment = require("moment");
19
19
  const { readState } = require("@saltcorn/data/plugin-helper");
20
20
 
@@ -39,7 +39,6 @@ module.exports = router;
39
39
  */
40
40
  router.get(
41
41
  "/_versions/:name/:id",
42
- setTenant,
43
42
  isAdmin,
44
43
  error_catcher(async (req, res) => {
45
44
  const { name, id } = req.params;
@@ -88,7 +87,6 @@ router.get(
88
87
  */
89
88
  router.post(
90
89
  "/_restore/:name/:id/:_version",
91
- setTenant,
92
90
  isAdmin,
93
91
  error_catcher(async (req, res) => {
94
92
  const { name, id, _version } = req.params;
@@ -152,7 +150,7 @@ const typeToJsGridType = (t, field) => {
152
150
 
153
151
  /**
154
152
  * Version Field
155
- * @param {string} tname
153
+ * @param {string} tname
156
154
  * @returns {string}
157
155
  */
158
156
  const versionsField = (tname) => `
@@ -183,7 +181,6 @@ jsGrid.fields.versions = VersionsField;
183
181
  */
184
182
  router.get(
185
183
  "/:tname",
186
- setTenant,
187
184
  isAdmin,
188
185
  error_catcher(async (req, res) => {
189
186
  const { tname } = req.params;
package/routes/menu.js CHANGED
@@ -32,8 +32,8 @@ const router = new Router();
32
32
  module.exports = router;
33
33
 
34
34
  /**
35
- *
36
- * @param {object} req
35
+ *
36
+ * @param {object} req
37
37
  * @returns {Promise<Form>}
38
38
  */
39
39
  const menuForm = async (req) => {
@@ -157,7 +157,7 @@ const menuForm = async (req) => {
157
157
  //create -- new
158
158
 
159
159
  /**
160
- * @param {object[]} menu_items
160
+ * @param {object[]} menu_items
161
161
  * @returns {string}
162
162
  */
163
163
  const menuEditorScript = (menu_items) => `
@@ -202,8 +202,8 @@ const menuEditorScript = (menu_items) => `
202
202
  `;
203
203
 
204
204
  /**
205
- * @param {object[]} menu_items
206
- * @returns {object[]}
205
+ * @param {object[]} menu_items
206
+ * @returns {object[]}
207
207
  */
208
208
  const menuTojQME = (menu_items) =>
209
209
  (menu_items || []).map((mi) => ({
@@ -214,7 +214,7 @@ const menuTojQME = (menu_items) =>
214
214
  }));
215
215
 
216
216
  /**
217
- * @param {object[]} menu_items
217
+ * @param {object[]} menu_items
218
218
  * @returns {object[]}
219
219
  */
220
220
  const jQMEtoMenu = (menu_items) =>
@@ -233,7 +233,6 @@ const jQMEtoMenu = (menu_items) =>
233
233
  */
234
234
  router.get(
235
235
  "/",
236
- setTenant,
237
236
  isAdmin,
238
237
  error_catcher(async (req, res) => {
239
238
  const form = await menuForm(req);
@@ -287,7 +286,6 @@ router.get(
287
286
  */
288
287
  router.post(
289
288
  "/",
290
- setTenant,
291
289
  isAdmin,
292
290
  error_catcher(async (req, res) => {
293
291
  if (req.xhr) {
package/routes/packs.js CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  const Router = require("express-promise-router");
8
- const { setTenant, isAdmin, error_catcher } = require("./utils.js");
8
+ const { isAdmin, error_catcher } = require("./utils.js");
9
9
  const { mkTable, renderForm, link, post_btn } = require("@saltcorn/markup");
10
10
  const { getState } = require("@saltcorn/data/db/state");
11
11
  const Table = require("@saltcorn/data/models/table");
@@ -54,7 +54,6 @@ module.exports = router;
54
54
  */
55
55
  router.get(
56
56
  "/create/",
57
- setTenant,
58
57
  isAdmin,
59
58
  error_catcher(async (req, res) => {
60
59
  const tables = await Table.find({});
@@ -139,7 +138,6 @@ router.get(
139
138
  */
140
139
  router.post(
141
140
  "/create",
142
- setTenant,
143
141
  isAdmin,
144
142
  error_catcher(async (req, res) => {
145
143
  var pack = {
@@ -211,7 +209,7 @@ router.post(
211
209
  );
212
210
 
213
211
  /**
214
- * @param {object} req
212
+ * @param {object} req
215
213
  * @returns {Form}
216
214
  */
217
215
  const install_pack_form = (req) =>
@@ -236,7 +234,6 @@ const install_pack_form = (req) =>
236
234
  */
237
235
  router.get(
238
236
  "/install",
239
- setTenant,
240
237
  isAdmin,
241
238
  error_catcher(async (req, res) => {
242
239
  res.sendWrap(req.__(`Install Pack`), {
@@ -267,7 +264,6 @@ router.get(
267
264
  */
268
265
  router.post(
269
266
  "/install",
270
- setTenant,
271
267
  isAdmin,
272
268
  error_catcher(async (req, res) => {
273
269
  var pack, error;
@@ -326,7 +322,6 @@ router.post(
326
322
  */
327
323
  router.post(
328
324
  "/install-named/:name",
329
- setTenant,
330
325
  isAdmin,
331
326
  error_catcher(async (req, res) => {
332
327
  const { name } = req.params;
@@ -363,7 +358,6 @@ router.post(
363
358
  */
364
359
  router.post(
365
360
  "/uninstall/:name",
366
- setTenant,
367
361
  isAdmin,
368
362
  error_catcher(async (req, res) => {
369
363
  const { name } = req.params;