@budibase/server 2.4.11 → 2.4.12-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,8 +10,8 @@
10
10
  href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap"
11
11
  rel="stylesheet"
12
12
  />
13
- <script type="module" crossorigin src="/builder/assets/index.83bb8d3b.js"></script>
14
- <link rel="stylesheet" href="/builder/assets/index.b0e3aca6.css">
13
+ <script type="module" crossorigin src="/builder/assets/index.72dd0c27.js"></script>
14
+ <link rel="stylesheet" href="/builder/assets/index.af76a09d.css">
15
15
  </head>
16
16
  <body id="app">
17
17
 
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.convertToOpenMetrics = exports.fetch = void 0;
16
+ const backend_core_1 = require("@budibase/backend-core");
17
+ const pro_1 = require("@budibase/pro");
18
+ const os_1 = __importDefault(require("os"));
19
+ function fetch(ctx) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ // *** OPERATING SYSTEM ***
22
+ const freeMem = os_1.default.freemem();
23
+ const totalMem = os_1.default.totalmem();
24
+ const usedMem = totalMem - freeMem;
25
+ const uptime = os_1.default.uptime();
26
+ // *** APPS ***
27
+ const allDatabases = yield backend_core_1.db.getAllDbs();
28
+ const devAppIDs = yield backend_core_1.db.getDevAppIDs();
29
+ const prodAppIDs = yield backend_core_1.db.getProdAppIDs();
30
+ const allAppIds = yield backend_core_1.db.getAllApps({ idsOnly: true });
31
+ // *** USERS ***
32
+ const usersObject = yield backend_core_1.users.getAllUserIds();
33
+ // *** QUOTAS ***
34
+ const usage = yield pro_1.quotas.getQuotaUsage();
35
+ const license = yield pro_1.licensing.cache.getCachedLicense();
36
+ const appsQuotaUsage = usage.usageQuota.apps;
37
+ const rowsQuotaUsage = usage.usageQuota.rows;
38
+ const pluginsQuotaUsage = usage.usageQuota.plugins;
39
+ const userGroupsQuotaUsage = usage.usageQuota.userGroups;
40
+ const queryQuotaUsage = usage.monthly.current.queries;
41
+ const automationsQuotaUsage = usage.monthly.current.automations;
42
+ const appsQuotaLimit = license.quotas.usage.static.apps.value;
43
+ const rowsQuotaLimit = license.quotas.usage.static.rows.value;
44
+ const userGroupsQuotaLimit = license.quotas.usage.static.userGroups.value;
45
+ const pluginsQuotaLimit = license.quotas.usage.static.plugins.value;
46
+ const queryQuotaLimit = license.quotas.usage.monthly.queries.value;
47
+ const automationsQuotaLimit = license.quotas.usage.monthly.automations.value;
48
+ // *** BUILD THE OUTPUT STRING ***
49
+ var outputString = "";
50
+ // **** budibase_os_uptime ****
51
+ outputString += convertToOpenMetrics("budibase_os_uptime", "Time in seconds that the host operating system has been up", "counter", uptime);
52
+ // **** budibase_os_free_mem ****
53
+ outputString += convertToOpenMetrics("budibase_os_free_mem", "Bytes of memory free for usage on the host operating system", "gauge", freeMem);
54
+ // **** budibase_os_total_mem ****
55
+ outputString += convertToOpenMetrics("budibase_os_total_mem", "Total bytes of memory on the host operating system", "gauge", totalMem);
56
+ // **** budibase_os_used_mem ****
57
+ outputString += convertToOpenMetrics("budibase_os_used_mem", "Total bytes of memory in use on the host operating system", "gauge", usedMem);
58
+ // **** budibase_os_load1 ****
59
+ outputString += convertToOpenMetrics("budibase_os_load1", "Host operating system load average", "gauge", os_1.default.loadavg()[0]);
60
+ // **** budibase_os_load5 ****
61
+ outputString += convertToOpenMetrics("budibase_os_load5", "Host operating system load average", "gauge", os_1.default.loadavg()[1]);
62
+ // **** budibase_os_load15 ****
63
+ outputString += convertToOpenMetrics("budibase_os_load15", "Host operating system load average", "gauge", os_1.default.loadavg()[2]);
64
+ // **** budibase_tenant_user_count ****
65
+ outputString += convertToOpenMetrics("budibase_tenant_user_count", "The number of users created", "gauge", usersObject.length);
66
+ // **** budibase_tenant_app_count ****
67
+ outputString += convertToOpenMetrics("budibase_tenant_app_count", "The number of apps created by a user", "gauge", allAppIds.length);
68
+ // **** budibase_tenant_production_app_count ****
69
+ outputString += convertToOpenMetrics("budibase_tenant_production_app_count", "The number of apps a user has published", "gauge", prodAppIDs.length);
70
+ // **** budibase_tenant_dev_app_count ****
71
+ outputString += convertToOpenMetrics("budibase_tenant_dev_app_count", "The number of apps a user has unpublished in development", "gauge", devAppIDs.length);
72
+ // **** budibase_tenant_db_count ****
73
+ outputString += convertToOpenMetrics("budibase_tenant_db_count", "The number of couchdb databases including global tables such as _users", "gauge", allDatabases.length);
74
+ // **** budibase_quota_usage_apps ****
75
+ outputString += convertToOpenMetrics("budibase_quota_usage_apps", "The number of apps created", "gauge", appsQuotaUsage);
76
+ // **** budibase_quota_limit_apps ****
77
+ outputString += convertToOpenMetrics("budibase_quota_limit_apps", "The limit on the number of apps that can be created", "gauge", appsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : appsQuotaLimit);
78
+ // **** budibase_quota_usage_rows ****
79
+ outputString += convertToOpenMetrics("budibase_quota_usage_rows", "The number of database rows used from the quota", "gauge", rowsQuotaUsage);
80
+ // **** budibase_quota_limit_rows ****
81
+ outputString += convertToOpenMetrics("budibase_quota_limit_rows", "The limit on the number of rows that can be created", "gauge", rowsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : rowsQuotaLimit);
82
+ // **** budibase_quota_usage_plugins ****
83
+ outputString += convertToOpenMetrics("budibase_quota_usage_plugins", "The number of plugins in use", "gauge", pluginsQuotaUsage);
84
+ // **** budibase_quota_limit_plugins ****
85
+ outputString += convertToOpenMetrics("budibase_quota_limit_plugins", "The limit on the number of plugins that can be created", "gauge", pluginsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : pluginsQuotaLimit);
86
+ // **** budibase_quota_usage_user_groups ****
87
+ outputString += convertToOpenMetrics("budibase_quota_usage_user_groups", "The number of user groups created", "gauge", userGroupsQuotaUsage);
88
+ // **** budibase_quota_limit_user_groups ****
89
+ outputString += convertToOpenMetrics("budibase_quota_limit_user_groups", "The limit on the number of user groups that can be created", "gauge", userGroupsQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : userGroupsQuotaLimit);
90
+ // **** budibase_quota_usage_queries ****
91
+ outputString += convertToOpenMetrics("budibase_quota_usage_queries", "The number of queries used in the current month", "gauge", queryQuotaUsage);
92
+ // **** budibase_quota_limit_queries ****
93
+ outputString += convertToOpenMetrics("budibase_quota_limit_queries", "The limit on the number of queries for the current month", "gauge", queryQuotaLimit == -1 ? Number.MAX_SAFE_INTEGER : queryQuotaLimit);
94
+ // **** budibase_quota_usage_automations ****
95
+ outputString += convertToOpenMetrics("budibase_quota_usage_automations", "The number of automations used in the current month", "gauge", automationsQuotaUsage);
96
+ // **** budibase_quota_limit_automations ****
97
+ outputString += convertToOpenMetrics("budibase_quota_limit_automations", "The limit on the number of automations that can be created", "gauge", automationsQuotaLimit == -1
98
+ ? Number.MAX_SAFE_INTEGER
99
+ : automationsQuotaLimit);
100
+ ctx.body = outputString;
101
+ ctx.set("Content-Type", "text/plain");
102
+ });
103
+ }
104
+ exports.fetch = fetch;
105
+ function convertToOpenMetrics(metricName, metricHelp, metricType, metricValue) {
106
+ return `# HELP ${metricName} ${metricHelp}.
107
+ # TYPE ${metricName} ${metricType}
108
+ ${metricName} ${metricValue}\n`;
109
+ }
110
+ exports.convertToOpenMetrics = convertToOpenMetrics;
111
+ exports.default = {
112
+ fetch,
113
+ };
@@ -614,8 +614,16 @@ class ExternalRequest {
614
614
  let { id, row, filters, sort, paginate, rows } = cleanupConfig(config, table);
615
615
  //if the sort column is a formula, remove it
616
616
  for (let sortColumn of Object.keys(sort || {})) {
617
- if (((_a = table.schema[sortColumn]) === null || _a === void 0 ? void 0 : _a.type) === "formula") {
618
- sort === null || sort === void 0 ? true : delete sort[sortColumn];
617
+ if (!(sort === null || sort === void 0 ? void 0 : sort[sortColumn])) {
618
+ continue;
619
+ }
620
+ switch ((_a = table.schema[sortColumn]) === null || _a === void 0 ? void 0 : _a.type) {
621
+ case types_1.FieldType.FORMULA:
622
+ sort === null || sort === void 0 ? true : delete sort[sortColumn];
623
+ break;
624
+ case types_1.FieldType.NUMBER:
625
+ sort[sortColumn].type = types_1.SortType.number;
626
+ break;
619
627
  }
620
628
  }
621
629
  filters = buildFilters(id, filters || {}, table);
@@ -188,7 +188,7 @@ function search(ctx) {
188
188
  ? constants_1.SortDirection.DESCENDING
189
189
  : constants_1.SortDirection.ASCENDING;
190
190
  sort = {
191
- [params.sort]: direction,
191
+ [params.sort]: { direction },
192
192
  };
193
193
  }
194
194
  try {
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.shutdown = void 0;
7
7
  const applications_1 = __importDefault(require("./applications"));
8
+ const metrics_1 = __importDefault(require("./metrics"));
8
9
  const queries_1 = __importDefault(require("./queries"));
9
10
  const tables_1 = __importDefault(require("./tables"));
10
11
  const rows_1 = __importDefault(require("./rows"));
@@ -86,6 +87,12 @@ function addToRouter(endpoints) {
86
87
  }
87
88
  }
88
89
  }
90
+ function applyAdminRoutes(endpoints) {
91
+ addMiddleware(endpoints.read, backend_core_1.middleware.builderOrAdmin);
92
+ addMiddleware(endpoints.write, backend_core_1.middleware.builderOrAdmin);
93
+ addToRouter(endpoints.read);
94
+ addToRouter(endpoints.write);
95
+ }
89
96
  function applyRoutes(endpoints, permType, resource, subResource) {
90
97
  const paramMiddleware = subResource
91
98
  ? (0, resourceId_1.paramSubResource)(resource, subResource)
@@ -107,6 +114,7 @@ function applyRoutes(endpoints, permType, resource, subResource) {
107
114
  addToRouter(endpoints.read);
108
115
  addToRouter(endpoints.write);
109
116
  }
117
+ applyAdminRoutes(metrics_1.default);
110
118
  applyRoutes(applications_1.default, PermissionType.APP, "appId");
111
119
  applyRoutes(tables_1.default, PermissionType.TABLE, "tableId");
112
120
  applyRoutes(users_1.default, PermissionType.USER, "userId");
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const metrics_1 = __importDefault(require("../../controllers/public/metrics"));
7
+ const Endpoint_1 = __importDefault(require("./utils/Endpoint"));
8
+ const read = [];
9
+ /**
10
+ * @openapi
11
+ * /metrics:
12
+ * get:
13
+ * operationId: metricsGet
14
+ * summary: Retrieve Budibase tenant metrics
15
+ * description: Output metrics in OpenMetrics format compatible with Prometheus
16
+ * tags:
17
+ * - metrics
18
+ * responses:
19
+ * 200:
20
+ * description: Returns tenant metrics.
21
+ * content:
22
+ * text/plain:
23
+ * schema:
24
+ * type: string
25
+ * examples:
26
+ * metrics:
27
+ * $ref: '#/components/examples/metrics'
28
+ */
29
+ read.push(new Endpoint_1.default("get", "/metrics", metrics_1.default.fetch));
30
+ exports.default = { read };
@@ -293,7 +293,7 @@ class InternalBuilder {
293
293
  const table = (_a = json.meta) === null || _a === void 0 ? void 0 : _a.table;
294
294
  if (sort) {
295
295
  for (let [key, value] of Object.entries(sort)) {
296
- const direction = value === types_1.SortDirection.ASCENDING ? "asc" : "desc";
296
+ const direction = value.direction === types_1.SortDirection.ASCENDING ? "asc" : "desc";
297
297
  query = query.orderBy(`${table === null || table === void 0 ? void 0 : table.name}.${key}`, direction);
298
298
  }
299
299
  }
@@ -19,6 +19,7 @@ const constants_1 = require("../constants");
19
19
  const google_spreadsheet_1 = require("google-spreadsheet");
20
20
  const node_fetch_1 = __importDefault(require("node-fetch"));
21
21
  const backend_core_1 = require("@budibase/backend-core");
22
+ const shared_core_1 = require("@budibase/shared-core");
22
23
  const SCHEMA = {
23
24
  plus: true,
24
25
  auth: {
@@ -196,7 +197,7 @@ class GoogleSheetsIntegration {
196
197
  const sheet = json.endpoint.entityId;
197
198
  const handlers = {
198
199
  [constants_1.DataSourceOperation.CREATE]: () => this.create({ sheet, row: json.body }),
199
- [constants_1.DataSourceOperation.READ]: () => this.read({ sheet }),
200
+ [constants_1.DataSourceOperation.READ]: () => this.read(Object.assign(Object.assign({}, json), { sheet })),
200
201
  [constants_1.DataSourceOperation.UPDATE]: () => {
201
202
  var _a, _b, _c;
202
203
  return this.update({
@@ -312,11 +313,21 @@ class GoogleSheetsIntegration {
312
313
  yield this.connect();
313
314
  const sheet = this.client.sheetsByTitle[query.sheet];
314
315
  const rows = yield sheet.getRows();
316
+ const filtered = shared_core_1.dataFilters.runLuceneQuery(rows, query.filters);
315
317
  const headerValues = sheet.headerValues;
316
- const response = [];
317
- for (let row of rows) {
318
+ let response = [];
319
+ for (let row of filtered) {
318
320
  response.push(this.buildRowObject(headerValues, row._rawData, row._rowNumber));
319
321
  }
322
+ if (query.sort) {
323
+ if (Object.keys(query.sort).length !== 1) {
324
+ console.warn("Googlesheets does not support multiple sorting", {
325
+ sortInfo: query.sort,
326
+ });
327
+ }
328
+ const [sortField, sortInfo] = Object.entries(query.sort)[0];
329
+ response = shared_core_1.dataFilters.luceneSort(response, sortField, sortInfo.direction, sortInfo.type);
330
+ }
320
331
  return response;
321
332
  }
322
333
  catch (err) {
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.4.10",
4
+ "version": "2.4.12-alpha.0",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -43,11 +43,12 @@
43
43
  "license": "GPL-3.0",
44
44
  "dependencies": {
45
45
  "@apidevtools/swagger-parser": "10.0.3",
46
- "@budibase/backend-core": "^2.4.10",
47
- "@budibase/client": "^2.4.10",
48
- "@budibase/pro": "2.4.10",
49
- "@budibase/string-templates": "^2.4.10",
50
- "@budibase/types": "^2.4.10",
46
+ "@budibase/backend-core": "2.4.12-alpha.0",
47
+ "@budibase/client": "2.4.12-alpha.0",
48
+ "@budibase/pro": "2.4.12-alpha.0",
49
+ "@budibase/shared-core": "2.4.12-alpha.0",
50
+ "@budibase/string-templates": "2.4.12-alpha.0",
51
+ "@budibase/types": "2.4.12-alpha.0",
51
52
  "@bull-board/api": "3.7.0",
52
53
  "@bull-board/koa": "3.9.4",
53
54
  "@elastic/elasticsearch": "7.10.0",