@budibase/server 2.3.18-alpha.2 → 2.3.18-alpha.20

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.
Files changed (87) hide show
  1. package/__mocks__/node-fetch.ts +3 -0
  2. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  3. package/builder/assets/{index.bbe4c16b.js → index.07aa249f.js} +430 -417
  4. package/builder/assets/index.dc0472d8.css +6 -0
  5. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  6. package/builder/index.html +2 -2
  7. package/dist/api/controllers/automation.js +11 -2
  8. package/dist/api/controllers/cloud.js +2 -2
  9. package/dist/api/controllers/row/ExternalRequest.js +49 -24
  10. package/dist/api/controllers/row/external.js +1 -1
  11. package/dist/api/controllers/row/internalSearch.js +6 -450
  12. package/dist/api/controllers/row/utils.js +1 -3
  13. package/dist/api/routes/automation.js +1 -1
  14. package/dist/api/routes/public/applications.js +7 -7
  15. package/dist/api/routes/public/queries.js +2 -2
  16. package/dist/api/routes/public/rows.js +5 -5
  17. package/dist/api/routes/public/tables.js +5 -5
  18. package/dist/api/routes/public/users.js +5 -5
  19. package/dist/app.js +2 -0
  20. package/dist/db/index.js +25 -2
  21. package/dist/db/utils.js +2 -5
  22. package/dist/db/views/staticViews.js +2 -1
  23. package/dist/integrations/base/sql.js +4 -8
  24. package/dist/integrations/googlesheets.js +17 -20
  25. package/dist/middleware/authorized.js +5 -3
  26. package/dist/middleware/builder.js +6 -3
  27. package/dist/migrations/functions/backfill/global/configs.js +10 -4
  28. package/dist/migrations/tests/helpers.js +1 -1
  29. package/dist/migrations/tests/structures.js +1 -1
  30. package/dist/package.json +9 -8
  31. package/dist/startup.js +3 -0
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/jest.config.ts +1 -0
  34. package/package.json +10 -9
  35. package/scripts/test.sh +12 -0
  36. package/specs/{generate.js → generate.ts} +7 -9
  37. package/specs/openapi.json +24 -24
  38. package/specs/openapi.yaml +24 -24
  39. package/specs/{parameters.js → parameters.ts} +6 -6
  40. package/specs/resources/{application.js → application.ts} +4 -4
  41. package/specs/resources/{index.js → index.ts} +8 -8
  42. package/specs/resources/{misc.js → misc.ts} +3 -3
  43. package/specs/resources/{query.js → query.ts} +4 -4
  44. package/specs/resources/{row.js → row.ts} +3 -4
  45. package/specs/resources/{table.js → table.ts} +5 -5
  46. package/specs/resources/{user.js → user.ts} +3 -3
  47. package/specs/resources/utils/Resource.ts +39 -0
  48. package/specs/resources/utils/{index.js → index.ts} +1 -1
  49. package/specs/{security.js → security.ts} +1 -1
  50. package/src/api/controllers/automation.ts +13 -2
  51. package/src/api/controllers/cloud.ts +2 -2
  52. package/src/api/controllers/row/ExternalRequest.ts +95 -28
  53. package/src/api/controllers/row/external.ts +1 -1
  54. package/src/api/controllers/row/internalSearch.ts +11 -524
  55. package/src/api/controllers/row/utils.ts +1 -2
  56. package/src/api/routes/automation.ts +1 -1
  57. package/src/api/routes/public/applications.ts +7 -7
  58. package/src/api/routes/public/queries.ts +2 -2
  59. package/src/api/routes/public/rows.ts +5 -5
  60. package/src/api/routes/public/tables.ts +5 -5
  61. package/src/api/routes/public/tests/{compare.spec.js → compare.spec.ts} +44 -25
  62. package/src/api/routes/public/users.ts +5 -5
  63. package/src/api/routes/tests/{cloud.seq.spec.ts → cloud.spec.ts} +13 -20
  64. package/src/api/routes/tests/utilities/TestFunctions.ts +1 -2
  65. package/src/app.ts +2 -0
  66. package/src/db/index.ts +2 -2
  67. package/src/db/utils.ts +0 -4
  68. package/src/db/views/staticViews.ts +3 -3
  69. package/src/definitions/openapi.ts +449 -63
  70. package/src/integration-test/postgres.spec.ts +351 -81
  71. package/src/integrations/base/sql.ts +4 -8
  72. package/src/integrations/googlesheets.ts +21 -22
  73. package/src/integrations/tests/googlesheets.spec.ts +122 -0
  74. package/src/middleware/authorized.ts +6 -4
  75. package/src/middleware/builder.ts +8 -3
  76. package/src/migrations/functions/backfill/global/configs.ts +15 -9
  77. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +3 -4
  78. package/src/migrations/tests/helpers.ts +2 -2
  79. package/src/migrations/tests/structures.ts +1 -0
  80. package/src/startup.ts +4 -1
  81. package/src/tests/jestEnv.ts +1 -0
  82. package/src/tests/utilities/TestConfiguration.ts +42 -30
  83. package/src/tests/utilities/structures.ts +0 -2
  84. package/builder/assets/index.7e76c039.css +0 -6
  85. package/dist/integrations/base/utils.js +0 -16
  86. package/specs/resources/utils/Resource.js +0 -26
  87. package/src/integrations/base/utils.ts +0 -12
@@ -11,7 +11,7 @@ const read = [], write = [];
11
11
  * @openapi
12
12
  * /users:
13
13
  * post:
14
- * operationId: create
14
+ * operationId: userCreate
15
15
  * summary: Create a user
16
16
  * tags:
17
17
  * - users
@@ -37,7 +37,7 @@ write.push(new Endpoint_1.default("post", "/users", users_1.default.create));
37
37
  * @openapi
38
38
  * /users/{userId}:
39
39
  * put:
40
- * operationId: update
40
+ * operationId: userUpdate
41
41
  * summary: Update a user
42
42
  * tags:
43
43
  * - users
@@ -65,7 +65,7 @@ write.push(new Endpoint_1.default("put", "/users/:userId", users_1.default.updat
65
65
  * @openapi
66
66
  * /users/{userId}:
67
67
  * delete:
68
- * operationId: destroy
68
+ * operationId: userDestroy
69
69
  * summary: Delete a user
70
70
  * tags:
71
71
  * - users
@@ -87,7 +87,7 @@ write.push(new Endpoint_1.default("delete", "/users/:userId", users_1.default.de
87
87
  * @openapi
88
88
  * /users/{userId}:
89
89
  * get:
90
- * operationId: getById
90
+ * operationId: userGetById
91
91
  * summary: Retrieve a user
92
92
  * tags:
93
93
  * - users
@@ -109,7 +109,7 @@ read.push(new Endpoint_1.default("get", "/users/:userId", users_1.default.read))
109
109
  * @openapi
110
110
  * /users/search:
111
111
  * post:
112
- * operationId: search
112
+ * operationId: userSearch
113
113
  * summary: Search for users
114
114
  * description: Based on user properties (currently only name) search for users.
115
115
  * tags:
package/dist/app.js CHANGED
@@ -64,6 +64,7 @@ const websocket_1 = require("./websocket");
64
64
  const startup_1 = require("./startup");
65
65
  const Sentry = require("@sentry/node");
66
66
  const destroyable = require("server-destroy");
67
+ const { userAgent } = require("koa-useragent");
67
68
  const app = new koa_1.default();
68
69
  let mbNumber = parseInt(environment_1.default.HTTP_MB_LIMIT || "10");
69
70
  if (!mbNumber || isNaN(mbNumber)) {
@@ -80,6 +81,7 @@ app.use((0, koa_body_1.default)({
80
81
  parsedMethods: ["POST", "PUT", "PATCH", "DELETE"],
81
82
  }));
82
83
  app.use(backend_core_1.middleware.logging);
84
+ app.use(userAgent);
83
85
  if (environment_1.default.isProd()) {
84
86
  environment_1.default._set("NODE_ENV", "production");
85
87
  Sentry.init();
package/dist/db/index.js CHANGED
@@ -1,10 +1,33 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
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
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.init = void 0;
7
- const backend_core_1 = require("@budibase/backend-core");
30
+ const core = __importStar(require("@budibase/backend-core"));
8
31
  const environment_1 = __importDefault(require("../environment"));
9
32
  function init() {
10
33
  const dbConfig = {
@@ -15,6 +38,6 @@ function init() {
15
38
  dbConfig.inMemory = true;
16
39
  dbConfig.allDbs = true;
17
40
  }
18
- (0, backend_core_1.init)({ db: dbConfig });
41
+ core.init({ db: dbConfig });
19
42
  }
20
43
  exports.init = init;
package/dist/db/utils.js CHANGED
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateMemoryViewID = exports.getMetadataParams = exports.generateMetadataID = exports.generateUserFlagID = exports.getQueryParams = exports.getAutomationMetadataParams = exports.generateAutomationMetadataID = exports.generateQueryID = exports.getDatasourceParams = exports.generateDatasourceID = exports.getWebhookParams = exports.generateWebhookID = exports.getScreenParams = exports.generateScreenID = exports.getLayoutParams = exports.generateLayoutID = exports.getLinkParams = exports.generateLinkID = exports.generateAutomationID = exports.getAutomationParams = exports.getTableIDFromRowID = exports.generateTableID = exports.getTableParams = exports.getGlobalIDFromUserMetadataID = exports.generateUserMetadataID = exports.getUserMetadataParams = exports.generateRowID = exports.getRowParams = exports.getDocParams = exports.getQueryIndex = exports.getRoleParams = exports.generateRoleID = exports.generateDevAppID = exports.generateAppID = exports.UNICODE_MAX = exports.InternalTables = exports.ViewName = exports.TABLE_ROW_PREFIX = exports.LINK_USER_METADATA_PREFIX = exports.USER_METDATA_PREFIX = exports.isProdAppID = exports.isDevAppID = exports.APP_DEV_PREFIX = exports.APP_PREFIX = exports.DocumentType = exports.StaticDatabases = exports.SEPARATOR = exports.BudibaseInternalDB = exports.SearchIndexes = exports.AppStatus = void 0;
7
- exports.getMultiIDParams = exports.generatePluginID = exports.getMemoryViewParams = void 0;
6
+ exports.getMemoryViewParams = exports.generateMemoryViewID = exports.getMetadataParams = exports.generateMetadataID = exports.generateUserFlagID = exports.getQueryParams = exports.getAutomationMetadataParams = exports.generateAutomationMetadataID = exports.generateQueryID = exports.getDatasourceParams = exports.generateDatasourceID = exports.getWebhookParams = exports.generateWebhookID = exports.getScreenParams = exports.generateScreenID = exports.getLayoutParams = exports.generateLayoutID = exports.getLinkParams = exports.generateLinkID = exports.generateAutomationID = exports.getAutomationParams = exports.getTableIDFromRowID = exports.generateTableID = exports.getTableParams = exports.getGlobalIDFromUserMetadataID = exports.generateUserMetadataID = exports.getUserMetadataParams = exports.generateRowID = exports.getRowParams = exports.getDocParams = exports.getQueryIndex = exports.getRoleParams = exports.generateRoleID = exports.generateDevAppID = exports.generateAppID = exports.UNICODE_MAX = exports.InternalTables = exports.ViewName = exports.TABLE_ROW_PREFIX = exports.LINK_USER_METADATA_PREFIX = exports.USER_METDATA_PREFIX = exports.isProdAppID = exports.isDevAppID = exports.APP_DEV_PREFIX = exports.APP_PREFIX = exports.DocumentType = exports.StaticDatabases = exports.SEPARATOR = exports.BudibaseInternalDB = exports.AppStatus = void 0;
7
+ exports.getMultiIDParams = exports.generatePluginID = void 0;
8
8
  const newid_1 = __importDefault(require("./newid"));
9
9
  const backend_core_1 = require("@budibase/backend-core");
10
10
  exports.AppStatus = {
@@ -12,9 +12,6 @@ exports.AppStatus = {
12
12
  ALL: "all",
13
13
  DEPLOYED: "published",
14
14
  };
15
- exports.SearchIndexes = {
16
- ROWS: "rows",
17
- };
18
15
  exports.BudibaseInternalDB = {
19
16
  _id: "bb_internal",
20
17
  type: backend_core_1.db.BUDIBASE_DATASOURCE_TYPE,
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.createAllSearchIndex = exports.createRoutingView = exports.createLinkView = void 0;
13
13
  const backend_core_1 = require("@budibase/backend-core");
14
14
  const utils_1 = require("../utils");
15
+ const types_1 = require("@budibase/types");
15
16
  const SCREEN_PREFIX = utils_1.DocumentType.SCREEN + utils_1.SEPARATOR;
16
17
  /**************************************************
17
18
  * INFORMATION *
@@ -99,7 +100,7 @@ function searchIndex(indexName, fnString) {
99
100
  }
100
101
  function createAllSearchIndex() {
101
102
  return __awaiter(this, void 0, void 0, function* () {
102
- yield searchIndex(utils_1.SearchIndexes.ROWS, function (doc) {
103
+ yield searchIndex(types_1.SearchIndex.ROWS, function (doc) {
103
104
  function idx(input, prev) {
104
105
  for (let key of Object.keys(input)) {
105
106
  let idxKey = prev != null ? `${prev}.${key}` : key;
@@ -14,10 +14,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const knex_1 = require("knex");
16
16
  const types_1 = require("@budibase/types");
17
+ const backend_core_1 = require("@budibase/backend-core");
17
18
  const utils_1 = require("../utils");
18
19
  const sqlTable_1 = __importDefault(require("./sqlTable"));
19
20
  const environment_1 = __importDefault(require("../../environment"));
20
- const utils_2 = require("./utils");
21
21
  const envLimit = environment_1.default.SQL_MAX_ROWS
22
22
  ? parseInt(environment_1.default.SQL_MAX_ROWS)
23
23
  : null;
@@ -117,7 +117,7 @@ class InternalBuilder {
117
117
  addFilters(query, filters, opts) {
118
118
  function iterate(structure, fn) {
119
119
  for (let [key, value] of Object.entries(structure)) {
120
- const updatedKey = (0, utils_2.removeKeyNumbering)(key);
120
+ const updatedKey = backend_core_1.db.removeKeyNumbering(key);
121
121
  const isRelationshipField = updatedKey.includes(".");
122
122
  if (!opts.relationship && !isRelationshipField) {
123
123
  fn(`${opts.tableName}.${updatedKey}`, value);
@@ -382,9 +382,7 @@ class InternalBuilder {
382
382
  return query.insert(parsedBody);
383
383
  }
384
384
  else {
385
- return query
386
- .insert(parsedBody)
387
- .returning(generateSelectStatement(json, knex));
385
+ return query.insert(parsedBody).returning("*");
388
386
  }
389
387
  }
390
388
  bulkCreate(knex, json) {
@@ -463,9 +461,7 @@ class InternalBuilder {
463
461
  return query.update(parsedBody);
464
462
  }
465
463
  else {
466
- return query
467
- .update(parsedBody)
468
- .returning(generateSelectStatement(json, knex));
464
+ return query.update(parsedBody).returning("*");
469
465
  }
470
466
  }
471
467
  delete(knex, json, opts) {
@@ -17,9 +17,8 @@ const google_auth_library_1 = require("google-auth-library");
17
17
  const utils_1 = require("./utils");
18
18
  const constants_1 = require("../constants");
19
19
  const google_spreadsheet_1 = require("google-spreadsheet");
20
- const environment_1 = __importDefault(require("../environment"));
20
+ const node_fetch_1 = __importDefault(require("node-fetch"));
21
21
  const backend_core_1 = require("@budibase/backend-core");
22
- const fetch = require("node-fetch");
23
22
  const SCHEMA = {
24
23
  plus: true,
25
24
  auth: {
@@ -120,7 +119,7 @@ class GoogleSheetsIntegration {
120
119
  }
121
120
  fetchAccessToken(payload) {
122
121
  return __awaiter(this, void 0, void 0, function* () {
123
- const response = yield fetch("https://www.googleapis.com/oauth2/v4/token", {
122
+ const response = yield (0, node_fetch_1.default)("https://www.googleapis.com/oauth2/v4/token", {
124
123
  method: "POST",
125
124
  body: JSON.stringify(Object.assign(Object.assign({}, payload), { grant_type: "refresh_token" })),
126
125
  headers: {
@@ -138,15 +137,9 @@ class GoogleSheetsIntegration {
138
137
  return __awaiter(this, void 0, void 0, function* () {
139
138
  try {
140
139
  // Initialise oAuth client
141
- const db = backend_core_1.tenancy.getGlobalDB();
142
- let googleConfig = yield backend_core_1.db.getScopedConfig(db, {
143
- type: backend_core_1.constants.Config.GOOGLE,
144
- });
140
+ let googleConfig = yield backend_core_1.configs.getGoogleDatasourceConfig();
145
141
  if (!googleConfig) {
146
- googleConfig = {
147
- clientID: environment_1.default.GOOGLE_CLIENT_ID,
148
- clientSecret: environment_1.default.GOOGLE_CLIENT_SECRET,
149
- };
142
+ throw new backend_core_1.HTTPError("Google config not found", 400);
150
143
  }
151
144
  const oauthClient = new google_auth_library_1.OAuth2Client({
152
145
  clientId: googleConfig.clientID,
@@ -173,7 +166,7 @@ class GoogleSheetsIntegration {
173
166
  buildSchema(datasourceId) {
174
167
  return __awaiter(this, void 0, void 0, function* () {
175
168
  yield this.connect();
176
- const sheets = yield this.client.sheetsByIndex;
169
+ const sheets = this.client.sheetsByIndex;
177
170
  const tables = {};
178
171
  for (let sheet of sheets) {
179
172
  // must fetch rows to determine schema
@@ -254,7 +247,7 @@ class GoogleSheetsIntegration {
254
247
  return __awaiter(this, void 0, void 0, function* () {
255
248
  try {
256
249
  yield this.connect();
257
- const sheet = yield this.client.sheetsByTitle[table.name];
250
+ const sheet = this.client.sheetsByTitle[table.name];
258
251
  yield sheet.loadHeaderRow();
259
252
  if (table._rename) {
260
253
  const headers = [];
@@ -269,8 +262,12 @@ class GoogleSheetsIntegration {
269
262
  yield sheet.setHeaderRow(headers);
270
263
  }
271
264
  else {
272
- let newField = Object.keys(table.schema).find(key => !sheet.headerValues.includes(key));
273
- yield sheet.setHeaderRow([...sheet.headerValues, newField]);
265
+ const updatedHeaderValues = [...sheet.headerValues];
266
+ const newField = Object.keys(table.schema).find(key => !sheet.headerValues.includes(key));
267
+ if (newField) {
268
+ updatedHeaderValues.push(newField);
269
+ }
270
+ yield sheet.setHeaderRow(updatedHeaderValues);
274
271
  }
275
272
  }
276
273
  catch (err) {
@@ -283,7 +280,7 @@ class GoogleSheetsIntegration {
283
280
  return __awaiter(this, void 0, void 0, function* () {
284
281
  try {
285
282
  yield this.connect();
286
- const sheetToDelete = yield this.client.sheetsByTitle[sheet];
283
+ const sheetToDelete = this.client.sheetsByTitle[sheet];
287
284
  return yield sheetToDelete.delete();
288
285
  }
289
286
  catch (err) {
@@ -296,7 +293,7 @@ class GoogleSheetsIntegration {
296
293
  return __awaiter(this, void 0, void 0, function* () {
297
294
  try {
298
295
  yield this.connect();
299
- const sheet = yield this.client.sheetsByTitle[query.sheet];
296
+ const sheet = this.client.sheetsByTitle[query.sheet];
300
297
  const rowToInsert = typeof query.row === "string" ? JSON.parse(query.row) : query.row;
301
298
  const row = yield sheet.addRow(rowToInsert);
302
299
  return [
@@ -313,7 +310,7 @@ class GoogleSheetsIntegration {
313
310
  return __awaiter(this, void 0, void 0, function* () {
314
311
  try {
315
312
  yield this.connect();
316
- const sheet = yield this.client.sheetsByTitle[query.sheet];
313
+ const sheet = this.client.sheetsByTitle[query.sheet];
317
314
  const rows = yield sheet.getRows();
318
315
  const headerValues = sheet.headerValues;
319
316
  const response = [];
@@ -332,7 +329,7 @@ class GoogleSheetsIntegration {
332
329
  return __awaiter(this, void 0, void 0, function* () {
333
330
  try {
334
331
  yield this.connect();
335
- const sheet = yield this.client.sheetsByTitle[query.sheet];
332
+ const sheet = this.client.sheetsByTitle[query.sheet];
336
333
  const rows = yield sheet.getRows();
337
334
  const row = rows[query.rowIndex];
338
335
  if (row) {
@@ -358,7 +355,7 @@ class GoogleSheetsIntegration {
358
355
  delete(query) {
359
356
  return __awaiter(this, void 0, void 0, function* () {
360
357
  yield this.connect();
361
- const sheet = yield this.client.sheetsByTitle[query.sheet];
358
+ const sheet = this.client.sheetsByTitle[query.sheet];
362
359
  const rows = yield sheet.getRows();
363
360
  const row = rows[query.rowIndex];
364
361
  if (row) {
@@ -66,9 +66,6 @@ exports.default = (permType, permLevel = null, opts = { schema: false }) => (ctx
66
66
  if (!ctx.user) {
67
67
  return ctx.throw(403, "No user info found");
68
68
  }
69
- // check general builder stuff, this middleware is a good way
70
- // to find API endpoints which are builder focused
71
- yield (0, builder_1.default)(ctx, permType);
72
69
  // get the resource roles
73
70
  let resourceRoles = [];
74
71
  let otherLevelRoles = [];
@@ -92,6 +89,11 @@ exports.default = (permType, permLevel = null, opts = { schema: false }) => (ctx
92
89
  if (!ctx.isAuthenticated) {
93
90
  return ctx.throw(403, "Session not authenticated");
94
91
  }
92
+ // check general builder stuff, this middleware is a good way
93
+ // to find API endpoints which are builder focused
94
+ if (permType === backend_core_1.permissions.PermissionType.BUILDER) {
95
+ yield (0, builder_1.default)(ctx);
96
+ }
95
97
  try {
96
98
  // check authorized
97
99
  yield checkAuthorized(ctx, resourceRoles, permType, permLevel);
@@ -61,14 +61,17 @@ function updateAppUpdatedAt(ctx) {
61
61
  }));
62
62
  });
63
63
  }
64
- function builder(ctx, permType) {
64
+ function builder(ctx) {
65
65
  return __awaiter(this, void 0, void 0, function* () {
66
66
  const appId = ctx.appId;
67
67
  // this only functions within an app context
68
68
  if (!appId) {
69
69
  return;
70
70
  }
71
- const isBuilderApi = permType === backend_core_1.permissions.PermissionType.BUILDER;
71
+ // check authenticated
72
+ if (!ctx.isAuthenticated) {
73
+ return ctx.throw(403, "Session not authenticated");
74
+ }
72
75
  const referer = ctx.headers["referer"];
73
76
  const overviewPath = "/builder/portal/overview/";
74
77
  const overviewContext = !referer ? false : referer.includes(overviewPath);
@@ -78,7 +81,7 @@ function builder(ctx, permType) {
78
81
  const hasAppId = !referer ? false : referer.includes(appId);
79
82
  const editingApp = referer ? hasAppId : false;
80
83
  // check this is a builder call and editing
81
- if (!isBuilderApi || !editingApp) {
84
+ if (!editingApp) {
82
85
  return;
83
86
  }
84
87
  // check locks
@@ -12,14 +12,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.backfill = void 0;
15
+ exports.backfill = exports.getConfigParams = void 0;
16
16
  const backend_core_1 = require("@budibase/backend-core");
17
17
  const types_1 = require("@budibase/types");
18
18
  const environment_1 = __importDefault(require("./../../../../environment"));
19
- const getConfigs = (globalDb) => __awaiter(void 0, void 0, void 0, function* () {
20
- const response = yield globalDb.allDocs(backend_core_1.db.getConfigParams({}, {
19
+ const getConfigParams = () => {
20
+ return {
21
21
  include_docs: true,
22
- }));
22
+ startkey: `${backend_core_1.DocumentType.CONFIG}${backend_core_1.SEPARATOR}`,
23
+ endkey: `${backend_core_1.DocumentType.CONFIG}${backend_core_1.SEPARATOR}${backend_core_1.UNICODE_MAX}`,
24
+ };
25
+ };
26
+ exports.getConfigParams = getConfigParams;
27
+ const getConfigs = (globalDb) => __awaiter(void 0, void 0, void 0, function* () {
28
+ const response = yield globalDb.allDocs((0, exports.getConfigParams)());
23
29
  return response.rows.map((row) => row.doc);
24
30
  });
25
31
  const backfill = (globalDb, timestamp) => __awaiter(void 0, void 0, void 0, function* () {
@@ -57,7 +57,7 @@ const saveSmtpConfig = (globalDb) => __awaiter(void 0, void 0, void 0, function*
57
57
  });
58
58
  exports.saveSmtpConfig = saveSmtpConfig;
59
59
  const saveConfig = (config, globalDb) => __awaiter(void 0, void 0, void 0, function* () {
60
- config._id = backend_core_1.db.generateConfigID({ type: config.type });
60
+ config._id = backend_core_1.configs.generateConfigID(config.type);
61
61
  let response;
62
62
  try {
63
63
  response = yield globalDb.get(config._id);
@@ -8,7 +8,7 @@ const oidc = (conf) => {
8
8
  type: types_1.ConfigType.OIDC,
9
9
  config: {
10
10
  configs: [
11
- Object.assign({ configUrl: "http://someconfigurl", clientID: "clientId", clientSecret: "clientSecret", logo: "Microsoft", name: "Active Directory", uuid: backend_core_1.utils.newid(), activated: true }, conf),
11
+ Object.assign({ configUrl: "http://someconfigurl", clientID: "clientId", clientSecret: "clientSecret", logo: "Microsoft", name: "Active Directory", uuid: backend_core_1.utils.newid(), activated: true, scopes: [] }, conf),
12
12
  ],
13
13
  },
14
14
  };
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "2.3.18-alpha.1",
4
+ "version": "2.3.18-alpha.19",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -14,7 +14,7 @@
14
14
  "build:dev": "yarn prebuild && tsc --build --watch --preserveWatchOutput",
15
15
  "debug": "yarn build && node --expose-gc --inspect=9222 dist/index.js",
16
16
  "postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
17
- "test": "jest --coverage --runInBand",
17
+ "test": "bash scripts/test.sh",
18
18
  "test:watch": "jest --watch",
19
19
  "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
20
20
  "build:docker": "yarn run predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
@@ -25,7 +25,7 @@
25
25
  "dev:stack:down": "node scripts/dev/manage.js down",
26
26
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
27
27
  "dev:builder": "yarn run dev:stack:up && nodemon",
28
- "specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
28
+ "specs": "ts-node specs/generate.ts && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
29
29
  "initialise": "node scripts/initialise.js",
30
30
  "env:multi:enable": "node scripts/multiTenancy.js enable",
31
31
  "env:multi:disable": "node scripts/multiTenancy.js disable",
@@ -43,11 +43,11 @@
43
43
  "license": "GPL-3.0",
44
44
  "dependencies": {
45
45
  "@apidevtools/swagger-parser": "10.0.3",
46
- "@budibase/backend-core": "2.3.18-alpha.1",
47
- "@budibase/client": "2.3.18-alpha.1",
48
- "@budibase/pro": "2.3.18-alpha.1",
49
- "@budibase/string-templates": "2.3.18-alpha.1",
50
- "@budibase/types": "2.3.18-alpha.1",
46
+ "@budibase/backend-core": "2.3.18-alpha.19",
47
+ "@budibase/client": "2.3.18-alpha.19",
48
+ "@budibase/pro": "2.3.18-alpha.19",
49
+ "@budibase/string-templates": "2.3.18-alpha.19",
50
+ "@budibase/types": "2.3.18-alpha.19",
51
51
  "@bull-board/api": "3.7.0",
52
52
  "@bull-board/koa": "3.9.4",
53
53
  "@elastic/elasticsearch": "7.10.0",
@@ -87,6 +87,7 @@
87
87
  "koa-send": "5.0.0",
88
88
  "koa-session": "5.12.0",
89
89
  "koa-static": "5.0.0",
90
+ "koa-useragent": "^4.1.0",
90
91
  "koa2-ratelimit": "1.1.1",
91
92
  "lodash": "4.17.21",
92
93
  "memorystream": "0.3.1",
package/dist/startup.js CHANGED
@@ -141,6 +141,9 @@ function startup(app, server) {
141
141
  // get the references to the queue promises, don't await as
142
142
  // they will never end, unless the processing stops
143
143
  let queuePromises = [];
144
+ // configure events to use the pro audit log write
145
+ // can't integrate directly into backend-core due to cyclic issues
146
+ queuePromises.push(backend_core_1.events.processors.init(pro.sdk.auditLogs.write));
144
147
  queuePromises.push(automations.init());
145
148
  queuePromises.push(initPro());
146
149
  if (app) {