@budibase/backend-core 2.9.19 → 2.9.21-alpha.0

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 (250) hide show
  1. package/dist/index.js +266 -324
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.js.meta.json +1 -1
  4. package/dist/package.json +19 -4
  5. package/dist/plugins.js +1 -1
  6. package/dist/plugins.js.map +1 -1
  7. package/dist/plugins.js.meta.json +1 -1
  8. package/dist/src/security/permissions.d.ts +1 -1
  9. package/dist/tests.js +222 -260
  10. package/dist/tests.js.map +4 -4
  11. package/dist/tests.js.meta.json +1 -1
  12. package/package.json +19 -4
  13. package/dist/tsconfig.build.tsbuildinfo +0 -1
  14. package/src/accounts/accounts.ts +0 -82
  15. package/src/accounts/api.ts +0 -59
  16. package/src/accounts/index.ts +0 -1
  17. package/src/auth/auth.ts +0 -208
  18. package/src/auth/index.ts +0 -1
  19. package/src/auth/tests/auth.spec.ts +0 -14
  20. package/src/blacklist/blacklist.ts +0 -54
  21. package/src/blacklist/index.ts +0 -1
  22. package/src/blacklist/tests/blacklist.spec.ts +0 -46
  23. package/src/cache/appMetadata.ts +0 -88
  24. package/src/cache/base/index.ts +0 -92
  25. package/src/cache/generic.ts +0 -30
  26. package/src/cache/index.ts +0 -5
  27. package/src/cache/tests/writethrough.spec.ts +0 -138
  28. package/src/cache/user.ts +0 -69
  29. package/src/cache/writethrough.ts +0 -133
  30. package/src/configs/configs.ts +0 -257
  31. package/src/configs/index.ts +0 -1
  32. package/src/configs/tests/configs.spec.ts +0 -184
  33. package/src/constants/db.ts +0 -63
  34. package/src/constants/index.ts +0 -2
  35. package/src/constants/misc.ts +0 -50
  36. package/src/context/Context.ts +0 -14
  37. package/src/context/identity.ts +0 -58
  38. package/src/context/index.ts +0 -3
  39. package/src/context/mainContext.ts +0 -310
  40. package/src/context/tests/index.spec.ts +0 -147
  41. package/src/context/types.ts +0 -11
  42. package/src/db/Replication.ts +0 -84
  43. package/src/db/constants.ts +0 -10
  44. package/src/db/couch/DatabaseImpl.ts +0 -238
  45. package/src/db/couch/connections.ts +0 -77
  46. package/src/db/couch/index.ts +0 -5
  47. package/src/db/couch/pouchDB.ts +0 -97
  48. package/src/db/couch/pouchDump.ts +0 -0
  49. package/src/db/couch/utils.ts +0 -50
  50. package/src/db/db.ts +0 -39
  51. package/src/db/errors.ts +0 -14
  52. package/src/db/index.ts +0 -12
  53. package/src/db/lucene.ts +0 -732
  54. package/src/db/searchIndexes/index.ts +0 -1
  55. package/src/db/searchIndexes/searchIndexes.ts +0 -62
  56. package/src/db/tests/index.spec.js +0 -25
  57. package/src/db/tests/lucene.spec.ts +0 -298
  58. package/src/db/tests/pouch.spec.js +0 -62
  59. package/src/db/tests/utils.spec.ts +0 -63
  60. package/src/db/utils.ts +0 -207
  61. package/src/db/views.ts +0 -241
  62. package/src/docIds/conversions.ts +0 -59
  63. package/src/docIds/ids.ts +0 -113
  64. package/src/docIds/index.ts +0 -2
  65. package/src/docIds/newid.ts +0 -5
  66. package/src/docIds/params.ts +0 -174
  67. package/src/docUpdates/index.ts +0 -29
  68. package/src/environment.ts +0 -201
  69. package/src/errors/errors.ts +0 -119
  70. package/src/errors/index.ts +0 -1
  71. package/src/events/analytics.ts +0 -6
  72. package/src/events/asyncEvents/index.ts +0 -2
  73. package/src/events/asyncEvents/publisher.ts +0 -12
  74. package/src/events/asyncEvents/queue.ts +0 -22
  75. package/src/events/backfill.ts +0 -183
  76. package/src/events/documentId.ts +0 -56
  77. package/src/events/events.ts +0 -40
  78. package/src/events/identification.ts +0 -310
  79. package/src/events/index.ts +0 -14
  80. package/src/events/processors/AnalyticsProcessor.ts +0 -64
  81. package/src/events/processors/AuditLogsProcessor.ts +0 -93
  82. package/src/events/processors/LoggingProcessor.ts +0 -37
  83. package/src/events/processors/Processors.ts +0 -52
  84. package/src/events/processors/async/DocumentUpdateProcessor.ts +0 -43
  85. package/src/events/processors/index.ts +0 -19
  86. package/src/events/processors/posthog/PosthogProcessor.ts +0 -118
  87. package/src/events/processors/posthog/index.ts +0 -2
  88. package/src/events/processors/posthog/rateLimiting.ts +0 -106
  89. package/src/events/processors/posthog/tests/PosthogProcessor.spec.ts +0 -168
  90. package/src/events/processors/types.ts +0 -1
  91. package/src/events/publishers/account.ts +0 -35
  92. package/src/events/publishers/app.ts +0 -155
  93. package/src/events/publishers/auditLog.ts +0 -26
  94. package/src/events/publishers/auth.ts +0 -73
  95. package/src/events/publishers/automation.ts +0 -110
  96. package/src/events/publishers/backfill.ts +0 -74
  97. package/src/events/publishers/backup.ts +0 -42
  98. package/src/events/publishers/datasource.ts +0 -48
  99. package/src/events/publishers/email.ts +0 -17
  100. package/src/events/publishers/environmentVariable.ts +0 -38
  101. package/src/events/publishers/group.ts +0 -99
  102. package/src/events/publishers/index.ts +0 -24
  103. package/src/events/publishers/installation.ts +0 -38
  104. package/src/events/publishers/layout.ts +0 -26
  105. package/src/events/publishers/license.ts +0 -84
  106. package/src/events/publishers/org.ts +0 -37
  107. package/src/events/publishers/plugin.ts +0 -47
  108. package/src/events/publishers/query.ts +0 -88
  109. package/src/events/publishers/role.ts +0 -62
  110. package/src/events/publishers/rows.ts +0 -29
  111. package/src/events/publishers/screen.ts +0 -36
  112. package/src/events/publishers/serve.ts +0 -43
  113. package/src/events/publishers/table.ts +0 -70
  114. package/src/events/publishers/user.ts +0 -202
  115. package/src/events/publishers/view.ts +0 -107
  116. package/src/featureFlags/index.ts +0 -77
  117. package/src/featureFlags/tests/featureFlags.spec.ts +0 -85
  118. package/src/helpers.ts +0 -9
  119. package/src/index.ts +0 -53
  120. package/src/installation.ts +0 -107
  121. package/src/logging/alerts.ts +0 -26
  122. package/src/logging/correlation/correlation.ts +0 -13
  123. package/src/logging/correlation/index.ts +0 -1
  124. package/src/logging/correlation/middleware.ts +0 -17
  125. package/src/logging/index.ts +0 -4
  126. package/src/logging/pino/logger.ts +0 -232
  127. package/src/logging/pino/middleware.ts +0 -45
  128. package/src/logging/system.ts +0 -81
  129. package/src/logging/tests/system.spec.ts +0 -61
  130. package/src/middleware/adminOnly.ts +0 -9
  131. package/src/middleware/auditLog.ts +0 -6
  132. package/src/middleware/authenticated.ts +0 -193
  133. package/src/middleware/builderOnly.ts +0 -20
  134. package/src/middleware/builderOrAdmin.ts +0 -20
  135. package/src/middleware/csrf.ts +0 -81
  136. package/src/middleware/errorHandling.ts +0 -29
  137. package/src/middleware/index.ts +0 -21
  138. package/src/middleware/internalApi.ts +0 -23
  139. package/src/middleware/joi-validator.ts +0 -45
  140. package/src/middleware/matchers.ts +0 -47
  141. package/src/middleware/passport/datasource/google.ts +0 -95
  142. package/src/middleware/passport/local.ts +0 -54
  143. package/src/middleware/passport/sso/google.ts +0 -77
  144. package/src/middleware/passport/sso/oidc.ts +0 -154
  145. package/src/middleware/passport/sso/sso.ts +0 -165
  146. package/src/middleware/passport/sso/tests/google.spec.ts +0 -67
  147. package/src/middleware/passport/sso/tests/oidc.spec.ts +0 -152
  148. package/src/middleware/passport/sso/tests/sso.spec.ts +0 -197
  149. package/src/middleware/passport/utils.ts +0 -38
  150. package/src/middleware/querystringToBody.ts +0 -28
  151. package/src/middleware/tenancy.ts +0 -36
  152. package/src/middleware/tests/builder.spec.ts +0 -180
  153. package/src/middleware/tests/matchers.spec.ts +0 -134
  154. package/src/migrations/definitions.ts +0 -40
  155. package/src/migrations/index.ts +0 -2
  156. package/src/migrations/migrations.ts +0 -191
  157. package/src/migrations/tests/__snapshots__/migrations.spec.ts.snap +0 -11
  158. package/src/migrations/tests/migrations.spec.ts +0 -64
  159. package/src/objectStore/buckets/app.ts +0 -40
  160. package/src/objectStore/buckets/global.ts +0 -29
  161. package/src/objectStore/buckets/index.ts +0 -3
  162. package/src/objectStore/buckets/plugins.ts +0 -71
  163. package/src/objectStore/buckets/tests/app.spec.ts +0 -171
  164. package/src/objectStore/buckets/tests/global.spec.ts +0 -74
  165. package/src/objectStore/buckets/tests/plugins.spec.ts +0 -111
  166. package/src/objectStore/cloudfront.ts +0 -41
  167. package/src/objectStore/index.ts +0 -3
  168. package/src/objectStore/objectStore.ts +0 -440
  169. package/src/objectStore/utils.ts +0 -27
  170. package/src/platform/index.ts +0 -3
  171. package/src/platform/platformDb.ts +0 -6
  172. package/src/platform/tenants.ts +0 -101
  173. package/src/platform/tests/tenants.spec.ts +0 -26
  174. package/src/platform/users.ts +0 -90
  175. package/src/plugin/index.ts +0 -1
  176. package/src/plugin/tests/validation.spec.ts +0 -83
  177. package/src/plugin/utils.ts +0 -156
  178. package/src/queue/constants.ts +0 -6
  179. package/src/queue/inMemoryQueue.ts +0 -141
  180. package/src/queue/index.ts +0 -2
  181. package/src/queue/listeners.ts +0 -195
  182. package/src/queue/queue.ts +0 -54
  183. package/src/redis/index.ts +0 -6
  184. package/src/redis/init.ts +0 -86
  185. package/src/redis/redis.ts +0 -308
  186. package/src/redis/redlockImpl.ts +0 -139
  187. package/src/redis/utils.ts +0 -117
  188. package/src/security/encryption.ts +0 -179
  189. package/src/security/permissions.ts +0 -159
  190. package/src/security/roles.ts +0 -420
  191. package/src/security/sessions.ts +0 -120
  192. package/src/security/tests/encryption.spec.ts +0 -31
  193. package/src/security/tests/permissions.spec.ts +0 -145
  194. package/src/security/tests/sessions.spec.ts +0 -12
  195. package/src/tenancy/db.ts +0 -6
  196. package/src/tenancy/index.ts +0 -2
  197. package/src/tenancy/tenancy.ts +0 -140
  198. package/src/tenancy/tests/tenancy.spec.ts +0 -184
  199. package/src/timers/index.ts +0 -1
  200. package/src/timers/timers.ts +0 -22
  201. package/src/users/db.ts +0 -460
  202. package/src/users/events.ts +0 -176
  203. package/src/users/index.ts +0 -4
  204. package/src/users/lookup.ts +0 -102
  205. package/src/users/users.ts +0 -276
  206. package/src/users/utils.ts +0 -55
  207. package/src/utils/hashing.ts +0 -14
  208. package/src/utils/index.ts +0 -3
  209. package/src/utils/stringUtils.ts +0 -8
  210. package/src/utils/tests/utils.spec.ts +0 -191
  211. package/src/utils/utils.ts +0 -239
  212. package/tests/core/logging.ts +0 -34
  213. package/tests/core/utilities/index.ts +0 -6
  214. package/tests/core/utilities/jestUtils.ts +0 -30
  215. package/tests/core/utilities/mocks/alerts.ts +0 -3
  216. package/tests/core/utilities/mocks/date.ts +0 -2
  217. package/tests/core/utilities/mocks/events.ts +0 -131
  218. package/tests/core/utilities/mocks/fetch.ts +0 -17
  219. package/tests/core/utilities/mocks/index.ts +0 -10
  220. package/tests/core/utilities/mocks/licenses.ts +0 -107
  221. package/tests/core/utilities/mocks/posthog.ts +0 -7
  222. package/tests/core/utilities/structures/Chance.ts +0 -20
  223. package/tests/core/utilities/structures/accounts.ts +0 -115
  224. package/tests/core/utilities/structures/apps.ts +0 -21
  225. package/tests/core/utilities/structures/common.ts +0 -7
  226. package/tests/core/utilities/structures/db.ts +0 -12
  227. package/tests/core/utilities/structures/documents/index.ts +0 -1
  228. package/tests/core/utilities/structures/documents/platform/index.ts +0 -1
  229. package/tests/core/utilities/structures/documents/platform/installation.ts +0 -12
  230. package/tests/core/utilities/structures/generator.ts +0 -2
  231. package/tests/core/utilities/structures/index.ts +0 -15
  232. package/tests/core/utilities/structures/koa.ts +0 -16
  233. package/tests/core/utilities/structures/licenses.ts +0 -167
  234. package/tests/core/utilities/structures/plugins.ts +0 -19
  235. package/tests/core/utilities/structures/quotas.ts +0 -67
  236. package/tests/core/utilities/structures/scim.ts +0 -80
  237. package/tests/core/utilities/structures/shared.ts +0 -19
  238. package/tests/core/utilities/structures/sso.ts +0 -119
  239. package/tests/core/utilities/structures/tenants.ts +0 -5
  240. package/tests/core/utilities/structures/userGroups.ts +0 -10
  241. package/tests/core/utilities/structures/users.ts +0 -73
  242. package/tests/core/utilities/testContainerUtils.ts +0 -98
  243. package/tests/core/utilities/utils/index.ts +0 -1
  244. package/tests/core/utilities/utils/time.ts +0 -3
  245. package/tests/extra/DBTestConfiguration.ts +0 -36
  246. package/tests/extra/index.ts +0 -2
  247. package/tests/extra/testEnv.ts +0 -95
  248. package/tests/index.ts +0 -1
  249. package/tests/jestEnv.ts +0 -6
  250. package/tests/jestSetup.ts +0 -28
package/src/db/utils.ts DELETED
@@ -1,207 +0,0 @@
1
- import env from "../environment"
2
- import { DEFAULT_TENANT_ID, SEPARATOR, DocumentType } from "../constants"
3
- import { getTenantId, getGlobalDBName } from "../context"
4
- import { doWithDB, directCouchAllDbs } from "./db"
5
- import { AppState, DeletedApp, getAppMetadata } from "../cache/appMetadata"
6
- import { isDevApp, isDevAppID, getProdAppID } from "../docIds/conversions"
7
- import { App, Database } from "@budibase/types"
8
- import { getStartEndKeyURL } from "../docIds"
9
- export * from "../docIds"
10
-
11
- /**
12
- * if in production this will use the CouchDB _all_dbs call to retrieve a list of databases. If testing
13
- * when using Pouch it will use the pouchdb-all-dbs package.
14
- * opts.efficient can be provided to make sure this call is always quick in a multi-tenant environment,
15
- * but it may not be 100% accurate in full efficiency mode (some tenantless apps may be missed).
16
- */
17
- export async function getAllDbs(opts = { efficient: false }) {
18
- const efficient = opts && opts.efficient
19
-
20
- let dbs: any[] = []
21
- async function addDbs(queryString?: string) {
22
- const json = await directCouchAllDbs(queryString)
23
- dbs = dbs.concat(json)
24
- }
25
- let tenantId = getTenantId()
26
- if (!env.MULTI_TENANCY || (!efficient && tenantId === DEFAULT_TENANT_ID)) {
27
- // just get all DBs when:
28
- // - single tenancy
29
- // - default tenant
30
- // - apps dbs don't contain tenant id
31
- // - non-default tenant dbs are filtered out application side in getAllApps
32
- await addDbs()
33
- } else {
34
- // get prod apps
35
- await addDbs(getStartEndKeyURL(DocumentType.APP, tenantId))
36
- // get dev apps
37
- await addDbs(getStartEndKeyURL(DocumentType.APP_DEV, tenantId))
38
- // add global db name
39
- dbs.push(getGlobalDBName(tenantId))
40
- }
41
- return dbs
42
- }
43
-
44
- /**
45
- * Lots of different points in the system need to find the full list of apps, this will
46
- * enumerate the entire CouchDB cluster and get the list of databases (every app).
47
- *
48
- * @return {Promise<object[]>} returns the app information document stored in each app database.
49
- */
50
- export async function getAllApps({
51
- dev,
52
- all,
53
- idsOnly,
54
- efficient,
55
- }: any = {}): Promise<App[] | string[]> {
56
- let tenantId = getTenantId()
57
- if (!env.MULTI_TENANCY && !tenantId) {
58
- tenantId = DEFAULT_TENANT_ID
59
- }
60
- let dbs = await getAllDbs({ efficient })
61
- const appDbNames = dbs.filter((dbName: any) => {
62
- if (env.isTest() && !dbName) {
63
- return false
64
- }
65
-
66
- const split = dbName.split(SEPARATOR)
67
- // it is an app, check the tenantId
68
- if (split[0] === DocumentType.APP) {
69
- // tenantId is always right before the UUID
70
- const possibleTenantId = split[split.length - 2]
71
-
72
- const noTenantId =
73
- split.length === 2 || possibleTenantId === DocumentType.DEV
74
-
75
- return (
76
- (tenantId === DEFAULT_TENANT_ID && noTenantId) ||
77
- possibleTenantId === tenantId
78
- )
79
- }
80
- return false
81
- })
82
- if (idsOnly) {
83
- const devAppIds = appDbNames.filter(appId => isDevAppID(appId))
84
- const prodAppIds = appDbNames.filter(appId => !isDevAppID(appId))
85
- switch (dev) {
86
- case true:
87
- return devAppIds
88
- case false:
89
- return prodAppIds
90
- default:
91
- return appDbNames
92
- }
93
- }
94
- const appPromises = appDbNames.map((app: any) =>
95
- // skip setup otherwise databases could be re-created
96
- getAppMetadata(app)
97
- )
98
- if (appPromises.length === 0) {
99
- return []
100
- } else {
101
- const response = await Promise.allSettled(appPromises)
102
- const apps = response
103
- .filter(
104
- (result: any) =>
105
- result.status === "fulfilled" &&
106
- result.value?.state !== AppState.INVALID
107
- )
108
- .map(({ value }: any) => value)
109
- if (!all) {
110
- return apps.filter((app: any) => {
111
- if (dev) {
112
- return isDevApp(app)
113
- }
114
- return !isDevApp(app)
115
- })
116
- } else {
117
- return apps.map((app: any) => ({
118
- ...app,
119
- status: isDevApp(app) ? "development" : "published",
120
- }))
121
- }
122
- }
123
- }
124
-
125
- export async function getAppsByIDs(appIds: string[]) {
126
- const settled = await Promise.allSettled(
127
- appIds.map(appId => getAppMetadata(appId))
128
- )
129
- // have to list the apps which exist, some may have been deleted
130
- return settled
131
- .filter(
132
- promise =>
133
- promise.status === "fulfilled" &&
134
- (promise.value as DeletedApp).state !== AppState.INVALID
135
- )
136
- .map(promise => (promise as PromiseFulfilledResult<App>).value)
137
- }
138
-
139
- /**
140
- * Utility function for getAllApps but filters to production apps only.
141
- */
142
- export async function getProdAppIDs() {
143
- const apps = (await getAllApps({ idsOnly: true })) as string[]
144
- return apps.filter((id: any) => !isDevAppID(id))
145
- }
146
-
147
- /**
148
- * Utility function for the inverse of above.
149
- */
150
- export async function getDevAppIDs() {
151
- const apps = (await getAllApps({ idsOnly: true })) as string[]
152
- return apps.filter((id: any) => isDevAppID(id))
153
- }
154
-
155
- export function isSameAppID(
156
- appId1: string | undefined,
157
- appId2: string | undefined
158
- ) {
159
- if (appId1 == undefined || appId2 == undefined) {
160
- return false
161
- }
162
- return getProdAppID(appId1) === getProdAppID(appId2)
163
- }
164
-
165
- export async function dbExists(dbName: any) {
166
- return doWithDB(
167
- dbName,
168
- async (db: Database) => {
169
- return await db.exists()
170
- },
171
- { skip_setup: true }
172
- )
173
- }
174
-
175
- export function pagination<T>(
176
- data: T[],
177
- pageSize: number,
178
- {
179
- paginate,
180
- property,
181
- getKey,
182
- }: {
183
- paginate: boolean
184
- property: string
185
- getKey?: (doc: T) => string | undefined
186
- } = {
187
- paginate: true,
188
- property: "_id",
189
- }
190
- ) {
191
- if (!paginate) {
192
- return { data, hasNextPage: false }
193
- }
194
- const hasNextPage = data.length > pageSize
195
- let nextPage = undefined
196
- if (!getKey) {
197
- getKey = (doc: any) => (property ? doc?.[property] : doc?._id)
198
- }
199
- if (hasNextPage) {
200
- nextPage = getKey(data[pageSize])
201
- }
202
- return {
203
- data: data.slice(0, pageSize),
204
- hasNextPage,
205
- nextPage,
206
- }
207
- }
package/src/db/views.ts DELETED
@@ -1,241 +0,0 @@
1
- import {
2
- DeprecatedViews,
3
- DocumentType,
4
- SEPARATOR,
5
- StaticDatabases,
6
- ViewName,
7
- } from "../constants"
8
- import { getGlobalDB } from "../context"
9
- import { doWithDB } from "./"
10
- import { AllDocsResponse, Database, DatabaseQueryOpts } from "@budibase/types"
11
- import env from "../environment"
12
-
13
- const DESIGN_DB = "_design/database"
14
-
15
- function DesignDoc() {
16
- return {
17
- _id: DESIGN_DB,
18
- // view collation information, read before writing any complex views:
19
- // https://docs.couchdb.org/en/master/ddocs/views/collation.html#collation-specification
20
- views: {},
21
- }
22
- }
23
-
24
- interface DesignDocument {
25
- views: any
26
- }
27
-
28
- async function removeDeprecated(db: Database, viewName: ViewName) {
29
- // @ts-ignore
30
- if (!DeprecatedViews[viewName]) {
31
- return
32
- }
33
- try {
34
- const designDoc = await db.get<DesignDocument>(DESIGN_DB)
35
- // @ts-ignore
36
- for (let deprecatedNames of DeprecatedViews[viewName]) {
37
- delete designDoc.views[deprecatedNames]
38
- }
39
- await db.put(designDoc)
40
- } catch (err) {
41
- // doesn't exist, ignore
42
- }
43
- }
44
-
45
- export async function createView(
46
- db: any,
47
- viewJs: string,
48
- viewName: string
49
- ): Promise<void> {
50
- let designDoc
51
- try {
52
- designDoc = (await db.get(DESIGN_DB)) as DesignDocument
53
- } catch (err) {
54
- // no design doc, make one
55
- designDoc = DesignDoc()
56
- }
57
- const view = {
58
- map: viewJs,
59
- }
60
- designDoc.views = {
61
- ...designDoc.views,
62
- [viewName]: view,
63
- }
64
- try {
65
- await db.put(designDoc)
66
- } catch (err: any) {
67
- if (err.status === 409) {
68
- return await createView(db, viewJs, viewName)
69
- } else {
70
- throw err
71
- }
72
- }
73
- }
74
-
75
- export const createNewUserEmailView = async () => {
76
- const db = getGlobalDB()
77
- const viewJs = `function(doc) {
78
- if (doc._id.startsWith("${DocumentType.USER}${SEPARATOR}")) {
79
- emit(doc.email.toLowerCase(), doc._id)
80
- }
81
- }`
82
- await createView(db, viewJs, ViewName.USER_BY_EMAIL)
83
- }
84
-
85
- export const createUserAppView = async () => {
86
- const db = getGlobalDB()
87
- const viewJs = `function(doc) {
88
- if (doc._id.startsWith("${DocumentType.USER}${SEPARATOR}") && doc.roles) {
89
- for (let prodAppId of Object.keys(doc.roles)) {
90
- let emitted = prodAppId + "${SEPARATOR}" + doc._id
91
- emit(emitted, null)
92
- }
93
- }
94
- }`
95
- await createView(db, viewJs, ViewName.USER_BY_APP)
96
- }
97
-
98
- export const createApiKeyView = async () => {
99
- const db = getGlobalDB()
100
- const viewJs = `function(doc) {
101
- if (doc._id.startsWith("${DocumentType.DEV_INFO}") && doc.apiKey) {
102
- emit(doc.apiKey, doc.userId)
103
- }
104
- }`
105
- await createView(db, viewJs, ViewName.BY_API_KEY)
106
- }
107
-
108
- export interface QueryViewOptions {
109
- arrayResponse?: boolean
110
- }
111
-
112
- export async function queryViewRaw<T>(
113
- viewName: ViewName,
114
- params: DatabaseQueryOpts,
115
- db: Database,
116
- createFunc: any,
117
- opts?: QueryViewOptions
118
- ): Promise<AllDocsResponse<T>> {
119
- try {
120
- const response = await db.query<T>(`database/${viewName}`, params)
121
- // await to catch error
122
- return response
123
- } catch (err: any) {
124
- const pouchNotFound = err && err.name === "not_found"
125
- const couchNotFound = err && err.status === 404
126
- if (pouchNotFound || couchNotFound) {
127
- await removeDeprecated(db, viewName)
128
- await createFunc()
129
- return queryViewRaw(viewName, params, db, createFunc, opts)
130
- } else if (err.status === 409) {
131
- // can happen when multiple queries occur at once, view couldn't be created
132
- // other design docs being updated, re-run
133
- return queryViewRaw(viewName, params, db, createFunc, opts)
134
- } else {
135
- throw err
136
- }
137
- }
138
- }
139
-
140
- export const queryView = async <T>(
141
- viewName: ViewName,
142
- params: DatabaseQueryOpts,
143
- db: Database,
144
- createFunc: any,
145
- opts?: QueryViewOptions
146
- ): Promise<T[] | T | undefined> => {
147
- const response = await queryViewRaw<T>(viewName, params, db, createFunc, opts)
148
- const rows = response.rows
149
- const docs = rows.map((row: any) =>
150
- params.include_docs ? row.doc : row.value
151
- )
152
-
153
- // if arrayResponse has been requested, always return array regardless of length
154
- if (opts?.arrayResponse) {
155
- return docs as T[]
156
- } else {
157
- // return the single document if there is only one
158
- return docs.length <= 1 ? (docs[0] as T) : (docs as T[])
159
- }
160
- }
161
-
162
- // PLATFORM
163
-
164
- async function createPlatformView(viewJs: string, viewName: ViewName) {
165
- try {
166
- await doWithDB(StaticDatabases.PLATFORM_INFO.name, async (db: Database) => {
167
- await createView(db, viewJs, viewName)
168
- })
169
- } catch (e: any) {
170
- if (e.status === 409 && env.isTest()) {
171
- // multiple tests can try to initialise platforms views
172
- // at once - safe to exit on conflict
173
- return
174
- }
175
- throw e
176
- }
177
- }
178
-
179
- export const createPlatformAccountEmailView = async () => {
180
- const viewJs = `function(doc) {
181
- if (doc._id.startsWith("${DocumentType.ACCOUNT_METADATA}${SEPARATOR}")) {
182
- emit(doc.email.toLowerCase(), doc._id)
183
- }
184
- }`
185
- await createPlatformView(viewJs, ViewName.ACCOUNT_BY_EMAIL)
186
- }
187
-
188
- export const createPlatformUserView = async () => {
189
- const viewJs = `function(doc) {
190
- if (doc.tenantId) {
191
- emit(doc._id.toLowerCase(), doc._id)
192
- }
193
- }`
194
- await createPlatformView(viewJs, ViewName.PLATFORM_USERS_LOWERCASE)
195
- }
196
-
197
- export const queryPlatformView = async <T>(
198
- viewName: ViewName,
199
- params: DatabaseQueryOpts,
200
- opts?: QueryViewOptions
201
- ): Promise<T[] | T | undefined> => {
202
- const CreateFuncByName: any = {
203
- [ViewName.ACCOUNT_BY_EMAIL]: createPlatformAccountEmailView,
204
- [ViewName.PLATFORM_USERS_LOWERCASE]: createPlatformUserView,
205
- }
206
-
207
- return doWithDB(StaticDatabases.PLATFORM_INFO.name, async (db: Database) => {
208
- const createFn = CreateFuncByName[viewName]
209
- return queryView(viewName, params, db, createFn, opts)
210
- })
211
- }
212
-
213
- const CreateFuncByName: any = {
214
- [ViewName.USER_BY_EMAIL]: createNewUserEmailView,
215
- [ViewName.BY_API_KEY]: createApiKeyView,
216
- [ViewName.USER_BY_APP]: createUserAppView,
217
- }
218
-
219
- export const queryGlobalView = async <T>(
220
- viewName: ViewName,
221
- params: DatabaseQueryOpts,
222
- db?: Database,
223
- opts?: QueryViewOptions
224
- ): Promise<T[] | T | undefined> => {
225
- // can pass DB in if working with something specific
226
- if (!db) {
227
- db = getGlobalDB()
228
- }
229
- const createFn = CreateFuncByName[viewName]
230
- return queryView(viewName, params, db!, createFn, opts)
231
- }
232
-
233
- export async function queryGlobalViewRaw<T>(
234
- viewName: ViewName,
235
- params: DatabaseQueryOpts,
236
- opts?: QueryViewOptions
237
- ) {
238
- const db = getGlobalDB()
239
- const createFn = CreateFuncByName[viewName]
240
- return queryViewRaw<T>(viewName, params, db, createFn, opts)
241
- }
@@ -1,59 +0,0 @@
1
- import { APP_DEV_PREFIX, APP_PREFIX } from "../constants"
2
- import { App } from "@budibase/types"
3
- const NO_APP_ERROR = "No app provided"
4
-
5
- export function isDevAppID(appId?: string) {
6
- if (!appId) {
7
- throw NO_APP_ERROR
8
- }
9
- return appId.startsWith(APP_DEV_PREFIX)
10
- }
11
-
12
- export function isProdAppID(appId?: string) {
13
- if (!appId) {
14
- throw NO_APP_ERROR
15
- }
16
- return appId.startsWith(APP_PREFIX) && !isDevAppID(appId)
17
- }
18
-
19
- export function isDevApp(app: App) {
20
- if (!app) {
21
- throw NO_APP_ERROR
22
- }
23
- return isDevAppID(app.appId)
24
- }
25
-
26
- /**
27
- * Generates a development app ID from a real app ID.
28
- * @returns {string} the dev app ID which can be used for dev database.
29
- */
30
- export function getDevelopmentAppID(appId: string) {
31
- if (!appId || appId.startsWith(APP_DEV_PREFIX)) {
32
- return appId
33
- }
34
- // split to take off the app_ element, then join it together incase any other app_ exist
35
- const split = appId.split(APP_PREFIX)
36
- split.shift()
37
- const rest = split.join(APP_PREFIX)
38
- return `${APP_DEV_PREFIX}${rest}`
39
- }
40
- export const getDevAppID = getDevelopmentAppID
41
-
42
- /**
43
- * Convert a development app ID to a deployed app ID.
44
- */
45
- export function getProdAppID(appId: string) {
46
- if (!appId || !appId.startsWith(APP_DEV_PREFIX)) {
47
- return appId
48
- }
49
- // split to take off the app_dev element, then join it together incase any other app_ exist
50
- const split = appId.split(APP_DEV_PREFIX)
51
- split.shift()
52
- const rest = split.join(APP_DEV_PREFIX)
53
- return `${APP_PREFIX}${rest}`
54
- }
55
-
56
- export function extractAppUUID(id: string) {
57
- const split = id?.split("_") || []
58
- return split.length ? split[split.length - 1] : null
59
- }
package/src/docIds/ids.ts DELETED
@@ -1,113 +0,0 @@
1
- import {
2
- APP_PREFIX,
3
- DocumentType,
4
- InternalTable,
5
- SEPARATOR,
6
- } from "../constants"
7
- import { newid } from "./newid"
8
-
9
- /**
10
- * Generates a new app ID.
11
- * @returns {string} The new app ID which the app doc can be stored under.
12
- */
13
- export const generateAppID = (tenantId?: string | null) => {
14
- let id = APP_PREFIX
15
- if (tenantId) {
16
- id += `${tenantId}${SEPARATOR}`
17
- }
18
- return `${id}${newid()}`
19
- }
20
-
21
- /**
22
- * Gets a new row ID for the specified table.
23
- * @param {string} tableId The table which the row is being created for.
24
- * @param {string|null} id If an ID is to be used then the UUID can be substituted for this.
25
- * @returns {string} The new ID which a row doc can be stored under.
26
- */
27
- export function generateRowID(tableId: string, id?: string) {
28
- id = id || newid()
29
- return `${DocumentType.ROW}${SEPARATOR}${tableId}${SEPARATOR}${id}`
30
- }
31
-
32
- /**
33
- * Generates a new workspace ID.
34
- * @returns {string} The new workspace ID which the workspace doc can be stored under.
35
- */
36
- export function generateWorkspaceID() {
37
- return `${DocumentType.WORKSPACE}${SEPARATOR}${newid()}`
38
- }
39
-
40
- /**
41
- * Generates a new global user ID.
42
- * @returns {string} The new user ID which the user doc can be stored under.
43
- */
44
- export function generateGlobalUserID(id?: any) {
45
- return `${DocumentType.USER}${SEPARATOR}${id || newid()}`
46
- }
47
-
48
- /**
49
- * Generates a new user ID based on the passed in global ID.
50
- * @param {string} globalId The ID of the global user.
51
- * @returns {string} The new user ID which the user doc can be stored under.
52
- */
53
- export function generateUserMetadataID(globalId: string) {
54
- return generateRowID(InternalTable.USER_METADATA, globalId)
55
- }
56
-
57
- /**
58
- * Breaks up the ID to get the global ID.
59
- */
60
- export function getGlobalIDFromUserMetadataID(id: string) {
61
- const prefix = `${DocumentType.ROW}${SEPARATOR}${InternalTable.USER_METADATA}${SEPARATOR}`
62
- if (!id || !id.includes(prefix)) {
63
- return id
64
- }
65
- return id.split(prefix)[1]
66
- }
67
-
68
- /**
69
- * Generates a template ID.
70
- * @param ownerId The owner/user of the template, this could be global or a workspace level.
71
- */
72
- export function generateTemplateID(ownerId: any) {
73
- return `${DocumentType.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}${newid()}`
74
- }
75
-
76
- export function generateAppUserID(prodAppId: string, userId: string) {
77
- return `${prodAppId}${SEPARATOR}${userId}`
78
- }
79
-
80
- /**
81
- * Generates a new role ID.
82
- * @returns {string} The new role ID which the role doc can be stored under.
83
- */
84
- export function generateRoleID(name: string) {
85
- const prefix = `${DocumentType.ROLE}${SEPARATOR}`
86
- if (name.startsWith(prefix)) {
87
- return name
88
- }
89
- return `${prefix}${name}`
90
- }
91
-
92
- /**
93
- * Utility function to be more verbose.
94
- */
95
- export function prefixRoleID(name: string) {
96
- return generateRoleID(name)
97
- }
98
-
99
- /**
100
- * Generates a new dev info document ID - this is scoped to a user.
101
- * @returns {string} The new dev info ID which info for dev (like api key) can be stored under.
102
- */
103
- export const generateDevInfoID = (userId: any) => {
104
- return `${DocumentType.DEV_INFO}${SEPARATOR}${userId}`
105
- }
106
-
107
- /**
108
- * Generates a new plugin ID - to be used in the global DB.
109
- * @returns {string} The new plugin ID which a plugin metadata document can be stored under.
110
- */
111
- export const generatePluginID = (name: string) => {
112
- return `${DocumentType.PLUGIN}${SEPARATOR}${name}`
113
- }
@@ -1,2 +0,0 @@
1
- export * from "./ids"
2
- export * from "./params"
@@ -1,5 +0,0 @@
1
- import { v4 } from "uuid"
2
-
3
- export function newid() {
4
- return v4().replace(/-/g, "")
5
- }