@budibase/server 1.0.91-alpha.2 → 1.0.91-alpha.5

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 (192) hide show
  1. package/builder/assets/{index.7c8961b4.css → index.248a239b.css} +1 -1
  2. package/builder/assets/index.8372a10e.js +1291 -0
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +189 -188
  5. package/coverage/coverage-final.json +6 -6
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/index.html +1 -1
  17. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +10 -10
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +19 -7
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +6 -6
  34. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  50. package/coverage/lcov-report/api/index.html +1 -1
  51. package/coverage/lcov-report/api/index.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  81. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  82. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  84. package/coverage/lcov-report/automations/actions.js.html +1 -1
  85. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  86. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  87. package/coverage/lcov-report/automations/index.html +1 -1
  88. package/coverage/lcov-report/automations/index.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/index.html +1 -1
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  116. package/coverage/lcov-report/automations/utils.js.html +1 -1
  117. package/coverage/lcov-report/constants/index.html +1 -1
  118. package/coverage/lcov-report/constants/index.js.html +1 -1
  119. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  120. package/coverage/lcov-report/constants/screens.js.html +1 -1
  121. package/coverage/lcov-report/db/client.js.html +1 -1
  122. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  123. package/coverage/lcov-report/db/index.html +1 -1
  124. package/coverage/lcov-report/db/index.js.html +1 -1
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +11 -11
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
  129. package/coverage/lcov-report/db/newid.js.html +1 -1
  130. package/coverage/lcov-report/db/utils.js.html +1 -1
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  132. package/coverage/lcov-report/events/index.html +1 -1
  133. package/coverage/lcov-report/events/index.js.html +1 -1
  134. package/coverage/lcov-report/events/utils.js.html +1 -1
  135. package/coverage/lcov-report/index.html +10 -10
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  139. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  140. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  141. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  142. package/coverage/lcov-report/middleware/index.html +1 -1
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  144. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  145. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  146. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  147. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  148. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  149. package/coverage/lcov-report/threads/automation.js.html +1 -1
  150. package/coverage/lcov-report/threads/index.html +1 -1
  151. package/coverage/lcov-report/threads/index.js.html +1 -1
  152. package/coverage/lcov-report/threads/query.js.html +1 -1
  153. package/coverage/lcov-report/threads/utils.js.html +1 -1
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  156. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  157. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  158. package/coverage/lcov-report/utilities/global.js.html +1 -1
  159. package/coverage/lcov-report/utilities/index.html +1 -1
  160. package/coverage/lcov-report/utilities/index.js.html +1 -1
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  162. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +12 -12
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  169. package/coverage/lcov-report/utilities/security.js.html +1 -1
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  175. package/coverage/lcov-report/utilities/users.js.html +1 -1
  176. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  177. package/coverage/lcov.info +275 -274
  178. package/dist/api/controllers/row/internal.js +2 -1
  179. package/dist/definitions/datasource.js +1 -0
  180. package/dist/integrations/base/sql.js +16 -9
  181. package/dist/integrations/firebase.js +192 -0
  182. package/dist/integrations/index.js +3 -0
  183. package/dist/package.json +5 -4
  184. package/dist/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +6 -5
  186. package/src/api/controllers/row/internal.js +5 -1
  187. package/src/definitions/datasource.ts +1 -0
  188. package/src/integrations/base/sql.ts +14 -9
  189. package/src/integrations/firebase.ts +205 -0
  190. package/src/integrations/index.ts +3 -0
  191. package/src/integrations/tests/sql.spec.js +51 -0
  192. package/builder/assets/index.d1097f6b.js +0 -1291
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.91-alpha.2",
4
+ "version": "1.0.91-alpha.5",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -71,12 +71,13 @@
71
71
  "license": "GPL-3.0",
72
72
  "dependencies": {
73
73
  "@apidevtools/swagger-parser": "^10.0.3",
74
- "@budibase/backend-core": "^1.0.91-alpha.2",
75
- "@budibase/client": "^1.0.91-alpha.2",
76
- "@budibase/string-templates": "^1.0.91-alpha.2",
74
+ "@budibase/backend-core": "^1.0.91-alpha.5",
75
+ "@budibase/client": "^1.0.91-alpha.5",
76
+ "@budibase/string-templates": "^1.0.91-alpha.5",
77
77
  "@bull-board/api": "^3.7.0",
78
78
  "@bull-board/koa": "^3.7.0",
79
79
  "@elastic/elasticsearch": "7.10.0",
80
+ "@google-cloud/firestore": "^5.0.2",
80
81
  "@koa/router": "8.0.0",
81
82
  "@sendgrid/mail": "7.1.1",
82
83
  "@sentry/node": "^6.0.0",
@@ -175,5 +176,5 @@
175
176
  "optionalDependencies": {
176
177
  "oracledb": "^5.3.0"
177
178
  },
178
- "gitHead": "b25cacf6b86fe7551b3eb63707e2505d78394783"
179
+ "gitHead": "0ef164c14981ac1fc025372c79c0e365a7d7eb99"
179
180
  }
@@ -85,7 +85,11 @@ exports.patch = async ctx => {
85
85
  const isUserTable = tableId === InternalTables.USER_METADATA
86
86
  let oldRow
87
87
  try {
88
- oldRow = await db.get(inputs._id)
88
+ let dbTable = await db.get(tableId)
89
+ oldRow = await outputProcessing(
90
+ dbTable,
91
+ await findRow(ctx, tableId, inputs._id)
92
+ )
89
93
  } catch (err) {
90
94
  if (isUserTable) {
91
95
  // don't include the rev, it'll be the global rev
@@ -48,6 +48,7 @@ export enum SourceNames {
48
48
  REST = "REST",
49
49
  ORACLE = "ORACLE",
50
50
  GOOGLE_SHEETS = "GOOGLE_SHEETS",
51
+ FIREBASE = "FIREBASE",
51
52
  }
52
53
 
53
54
  export enum IncludeRelationships {
@@ -27,11 +27,8 @@ function parse(input: any) {
27
27
  if (typeof input !== "string") {
28
28
  return input
29
29
  }
30
- if (input === MAX_ISO_DATE) {
31
- return new Date(8640000000000000)
32
- }
33
- if (input === MIN_ISO_DATE) {
34
- return new Date(-8640000000000000)
30
+ if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
31
+ return null
35
32
  }
36
33
  if (isIsoDateString(input)) {
37
34
  return new Date(input)
@@ -130,11 +127,19 @@ class InternalBuilder {
130
127
  }
131
128
  if (filters.range) {
132
129
  iterate(filters.range, (key, value) => {
133
- if (!value.high || !value.low) {
134
- return
130
+ if (value.low && value.high) {
131
+ // Use a between operator if we have 2 valid range values
132
+ const fnc = allOr ? "orWhereBetween" : "whereBetween"
133
+ query = query[fnc](key, [value.low, value.high])
134
+ } else if (value.low) {
135
+ // Use just a single greater than operator if we only have a low
136
+ const fnc = allOr ? "orWhere" : "where"
137
+ query = query[fnc](key, ">", value.low)
138
+ } else if (value.high) {
139
+ // Use just a single less than operator if we only have a high
140
+ const fnc = allOr ? "orWhere" : "where"
141
+ query = query[fnc](key, "<", value.high)
135
142
  }
136
- const fnc = allOr ? "orWhereBetween" : "whereBetween"
137
- query = query[fnc](key, [value.low, value.high])
138
143
  })
139
144
  }
140
145
  if (filters.equal) {
@@ -0,0 +1,205 @@
1
+ import {
2
+ DatasourceFieldTypes,
3
+ Integration,
4
+ QueryTypes,
5
+ } from "../definitions/datasource"
6
+ import { IntegrationBase } from "./base/IntegrationBase"
7
+ import { Firestore, WhereFilterOp } from "@google-cloud/firestore"
8
+
9
+ module Firebase {
10
+ interface FirebaseConfig {
11
+ email: string
12
+ privateKey: string
13
+ projectId: string
14
+ serviceAccount?: string
15
+ }
16
+
17
+ const SCHEMA: Integration = {
18
+ docs: "https://firebase.google.com/docs/firestore/quickstart",
19
+ friendlyName: "Firestore",
20
+ description:
21
+ "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
22
+ datasource: {
23
+ email: {
24
+ type: DatasourceFieldTypes.STRING,
25
+ required: true,
26
+ },
27
+ privateKey: {
28
+ type: DatasourceFieldTypes.STRING,
29
+ required: true,
30
+ },
31
+ projectId: {
32
+ type: DatasourceFieldTypes.STRING,
33
+ required: true,
34
+ },
35
+ serviceAccount: {
36
+ type: DatasourceFieldTypes.JSON,
37
+ required: false,
38
+ },
39
+ },
40
+ query: {
41
+ create: {
42
+ type: QueryTypes.JSON,
43
+ },
44
+ read: {
45
+ type: QueryTypes.JSON,
46
+ },
47
+ update: {
48
+ type: QueryTypes.JSON,
49
+ },
50
+ delete: {
51
+ type: QueryTypes.JSON,
52
+ },
53
+ },
54
+ extra: {
55
+ collection: {
56
+ displayName: "Collection",
57
+ type: DatasourceFieldTypes.STRING,
58
+ required: true,
59
+ },
60
+ filterField: {
61
+ displayName: "Filter field",
62
+ type: DatasourceFieldTypes.STRING,
63
+ required: false,
64
+ },
65
+ filter: {
66
+ displayName: "Filter comparison",
67
+ type: DatasourceFieldTypes.LIST,
68
+ required: false,
69
+ data: {
70
+ read: [
71
+ "==",
72
+ "<",
73
+ "<=",
74
+ "==",
75
+ "!=",
76
+ ">=",
77
+ ">",
78
+ "array-contains",
79
+ "in",
80
+ "not-in",
81
+ "array-contains-any",
82
+ ],
83
+ },
84
+ },
85
+ filterValue: {
86
+ displayName: "Filter value",
87
+ type: DatasourceFieldTypes.STRING,
88
+ required: false,
89
+ },
90
+ },
91
+ }
92
+
93
+ class FirebaseIntegration implements IntegrationBase {
94
+ private config: FirebaseConfig
95
+ private db: Firestore
96
+
97
+ constructor(config: FirebaseConfig) {
98
+ this.config = config
99
+ if (config.serviceAccount) {
100
+ const serviceAccount = JSON.parse(config.serviceAccount)
101
+ this.db = new Firestore({
102
+ projectId: serviceAccount.project_id,
103
+ credentials: {
104
+ client_email: serviceAccount.client_email,
105
+ private_key: serviceAccount.private_key,
106
+ },
107
+ })
108
+ } else {
109
+ this.db = new Firestore({
110
+ projectId: config.projectId,
111
+ credentials: {
112
+ client_email: config.email,
113
+ private_key: config.privateKey,
114
+ },
115
+ })
116
+ }
117
+ }
118
+
119
+ async create(query: { json: object; extra: { [key: string]: string } }) {
120
+ try {
121
+ const documentReference = this.db
122
+ .collection(query.extra.collection)
123
+ .doc()
124
+ await documentReference.set({ ...query.json, id: documentReference.id })
125
+ const snapshot = await documentReference.get()
126
+ return snapshot.data()
127
+ } catch (err) {
128
+ console.error("Error writing to Firestore", err)
129
+ throw err
130
+ }
131
+ }
132
+
133
+ async read(query: { json: object; extra: { [key: string]: string } }) {
134
+ try {
135
+ let snapshot
136
+ const collectionRef = this.db.collection(query.extra.collection)
137
+ if (
138
+ query.extra.filterField &&
139
+ query.extra.filter &&
140
+ query.extra.filterValue
141
+ ) {
142
+ snapshot = await collectionRef
143
+ .where(
144
+ query.extra.filterField,
145
+ query.extra.filter as WhereFilterOp,
146
+ query.extra.filterValue
147
+ )
148
+ .get()
149
+ } else {
150
+ snapshot = await collectionRef.get()
151
+ }
152
+ const result: any[] = []
153
+ snapshot.forEach(doc => result.push(doc.data()))
154
+
155
+ return result
156
+ } catch (err) {
157
+ console.error("Error querying Firestore", err)
158
+ throw err
159
+ }
160
+ }
161
+
162
+ async update(query: {
163
+ json: Record<string, any>
164
+ extra: { [key: string]: string }
165
+ }) {
166
+ try {
167
+ await this.db
168
+ .collection(query.extra.collection)
169
+ .doc(query.json.id)
170
+ .update(query.json)
171
+
172
+ return (
173
+ await this.db
174
+ .collection(query.extra.collection)
175
+ .doc(query.json.id)
176
+ .get()
177
+ ).data()
178
+ } catch (err) {
179
+ console.error("Error writing to firebase", err)
180
+ throw err
181
+ }
182
+ }
183
+
184
+ async delete(query: {
185
+ json: { id: string }
186
+ extra: { [key: string]: string }
187
+ }) {
188
+ try {
189
+ await this.db
190
+ .collection(query.extra.collection)
191
+ .doc(query.json.id)
192
+ .delete()
193
+ return true
194
+ } catch (err) {
195
+ console.error("Error writing to mongodb", err)
196
+ throw err
197
+ }
198
+ }
199
+ }
200
+
201
+ module.exports = {
202
+ schema: SCHEMA,
203
+ integration: FirebaseIntegration,
204
+ }
205
+ }
@@ -10,6 +10,7 @@ const mysql = require("./mysql")
10
10
  const arangodb = require("./arangodb")
11
11
  const rest = require("./rest")
12
12
  const googlesheets = require("./googlesheets")
13
+ const firebase = require("./firebase")
13
14
  const { SourceNames } = require("../definitions/datasource")
14
15
  const environment = require("../environment")
15
16
 
@@ -25,6 +26,7 @@ const DEFINITIONS = {
25
26
  [SourceNames.MYSQL]: mysql.schema,
26
27
  [SourceNames.ARANGODB]: arangodb.schema,
27
28
  [SourceNames.REST]: rest.schema,
29
+ [SourceNames.FIREBASE]: firebase.schema,
28
30
  }
29
31
 
30
32
  const INTEGRATIONS = {
@@ -39,6 +41,7 @@ const INTEGRATIONS = {
39
41
  [SourceNames.MYSQL]: mysql.integration,
40
42
  [SourceNames.ARANGODB]: arangodb.integration,
41
43
  [SourceNames.REST]: rest.integration,
44
+ [SourceNames.FIREBASE]: firebase.integration,
42
45
  }
43
46
 
44
47
  // optionally add oracle integration if the oracle binary can be installed
@@ -187,4 +187,55 @@ describe("SQL query builder", () => {
187
187
  sql: `select * from (select * from \`${TABLE_NAME}\` limit ?) as \`${TABLE_NAME}\``
188
188
  })
189
189
  })
190
+
191
+ it("should use greater than when only low range specified", () => {
192
+ const date = new Date()
193
+ const query = sql._query(generateReadJson({
194
+ filters: {
195
+ range: {
196
+ property: {
197
+ low: date,
198
+ }
199
+ }
200
+ }
201
+ }))
202
+ expect(query).toEqual({
203
+ bindings: [date, limit],
204
+ sql: `select * from (select * from "${TABLE_NAME}" where "${TABLE_NAME}"."property" > $1 limit $2) as "${TABLE_NAME}"`
205
+ })
206
+ })
207
+
208
+ it("should use less than when only high range specified", () => {
209
+ const date = new Date()
210
+ const query = sql._query(generateReadJson({
211
+ filters: {
212
+ range: {
213
+ property: {
214
+ high: date,
215
+ }
216
+ }
217
+ }
218
+ }))
219
+ expect(query).toEqual({
220
+ bindings: [date, limit],
221
+ sql: `select * from (select * from "${TABLE_NAME}" where "${TABLE_NAME}"."property" < $1 limit $2) as "${TABLE_NAME}"`
222
+ })
223
+ })
224
+
225
+ it("should use greater than when only low range specified", () => {
226
+ const date = new Date()
227
+ const query = sql._query(generateReadJson({
228
+ filters: {
229
+ range: {
230
+ property: {
231
+ low: date,
232
+ }
233
+ }
234
+ }
235
+ }))
236
+ expect(query).toEqual({
237
+ bindings: [date, limit],
238
+ sql: `select * from (select * from "${TABLE_NAME}" where "${TABLE_NAME}"."property" > $1 limit $2) as "${TABLE_NAME}"`
239
+ })
240
+ })
190
241
  })