@budibase/server 1.0.46-alpha.5 → 1.0.46-alpha.6
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/builder/assets/{index.298ba3d3.js → index.00221ff2.js} +234 -234
- package/builder/assets/{index.243ca52c.css → index.dd9e386f.css} +1 -1
- package/builder/index.html +2 -2
- package/coverage/clover.xml +157 -145
- package/coverage/coverage-final.json +4 -4
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +44 -8
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +15 -15
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +15 -15
- package/coverage/lcov-report/api/controllers/query/index.js.html +44 -11
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +5 -5
- package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +5 -14
- package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/application.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/index.js.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/row.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/static.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/automations/utils.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +5 -5
- package/coverage/lcov-report/constants/index.js.html +16 -4
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/client.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +1 -1
- package/coverage/lcov-report/db/utils.js.html +1 -1
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +26 -26
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/authorized.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- package/coverage/lcov-report/middleware/index.html +1 -1
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/migrations/usageQuotas/index.html +1 -1
- package/coverage/lcov-report/migrations/usageQuotas/index.js.html +1 -1
- package/coverage/lcov-report/migrations/usageQuotas/syncApps.js.html +1 -1
- package/coverage/lcov-report/migrations/usageQuotas/syncRows.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +1 -1
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
- package/coverage/lcov.info +253 -226
- package/dist/api/controllers/datasource.js +11 -0
- package/dist/api/controllers/query/index.js +11 -3
- package/dist/api/controllers/row/utils.js +1 -2
- package/dist/constants/index.js +3 -0
- package/dist/definitions/datasource.js +1 -0
- package/dist/integrations/googlesheets.js +340 -0
- package/dist/integrations/index.js +3 -0
- package/dist/integrations/rest.js +5 -5
- package/dist/integrations/s3.js +1 -1
- package/dist/package.json +7 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -5
- package/src/api/controllers/datasource.js +12 -0
- package/src/api/controllers/query/index.js +14 -3
- package/src/api/controllers/row/utils.js +1 -4
- package/src/constants/index.js +4 -0
- package/src/definitions/datasource.ts +3 -0
- package/src/integrations/googlesheets.ts +353 -0
- package/src/integrations/index.ts +3 -0
- package/src/integrations/rest.ts +28 -9
- package/src/integrations/s3.ts +1 -1
|
@@ -0,0 +1,340 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const datasource_1 = require("../definitions/datasource");
|
|
13
|
+
const google_auth_library_1 = require("google-auth-library");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
const constants_1 = require("../constants");
|
|
16
|
+
const google_spreadsheet_1 = require("google-spreadsheet");
|
|
17
|
+
var GoogleSheetsModule;
|
|
18
|
+
(function (GoogleSheetsModule) {
|
|
19
|
+
const { getGlobalDB } = require("@budibase/backend-core/tenancy");
|
|
20
|
+
const { getScopedConfig } = require("@budibase/backend-core/db");
|
|
21
|
+
const { Configs } = require("@budibase/backend-core/constants");
|
|
22
|
+
const SCHEMA = {
|
|
23
|
+
plus: true,
|
|
24
|
+
auth: {
|
|
25
|
+
type: "google",
|
|
26
|
+
},
|
|
27
|
+
relationships: false,
|
|
28
|
+
docs: "https://developers.google.com/sheets/api/quickstart/nodejs",
|
|
29
|
+
description: "Create and collaborate on online spreadsheets in real-time and from any device. ",
|
|
30
|
+
friendlyName: "Google Sheets",
|
|
31
|
+
datasource: {
|
|
32
|
+
spreadsheetId: {
|
|
33
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
query: {
|
|
38
|
+
create: {
|
|
39
|
+
type: datasource_1.QueryTypes.FIELDS,
|
|
40
|
+
fields: {
|
|
41
|
+
sheet: {
|
|
42
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
43
|
+
required: true,
|
|
44
|
+
},
|
|
45
|
+
row: {
|
|
46
|
+
type: datasource_1.QueryTypes.JSON,
|
|
47
|
+
required: true,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
read: {
|
|
52
|
+
type: datasource_1.QueryTypes.FIELDS,
|
|
53
|
+
fields: {
|
|
54
|
+
sheet: {
|
|
55
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
56
|
+
required: true,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
update: {
|
|
61
|
+
type: datasource_1.QueryTypes.FIELDS,
|
|
62
|
+
fields: {
|
|
63
|
+
sheet: {
|
|
64
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
65
|
+
required: true,
|
|
66
|
+
},
|
|
67
|
+
rowIndex: {
|
|
68
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
69
|
+
required: true,
|
|
70
|
+
},
|
|
71
|
+
row: {
|
|
72
|
+
type: datasource_1.QueryTypes.JSON,
|
|
73
|
+
required: true,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
delete: {
|
|
78
|
+
type: datasource_1.QueryTypes.FIELDS,
|
|
79
|
+
fields: {
|
|
80
|
+
sheet: {
|
|
81
|
+
type: datasource_1.DatasourceFieldTypes.STRING,
|
|
82
|
+
required: true,
|
|
83
|
+
},
|
|
84
|
+
rowIndex: {
|
|
85
|
+
type: datasource_1.DatasourceFieldTypes.NUMBER,
|
|
86
|
+
required: true,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
class GoogleSheetsIntegration {
|
|
93
|
+
constructor(config) {
|
|
94
|
+
this.tables = {};
|
|
95
|
+
this.schemaErrors = {};
|
|
96
|
+
this.config = config;
|
|
97
|
+
const spreadsheetId = this.cleanSpreadsheetUrl(this.config.spreadsheetId);
|
|
98
|
+
this.client = new google_spreadsheet_1.GoogleSpreadsheet(spreadsheetId);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Pull the spreadsheet ID out from a valid google sheets URL
|
|
102
|
+
* @param spreadsheetId - the URL or standard spreadsheetId of the google sheet
|
|
103
|
+
* @returns spreadsheet Id of the google sheet
|
|
104
|
+
*/
|
|
105
|
+
cleanSpreadsheetUrl(spreadsheetId) {
|
|
106
|
+
if (!spreadsheetId) {
|
|
107
|
+
throw new Error("You must set a spreadsheet ID in your configuration to fetch tables.");
|
|
108
|
+
}
|
|
109
|
+
const parts = spreadsheetId.split("/");
|
|
110
|
+
return parts.length > 5 ? parts[5] : spreadsheetId;
|
|
111
|
+
}
|
|
112
|
+
connect() {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
try {
|
|
115
|
+
// Initialise oAuth client
|
|
116
|
+
const db = getGlobalDB();
|
|
117
|
+
const googleConfig = yield getScopedConfig(db, {
|
|
118
|
+
type: Configs.GOOGLE,
|
|
119
|
+
});
|
|
120
|
+
const oauthClient = new google_auth_library_1.OAuth2Client({
|
|
121
|
+
clientId: googleConfig.clientID,
|
|
122
|
+
clientSecret: googleConfig.clientSecret,
|
|
123
|
+
});
|
|
124
|
+
oauthClient.credentials.access_token = this.config.auth.accessToken;
|
|
125
|
+
oauthClient.credentials.refresh_token = this.config.auth.refreshToken;
|
|
126
|
+
this.client.useOAuth2Client(oauthClient);
|
|
127
|
+
yield this.client.loadInfo();
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
console.error("Error connecting to google sheets", err);
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
buildSchema(datasourceId) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
yield this.connect();
|
|
138
|
+
const sheets = yield this.client.sheetsByIndex;
|
|
139
|
+
const tables = {};
|
|
140
|
+
for (let sheet of sheets) {
|
|
141
|
+
// must fetch rows to determine schema
|
|
142
|
+
yield sheet.getRows();
|
|
143
|
+
// build schema
|
|
144
|
+
const schema = {};
|
|
145
|
+
// build schema from headers
|
|
146
|
+
for (let header of sheet.headerValues) {
|
|
147
|
+
schema[header] = {
|
|
148
|
+
name: header,
|
|
149
|
+
type: constants_1.FieldTypes.STRING,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// create tables
|
|
153
|
+
tables[sheet.title] = {
|
|
154
|
+
_id: utils_1.buildExternalTableId(datasourceId, sheet.title),
|
|
155
|
+
name: sheet.title,
|
|
156
|
+
primary: ["rowNumber"],
|
|
157
|
+
schema,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
this.tables = tables;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
query(json) {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
const sheet = json.endpoint.entityId;
|
|
166
|
+
const handlers = {
|
|
167
|
+
[constants_1.DataSourceOperation.CREATE]: () => this.create({ sheet, row: json.body }),
|
|
168
|
+
[constants_1.DataSourceOperation.READ]: () => this.read({ sheet }),
|
|
169
|
+
[constants_1.DataSourceOperation.UPDATE]: () => {
|
|
170
|
+
var _a, _b, _c;
|
|
171
|
+
return this.update({
|
|
172
|
+
// exclude the header row and zero index
|
|
173
|
+
rowIndex: ((_c = (_b = (_a = json.extra) === null || _a === void 0 ? void 0 : _a.idFilter) === null || _b === void 0 ? void 0 : _b.equal) === null || _c === void 0 ? void 0 : _c.rowNumber) - 2,
|
|
174
|
+
sheet,
|
|
175
|
+
row: json.body,
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
[constants_1.DataSourceOperation.DELETE]: () => {
|
|
179
|
+
var _a, _b, _c;
|
|
180
|
+
return this.delete({
|
|
181
|
+
// exclude the header row and zero index
|
|
182
|
+
rowIndex: ((_c = (_b = (_a = json.extra) === null || _a === void 0 ? void 0 : _a.idFilter) === null || _b === void 0 ? void 0 : _b.equal) === null || _c === void 0 ? void 0 : _c.rowNumber) - 2,
|
|
183
|
+
sheet,
|
|
184
|
+
});
|
|
185
|
+
},
|
|
186
|
+
[constants_1.DataSourceOperation.CREATE_TABLE]: () => { var _a; return this.createTable((_a = json === null || json === void 0 ? void 0 : json.table) === null || _a === void 0 ? void 0 : _a.name); },
|
|
187
|
+
[constants_1.DataSourceOperation.UPDATE_TABLE]: () => this.updateTable(json.table),
|
|
188
|
+
[constants_1.DataSourceOperation.DELETE_TABLE]: () => { var _a; return this.deleteTable((_a = json === null || json === void 0 ? void 0 : json.table) === null || _a === void 0 ? void 0 : _a.name); },
|
|
189
|
+
};
|
|
190
|
+
const internalQueryMethod = handlers[json.endpoint.operation];
|
|
191
|
+
return yield internalQueryMethod();
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
buildRowObject(headers, values, rowNumber) {
|
|
195
|
+
const rowObject = { rowNumber };
|
|
196
|
+
for (let i = 0; i < headers.length; i++) {
|
|
197
|
+
rowObject._id = rowNumber;
|
|
198
|
+
rowObject[headers[i]] = values[i];
|
|
199
|
+
}
|
|
200
|
+
return rowObject;
|
|
201
|
+
}
|
|
202
|
+
createTable(name) {
|
|
203
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
try {
|
|
205
|
+
yield this.connect();
|
|
206
|
+
const sheet = yield this.client.addSheet({ title: name });
|
|
207
|
+
return sheet;
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
console.error("Error creating new table in google sheets", err);
|
|
211
|
+
throw err;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
updateTable(table) {
|
|
216
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
+
try {
|
|
218
|
+
yield this.connect();
|
|
219
|
+
const sheet = yield this.client.sheetsByTitle[table.name];
|
|
220
|
+
yield sheet.loadHeaderRow();
|
|
221
|
+
if (table._rename) {
|
|
222
|
+
const headers = [];
|
|
223
|
+
for (let header of sheet.headerValues) {
|
|
224
|
+
if (header === table._rename.old) {
|
|
225
|
+
headers.push(table._rename.updated);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
headers.push(header);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
yield sheet.setHeaderRow(headers);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
let newField = Object.keys(table.schema).find(key => !sheet.headerValues.includes(key));
|
|
235
|
+
yield sheet.setHeaderRow([...sheet.headerValues, newField]);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
console.error("Error updating table in google sheets", err);
|
|
240
|
+
throw err;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
deleteTable(sheet) {
|
|
245
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
246
|
+
try {
|
|
247
|
+
yield this.connect();
|
|
248
|
+
const sheetToDelete = yield this.client.sheetsByTitle[sheet];
|
|
249
|
+
return yield sheetToDelete.delete();
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
console.error("Error deleting table in google sheets", err);
|
|
253
|
+
throw err;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
create(query) {
|
|
258
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
259
|
+
try {
|
|
260
|
+
yield this.connect();
|
|
261
|
+
const sheet = yield this.client.sheetsByTitle[query.sheet];
|
|
262
|
+
const rowToInsert = typeof query.row === "string" ? JSON.parse(query.row) : query.row;
|
|
263
|
+
const row = yield sheet.addRow(rowToInsert);
|
|
264
|
+
return [
|
|
265
|
+
this.buildRowObject(sheet.headerValues, row._rawData, row._rowNumber),
|
|
266
|
+
];
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
console.error("Error writing to google sheets", err);
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
read(query) {
|
|
275
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
276
|
+
try {
|
|
277
|
+
yield this.connect();
|
|
278
|
+
const sheet = yield this.client.sheetsByTitle[query.sheet];
|
|
279
|
+
const rows = yield sheet.getRows();
|
|
280
|
+
const headerValues = sheet.headerValues;
|
|
281
|
+
const response = [];
|
|
282
|
+
for (let row of rows) {
|
|
283
|
+
response.push(this.buildRowObject(headerValues, row._rawData, row._rowNumber));
|
|
284
|
+
}
|
|
285
|
+
return response;
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
console.error("Error reading from google sheets", err);
|
|
289
|
+
throw err;
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
update(query) {
|
|
294
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
295
|
+
try {
|
|
296
|
+
yield this.connect();
|
|
297
|
+
const sheet = yield this.client.sheetsByTitle[query.sheet];
|
|
298
|
+
const rows = yield sheet.getRows();
|
|
299
|
+
const row = rows[query.rowIndex];
|
|
300
|
+
if (row) {
|
|
301
|
+
const updateValues = query.row;
|
|
302
|
+
for (let key in updateValues) {
|
|
303
|
+
row[key] = updateValues[key];
|
|
304
|
+
}
|
|
305
|
+
yield row.save();
|
|
306
|
+
return [
|
|
307
|
+
this.buildRowObject(sheet.headerValues, row._rawData, row._rowNumber),
|
|
308
|
+
];
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
throw new Error("Row does not exist.");
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
console.error("Error reading from google sheets", err);
|
|
316
|
+
throw err;
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
delete(query) {
|
|
321
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
322
|
+
yield this.connect();
|
|
323
|
+
const sheet = yield this.client.sheetsByTitle[query.sheet];
|
|
324
|
+
const rows = yield sheet.getRows();
|
|
325
|
+
const row = rows[query.rowIndex];
|
|
326
|
+
if (row) {
|
|
327
|
+
yield row.delete();
|
|
328
|
+
return [{ deleted: query.rowIndex }];
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
throw new Error("Row does not exist.");
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
module.exports = {
|
|
337
|
+
schema: SCHEMA,
|
|
338
|
+
integration: GoogleSheetsIntegration,
|
|
339
|
+
};
|
|
340
|
+
})(GoogleSheetsModule || (GoogleSheetsModule = {}));
|
|
@@ -10,6 +10,7 @@ const airtable = require("./airtable");
|
|
|
10
10
|
const mysql = require("./mysql");
|
|
11
11
|
const arangodb = require("./arangodb");
|
|
12
12
|
const rest = require("./rest");
|
|
13
|
+
const googlesheets = require("./googlesheets");
|
|
13
14
|
const { SourceNames } = require("../definitions/datasource");
|
|
14
15
|
const DEFINITIONS = {
|
|
15
16
|
[SourceNames.POSTGRES]: postgres.schema,
|
|
@@ -23,6 +24,7 @@ const DEFINITIONS = {
|
|
|
23
24
|
[SourceNames.MYSQL]: mysql.schema,
|
|
24
25
|
[SourceNames.ARANGODB]: arangodb.schema,
|
|
25
26
|
[SourceNames.REST]: rest.schema,
|
|
27
|
+
[SourceNames.GOOGLE_SHEETS]: googlesheets.schema,
|
|
26
28
|
};
|
|
27
29
|
const INTEGRATIONS = {
|
|
28
30
|
[SourceNames.POSTGRES]: postgres.integration,
|
|
@@ -36,6 +38,7 @@ const INTEGRATIONS = {
|
|
|
36
38
|
[SourceNames.MYSQL]: mysql.integration,
|
|
37
39
|
[SourceNames.ARANGODB]: arangodb.integration,
|
|
38
40
|
[SourceNames.REST]: rest.integration,
|
|
41
|
+
[SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
|
|
39
42
|
};
|
|
40
43
|
// optionally add oracle integration if the oracle binary can be installed
|
|
41
44
|
if (!(process.arch === "arm64" && process.platform === "darwin")) {
|
|
@@ -40,8 +40,8 @@ const coreFields = {
|
|
|
40
40
|
enum: Object.values(BodyTypes),
|
|
41
41
|
},
|
|
42
42
|
pagination: {
|
|
43
|
-
type: datasource_1.DatasourceFieldTypes.OBJECT
|
|
44
|
-
}
|
|
43
|
+
type: datasource_1.DatasourceFieldTypes.OBJECT,
|
|
44
|
+
},
|
|
45
45
|
};
|
|
46
46
|
var RestModule;
|
|
47
47
|
(function (RestModule) {
|
|
@@ -162,8 +162,8 @@ var RestModule;
|
|
|
162
162
|
headers,
|
|
163
163
|
},
|
|
164
164
|
pagination: {
|
|
165
|
-
cursor: nextCursor
|
|
166
|
-
}
|
|
165
|
+
cursor: nextCursor,
|
|
166
|
+
},
|
|
167
167
|
};
|
|
168
168
|
});
|
|
169
169
|
}
|
|
@@ -294,7 +294,7 @@ var RestModule;
|
|
|
294
294
|
}
|
|
295
295
|
_req(query) {
|
|
296
296
|
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
-
const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, pagination, paginationValues } = query;
|
|
297
|
+
const { path = "", queryString = "", headers = {}, method = "GET", disabledHeaders, bodyType, requestBody, authConfigId, pagination, paginationValues, } = query;
|
|
298
298
|
const authHeaders = this.getAuthHeaders(authConfigId);
|
|
299
299
|
this.headers = Object.assign(Object.assign(Object.assign({}, this.config.defaultHeaders), headers), authHeaders);
|
|
300
300
|
if (disabledHeaders) {
|
package/dist/integrations/s3.js
CHANGED
package/dist/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.46-alpha.
|
|
4
|
+
"version": "1.0.46-alpha.5",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -70,9 +70,9 @@
|
|
|
70
70
|
"license": "GPL-3.0",
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"@apidevtools/swagger-parser": "^10.0.3",
|
|
73
|
-
"@budibase/backend-core": "^1.0.46-alpha.
|
|
74
|
-
"@budibase/client": "^1.0.46-alpha.
|
|
75
|
-
"@budibase/string-templates": "^1.0.46-alpha.
|
|
73
|
+
"@budibase/backend-core": "^1.0.46-alpha.5",
|
|
74
|
+
"@budibase/client": "^1.0.46-alpha.5",
|
|
75
|
+
"@budibase/string-templates": "^1.0.46-alpha.5",
|
|
76
76
|
"@bull-board/api": "^3.7.0",
|
|
77
77
|
"@bull-board/koa": "^3.7.0",
|
|
78
78
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -92,6 +92,8 @@
|
|
|
92
92
|
"fix-path": "3.0.0",
|
|
93
93
|
"form-data": "^4.0.0",
|
|
94
94
|
"fs-extra": "8.1.0",
|
|
95
|
+
"google-auth-library": "^7.11.0",
|
|
96
|
+
"google-spreadsheet": "^3.2.0",
|
|
95
97
|
"jimp": "0.16.1",
|
|
96
98
|
"joi": "17.2.1",
|
|
97
99
|
"js-yaml": "^4.1.0",
|
|
@@ -139,6 +141,7 @@
|
|
|
139
141
|
"@jest/test-sequencer": "^24.8.0",
|
|
140
142
|
"@types/apidoc": "^0.50.0",
|
|
141
143
|
"@types/bull": "^3.15.1",
|
|
144
|
+
"@types/google-spreadsheet": "^3.1.5",
|
|
142
145
|
"@types/jest": "^26.0.23",
|
|
143
146
|
"@types/koa": "^2.13.3",
|
|
144
147
|
"@types/koa-router": "^7.4.2",
|