Replacing all plural TS enumerations with singular - this involves a major rename of the DocumentTypes.
This commit is contained in:
parent
0efa0d375d
commit
b803a3fd93
|
@ -1,6 +1,6 @@
|
||||||
const redis = require("../redis/init")
|
const redis = require("../redis/init")
|
||||||
const { doWithDB } = require("../db")
|
const { doWithDB } = require("../db")
|
||||||
const { DocumentTypes } = require("../db/constants")
|
const { DocumentType } = require("../db/constants")
|
||||||
|
|
||||||
const AppState = {
|
const AppState = {
|
||||||
INVALID: "invalid",
|
INVALID: "invalid",
|
||||||
|
@ -14,7 +14,7 @@ const populateFromDB = async appId => {
|
||||||
return doWithDB(
|
return doWithDB(
|
||||||
appId,
|
appId,
|
||||||
db => {
|
db => {
|
||||||
return db.get(DocumentTypes.APP_METADATA)
|
return db.get(DocumentType.APP_METADATA)
|
||||||
},
|
},
|
||||||
{ skip_setup: true }
|
{ skip_setup: true }
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
export enum ContextKeys {
|
export enum ContextKey {
|
||||||
TENANT_ID = "tenantId",
|
TENANT_ID = "tenantId",
|
||||||
GLOBAL_DB = "globalDb",
|
GLOBAL_DB = "globalDb",
|
||||||
APP_ID = "appId",
|
APP_ID = "appId",
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import env from "../environment"
|
import env from "../environment"
|
||||||
import { SEPARATOR, DocumentTypes } from "../db/constants"
|
import { SEPARATOR, DocumentType } from "../db/constants"
|
||||||
import cls from "./FunctionContext"
|
import cls from "./FunctionContext"
|
||||||
import { dangerousGetDB, closeDB } from "../db"
|
import { dangerousGetDB, closeDB } from "../db"
|
||||||
import { baseGlobalDBName } from "../tenancy/utils"
|
import { baseGlobalDBName } from "../tenancy/utils"
|
||||||
import { IdentityContext } from "@budibase/types"
|
import { IdentityContext } from "@budibase/types"
|
||||||
import { DEFAULT_TENANT_ID as _DEFAULT_TENANT_ID } from "../constants"
|
import { DEFAULT_TENANT_ID as _DEFAULT_TENANT_ID } from "../constants"
|
||||||
import { ContextKeys } from "./constants"
|
import { ContextKey } from "./constants"
|
||||||
import {
|
import {
|
||||||
updateUsing,
|
updateUsing,
|
||||||
closeWithUsing,
|
closeWithUsing,
|
||||||
|
@ -33,8 +33,8 @@ export const closeTenancy = async () => {
|
||||||
}
|
}
|
||||||
await closeDB(db)
|
await closeDB(db)
|
||||||
// clear from context now that database is closed/task is finished
|
// clear from context now that database is closed/task is finished
|
||||||
cls.setOnContext(ContextKeys.TENANT_ID, null)
|
cls.setOnContext(ContextKey.TENANT_ID, null)
|
||||||
cls.setOnContext(ContextKeys.GLOBAL_DB, null)
|
cls.setOnContext(ContextKey.GLOBAL_DB, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
// export const isDefaultTenant = () => {
|
// export const isDefaultTenant = () => {
|
||||||
|
@ -54,7 +54,7 @@ export const getTenantIDFromAppID = (appId: string) => {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
const split = appId.split(SEPARATOR)
|
const split = appId.split(SEPARATOR)
|
||||||
const hasDev = split[1] === DocumentTypes.DEV
|
const hasDev = split[1] === DocumentType.DEV
|
||||||
if ((hasDev && split.length === 3) || (!hasDev && split.length === 2)) {
|
if ((hasDev && split.length === 3) || (!hasDev && split.length === 2)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -83,14 +83,14 @@ export const doInTenant = (tenantId: string | null, task: any) => {
|
||||||
// invoke the task
|
// invoke the task
|
||||||
return await task()
|
return await task()
|
||||||
} finally {
|
} finally {
|
||||||
await closeWithUsing(ContextKeys.TENANCY_IN_USE, () => {
|
await closeWithUsing(ContextKey.TENANCY_IN_USE, () => {
|
||||||
return closeTenancy()
|
return closeTenancy()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const existing = cls.getFromContext(ContextKeys.TENANT_ID) === tenantId
|
const existing = cls.getFromContext(ContextKey.TENANT_ID) === tenantId
|
||||||
return updateUsing(ContextKeys.TENANCY_IN_USE, existing, internal)
|
return updateUsing(ContextKey.TENANCY_IN_USE, existing, internal)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const doInAppContext = (appId: string, task: any) => {
|
export const doInAppContext = (appId: string, task: any) => {
|
||||||
|
@ -108,7 +108,7 @@ export const doInAppContext = (appId: string, task: any) => {
|
||||||
setAppTenantId(appId)
|
setAppTenantId(appId)
|
||||||
}
|
}
|
||||||
// set the app ID
|
// set the app ID
|
||||||
cls.setOnContext(ContextKeys.APP_ID, appId)
|
cls.setOnContext(ContextKey.APP_ID, appId)
|
||||||
|
|
||||||
// preserve the identity
|
// preserve the identity
|
||||||
if (identity) {
|
if (identity) {
|
||||||
|
@ -118,14 +118,14 @@ export const doInAppContext = (appId: string, task: any) => {
|
||||||
// invoke the task
|
// invoke the task
|
||||||
return await task()
|
return await task()
|
||||||
} finally {
|
} finally {
|
||||||
await closeWithUsing(ContextKeys.APP_IN_USE, async () => {
|
await closeWithUsing(ContextKey.APP_IN_USE, async () => {
|
||||||
await closeAppDBs()
|
await closeAppDBs()
|
||||||
await closeTenancy()
|
await closeTenancy()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const existing = cls.getFromContext(ContextKeys.APP_ID) === appId
|
const existing = cls.getFromContext(ContextKey.APP_ID) === appId
|
||||||
return updateUsing(ContextKeys.APP_IN_USE, existing, internal)
|
return updateUsing(ContextKey.APP_IN_USE, existing, internal)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const doInIdentityContext = (identity: IdentityContext, task: any) => {
|
export const doInIdentityContext = (identity: IdentityContext, task: any) => {
|
||||||
|
@ -135,7 +135,7 @@ export const doInIdentityContext = (identity: IdentityContext, task: any) => {
|
||||||
|
|
||||||
async function internal(opts = { existing: false }) {
|
async function internal(opts = { existing: false }) {
|
||||||
if (!opts.existing) {
|
if (!opts.existing) {
|
||||||
cls.setOnContext(ContextKeys.IDENTITY, identity)
|
cls.setOnContext(ContextKey.IDENTITY, identity)
|
||||||
// set the tenant so that doInTenant will preserve identity
|
// set the tenant so that doInTenant will preserve identity
|
||||||
if (identity.tenantId) {
|
if (identity.tenantId) {
|
||||||
updateTenantId(identity.tenantId)
|
updateTenantId(identity.tenantId)
|
||||||
|
@ -146,27 +146,27 @@ export const doInIdentityContext = (identity: IdentityContext, task: any) => {
|
||||||
// invoke the task
|
// invoke the task
|
||||||
return await task()
|
return await task()
|
||||||
} finally {
|
} finally {
|
||||||
await closeWithUsing(ContextKeys.IDENTITY_IN_USE, async () => {
|
await closeWithUsing(ContextKey.IDENTITY_IN_USE, async () => {
|
||||||
setIdentity(null)
|
setIdentity(null)
|
||||||
await closeTenancy()
|
await closeTenancy()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const existing = cls.getFromContext(ContextKeys.IDENTITY)
|
const existing = cls.getFromContext(ContextKey.IDENTITY)
|
||||||
return updateUsing(ContextKeys.IDENTITY_IN_USE, existing, internal)
|
return updateUsing(ContextKey.IDENTITY_IN_USE, existing, internal)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getIdentity = (): IdentityContext | undefined => {
|
export const getIdentity = (): IdentityContext | undefined => {
|
||||||
try {
|
try {
|
||||||
return cls.getFromContext(ContextKeys.IDENTITY)
|
return cls.getFromContext(ContextKey.IDENTITY)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// do nothing - identity is not in context
|
// do nothing - identity is not in context
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const updateTenantId = (tenantId: string | null) => {
|
export const updateTenantId = (tenantId: string | null) => {
|
||||||
cls.setOnContext(ContextKeys.TENANT_ID, tenantId)
|
cls.setOnContext(ContextKey.TENANT_ID, tenantId)
|
||||||
if (env.USE_COUCH) {
|
if (env.USE_COUCH) {
|
||||||
setGlobalDB(tenantId)
|
setGlobalDB(tenantId)
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ export const updateAppId = async (appId: string) => {
|
||||||
try {
|
try {
|
||||||
// have to close first, before removing the databases from context
|
// have to close first, before removing the databases from context
|
||||||
await closeAppDBs()
|
await closeAppDBs()
|
||||||
cls.setOnContext(ContextKeys.APP_ID, appId)
|
cls.setOnContext(ContextKey.APP_ID, appId)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (env.isTest()) {
|
if (env.isTest()) {
|
||||||
TEST_APP_ID = appId
|
TEST_APP_ID = appId
|
||||||
|
@ -189,12 +189,12 @@ export const updateAppId = async (appId: string) => {
|
||||||
export const setGlobalDB = (tenantId: string | null) => {
|
export const setGlobalDB = (tenantId: string | null) => {
|
||||||
const dbName = baseGlobalDBName(tenantId)
|
const dbName = baseGlobalDBName(tenantId)
|
||||||
const db = dangerousGetDB(dbName)
|
const db = dangerousGetDB(dbName)
|
||||||
cls.setOnContext(ContextKeys.GLOBAL_DB, db)
|
cls.setOnContext(ContextKey.GLOBAL_DB, db)
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getGlobalDB = () => {
|
export const getGlobalDB = () => {
|
||||||
const db = cls.getFromContext(ContextKeys.GLOBAL_DB)
|
const db = cls.getFromContext(ContextKey.GLOBAL_DB)
|
||||||
if (!db) {
|
if (!db) {
|
||||||
throw new Error("Global DB not found")
|
throw new Error("Global DB not found")
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ export const getGlobalDB = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isTenantIdSet = () => {
|
export const isTenantIdSet = () => {
|
||||||
const tenantId = cls.getFromContext(ContextKeys.TENANT_ID)
|
const tenantId = cls.getFromContext(ContextKey.TENANT_ID)
|
||||||
return !!tenantId
|
return !!tenantId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ export const getTenantId = () => {
|
||||||
if (!isMultiTenant()) {
|
if (!isMultiTenant()) {
|
||||||
return DEFAULT_TENANT_ID
|
return DEFAULT_TENANT_ID
|
||||||
}
|
}
|
||||||
const tenantId = cls.getFromContext(ContextKeys.TENANT_ID)
|
const tenantId = cls.getFromContext(ContextKey.TENANT_ID)
|
||||||
if (!tenantId) {
|
if (!tenantId) {
|
||||||
throw new Error("Tenant id not found")
|
throw new Error("Tenant id not found")
|
||||||
}
|
}
|
||||||
|
@ -218,7 +218,7 @@ export const getTenantId = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getAppId = () => {
|
export const getAppId = () => {
|
||||||
const foundId = cls.getFromContext(ContextKeys.APP_ID)
|
const foundId = cls.getFromContext(ContextKey.APP_ID)
|
||||||
if (!foundId && env.isTest() && TEST_APP_ID) {
|
if (!foundId && env.isTest() && TEST_APP_ID) {
|
||||||
return TEST_APP_ID
|
return TEST_APP_ID
|
||||||
} else {
|
} else {
|
||||||
|
@ -231,7 +231,7 @@ export const getAppId = () => {
|
||||||
* contained, dev or prod.
|
* contained, dev or prod.
|
||||||
*/
|
*/
|
||||||
export const getAppDB = (opts?: any) => {
|
export const getAppDB = (opts?: any) => {
|
||||||
return getContextDB(ContextKeys.CURRENT_DB, opts)
|
return getContextDB(ContextKey.CURRENT_DB, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -239,7 +239,7 @@ export const getAppDB = (opts?: any) => {
|
||||||
* contained a development app ID, this will open the prod one.
|
* contained a development app ID, this will open the prod one.
|
||||||
*/
|
*/
|
||||||
export const getProdAppDB = (opts?: any) => {
|
export const getProdAppDB = (opts?: any) => {
|
||||||
return getContextDB(ContextKeys.PROD_DB, opts)
|
return getContextDB(ContextKey.PROD_DB, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -247,5 +247,5 @@ export const getProdAppDB = (opts?: any) => {
|
||||||
* contained a prod app ID, this will open the dev one.
|
* contained a prod app ID, this will open the dev one.
|
||||||
*/
|
*/
|
||||||
export const getDevAppDB = (opts?: any) => {
|
export const getDevAppDB = (opts?: any) => {
|
||||||
return getContextDB(ContextKeys.DEV_DB, opts)
|
return getContextDB(ContextKey.DEV_DB, opts)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import {
|
||||||
} from "./index"
|
} from "./index"
|
||||||
import cls from "./FunctionContext"
|
import cls from "./FunctionContext"
|
||||||
import { IdentityContext } from "@budibase/types"
|
import { IdentityContext } from "@budibase/types"
|
||||||
import { ContextKeys } from "./constants"
|
import { ContextKey } from "./constants"
|
||||||
import { dangerousGetDB, closeDB } from "../db"
|
import { dangerousGetDB, closeDB } from "../db"
|
||||||
import { isEqual } from "lodash"
|
import { isEqual } from "lodash"
|
||||||
import { getDevelopmentAppID, getProdAppID } from "../db/conversions"
|
import { getDevelopmentAppID, getProdAppID } from "../db/conversions"
|
||||||
|
@ -47,17 +47,13 @@ export const setAppTenantId = (appId: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setIdentity = (identity: IdentityContext | null) => {
|
export const setIdentity = (identity: IdentityContext | null) => {
|
||||||
cls.setOnContext(ContextKeys.IDENTITY, identity)
|
cls.setOnContext(ContextKey.IDENTITY, identity)
|
||||||
}
|
}
|
||||||
|
|
||||||
// this function makes sure the PouchDB objects are closed and
|
// this function makes sure the PouchDB objects are closed and
|
||||||
// fully deleted when finished - this protects against memory leaks
|
// fully deleted when finished - this protects against memory leaks
|
||||||
export async function closeAppDBs() {
|
export async function closeAppDBs() {
|
||||||
const dbKeys = [
|
const dbKeys = [ContextKey.CURRENT_DB, ContextKey.PROD_DB, ContextKey.DEV_DB]
|
||||||
ContextKeys.CURRENT_DB,
|
|
||||||
ContextKeys.PROD_DB,
|
|
||||||
ContextKeys.DEV_DB,
|
|
||||||
]
|
|
||||||
for (let dbKey of dbKeys) {
|
for (let dbKey of dbKeys) {
|
||||||
const db = cls.getFromContext(dbKey)
|
const db = cls.getFromContext(dbKey)
|
||||||
if (!db) {
|
if (!db) {
|
||||||
|
@ -68,16 +64,16 @@ export async function closeAppDBs() {
|
||||||
cls.setOnContext(dbKey, null)
|
cls.setOnContext(dbKey, null)
|
||||||
}
|
}
|
||||||
// clear the app ID now that the databases are closed
|
// clear the app ID now that the databases are closed
|
||||||
if (cls.getFromContext(ContextKeys.APP_ID)) {
|
if (cls.getFromContext(ContextKey.APP_ID)) {
|
||||||
cls.setOnContext(ContextKeys.APP_ID, null)
|
cls.setOnContext(ContextKey.APP_ID, null)
|
||||||
}
|
}
|
||||||
if (cls.getFromContext(ContextKeys.DB_OPTS)) {
|
if (cls.getFromContext(ContextKey.DB_OPTS)) {
|
||||||
cls.setOnContext(ContextKeys.DB_OPTS, null)
|
cls.setOnContext(ContextKey.DB_OPTS, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getContextDB(key: string, opts: any) {
|
export function getContextDB(key: string, opts: any) {
|
||||||
const dbOptsKey = `${key}${ContextKeys.DB_OPTS}`
|
const dbOptsKey = `${key}${ContextKey.DB_OPTS}`
|
||||||
let storedOpts = cls.getFromContext(dbOptsKey)
|
let storedOpts = cls.getFromContext(dbOptsKey)
|
||||||
let db = cls.getFromContext(key)
|
let db = cls.getFromContext(key)
|
||||||
if (db && isEqual(opts, storedOpts)) {
|
if (db && isEqual(opts, storedOpts)) {
|
||||||
|
@ -88,13 +84,13 @@ export function getContextDB(key: string, opts: any) {
|
||||||
let toUseAppId
|
let toUseAppId
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case ContextKeys.CURRENT_DB:
|
case ContextKey.CURRENT_DB:
|
||||||
toUseAppId = appId
|
toUseAppId = appId
|
||||||
break
|
break
|
||||||
case ContextKeys.PROD_DB:
|
case ContextKey.PROD_DB:
|
||||||
toUseAppId = getProdAppID(appId)
|
toUseAppId = getProdAppID(appId)
|
||||||
break
|
break
|
||||||
case ContextKeys.DEV_DB:
|
case ContextKey.DEV_DB:
|
||||||
toUseAppId = getDevelopmentAppID(appId)
|
toUseAppId = getDevelopmentAppID(appId)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,13 @@ export const UNICODE_MAX = "\ufff0"
|
||||||
/**
|
/**
|
||||||
* Can be used to create a few different forms of querying a view.
|
* Can be used to create a few different forms of querying a view.
|
||||||
*/
|
*/
|
||||||
export enum AutomationViewModes {
|
export enum AutomationViewMode {
|
||||||
ALL = "all",
|
ALL = "all",
|
||||||
AUTOMATION = "automation",
|
AUTOMATION = "automation",
|
||||||
STATUS = "status",
|
STATUS = "status",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ViewNames {
|
export enum ViewName {
|
||||||
USER_BY_APP = "by_app",
|
USER_BY_APP = "by_app",
|
||||||
USER_BY_EMAIL = "by_email2",
|
USER_BY_EMAIL = "by_email2",
|
||||||
BY_API_KEY = "by_api_key",
|
BY_API_KEY = "by_api_key",
|
||||||
|
@ -21,13 +21,13 @@ export enum ViewNames {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DeprecatedViews = {
|
export const DeprecatedViews = {
|
||||||
[ViewNames.USER_BY_EMAIL]: [
|
[ViewName.USER_BY_EMAIL]: [
|
||||||
// removed due to inaccuracy in view doc filter logic
|
// removed due to inaccuracy in view doc filter logic
|
||||||
"by_email",
|
"by_email",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DocumentTypes {
|
export enum DocumentType {
|
||||||
USER = "us",
|
USER = "us",
|
||||||
GROUP = "gr",
|
GROUP = "gr",
|
||||||
WORKSPACE = "workspace",
|
WORKSPACE = "workspace",
|
||||||
|
@ -62,6 +62,6 @@ export const StaticDatabases = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export const APP_PREFIX = exports.DocumentTypes.APP + exports.SEPARATOR
|
export const APP_PREFIX = DocumentType.APP + SEPARATOR
|
||||||
export const APP_DEV = exports.DocumentTypes.APP_DEV + exports.SEPARATOR
|
export const APP_DEV = DocumentType.APP_DEV + SEPARATOR
|
||||||
export const APP_DEV_PREFIX = APP_DEV
|
export const APP_DEV_PREFIX = APP_DEV
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { newid } from "../hashing"
|
import { newid } from "../hashing"
|
||||||
import { DEFAULT_TENANT_ID, Configs } from "../constants"
|
import { DEFAULT_TENANT_ID, Configs } from "../constants"
|
||||||
import env from "../environment"
|
import env from "../environment"
|
||||||
import { SEPARATOR, DocumentTypes, UNICODE_MAX, ViewNames } from "./constants"
|
import { SEPARATOR, DocumentType, UNICODE_MAX, ViewName } from "./constants"
|
||||||
import { getTenantId, getGlobalDBName, getGlobalDB } from "../tenancy"
|
import { getTenantId, getGlobalDBName, getGlobalDB } from "../tenancy"
|
||||||
import fetch from "node-fetch"
|
import fetch from "node-fetch"
|
||||||
import { doWithDB, allDbs } from "./index"
|
import { doWithDB, allDbs } from "./index"
|
||||||
|
@ -58,7 +58,7 @@ export function getDocParams(
|
||||||
/**
|
/**
|
||||||
* Retrieve the correct index for a view based on default design DB.
|
* Retrieve the correct index for a view based on default design DB.
|
||||||
*/
|
*/
|
||||||
export function getQueryIndex(viewName: ViewNames) {
|
export function getQueryIndex(viewName: ViewName) {
|
||||||
return `database/${viewName}`
|
return `database/${viewName}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ export function getQueryIndex(viewName: ViewNames) {
|
||||||
* @returns {string} The new workspace ID which the workspace doc can be stored under.
|
* @returns {string} The new workspace ID which the workspace doc can be stored under.
|
||||||
*/
|
*/
|
||||||
export function generateWorkspaceID() {
|
export function generateWorkspaceID() {
|
||||||
return `${DocumentTypes.WORKSPACE}${SEPARATOR}${newid()}`
|
return `${DocumentType.WORKSPACE}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,8 +76,8 @@ export function generateWorkspaceID() {
|
||||||
export function getWorkspaceParams(id = "", otherProps = {}) {
|
export function getWorkspaceParams(id = "", otherProps = {}) {
|
||||||
return {
|
return {
|
||||||
...otherProps,
|
...otherProps,
|
||||||
startkey: `${DocumentTypes.WORKSPACE}${SEPARATOR}${id}`,
|
startkey: `${DocumentType.WORKSPACE}${SEPARATOR}${id}`,
|
||||||
endkey: `${DocumentTypes.WORKSPACE}${SEPARATOR}${id}${UNICODE_MAX}`,
|
endkey: `${DocumentType.WORKSPACE}${SEPARATOR}${id}${UNICODE_MAX}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ export function getWorkspaceParams(id = "", otherProps = {}) {
|
||||||
* @returns {string} The new user ID which the user doc can be stored under.
|
* @returns {string} The new user ID which the user doc can be stored under.
|
||||||
*/
|
*/
|
||||||
export function generateGlobalUserID(id?: any) {
|
export function generateGlobalUserID(id?: any) {
|
||||||
return `${DocumentTypes.USER}${SEPARATOR}${id || newid()}`
|
return `${DocumentType.USER}${SEPARATOR}${id || newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -102,8 +102,8 @@ export function getGlobalUserParams(globalId: any, otherProps: any = {}) {
|
||||||
// need to include this incase pagination
|
// need to include this incase pagination
|
||||||
startkey: startkey
|
startkey: startkey
|
||||||
? startkey
|
? startkey
|
||||||
: `${DocumentTypes.USER}${SEPARATOR}${globalId}`,
|
: `${DocumentType.USER}${SEPARATOR}${globalId}`,
|
||||||
endkey: `${DocumentTypes.USER}${SEPARATOR}${globalId}${UNICODE_MAX}`,
|
endkey: `${DocumentType.USER}${SEPARATOR}${globalId}${UNICODE_MAX}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ export function getUsersByAppParams(appId: any, otherProps: any = {}) {
|
||||||
* @param ownerId The owner/user of the template, this could be global or a workspace level.
|
* @param ownerId The owner/user of the template, this could be global or a workspace level.
|
||||||
*/
|
*/
|
||||||
export function generateTemplateID(ownerId: any) {
|
export function generateTemplateID(ownerId: any) {
|
||||||
return `${DocumentTypes.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}${newid()}`
|
return `${DocumentType.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateAppUserID(prodAppId: string, userId: string) {
|
export function generateAppUserID(prodAppId: string, userId: string) {
|
||||||
|
@ -143,7 +143,7 @@ export function getTemplateParams(
|
||||||
if (templateId) {
|
if (templateId) {
|
||||||
final = templateId
|
final = templateId
|
||||||
} else {
|
} else {
|
||||||
final = `${DocumentTypes.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}`
|
final = `${DocumentType.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}`
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
...otherProps,
|
...otherProps,
|
||||||
|
@ -157,14 +157,14 @@ export function getTemplateParams(
|
||||||
* @returns {string} The new role ID which the role doc can be stored under.
|
* @returns {string} The new role ID which the role doc can be stored under.
|
||||||
*/
|
*/
|
||||||
export function generateRoleID(id: any) {
|
export function generateRoleID(id: any) {
|
||||||
return `${DocumentTypes.ROLE}${SEPARATOR}${id || newid()}`
|
return `${DocumentType.ROLE}${SEPARATOR}${id || newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets parameters for retrieving a role, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving a role, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
export function getRoleParams(roleId = null, otherProps = {}) {
|
export function getRoleParams(roleId = null, otherProps = {}) {
|
||||||
return getDocParams(DocumentTypes.ROLE, roleId, otherProps)
|
return getDocParams(DocumentType.ROLE, roleId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getStartEndKeyURL(base: any, baseKey: any, tenantId = null) {
|
export function getStartEndKeyURL(base: any, baseKey: any, tenantId = null) {
|
||||||
|
@ -211,9 +211,9 @@ export async function getAllDbs(opts = { efficient: false }) {
|
||||||
await addDbs(couchUrl)
|
await addDbs(couchUrl)
|
||||||
} else {
|
} else {
|
||||||
// get prod apps
|
// get prod apps
|
||||||
await addDbs(getStartEndKeyURL(couchUrl, DocumentTypes.APP, tenantId))
|
await addDbs(getStartEndKeyURL(couchUrl, DocumentType.APP, tenantId))
|
||||||
// get dev apps
|
// get dev apps
|
||||||
await addDbs(getStartEndKeyURL(couchUrl, DocumentTypes.APP_DEV, tenantId))
|
await addDbs(getStartEndKeyURL(couchUrl, DocumentType.APP_DEV, tenantId))
|
||||||
// add global db name
|
// add global db name
|
||||||
dbs.push(getGlobalDBName(tenantId))
|
dbs.push(getGlobalDBName(tenantId))
|
||||||
}
|
}
|
||||||
|
@ -235,12 +235,12 @@ export async function getAllApps({ dev, all, idsOnly, efficient }: any = {}) {
|
||||||
const appDbNames = dbs.filter((dbName: any) => {
|
const appDbNames = dbs.filter((dbName: any) => {
|
||||||
const split = dbName.split(SEPARATOR)
|
const split = dbName.split(SEPARATOR)
|
||||||
// it is an app, check the tenantId
|
// it is an app, check the tenantId
|
||||||
if (split[0] === DocumentTypes.APP) {
|
if (split[0] === DocumentType.APP) {
|
||||||
// tenantId is always right before the UUID
|
// tenantId is always right before the UUID
|
||||||
const possibleTenantId = split[split.length - 2]
|
const possibleTenantId = split[split.length - 2]
|
||||||
|
|
||||||
const noTenantId =
|
const noTenantId =
|
||||||
split.length === 2 || possibleTenantId === DocumentTypes.DEV
|
split.length === 2 || possibleTenantId === DocumentType.DEV
|
||||||
|
|
||||||
return (
|
return (
|
||||||
(tenantId === DEFAULT_TENANT_ID && noTenantId) ||
|
(tenantId === DEFAULT_TENANT_ID && noTenantId) ||
|
||||||
|
@ -326,7 +326,7 @@ export async function dbExists(dbName: any) {
|
||||||
export const generateConfigID = ({ type, workspace, user }: any) => {
|
export const generateConfigID = ({ type, workspace, user }: any) => {
|
||||||
const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR)
|
const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR)
|
||||||
|
|
||||||
return `${DocumentTypes.CONFIG}${SEPARATOR}${scope}`
|
return `${DocumentType.CONFIG}${SEPARATOR}${scope}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -340,8 +340,8 @@ export const getConfigParams = (
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...otherProps,
|
...otherProps,
|
||||||
startkey: `${DocumentTypes.CONFIG}${SEPARATOR}${scope}`,
|
startkey: `${DocumentType.CONFIG}${SEPARATOR}${scope}`,
|
||||||
endkey: `${DocumentTypes.CONFIG}${SEPARATOR}${scope}${UNICODE_MAX}`,
|
endkey: `${DocumentType.CONFIG}${SEPARATOR}${scope}${UNICODE_MAX}`,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,7 +350,7 @@ export const getConfigParams = (
|
||||||
* @returns {string} The new dev info ID which info for dev (like api key) can be stored under.
|
* @returns {string} The new dev info ID which info for dev (like api key) can be stored under.
|
||||||
*/
|
*/
|
||||||
export const generateDevInfoID = (userId: any) => {
|
export const generateDevInfoID = (userId: any) => {
|
||||||
return `${DocumentTypes.DEV_INFO}${SEPARATOR}${userId}`
|
return `${DocumentType.DEV_INFO}${SEPARATOR}${userId}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const {
|
const {
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
ViewNames,
|
ViewName,
|
||||||
DeprecatedViews,
|
DeprecatedViews,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
} = require("./utils")
|
} = require("./utils")
|
||||||
|
@ -44,14 +44,14 @@ exports.createNewUserEmailView = async () => {
|
||||||
const view = {
|
const view = {
|
||||||
// if using variables in a map function need to inject them before use
|
// if using variables in a map function need to inject them before use
|
||||||
map: `function(doc) {
|
map: `function(doc) {
|
||||||
if (doc._id.startsWith("${DocumentTypes.USER}${SEPARATOR}")) {
|
if (doc._id.startsWith("${DocumentType.USER}${SEPARATOR}")) {
|
||||||
emit(doc.email.toLowerCase(), doc._id)
|
emit(doc.email.toLowerCase(), doc._id)
|
||||||
}
|
}
|
||||||
}`,
|
}`,
|
||||||
}
|
}
|
||||||
designDoc.views = {
|
designDoc.views = {
|
||||||
...designDoc.views,
|
...designDoc.views,
|
||||||
[ViewNames.USER_BY_EMAIL]: view,
|
[ViewName.USER_BY_EMAIL]: view,
|
||||||
}
|
}
|
||||||
await db.put(designDoc)
|
await db.put(designDoc)
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ exports.createUserAppView = async () => {
|
||||||
const view = {
|
const view = {
|
||||||
// if using variables in a map function need to inject them before use
|
// if using variables in a map function need to inject them before use
|
||||||
map: `function(doc) {
|
map: `function(doc) {
|
||||||
if (doc._id.startsWith("${DocumentTypes.USER}${SEPARATOR}") && doc.roles) {
|
if (doc._id.startsWith("${DocumentType.USER}${SEPARATOR}") && doc.roles) {
|
||||||
for (let prodAppId of Object.keys(doc.roles)) {
|
for (let prodAppId of Object.keys(doc.roles)) {
|
||||||
let emitted = prodAppId + "${SEPARATOR}" + doc._id
|
let emitted = prodAppId + "${SEPARATOR}" + doc._id
|
||||||
emit(emitted, null)
|
emit(emitted, null)
|
||||||
|
@ -78,7 +78,7 @@ exports.createUserAppView = async () => {
|
||||||
}
|
}
|
||||||
designDoc.views = {
|
designDoc.views = {
|
||||||
...designDoc.views,
|
...designDoc.views,
|
||||||
[ViewNames.USER_BY_APP]: view,
|
[ViewName.USER_BY_APP]: view,
|
||||||
}
|
}
|
||||||
await db.put(designDoc)
|
await db.put(designDoc)
|
||||||
}
|
}
|
||||||
|
@ -93,14 +93,14 @@ exports.createApiKeyView = async () => {
|
||||||
}
|
}
|
||||||
const view = {
|
const view = {
|
||||||
map: `function(doc) {
|
map: `function(doc) {
|
||||||
if (doc._id.startsWith("${DocumentTypes.DEV_INFO}") && doc.apiKey) {
|
if (doc._id.startsWith("${DocumentType.DEV_INFO}") && doc.apiKey) {
|
||||||
emit(doc.apiKey, doc.userId)
|
emit(doc.apiKey, doc.userId)
|
||||||
}
|
}
|
||||||
}`,
|
}`,
|
||||||
}
|
}
|
||||||
designDoc.views = {
|
designDoc.views = {
|
||||||
...designDoc.views,
|
...designDoc.views,
|
||||||
[ViewNames.BY_API_KEY]: view,
|
[ViewName.BY_API_KEY]: view,
|
||||||
}
|
}
|
||||||
await db.put(designDoc)
|
await db.put(designDoc)
|
||||||
}
|
}
|
||||||
|
@ -123,17 +123,17 @@ exports.createUserBuildersView = async () => {
|
||||||
}
|
}
|
||||||
designDoc.views = {
|
designDoc.views = {
|
||||||
...designDoc.views,
|
...designDoc.views,
|
||||||
[ViewNames.USER_BY_BUILDERS]: view,
|
[ViewName.USER_BY_BUILDERS]: view,
|
||||||
}
|
}
|
||||||
await db.put(designDoc)
|
await db.put(designDoc)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.queryGlobalView = async (viewName, params, db = null) => {
|
exports.queryGlobalView = async (viewName, params, db = null) => {
|
||||||
const CreateFuncByName = {
|
const CreateFuncByName = {
|
||||||
[ViewNames.USER_BY_EMAIL]: exports.createNewUserEmailView,
|
[ViewName.USER_BY_EMAIL]: exports.createNewUserEmailView,
|
||||||
[ViewNames.BY_API_KEY]: exports.createApiKeyView,
|
[ViewName.BY_API_KEY]: exports.createApiKeyView,
|
||||||
[ViewNames.USER_BY_BUILDERS]: exports.createUserBuildersView,
|
[ViewName.USER_BY_BUILDERS]: exports.createUserBuildersView,
|
||||||
[ViewNames.USER_BY_APP]: exports.createUserAppView,
|
[ViewName.USER_BY_APP]: exports.createUserAppView,
|
||||||
}
|
}
|
||||||
// can pass DB in if working with something specific
|
// can pass DB in if working with something specific
|
||||||
if (!db) {
|
if (!db) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import errors from "./errors"
|
import errors from "./errors"
|
||||||
|
|
||||||
const errorClasses = errors.errors
|
const errorClasses = errors.errors
|
||||||
import * as events from "./events"
|
import * as events from "./events"
|
||||||
import * as migrations from "./migrations"
|
import * as migrations from "./migrations"
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { getUser } from "../cache/user"
|
||||||
import { getSession, updateSessionTTL } from "../security/sessions"
|
import { getSession, updateSessionTTL } from "../security/sessions"
|
||||||
import { buildMatcherRegex, matches } from "./matchers"
|
import { buildMatcherRegex, matches } from "./matchers"
|
||||||
import { SEPARATOR } from "../db/constants"
|
import { SEPARATOR } from "../db/constants"
|
||||||
import { ViewNames } from "../db/utils"
|
import { ViewName } from "../db/utils"
|
||||||
import { queryGlobalView } from "../db/views"
|
import { queryGlobalView } from "../db/views"
|
||||||
import { getGlobalDB, doInTenant } from "../tenancy"
|
import { getGlobalDB, doInTenant } from "../tenancy"
|
||||||
import { decrypt } from "../security/encryption"
|
import { decrypt } from "../security/encryption"
|
||||||
|
@ -43,7 +43,7 @@ async function checkApiKey(apiKey: string, populateUser?: Function) {
|
||||||
const db = getGlobalDB()
|
const db = getGlobalDB()
|
||||||
// api key is encrypted in the database
|
// api key is encrypted in the database
|
||||||
const userId = await queryGlobalView(
|
const userId = await queryGlobalView(
|
||||||
ViewNames.BY_API_KEY,
|
ViewName.BY_API_KEY,
|
||||||
{
|
{
|
||||||
key: apiKey,
|
key: apiKey,
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { DEFAULT_TENANT_ID } from "../constants"
|
import { DEFAULT_TENANT_ID } from "../constants"
|
||||||
import { doWithDB } from "../db"
|
import { doWithDB } from "../db"
|
||||||
import { DocumentTypes, StaticDatabases } from "../db/constants"
|
import { DocumentType, StaticDatabases } from "../db/constants"
|
||||||
import { getAllApps } from "../db/utils"
|
import { getAllApps } from "../db/utils"
|
||||||
import environment from "../environment"
|
import environment from "../environment"
|
||||||
import {
|
import {
|
||||||
|
@ -21,10 +21,10 @@ import {
|
||||||
export const getMigrationsDoc = async (db: any) => {
|
export const getMigrationsDoc = async (db: any) => {
|
||||||
// get the migrations doc
|
// get the migrations doc
|
||||||
try {
|
try {
|
||||||
return await db.get(DocumentTypes.MIGRATIONS)
|
return await db.get(DocumentType.MIGRATIONS)
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
if (err.status && err.status === 404) {
|
if (err.status && err.status === 404) {
|
||||||
return { _id: DocumentTypes.MIGRATIONS }
|
return { _id: DocumentType.MIGRATIONS }
|
||||||
} else {
|
} else {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
throw err
|
throw err
|
||||||
|
|
|
@ -3,7 +3,7 @@ const { BUILTIN_PERMISSION_IDS, PermissionLevels } = require("./permissions")
|
||||||
const {
|
const {
|
||||||
generateRoleID,
|
generateRoleID,
|
||||||
getRoleParams,
|
getRoleParams,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
} = require("../db/utils")
|
} = require("../db/utils")
|
||||||
const { getAppDB } = require("../context")
|
const { getAppDB } = require("../context")
|
||||||
|
@ -338,7 +338,7 @@ class AccessController {
|
||||||
* Adds the "role_" for builtin role IDs which are to be written to the DB (for permissions).
|
* Adds the "role_" for builtin role IDs which are to be written to the DB (for permissions).
|
||||||
*/
|
*/
|
||||||
exports.getDBRoleID = roleId => {
|
exports.getDBRoleID = roleId => {
|
||||||
if (roleId.startsWith(DocumentTypes.ROLE)) {
|
if (roleId.startsWith(DocumentType.ROLE)) {
|
||||||
return roleId
|
return roleId
|
||||||
}
|
}
|
||||||
return generateRoleID(roleId)
|
return generateRoleID(roleId)
|
||||||
|
@ -349,8 +349,8 @@ exports.getDBRoleID = roleId => {
|
||||||
*/
|
*/
|
||||||
exports.getExternalRoleID = roleId => {
|
exports.getExternalRoleID = roleId => {
|
||||||
// for built in roles we want to remove the DB role ID element (role_)
|
// for built in roles we want to remove the DB role ID element (role_)
|
||||||
if (roleId.startsWith(DocumentTypes.ROLE) && isBuiltin(roleId)) {
|
if (roleId.startsWith(DocumentType.ROLE) && isBuiltin(roleId)) {
|
||||||
return roleId.split(`${DocumentTypes.ROLE}${SEPARATOR}`)[1]
|
return roleId.split(`${DocumentType.ROLE}${SEPARATOR}`)[1]
|
||||||
}
|
}
|
||||||
return roleId
|
return roleId
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const {
|
const {
|
||||||
ViewNames,
|
ViewName,
|
||||||
getUsersByAppParams,
|
getUsersByAppParams,
|
||||||
getProdAppID,
|
getProdAppID,
|
||||||
generateAppUserID,
|
generateAppUserID,
|
||||||
|
@ -18,7 +18,7 @@ exports.getGlobalUserByEmail = async email => {
|
||||||
throw "Must supply an email address to view"
|
throw "Must supply an email address to view"
|
||||||
}
|
}
|
||||||
|
|
||||||
return await queryGlobalView(ViewNames.USER_BY_EMAIL, {
|
return await queryGlobalView(ViewName.USER_BY_EMAIL, {
|
||||||
key: email.toLowerCase(),
|
key: email.toLowerCase(),
|
||||||
include_docs: true,
|
include_docs: true,
|
||||||
})
|
})
|
||||||
|
@ -32,7 +32,7 @@ exports.searchGlobalUsersByApp = async (appId, opts) => {
|
||||||
include_docs: true,
|
include_docs: true,
|
||||||
})
|
})
|
||||||
params.startkey = opts && opts.startkey ? opts.startkey : params.startkey
|
params.startkey = opts && opts.startkey ? opts.startkey : params.startkey
|
||||||
let response = await queryGlobalView(ViewNames.USER_BY_APP, params)
|
let response = await queryGlobalView(ViewName.USER_BY_APP, params)
|
||||||
if (!response) {
|
if (!response) {
|
||||||
response = []
|
response = []
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ exports.searchGlobalUsersByEmail = async (email, opts) => {
|
||||||
const lcEmail = email.toLowerCase()
|
const lcEmail = email.toLowerCase()
|
||||||
// handle if passing up startkey for pagination
|
// handle if passing up startkey for pagination
|
||||||
const startkey = opts && opts.startkey ? opts.startkey : lcEmail
|
const startkey = opts && opts.startkey ? opts.startkey : lcEmail
|
||||||
let response = await queryGlobalView(ViewNames.USER_BY_EMAIL, {
|
let response = await queryGlobalView(ViewName.USER_BY_EMAIL, {
|
||||||
...opts,
|
...opts,
|
||||||
startkey,
|
startkey,
|
||||||
endkey: `${lcEmail}${UNICODE_MAX}`,
|
endkey: `${lcEmail}${UNICODE_MAX}`,
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
const {
|
const { DocumentType, SEPARATOR, ViewName, getAllApps } = require("./db/utils")
|
||||||
DocumentTypes,
|
|
||||||
SEPARATOR,
|
|
||||||
ViewNames,
|
|
||||||
getAllApps,
|
|
||||||
} = require("./db/utils")
|
|
||||||
const jwt = require("jsonwebtoken")
|
const jwt = require("jsonwebtoken")
|
||||||
const { options } = require("./middleware/passport/jwt")
|
const { options } = require("./middleware/passport/jwt")
|
||||||
const { queryGlobalView } = require("./db/views")
|
const { queryGlobalView } = require("./db/views")
|
||||||
|
@ -17,7 +12,7 @@ const {
|
||||||
const events = require("./events")
|
const events = require("./events")
|
||||||
const tenancy = require("./tenancy")
|
const tenancy = require("./tenancy")
|
||||||
|
|
||||||
const APP_PREFIX = DocumentTypes.APP + SEPARATOR
|
const APP_PREFIX = DocumentType.APP + SEPARATOR
|
||||||
const PROD_APP_PREFIX = "/app/"
|
const PROD_APP_PREFIX = "/app/"
|
||||||
|
|
||||||
function confirmAppId(possibleAppId) {
|
function confirmAppId(possibleAppId) {
|
||||||
|
@ -154,7 +149,7 @@ exports.isClient = ctx => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const getBuilders = async () => {
|
const getBuilders = async () => {
|
||||||
const builders = await queryGlobalView(ViewNames.USER_BY_BUILDERS, {
|
const builders = await queryGlobalView(ViewName.USER_BY_BUILDERS, {
|
||||||
include_docs: false,
|
include_docs: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { events } from "@budibase/backend-core"
|
import { events } from "@budibase/backend-core"
|
||||||
import { AnalyticsPingRequest, PingSource } from "@budibase/types"
|
import { AnalyticsPingRequest, PingSource } from "@budibase/types"
|
||||||
import { DocumentTypes, isDevAppID } from "../../db/utils"
|
import { DocumentType, isDevAppID } from "../../db/utils"
|
||||||
import { context } from "@budibase/backend-core"
|
import { context } from "@budibase/backend-core"
|
||||||
|
|
||||||
export const isEnabled = async (ctx: any) => {
|
export const isEnabled = async (ctx: any) => {
|
||||||
|
@ -15,7 +15,7 @@ export const ping = async (ctx: any) => {
|
||||||
switch (body.source) {
|
switch (body.source) {
|
||||||
case PingSource.APP: {
|
case PingSource.APP: {
|
||||||
const db = context.getAppDB({ skip_setup: true })
|
const db = context.getAppDB({ skip_setup: true })
|
||||||
const appInfo = await db.get(DocumentTypes.APP_METADATA)
|
const appInfo = await db.get(DocumentType.APP_METADATA)
|
||||||
let appId = context.getAppId()
|
let appId = context.getAppId()
|
||||||
|
|
||||||
if (isDevAppID(appId)) {
|
if (isDevAppID(appId)) {
|
||||||
|
|
|
@ -15,7 +15,7 @@ import {
|
||||||
getLayoutParams,
|
getLayoutParams,
|
||||||
getScreenParams,
|
getScreenParams,
|
||||||
generateDevAppID,
|
generateDevAppID,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
AppStatus,
|
AppStatus,
|
||||||
} from "../../db/utils"
|
} from "../../db/utils"
|
||||||
const {
|
const {
|
||||||
|
@ -206,7 +206,7 @@ export const fetchAppDefinition = async (ctx: any) => {
|
||||||
|
|
||||||
export const fetchAppPackage = async (ctx: any) => {
|
export const fetchAppPackage = async (ctx: any) => {
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
const application = await db.get(DocumentTypes.APP_METADATA)
|
const application = await db.get(DocumentType.APP_METADATA)
|
||||||
const layouts = await getLayouts()
|
const layouts = await getLayouts()
|
||||||
let screens = await getScreens()
|
let screens = await getScreens()
|
||||||
|
|
||||||
|
@ -248,13 +248,13 @@ const performAppCreate = async (ctx: any) => {
|
||||||
let _rev
|
let _rev
|
||||||
try {
|
try {
|
||||||
// if template there will be an existing doc
|
// if template there will be an existing doc
|
||||||
const existing = await db.get(DocumentTypes.APP_METADATA)
|
const existing = await db.get(DocumentType.APP_METADATA)
|
||||||
_rev = existing._rev
|
_rev = existing._rev
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
}
|
}
|
||||||
const newApplication: App = {
|
const newApplication: App = {
|
||||||
_id: DocumentTypes.APP_METADATA,
|
_id: DocumentType.APP_METADATA,
|
||||||
_rev,
|
_rev,
|
||||||
appId: instance._id,
|
appId: instance._id,
|
||||||
type: "app",
|
type: "app",
|
||||||
|
@ -383,7 +383,7 @@ export const update = async (ctx: any) => {
|
||||||
export const updateClient = async (ctx: any) => {
|
export const updateClient = async (ctx: any) => {
|
||||||
// Get current app version
|
// Get current app version
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
const application = await db.get(DocumentTypes.APP_METADATA)
|
const application = await db.get(DocumentType.APP_METADATA)
|
||||||
const currentVersion = application.version
|
const currentVersion = application.version
|
||||||
|
|
||||||
// Update client library and manifest
|
// Update client library and manifest
|
||||||
|
@ -407,7 +407,7 @@ export const updateClient = async (ctx: any) => {
|
||||||
export const revertClient = async (ctx: any) => {
|
export const revertClient = async (ctx: any) => {
|
||||||
// Check app can be reverted
|
// Check app can be reverted
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
const application = await db.get(DocumentTypes.APP_METADATA)
|
const application = await db.get(DocumentType.APP_METADATA)
|
||||||
if (!application.revertableVersion) {
|
if (!application.revertableVersion) {
|
||||||
ctx.throw(400, "There is no version to revert to")
|
ctx.throw(400, "There is no version to revert to")
|
||||||
}
|
}
|
||||||
|
@ -439,7 +439,7 @@ const destroyApp = async (ctx: any) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = isUnpublish ? context.getProdAppDB() : context.getAppDB()
|
const db = isUnpublish ? context.getProdAppDB() : context.getAppDB()
|
||||||
const app = await db.get(DocumentTypes.APP_METADATA)
|
const app = await db.get(DocumentType.APP_METADATA)
|
||||||
const result = await db.destroy()
|
const result = await db.destroy()
|
||||||
|
|
||||||
if (isUnpublish) {
|
if (isUnpublish) {
|
||||||
|
@ -526,7 +526,7 @@ export const sync = async (ctx: any, next: any) => {
|
||||||
try {
|
try {
|
||||||
await replication.replicate({
|
await replication.replicate({
|
||||||
filter: function (doc: any) {
|
filter: function (doc: any) {
|
||||||
return doc._id !== DocumentTypes.APP_METADATA
|
return doc._id !== DocumentType.APP_METADATA
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -550,7 +550,7 @@ export const sync = async (ctx: any, next: any) => {
|
||||||
const updateAppPackage = async (appPackage: any, appId: any) => {
|
const updateAppPackage = async (appPackage: any, appId: any) => {
|
||||||
return context.doInAppContext(appId, async () => {
|
return context.doInAppContext(appId, async () => {
|
||||||
const db = context.getAppDB()
|
const db = context.getAppDB()
|
||||||
const application = await db.get(DocumentTypes.APP_METADATA)
|
const application = await db.get(DocumentType.APP_METADATA)
|
||||||
|
|
||||||
const newAppPackage = { ...application, ...appPackage }
|
const newAppPackage = { ...application, ...appPackage }
|
||||||
if (appPackage._rev !== application._rev) {
|
if (appPackage._rev !== application._rev) {
|
||||||
|
|
|
@ -3,7 +3,7 @@ const triggers = require("../../automations/triggers")
|
||||||
const {
|
const {
|
||||||
getAutomationParams,
|
getAutomationParams,
|
||||||
generateAutomationID,
|
generateAutomationID,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
} = require("../../db/utils")
|
} = require("../../db/utils")
|
||||||
const {
|
const {
|
||||||
checkForWebhooks,
|
checkForWebhooks,
|
||||||
|
@ -201,7 +201,7 @@ exports.clearLogError = async function (ctx) {
|
||||||
const { automationId, appId } = ctx.request.body
|
const { automationId, appId } = ctx.request.body
|
||||||
await doInAppContext(appId, async () => {
|
await doInAppContext(appId, async () => {
|
||||||
const db = getProdAppDB()
|
const db = getProdAppDB()
|
||||||
const metadata = await db.get(DocumentTypes.APP_METADATA)
|
const metadata = await db.get(DocumentType.APP_METADATA)
|
||||||
if (!automationId) {
|
if (!automationId) {
|
||||||
delete metadata.automationErrors
|
delete metadata.automationErrors
|
||||||
} else if (
|
} else if (
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const { streamBackup } = require("../../utilities/fileSystem")
|
const { streamBackup } = require("../../utilities/fileSystem")
|
||||||
const { events, context } = require("@budibase/backend-core")
|
const { events, context } = require("@budibase/backend-core")
|
||||||
const { DocumentTypes } = require("../../db/utils")
|
const { DocumentType } = require("../../db/utils")
|
||||||
|
|
||||||
exports.exportAppDump = async function (ctx) {
|
exports.exportAppDump = async function (ctx) {
|
||||||
let { appId, excludeRows } = ctx.query
|
let { appId, excludeRows } = ctx.query
|
||||||
|
@ -12,7 +12,7 @@ exports.exportAppDump = async function (ctx) {
|
||||||
|
|
||||||
await context.doInAppContext(appId, async () => {
|
await context.doInAppContext(appId, async () => {
|
||||||
const appDb = context.getAppDB()
|
const appDb = context.getAppDB()
|
||||||
const app = await appDb.get(DocumentTypes.APP_METADATA)
|
const app = await appDb.get(DocumentType.APP_METADATA)
|
||||||
await events.app.exported(app)
|
await events.app.exported(app)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ const {
|
||||||
getGlobalDB,
|
getGlobalDB,
|
||||||
} = require("@budibase/backend-core/tenancy")
|
} = require("@budibase/backend-core/tenancy")
|
||||||
const { create } = require("./application")
|
const { create } = require("./application")
|
||||||
const { getDocParams, DocumentTypes, isDevAppID } = require("../../db/utils")
|
const { getDocParams, DocumentType, isDevAppID } = require("../../db/utils")
|
||||||
|
|
||||||
async function createApp(appName, appImport) {
|
async function createApp(appName, appImport) {
|
||||||
const ctx = {
|
const ctx = {
|
||||||
|
@ -31,7 +31,7 @@ exports.exportApps = async ctx => {
|
||||||
}
|
}
|
||||||
const apps = await getAllApps({ all: true })
|
const apps = await getAllApps({ all: true })
|
||||||
const globalDBString = await exportDB(getGlobalDBName(), {
|
const globalDBString = await exportDB(getGlobalDBName(), {
|
||||||
filter: doc => !doc._id.startsWith(DocumentTypes.USER),
|
filter: doc => !doc._id.startsWith(DocumentType.USER),
|
||||||
})
|
})
|
||||||
let allDBs = {
|
let allDBs = {
|
||||||
global: globalDBString,
|
global: globalDBString,
|
||||||
|
@ -97,7 +97,7 @@ exports.importApps = async ctx => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if there are any users make sure to remove them
|
// if there are any users make sure to remove them
|
||||||
let users = await getAllDocType(globalDb, DocumentTypes.USER)
|
let users = await getAllDocType(globalDb, DocumentType.USER)
|
||||||
let userDeletionPromises = []
|
let userDeletionPromises = []
|
||||||
for (let user of users) {
|
for (let user of users) {
|
||||||
userDeletionPromises.push(globalDb.remove(user._id, user._rev))
|
userDeletionPromises.push(globalDb.remove(user._id, user._rev))
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
const { DocumentTypes } = require("../../db/utils")
|
const { DocumentType } = require("../../db/utils")
|
||||||
const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
|
const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
|
||||||
const { getAppDB } = require("@budibase/backend-core/context")
|
const { getAppDB } = require("@budibase/backend-core/context")
|
||||||
|
|
||||||
exports.fetchAppComponentDefinitions = async function (ctx) {
|
exports.fetchAppComponentDefinitions = async function (ctx) {
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const app = await db.get(DocumentTypes.APP_METADATA)
|
const app = await db.get(DocumentType.APP_METADATA)
|
||||||
|
|
||||||
let componentManifests = await Promise.all(
|
let componentManifests = await Promise.all(
|
||||||
app.componentLibraries.map(async library => {
|
app.componentLibraries.map(async library => {
|
||||||
|
|
|
@ -2,7 +2,7 @@ const {
|
||||||
generateDatasourceID,
|
generateDatasourceID,
|
||||||
getDatasourceParams,
|
getDatasourceParams,
|
||||||
getQueryParams,
|
getQueryParams,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
BudibaseInternalDB,
|
BudibaseInternalDB,
|
||||||
getTableParams,
|
getTableParams,
|
||||||
} = require("../../db/utils")
|
} = require("../../db/utils")
|
||||||
|
@ -132,7 +132,7 @@ exports.save = async function (ctx) {
|
||||||
|
|
||||||
const datasource = {
|
const datasource = {
|
||||||
_id: generateDatasourceID({ plus }),
|
_id: generateDatasourceID({ plus }),
|
||||||
type: plus ? DocumentTypes.DATASOURCE_PLUS : DocumentTypes.DATASOURCE,
|
type: plus ? DocumentType.DATASOURCE_PLUS : DocumentType.DATASOURCE,
|
||||||
...ctx.request.body.datasource,
|
...ctx.request.body.datasource,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import {
|
||||||
getProdAppID,
|
getProdAppID,
|
||||||
getDevelopmentAppID,
|
getDevelopmentAppID,
|
||||||
} from "@budibase/backend-core/db"
|
} from "@budibase/backend-core/db"
|
||||||
import { DocumentTypes, getAutomationParams } from "../../../db/utils"
|
import { DocumentType, getAutomationParams } from "../../../db/utils"
|
||||||
import {
|
import {
|
||||||
disableAllCrons,
|
disableAllCrons,
|
||||||
enableCronTrigger,
|
enableCronTrigger,
|
||||||
|
@ -52,9 +52,9 @@ async function storeDeploymentHistory(deployment: any) {
|
||||||
let deploymentDoc
|
let deploymentDoc
|
||||||
try {
|
try {
|
||||||
// theres only one deployment doc per app database
|
// theres only one deployment doc per app database
|
||||||
deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
|
deploymentDoc = await db.get(DocumentType.DEPLOYMENTS)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
deploymentDoc = { _id: DocumentTypes.DEPLOYMENTS, history: {} }
|
deploymentDoc = { _id: DocumentType.DEPLOYMENTS, history: {} }
|
||||||
}
|
}
|
||||||
|
|
||||||
const deploymentId = deploymentJSON._id
|
const deploymentId = deploymentJSON._id
|
||||||
|
@ -115,7 +115,7 @@ async function deployApp(deployment: any) {
|
||||||
await replication.replicate()
|
await replication.replicate()
|
||||||
console.log("replication complete.. replacing app meta doc")
|
console.log("replication complete.. replacing app meta doc")
|
||||||
const db = getProdAppDB()
|
const db = getProdAppDB()
|
||||||
const appDoc = await db.get(DocumentTypes.APP_METADATA)
|
const appDoc = await db.get(DocumentType.APP_METADATA)
|
||||||
|
|
||||||
deployment.appUrl = appDoc.url
|
deployment.appUrl = appDoc.url
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ async function deployApp(deployment: any) {
|
||||||
export async function fetchDeployments(ctx: any) {
|
export async function fetchDeployments(ctx: any) {
|
||||||
try {
|
try {
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
|
const deploymentDoc = await db.get(DocumentType.DEPLOYMENTS)
|
||||||
const { updated, deployments } = await checkAllDeployments(deploymentDoc)
|
const { updated, deployments } = await checkAllDeployments(deploymentDoc)
|
||||||
if (updated) {
|
if (updated) {
|
||||||
await db.put(deployments)
|
await db.put(deployments)
|
||||||
|
@ -160,7 +160,7 @@ export async function fetchDeployments(ctx: any) {
|
||||||
export async function deploymentProgress(ctx: any) {
|
export async function deploymentProgress(ctx: any) {
|
||||||
try {
|
try {
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
|
const deploymentDoc = await db.get(DocumentType.DEPLOYMENTS)
|
||||||
ctx.body = deploymentDoc[ctx.params.deploymentId]
|
ctx.body = deploymentDoc[ctx.params.deploymentId]
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
ctx.throw(
|
ctx.throw(
|
||||||
|
@ -173,7 +173,7 @@ export async function deploymentProgress(ctx: any) {
|
||||||
const isFirstDeploy = async () => {
|
const isFirstDeploy = async () => {
|
||||||
try {
|
try {
|
||||||
const db = getProdAppDB()
|
const db = getProdAppDB()
|
||||||
await db.get(DocumentTypes.APP_METADATA)
|
await db.get(DocumentType.APP_METADATA)
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
if (e.status === 404) {
|
if (e.status === 404) {
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -4,7 +4,7 @@ const { checkSlashesInUrl } = require("../../utilities")
|
||||||
const { request } = require("../../utilities/workerRequests")
|
const { request } = require("../../utilities/workerRequests")
|
||||||
const { clearLock } = require("../../utilities/redis")
|
const { clearLock } = require("../../utilities/redis")
|
||||||
const { Replication, getProdAppID } = require("@budibase/backend-core/db")
|
const { Replication, getProdAppID } = require("@budibase/backend-core/db")
|
||||||
const { DocumentTypes } = require("../../db/utils")
|
const { DocumentType } = require("../../db/utils")
|
||||||
const { app: appCache } = require("@budibase/backend-core/cache")
|
const { app: appCache } = require("@budibase/backend-core/cache")
|
||||||
const { getProdAppDB, getAppDB } = require("@budibase/backend-core/context")
|
const { getProdAppDB, getAppDB } = require("@budibase/backend-core/context")
|
||||||
const { events } = require("@budibase/backend-core")
|
const { events } = require("@budibase/backend-core")
|
||||||
|
@ -87,7 +87,7 @@ exports.revert = async ctx => {
|
||||||
if (info.error) {
|
if (info.error) {
|
||||||
throw info.error
|
throw info.error
|
||||||
}
|
}
|
||||||
const deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
|
const deploymentDoc = await db.get(DocumentType.DEPLOYMENTS)
|
||||||
if (
|
if (
|
||||||
!deploymentDoc.history ||
|
!deploymentDoc.history ||
|
||||||
Object.keys(deploymentDoc.history).length === 0
|
Object.keys(deploymentDoc.history).length === 0
|
||||||
|
@ -110,7 +110,7 @@ exports.revert = async ctx => {
|
||||||
|
|
||||||
// update appID in reverted app to be dev version again
|
// update appID in reverted app to be dev version again
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const appDoc = await db.get(DocumentTypes.APP_METADATA)
|
const appDoc = await db.get(DocumentType.APP_METADATA)
|
||||||
appDoc.appId = appId
|
appDoc.appId = appId
|
||||||
appDoc.instance._id = appId
|
appDoc.instance._id = appId
|
||||||
await db.put(appDoc)
|
await db.put(appDoc)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const { cloneDeep } = require("lodash")
|
const { cloneDeep } = require("lodash")
|
||||||
const { definitions } = require("../../integrations")
|
const { definitions } = require("../../integrations")
|
||||||
const { SourceNames } = require("../../definitions/datasource")
|
const { SourceName } = require("@budibase/types")
|
||||||
const googlesheets = require("../../integrations/googlesheets")
|
const googlesheets = require("../../integrations/googlesheets")
|
||||||
const { featureFlags } = require("@budibase/backend-core")
|
const { featureFlags } = require("@budibase/backend-core")
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ exports.fetch = async function (ctx) {
|
||||||
|
|
||||||
// for google sheets integration google verification
|
// for google sheets integration google verification
|
||||||
if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
|
if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
|
||||||
defs[SourceNames.GOOGLE_SHEETS] = googlesheets.schema
|
defs[SourceName.GOOGLE_SHEETS] = googlesheets.schema
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = defs
|
ctx.body = defs
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const { getAppDB } = require("@budibase/backend-core/context")
|
const { getAppDB } = require("@budibase/backend-core/context")
|
||||||
import { isExternalTable } from "../../../integrations/utils"
|
import { isExternalTable } from "../../../integrations/utils"
|
||||||
import { APP_PREFIX, DocumentTypes } from "../../../db/utils"
|
import { APP_PREFIX, DocumentType } from "../../../db/utils"
|
||||||
|
|
||||||
export async function addRev(
|
export async function addRev(
|
||||||
body: { _id?: string; _rev?: string },
|
body: { _id?: string; _rev?: string },
|
||||||
|
@ -11,7 +11,7 @@ export async function addRev(
|
||||||
}
|
}
|
||||||
let id = body._id
|
let id = body._id
|
||||||
if (body._id.startsWith(APP_PREFIX)) {
|
if (body._id.startsWith(APP_PREFIX)) {
|
||||||
id = DocumentTypes.APP_METADATA
|
id = DocumentType.APP_METADATA
|
||||||
}
|
}
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const dbDoc = await db.get(id)
|
const dbDoc = await db.get(id)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { ImportInfo } from "./base"
|
import { ImportInfo } from "./base"
|
||||||
import { Query, QueryParameter } from "../../../../../definitions/datasource"
|
import { Query, QueryParameter } from "@budibase/types"
|
||||||
import { OpenAPIV2 } from "openapi-types"
|
import { OpenAPIV2 } from "openapi-types"
|
||||||
import { OpenAPISource } from "./base/openapi"
|
import { OpenAPISource } from "./base/openapi"
|
||||||
import { URL } from "url"
|
import { URL } from "url"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { ImportInfo } from "./base"
|
import { ImportInfo } from "./base"
|
||||||
import { Query, QueryParameter } from "../../../../../definitions/datasource"
|
import { Query, QueryParameter } from "@budibase/types"
|
||||||
import { OpenAPIV3 } from "openapi-types"
|
import { OpenAPIV3 } from "openapi-types"
|
||||||
import { OpenAPISource } from "./base/openapi"
|
import { OpenAPISource } from "./base/openapi"
|
||||||
import { URL } from "url"
|
import { URL } from "url"
|
||||||
|
|
|
@ -1,18 +1,16 @@
|
||||||
import {
|
import {
|
||||||
FilterTypes,
|
FilterType,
|
||||||
IncludeRelationships,
|
IncludeRelationship,
|
||||||
Operation,
|
Operation,
|
||||||
PaginationJson,
|
PaginationJson,
|
||||||
RelationshipsJson,
|
RelationshipsJson,
|
||||||
SearchFilters,
|
SearchFilters,
|
||||||
SortJson,
|
SortJson,
|
||||||
} from "../../../definitions/datasource"
|
|
||||||
import {
|
|
||||||
Datasource,
|
Datasource,
|
||||||
FieldSchema,
|
FieldSchema,
|
||||||
Row,
|
Row,
|
||||||
Table,
|
Table,
|
||||||
} from "../../../definitions/common"
|
} from "@budibase/types"
|
||||||
import {
|
import {
|
||||||
breakRowIdField,
|
breakRowIdField,
|
||||||
generateRowIdField,
|
generateRowIdField,
|
||||||
|
@ -128,7 +126,7 @@ module External {
|
||||||
if (
|
if (
|
||||||
typeof filter !== "object" ||
|
typeof filter !== "object" ||
|
||||||
Object.keys(filter).length === 0 ||
|
Object.keys(filter).length === 0 ||
|
||||||
key === FilterTypes.ONE_OF
|
key === FilterType.ONE_OF
|
||||||
) {
|
) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -634,7 +632,7 @@ module External {
|
||||||
*/
|
*/
|
||||||
buildFields(
|
buildFields(
|
||||||
table: Table,
|
table: Table,
|
||||||
includeRelations: IncludeRelationships = IncludeRelationships.INCLUDE
|
includeRelations: IncludeRelationship = IncludeRelationship.INCLUDE
|
||||||
) {
|
) {
|
||||||
function extractRealFields(table: Table, existing: string[] = []) {
|
function extractRealFields(table: Table, existing: string[] = []) {
|
||||||
return Object.entries(table.schema)
|
return Object.entries(table.schema)
|
||||||
|
|
|
@ -3,7 +3,7 @@ const {
|
||||||
generateRowID,
|
generateRowID,
|
||||||
getRowParams,
|
getRowParams,
|
||||||
getTableIDFromRowID,
|
getTableIDFromRowID,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
InternalTables,
|
InternalTables,
|
||||||
} = require("../../../db/utils")
|
} = require("../../../db/utils")
|
||||||
const { dangerousGetDB } = require("@budibase/backend-core/db")
|
const { dangerousGetDB } = require("@budibase/backend-core/db")
|
||||||
|
@ -183,7 +183,7 @@ exports.fetchView = async ctx => {
|
||||||
const viewName = ctx.params.viewName
|
const viewName = ctx.params.viewName
|
||||||
|
|
||||||
// if this is a table view being looked for just transfer to that
|
// if this is a table view being looked for just transfer to that
|
||||||
if (viewName.startsWith(DocumentTypes.TABLE)) {
|
if (viewName.startsWith(DocumentType.TABLE)) {
|
||||||
ctx.params.tableId = viewName
|
ctx.params.tableId = viewName
|
||||||
return exports.fetch(ctx)
|
return exports.fetch(ctx)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ const env = require("../../../environment")
|
||||||
const { clientLibraryPath } = require("../../../utilities")
|
const { clientLibraryPath } = require("../../../utilities")
|
||||||
const { upload } = require("../../../utilities/fileSystem")
|
const { upload } = require("../../../utilities/fileSystem")
|
||||||
const { attachmentsRelativeURL } = require("../../../utilities")
|
const { attachmentsRelativeURL } = require("../../../utilities")
|
||||||
const { DocumentTypes } = require("../../../db/utils")
|
const { DocumentType } = require("../../../db/utils")
|
||||||
const { getAppDB, getAppId } = require("@budibase/backend-core/context")
|
const { getAppDB, getAppId } = require("@budibase/backend-core/context")
|
||||||
const { setCookie, clearCookie } = require("@budibase/backend-core/utils")
|
const { setCookie, clearCookie } = require("@budibase/backend-core/utils")
|
||||||
const AWS = require("aws-sdk")
|
const AWS = require("aws-sdk")
|
||||||
|
@ -99,7 +99,7 @@ export const uploadFile = async function (ctx: any) {
|
||||||
|
|
||||||
export const serveApp = async function (ctx: any) {
|
export const serveApp = async function (ctx: any) {
|
||||||
const db = getAppDB({ skip_setup: true })
|
const db = getAppDB({ skip_setup: true })
|
||||||
const appInfo = await db.get(DocumentTypes.APP_METADATA)
|
const appInfo = await db.get(DocumentType.APP_METADATA)
|
||||||
let appId = getAppId()
|
let appId = getAppId()
|
||||||
|
|
||||||
if (!env.isJest()) {
|
if (!env.isJest()) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ const { getTable } = require("../table/utils")
|
||||||
const { FieldTypes } = require("../../../constants")
|
const { FieldTypes } = require("../../../constants")
|
||||||
const { getAppDB } = require("@budibase/backend-core/context")
|
const { getAppDB } = require("@budibase/backend-core/context")
|
||||||
const { events } = require("@budibase/backend-core")
|
const { events } = require("@budibase/backend-core")
|
||||||
const { DocumentTypes } = require("../../../db/utils")
|
const { DocumentType } = require("../../../db/utils")
|
||||||
const { cloneDeep, isEqual } = require("lodash")
|
const { cloneDeep, isEqual } = require("lodash")
|
||||||
|
|
||||||
exports.fetch = async ctx => {
|
exports.fetch = async ctx => {
|
||||||
|
@ -181,7 +181,7 @@ exports.exportView = async ctx => {
|
||||||
ctx.attachment(filename)
|
ctx.attachment(filename)
|
||||||
ctx.body = apiFileReturn(exporter(headers, rows))
|
ctx.body = apiFileReturn(exporter(headers, rows))
|
||||||
|
|
||||||
if (viewName.startsWith(DocumentTypes.TABLE)) {
|
if (viewName.startsWith(DocumentType.TABLE)) {
|
||||||
await events.table.exported(table, format)
|
await events.table.exported(table, format)
|
||||||
} else {
|
} else {
|
||||||
await events.view.exported(table, format)
|
await events.view.exported(table, format)
|
||||||
|
|
|
@ -2,7 +2,7 @@ const {
|
||||||
ViewNames,
|
ViewNames,
|
||||||
generateMemoryViewID,
|
generateMemoryViewID,
|
||||||
getMemoryViewParams,
|
getMemoryViewParams,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
} = require("../../../db/utils")
|
} = require("../../../db/utils")
|
||||||
const env = require("../../../environment")
|
const env = require("../../../environment")
|
||||||
|
@ -16,7 +16,7 @@ exports.getView = async viewName => {
|
||||||
return designDoc.views[viewName]
|
return designDoc.views[viewName]
|
||||||
} else {
|
} else {
|
||||||
// This is a table view, don't read the view from the DB
|
// This is a table view, don't read the view from the DB
|
||||||
if (viewName.startsWith(DocumentTypes.TABLE + SEPARATOR)) {
|
if (viewName.startsWith(DocumentType.TABLE + SEPARATOR)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const newid = require("./newid")
|
const newid = require("./newid")
|
||||||
const {
|
const {
|
||||||
DocumentTypes: CoreDocTypes,
|
DocumentType: CoreDocTypes,
|
||||||
getRoleParams,
|
getRoleParams,
|
||||||
generateRoleID,
|
generateRoleID,
|
||||||
APP_DEV_PREFIX,
|
APP_DEV_PREFIX,
|
||||||
|
@ -23,7 +23,7 @@ const AppStatus = {
|
||||||
DEPLOYED: "published",
|
DEPLOYED: "published",
|
||||||
}
|
}
|
||||||
|
|
||||||
const DocumentTypes = {
|
const DocumentType = {
|
||||||
...CoreDocTypes,
|
...CoreDocTypes,
|
||||||
TABLE: "ta",
|
TABLE: "ta",
|
||||||
ROW: "ro",
|
ROW: "ro",
|
||||||
|
@ -66,12 +66,12 @@ exports.APP_PREFIX = APP_PREFIX
|
||||||
exports.APP_DEV_PREFIX = APP_DEV_PREFIX
|
exports.APP_DEV_PREFIX = APP_DEV_PREFIX
|
||||||
exports.isDevAppID = isDevAppID
|
exports.isDevAppID = isDevAppID
|
||||||
exports.isProdAppID = isProdAppID
|
exports.isProdAppID = isProdAppID
|
||||||
exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
exports.USER_METDATA_PREFIX = `${DocumentType.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
||||||
exports.LINK_USER_METADATA_PREFIX = `${DocumentTypes.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
exports.LINK_USER_METADATA_PREFIX = `${DocumentType.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
||||||
exports.TABLE_ROW_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${DocumentTypes.TABLE}`
|
exports.TABLE_ROW_PREFIX = `${DocumentType.ROW}${SEPARATOR}${DocumentType.TABLE}`
|
||||||
exports.ViewNames = ViewNames
|
exports.ViewNames = ViewNames
|
||||||
exports.InternalTables = InternalTables
|
exports.InternalTables = InternalTables
|
||||||
exports.DocumentTypes = DocumentTypes
|
exports.DocumentType = DocumentType
|
||||||
exports.SEPARATOR = SEPARATOR
|
exports.SEPARATOR = SEPARATOR
|
||||||
exports.UNICODE_MAX = UNICODE_MAX
|
exports.UNICODE_MAX = UNICODE_MAX
|
||||||
exports.SearchIndexes = SearchIndexes
|
exports.SearchIndexes = SearchIndexes
|
||||||
|
@ -114,7 +114,7 @@ exports.getDocParams = getDocParams
|
||||||
* Gets parameters for retrieving tables, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving tables, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getTableParams = (tableId = null, otherProps = {}) => {
|
exports.getTableParams = (tableId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.TABLE, tableId, otherProps)
|
return getDocParams(DocumentType.TABLE, tableId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -122,7 +122,7 @@ exports.getTableParams = (tableId = null, otherProps = {}) => {
|
||||||
* @returns {string} The new table ID which the table doc can be stored under.
|
* @returns {string} The new table ID which the table doc can be stored under.
|
||||||
*/
|
*/
|
||||||
exports.generateTableID = () => {
|
exports.generateTableID = () => {
|
||||||
return `${DocumentTypes.TABLE}${SEPARATOR}${newid()}`
|
return `${DocumentType.TABLE}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -135,12 +135,12 @@ exports.generateTableID = () => {
|
||||||
*/
|
*/
|
||||||
exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
|
exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
|
||||||
if (tableId == null) {
|
if (tableId == null) {
|
||||||
return getDocParams(DocumentTypes.ROW, null, otherProps)
|
return getDocParams(DocumentType.ROW, null, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
const endOfKey = rowId == null ? `${tableId}${SEPARATOR}` : rowId
|
const endOfKey = rowId == null ? `${tableId}${SEPARATOR}` : rowId
|
||||||
|
|
||||||
return getDocParams(DocumentTypes.ROW, endOfKey, otherProps)
|
return getDocParams(DocumentType.ROW, endOfKey, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,9 +150,9 @@ exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
|
||||||
*/
|
*/
|
||||||
exports.getTableIDFromRowID = rowId => {
|
exports.getTableIDFromRowID = rowId => {
|
||||||
const components = rowId
|
const components = rowId
|
||||||
.split(DocumentTypes.TABLE + SEPARATOR)[1]
|
.split(DocumentType.TABLE + SEPARATOR)[1]
|
||||||
.split(SEPARATOR)
|
.split(SEPARATOR)
|
||||||
return `${DocumentTypes.TABLE}${SEPARATOR}${components[0]}`
|
return `${DocumentType.TABLE}${SEPARATOR}${components[0]}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,7 +163,7 @@ exports.getTableIDFromRowID = rowId => {
|
||||||
*/
|
*/
|
||||||
exports.generateRowID = (tableId, id = null) => {
|
exports.generateRowID = (tableId, id = null) => {
|
||||||
id = id || newid()
|
id = id || newid()
|
||||||
return `${DocumentTypes.ROW}${SEPARATOR}${tableId}${SEPARATOR}${id}`
|
return `${DocumentType.ROW}${SEPARATOR}${tableId}${SEPARATOR}${id}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -186,7 +186,7 @@ exports.generateUserMetadataID = globalId => {
|
||||||
* Breaks up the ID to get the global ID.
|
* Breaks up the ID to get the global ID.
|
||||||
*/
|
*/
|
||||||
exports.getGlobalIDFromUserMetadataID = id => {
|
exports.getGlobalIDFromUserMetadataID = id => {
|
||||||
const prefix = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
const prefix = `${DocumentType.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
|
||||||
if (!id || !id.includes(prefix)) {
|
if (!id || !id.includes(prefix)) {
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ exports.getGlobalIDFromUserMetadataID = id => {
|
||||||
* Gets parameters for retrieving automations, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving automations, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getAutomationParams = (automationId = null, otherProps = {}) => {
|
exports.getAutomationParams = (automationId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.AUTOMATION, automationId, otherProps)
|
return getDocParams(DocumentType.AUTOMATION, automationId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -205,7 +205,7 @@ exports.getAutomationParams = (automationId = null, otherProps = {}) => {
|
||||||
* @returns {string} The new automation ID which the automation doc can be stored under.
|
* @returns {string} The new automation ID which the automation doc can be stored under.
|
||||||
*/
|
*/
|
||||||
exports.generateAutomationID = () => {
|
exports.generateAutomationID = () => {
|
||||||
return `${DocumentTypes.AUTOMATION}${SEPARATOR}${newid()}`
|
return `${DocumentType.AUTOMATION}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -230,14 +230,14 @@ exports.generateLinkID = (
|
||||||
const tables = `${SEPARATOR}${tableId1}${SEPARATOR}${tableId2}`
|
const tables = `${SEPARATOR}${tableId1}${SEPARATOR}${tableId2}`
|
||||||
const rows = `${SEPARATOR}${rowId1}${SEPARATOR}${rowId2}`
|
const rows = `${SEPARATOR}${rowId1}${SEPARATOR}${rowId2}`
|
||||||
const fields = `${SEPARATOR}${fieldName1}${SEPARATOR}${fieldName2}`
|
const fields = `${SEPARATOR}${fieldName1}${SEPARATOR}${fieldName2}`
|
||||||
return `${DocumentTypes.LINK}${tables}${rows}${fields}`
|
return `${DocumentType.LINK}${tables}${rows}${fields}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets parameters for retrieving link docs, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving link docs, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getLinkParams = (otherProps = {}) => {
|
exports.getLinkParams = (otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.LINK, null, otherProps)
|
return getDocParams(DocumentType.LINK, null, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -245,14 +245,14 @@ exports.getLinkParams = (otherProps = {}) => {
|
||||||
* @returns {string} The new layout ID which the layout doc can be stored under.
|
* @returns {string} The new layout ID which the layout doc can be stored under.
|
||||||
*/
|
*/
|
||||||
exports.generateLayoutID = id => {
|
exports.generateLayoutID = id => {
|
||||||
return `${DocumentTypes.LAYOUT}${SEPARATOR}${id || newid()}`
|
return `${DocumentType.LAYOUT}${SEPARATOR}${id || newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets parameters for retrieving layout, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving layout, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getLayoutParams = (layoutId = null, otherProps = {}) => {
|
exports.getLayoutParams = (layoutId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.LAYOUT, layoutId, otherProps)
|
return getDocParams(DocumentType.LAYOUT, layoutId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -260,14 +260,14 @@ exports.getLayoutParams = (layoutId = null, otherProps = {}) => {
|
||||||
* @returns {string} The new screen ID which the screen doc can be stored under.
|
* @returns {string} The new screen ID which the screen doc can be stored under.
|
||||||
*/
|
*/
|
||||||
exports.generateScreenID = () => {
|
exports.generateScreenID = () => {
|
||||||
return `${DocumentTypes.SCREEN}${SEPARATOR}${newid()}`
|
return `${DocumentType.SCREEN}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets parameters for retrieving screens, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving screens, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getScreenParams = (screenId = null, otherProps = {}) => {
|
exports.getScreenParams = (screenId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.SCREEN, screenId, otherProps)
|
return getDocParams(DocumentType.SCREEN, screenId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -275,14 +275,14 @@ exports.getScreenParams = (screenId = null, otherProps = {}) => {
|
||||||
* @returns {string} The new webhook ID which the webhook doc can be stored under.
|
* @returns {string} The new webhook ID which the webhook doc can be stored under.
|
||||||
*/
|
*/
|
||||||
exports.generateWebhookID = () => {
|
exports.generateWebhookID = () => {
|
||||||
return `${DocumentTypes.WEBHOOK}${SEPARATOR}${newid()}`
|
return `${DocumentType.WEBHOOK}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets parameters for retrieving a webhook, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving a webhook, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getWebhookParams = (webhookId = null, otherProps = {}) => {
|
exports.getWebhookParams = (webhookId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.WEBHOOK, webhookId, otherProps)
|
return getDocParams(DocumentType.WEBHOOK, webhookId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -291,7 +291,7 @@ exports.getWebhookParams = (webhookId = null, otherProps = {}) => {
|
||||||
*/
|
*/
|
||||||
exports.generateDatasourceID = ({ plus = false } = {}) => {
|
exports.generateDatasourceID = ({ plus = false } = {}) => {
|
||||||
return `${
|
return `${
|
||||||
plus ? DocumentTypes.DATASOURCE_PLUS : DocumentTypes.DATASOURCE
|
plus ? DocumentType.DATASOURCE_PLUS : DocumentType.DATASOURCE
|
||||||
}${SEPARATOR}${newid()}`
|
}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,7 +299,7 @@ exports.generateDatasourceID = ({ plus = false } = {}) => {
|
||||||
* Gets parameters for retrieving a datasource, this is a utility function for the getDocParams function.
|
* Gets parameters for retrieving a datasource, this is a utility function for the getDocParams function.
|
||||||
*/
|
*/
|
||||||
exports.getDatasourceParams = (datasourceId = null, otherProps = {}) => {
|
exports.getDatasourceParams = (datasourceId = null, otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.DATASOURCE, datasourceId, otherProps)
|
return getDocParams(DocumentType.DATASOURCE, datasourceId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -308,7 +308,7 @@ exports.getDatasourceParams = (datasourceId = null, otherProps = {}) => {
|
||||||
*/
|
*/
|
||||||
exports.generateQueryID = datasourceId => {
|
exports.generateQueryID = datasourceId => {
|
||||||
return `${
|
return `${
|
||||||
DocumentTypes.QUERY
|
DocumentType.QUERY
|
||||||
}${SEPARATOR}${datasourceId}${SEPARATOR}${newid()}`
|
}${SEPARATOR}${datasourceId}${SEPARATOR}${newid()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,14 +317,14 @@ exports.generateQueryID = datasourceId => {
|
||||||
* automations etc.
|
* automations etc.
|
||||||
*/
|
*/
|
||||||
exports.generateAutomationMetadataID = automationId => {
|
exports.generateAutomationMetadataID = automationId => {
|
||||||
return `${DocumentTypes.AUTOMATION_METADATA}${SEPARATOR}${automationId}`
|
return `${DocumentType.AUTOMATION_METADATA}${SEPARATOR}${automationId}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve all automation metadata in an app database.
|
* Retrieve all automation metadata in an app database.
|
||||||
*/
|
*/
|
||||||
exports.getAutomationMetadataParams = (otherProps = {}) => {
|
exports.getAutomationMetadataParams = (otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.AUTOMATION_METADATA, null, otherProps)
|
return getDocParams(DocumentType.AUTOMATION_METADATA, null, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -332,11 +332,11 @@ exports.getAutomationMetadataParams = (otherProps = {}) => {
|
||||||
*/
|
*/
|
||||||
exports.getQueryParams = (datasourceId = null, otherProps = {}) => {
|
exports.getQueryParams = (datasourceId = null, otherProps = {}) => {
|
||||||
if (datasourceId == null) {
|
if (datasourceId == null) {
|
||||||
return getDocParams(DocumentTypes.QUERY, null, otherProps)
|
return getDocParams(DocumentType.QUERY, null, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
return getDocParams(
|
return getDocParams(
|
||||||
DocumentTypes.QUERY,
|
DocumentType.QUERY,
|
||||||
`${datasourceId}${SEPARATOR}`,
|
`${datasourceId}${SEPARATOR}`,
|
||||||
otherProps
|
otherProps
|
||||||
)
|
)
|
||||||
|
@ -347,11 +347,11 @@ exports.getQueryParams = (datasourceId = null, otherProps = {}) => {
|
||||||
* @returns {string} The ID of the flag document that was generated.
|
* @returns {string} The ID of the flag document that was generated.
|
||||||
*/
|
*/
|
||||||
exports.generateUserFlagID = userId => {
|
exports.generateUserFlagID = userId => {
|
||||||
return `${DocumentTypes.USER_FLAG}${SEPARATOR}${userId}`
|
return `${DocumentType.USER_FLAG}${SEPARATOR}${userId}`
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.generateMetadataID = (type, entityId) => {
|
exports.generateMetadataID = (type, entityId) => {
|
||||||
return `${DocumentTypes.METADATA}${SEPARATOR}${type}${SEPARATOR}${entityId}`
|
return `${DocumentType.METADATA}${SEPARATOR}${type}${SEPARATOR}${entityId}`
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.getMetadataParams = (type, entityId = null, otherProps = {}) => {
|
exports.getMetadataParams = (type, entityId = null, otherProps = {}) => {
|
||||||
|
@ -359,15 +359,15 @@ exports.getMetadataParams = (type, entityId = null, otherProps = {}) => {
|
||||||
if (entityId != null) {
|
if (entityId != null) {
|
||||||
docId += entityId
|
docId += entityId
|
||||||
}
|
}
|
||||||
return getDocParams(DocumentTypes.METADATA, docId, otherProps)
|
return getDocParams(DocumentType.METADATA, docId, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.generateMemoryViewID = viewName => {
|
exports.generateMemoryViewID = viewName => {
|
||||||
return `${DocumentTypes.MEM_VIEW}${SEPARATOR}${viewName}`
|
return `${DocumentType.MEM_VIEW}${SEPARATOR}${viewName}`
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.getMemoryViewParams = (otherProps = {}) => {
|
exports.getMemoryViewParams = (otherProps = {}) => {
|
||||||
return getDocParams(DocumentTypes.MEM_VIEW, null, otherProps)
|
return getDocParams(DocumentType.MEM_VIEW, null, otherProps)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
const { getAppDB } = require("@budibase/backend-core/context")
|
const { getAppDB } = require("@budibase/backend-core/context")
|
||||||
const {
|
const {
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
ViewNames,
|
ViewNames,
|
||||||
SearchIndexes,
|
SearchIndexes,
|
||||||
} = require("../utils")
|
} = require("../utils")
|
||||||
const SCREEN_PREFIX = DocumentTypes.SCREEN + SEPARATOR
|
const SCREEN_PREFIX = DocumentType.SCREEN + SEPARATOR
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* INFORMATION *
|
* INFORMATION *
|
||||||
|
|
|
@ -5,14 +5,14 @@ import {
|
||||||
Document,
|
Document,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
export enum LoopStepTypes {
|
export enum LoopStepType {
|
||||||
ARRAY = "Array",
|
ARRAY = "Array",
|
||||||
STRING = "String",
|
STRING = "String",
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LoopStep extends AutomationStep {
|
export interface LoopStep extends AutomationStep {
|
||||||
inputs: {
|
inputs: {
|
||||||
option: LoopStepTypes
|
option: LoopStepType
|
||||||
[key: string]: any
|
[key: string]: any
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
export { Query, Datasource } from "./datasource"
|
import { Document } from "@budibase/types"
|
||||||
export { FieldSchema, TableSchema, Table, Document, Row } from "@budibase/types"
|
export {
|
||||||
|
Query,
|
||||||
|
Datasource,
|
||||||
|
FieldSchema,
|
||||||
|
TableSchema,
|
||||||
|
Table,
|
||||||
|
Document,
|
||||||
|
Row,
|
||||||
|
} from "@budibase/types"
|
||||||
|
|
||||||
export interface Application extends Document {
|
export interface Application extends Document {
|
||||||
_id: string
|
_id: string
|
||||||
|
|
|
@ -1,32 +1,3 @@
|
||||||
import { SortDirection, Operation, SourceNames } from "@budibase/types"
|
|
||||||
// export everything that used to be exported from here
|
|
||||||
export {
|
|
||||||
Operation,
|
|
||||||
SortDirection,
|
|
||||||
QueryTypes,
|
|
||||||
DatasourceFieldTypes,
|
|
||||||
SourceNames,
|
|
||||||
IncludeRelationships,
|
|
||||||
FilterTypes,
|
|
||||||
QueryDefinition,
|
|
||||||
ExtraQueryConfig,
|
|
||||||
Integration,
|
|
||||||
IntegrationBase,
|
|
||||||
QueryParameter,
|
|
||||||
PaginationConfig,
|
|
||||||
PaginationValues,
|
|
||||||
RestQueryFields,
|
|
||||||
Query,
|
|
||||||
Datasource,
|
|
||||||
SearchFilters,
|
|
||||||
SortJson,
|
|
||||||
PaginationJson,
|
|
||||||
RenameColumn,
|
|
||||||
RelationshipsJson,
|
|
||||||
QueryJson,
|
|
||||||
SqlQuery,
|
|
||||||
} from "@budibase/types"
|
|
||||||
|
|
||||||
/********************************************
|
/********************************************
|
||||||
* This file contains structures which are *
|
* This file contains structures which are *
|
||||||
* internal to the server and don't need to *
|
* internal to the server and don't need to *
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
|
@ -21,61 +21,61 @@ module AirtableModule {
|
||||||
type: "Spreadsheet",
|
type: "Spreadsheet",
|
||||||
datasource: {
|
datasource: {
|
||||||
apiKey: {
|
apiKey: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
default: "enter api key",
|
default: "enter api key",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
base: {
|
base: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "mybase",
|
default: "mybase",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
view: {
|
view: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
numRecords: {
|
numRecords: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
default: 10,
|
default: 10,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
id: {
|
id: {
|
||||||
display: "Record ID",
|
display: "Record ID",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
|
@ -24,35 +24,35 @@ module ArangoModule {
|
||||||
"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",
|
"ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",
|
||||||
datasource: {
|
datasource: {
|
||||||
url: {
|
url: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "http://localhost:8529",
|
default: "http://localhost:8529",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
username: {
|
username: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "root",
|
default: "root",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
databaseName: {
|
databaseName: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "_system",
|
default: "_system",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
collection: {
|
collection: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,12 @@ import { Knex, knex } from "knex"
|
||||||
import {
|
import {
|
||||||
Operation,
|
Operation,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
QueryOptions,
|
|
||||||
RelationshipsJson,
|
RelationshipsJson,
|
||||||
SearchFilters,
|
SearchFilters,
|
||||||
SortDirection,
|
SortDirection,
|
||||||
} from "../../definitions/datasource"
|
} from "@budibase/types"
|
||||||
import { isIsoDateString, SqlClients } from "../utils"
|
import { QueryOptions } from "../../definitions/datasource"
|
||||||
|
import { isIsoDateString, SqlClient } from "../utils"
|
||||||
import SqlTableQueryBuilder from "./sqlTable"
|
import SqlTableQueryBuilder from "./sqlTable"
|
||||||
import environment from "../../environment"
|
import environment from "../../environment"
|
||||||
|
|
||||||
|
@ -27,14 +27,14 @@ function likeKey(client: string, key: string): string {
|
||||||
}
|
}
|
||||||
let start: string, end: string
|
let start: string, end: string
|
||||||
switch (client) {
|
switch (client) {
|
||||||
case SqlClients.MY_SQL:
|
case SqlClient.MY_SQL:
|
||||||
start = end = "`"
|
start = end = "`"
|
||||||
break
|
break
|
||||||
case SqlClients.ORACLE:
|
case SqlClient.ORACLE:
|
||||||
case SqlClients.POSTGRES:
|
case SqlClient.POSTGRES:
|
||||||
start = end = '"'
|
start = end = '"'
|
||||||
break
|
break
|
||||||
case SqlClients.MS_SQL:
|
case SqlClient.MS_SQL:
|
||||||
start = "["
|
start = "["
|
||||||
end = "]"
|
end = "]"
|
||||||
break
|
break
|
||||||
|
@ -102,7 +102,7 @@ function generateSelectStatement(
|
||||||
if (
|
if (
|
||||||
columnName &&
|
columnName &&
|
||||||
schema?.[columnName] &&
|
schema?.[columnName] &&
|
||||||
knex.client.config.client === SqlClients.POSTGRES
|
knex.client.config.client === SqlClient.POSTGRES
|
||||||
) {
|
) {
|
||||||
const externalType = schema[columnName].externalType
|
const externalType = schema[columnName].externalType
|
||||||
if (externalType?.includes("money")) {
|
if (externalType?.includes("money")) {
|
||||||
|
@ -146,7 +146,7 @@ class InternalBuilder {
|
||||||
const like = (key: string, value: any) => {
|
const like = (key: string, value: any) => {
|
||||||
const fnc = allOr ? "orWhere" : "where"
|
const fnc = allOr ? "orWhere" : "where"
|
||||||
// postgres supports ilike, nothing else does
|
// postgres supports ilike, nothing else does
|
||||||
if (this.client === SqlClients.POSTGRES) {
|
if (this.client === SqlClient.POSTGRES) {
|
||||||
query = query[fnc](key, "ilike", `%${value}%`)
|
query = query[fnc](key, "ilike", `%${value}%`)
|
||||||
} else {
|
} else {
|
||||||
const rawFnc = `${fnc}Raw`
|
const rawFnc = `${fnc}Raw`
|
||||||
|
@ -173,7 +173,7 @@ class InternalBuilder {
|
||||||
iterate(filters.string, (key, value) => {
|
iterate(filters.string, (key, value) => {
|
||||||
const fnc = allOr ? "orWhere" : "where"
|
const fnc = allOr ? "orWhere" : "where"
|
||||||
// postgres supports ilike, nothing else does
|
// postgres supports ilike, nothing else does
|
||||||
if (this.client === SqlClients.POSTGRES) {
|
if (this.client === SqlClient.POSTGRES) {
|
||||||
query = query[fnc](key, "ilike", `${value}%`)
|
query = query[fnc](key, "ilike", `${value}%`)
|
||||||
} else {
|
} else {
|
||||||
const rawFnc = `${fnc}Raw`
|
const rawFnc = `${fnc}Raw`
|
||||||
|
@ -229,7 +229,7 @@ class InternalBuilder {
|
||||||
if (filters.contains) {
|
if (filters.contains) {
|
||||||
const fnc = allOr ? "orWhere" : "where"
|
const fnc = allOr ? "orWhere" : "where"
|
||||||
const rawFnc = `${fnc}Raw`
|
const rawFnc = `${fnc}Raw`
|
||||||
if (this.client === SqlClients.POSTGRES) {
|
if (this.client === SqlClient.POSTGRES) {
|
||||||
iterate(filters.contains, (key: string, value: any) => {
|
iterate(filters.contains, (key: string, value: any) => {
|
||||||
const fieldNames = key.split(/\./g)
|
const fieldNames = key.split(/\./g)
|
||||||
const tableName = fieldNames[0]
|
const tableName = fieldNames[0]
|
||||||
|
@ -242,7 +242,7 @@ class InternalBuilder {
|
||||||
`"${tableName}"."${columnName}"::jsonb @> '[${value}]'`
|
`"${tableName}"."${columnName}"::jsonb @> '[${value}]'`
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
} else if (this.client === SqlClients.MY_SQL) {
|
} else if (this.client === SqlClient.MY_SQL) {
|
||||||
iterate(filters.contains, (key: string, value: any) => {
|
iterate(filters.contains, (key: string, value: any) => {
|
||||||
if (typeof value === "string") {
|
if (typeof value === "string") {
|
||||||
value = `"${value}"`
|
value = `"${value}"`
|
||||||
|
@ -265,7 +265,7 @@ class InternalBuilder {
|
||||||
const direction = value === SortDirection.ASCENDING ? "asc" : "desc"
|
const direction = value === SortDirection.ASCENDING ? "asc" : "desc"
|
||||||
query = query.orderBy(`${table?.name}.${key}`, direction)
|
query = query.orderBy(`${table?.name}.${key}`, direction)
|
||||||
}
|
}
|
||||||
} else if (this.client === SqlClients.MS_SQL && paginate?.limit) {
|
} else if (this.client === SqlClient.MS_SQL && paginate?.limit) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
query = query.orderBy(`${table?.name}.${table?.primary[0]}`)
|
query = query.orderBy(`${table?.name}.${table?.primary[0]}`)
|
||||||
}
|
}
|
||||||
|
@ -414,7 +414,7 @@ class InternalBuilder {
|
||||||
[tableName]: query,
|
[tableName]: query,
|
||||||
}).select(selectStatement)
|
}).select(selectStatement)
|
||||||
// have to add after as well (this breaks MS-SQL)
|
// have to add after as well (this breaks MS-SQL)
|
||||||
if (this.client !== SqlClients.MS_SQL) {
|
if (this.client !== SqlClient.MS_SQL) {
|
||||||
preQuery = this.addSorting(preQuery, json)
|
preQuery = this.addSorting(preQuery, json)
|
||||||
}
|
}
|
||||||
// handle joins
|
// handle joins
|
||||||
|
@ -565,9 +565,9 @@ class SqlQueryBuilder extends SqlTableQueryBuilder {
|
||||||
// same as delete, manage returning
|
// same as delete, manage returning
|
||||||
if (operation === Operation.CREATE || operation === Operation.UPDATE) {
|
if (operation === Operation.CREATE || operation === Operation.UPDATE) {
|
||||||
let id
|
let id
|
||||||
if (sqlClient === SqlClients.MS_SQL) {
|
if (sqlClient === SqlClient.MS_SQL) {
|
||||||
id = results?.[0].id
|
id = results?.[0].id
|
||||||
} else if (sqlClient === SqlClients.MY_SQL) {
|
} else if (sqlClient === SqlClient.MY_SQL) {
|
||||||
id = results?.insertId
|
id = results?.insertId
|
||||||
}
|
}
|
||||||
row = processFn(
|
row = processFn(
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
import { Knex, knex } from "knex"
|
import { Knex, knex } from "knex"
|
||||||
import { Table } from "../../definitions/common"
|
import { Operation, QueryJson, RenameColumn, Table } from "@budibase/types"
|
||||||
import {
|
|
||||||
Operation,
|
|
||||||
QueryJson,
|
|
||||||
RenameColumn,
|
|
||||||
} from "../../definitions/datasource"
|
|
||||||
import { breakExternalTableId } from "../utils"
|
import { breakExternalTableId } from "../utils"
|
||||||
import SchemaBuilder = Knex.SchemaBuilder
|
import SchemaBuilder = Knex.SchemaBuilder
|
||||||
import CreateTableBuilder = Knex.CreateTableBuilder
|
import CreateTableBuilder = Knex.CreateTableBuilder
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { QueryJson } from "../../definitions/datasource"
|
import { QueryJson, Datasource } from "@budibase/types"
|
||||||
import { Datasource } from "../../definitions/common"
|
|
||||||
|
|
||||||
module DatasourceUtils {
|
module DatasourceUtils {
|
||||||
const { integrations } = require("../index")
|
const { integrations } = require("../index")
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
|
@ -21,30 +21,30 @@ module CouchDBModule {
|
||||||
"Apache CouchDB is an open-source document-oriented NoSQL database, implemented in Erlang.",
|
"Apache CouchDB is an open-source document-oriented NoSQL database, implemented in Erlang.",
|
||||||
datasource: {
|
datasource: {
|
||||||
url: {
|
url: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
default: "http://localhost:5984",
|
default: "http://localhost:5984",
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
id: {
|
id: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
|
@ -24,101 +24,101 @@ module DynamoModule {
|
||||||
type: "Non-relational",
|
type: "Non-relational",
|
||||||
datasource: {
|
datasource: {
|
||||||
region: {
|
region: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
default: "us-east-1",
|
default: "us-east-1",
|
||||||
},
|
},
|
||||||
accessKeyId: {
|
accessKeyId: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
secretAccessKey: {
|
secretAccessKey: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
endpoint: {
|
endpoint: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: false,
|
required: false,
|
||||||
default: "https://dynamodb.us-east-1.amazonaws.com",
|
default: "https://dynamodb.us-east-1.amazonaws.com",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
readable: true,
|
readable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
scan: {
|
scan: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
readable: true,
|
readable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
describe: {
|
describe: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
readable: true,
|
readable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
get: {
|
get: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
readable: true,
|
readable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
table: {
|
table: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
|
||||||
|
@ -20,55 +20,55 @@ module ElasticsearchModule {
|
||||||
type: "Non-relational",
|
type: "Non-relational",
|
||||||
datasource: {
|
datasource: {
|
||||||
url: {
|
url: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
default: "http://localhost:9200",
|
default: "http://localhost:9200",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
customisable: true,
|
customisable: true,
|
||||||
fields: {
|
fields: {
|
||||||
id: {
|
id: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
index: {
|
index: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
id: {
|
id: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
Integration,
|
Integration,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import { Firestore, WhereFilterOp } from "@google-cloud/firestore"
|
import { Firestore, WhereFilterOp } from "@google-cloud/firestore"
|
||||||
|
@ -21,46 +21,46 @@ module Firebase {
|
||||||
"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
|
"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
|
||||||
datasource: {
|
datasource: {
|
||||||
email: {
|
email: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
privateKey: {
|
privateKey: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
projectId: {
|
projectId: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
extra: {
|
extra: {
|
||||||
collection: {
|
collection: {
|
||||||
displayName: "Collection",
|
displayName: "Collection",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
filterField: {
|
filterField: {
|
||||||
displayName: "Filter field",
|
displayName: "Filter field",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
filter: {
|
filter: {
|
||||||
displayName: "Filter comparison",
|
displayName: "Filter comparison",
|
||||||
type: DatasourceFieldTypes.LIST,
|
type: DatasourceFieldType.LIST,
|
||||||
required: false,
|
required: false,
|
||||||
data: {
|
data: {
|
||||||
read: [
|
read: [
|
||||||
|
@ -79,7 +79,7 @@ module Firebase {
|
||||||
},
|
},
|
||||||
filterValue: {
|
filterValue: {
|
||||||
displayName: "Filter value",
|
displayName: "Filter value",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
Integration,
|
Integration,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
Table,
|
Table,
|
||||||
TableSchema,
|
TableSchema,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
|
@ -54,59 +54,59 @@ module GoogleSheetsModule {
|
||||||
datasource: {
|
datasource: {
|
||||||
spreadsheetId: {
|
spreadsheetId: {
|
||||||
display: "Google Sheet URL",
|
display: "Google Sheet URL",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
sheet: {
|
sheet: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
row: {
|
row: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
sheet: {
|
sheet: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
sheet: {
|
sheet: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
rowIndex: {
|
rowIndex: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
row: {
|
row: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
sheet: {
|
sheet: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
rowIndex: {
|
rowIndex: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,54 +13,54 @@ const googlesheets = require("./googlesheets")
|
||||||
const firebase = require("./firebase")
|
const firebase = require("./firebase")
|
||||||
const redis = require("./redis")
|
const redis = require("./redis")
|
||||||
const snowflake = require("./snowflake")
|
const snowflake = require("./snowflake")
|
||||||
const { SourceNames } = require("../definitions/datasource")
|
const { SourceName } = require("@budibase/types")
|
||||||
const environment = require("../environment")
|
const environment = require("../environment")
|
||||||
|
|
||||||
const DEFINITIONS = {
|
const DEFINITIONS = {
|
||||||
[SourceNames.POSTGRES]: postgres.schema,
|
[SourceName.POSTGRES]: postgres.schema,
|
||||||
[SourceNames.DYNAMODB]: dynamodb.schema,
|
[SourceName.DYNAMODB]: dynamodb.schema,
|
||||||
[SourceNames.MONGODB]: mongodb.schema,
|
[SourceName.MONGODB]: mongodb.schema,
|
||||||
[SourceNames.ELASTICSEARCH]: elasticsearch.schema,
|
[SourceName.ELASTICSEARCH]: elasticsearch.schema,
|
||||||
[SourceNames.COUCHDB]: couchdb.schema,
|
[SourceName.COUCHDB]: couchdb.schema,
|
||||||
[SourceNames.SQL_SERVER]: sqlServer.schema,
|
[SourceName.SQL_SERVER]: sqlServer.schema,
|
||||||
[SourceNames.S3]: s3.schema,
|
[SourceName.S3]: s3.schema,
|
||||||
[SourceNames.AIRTABLE]: airtable.schema,
|
[SourceName.AIRTABLE]: airtable.schema,
|
||||||
[SourceNames.MYSQL]: mysql.schema,
|
[SourceName.MYSQL]: mysql.schema,
|
||||||
[SourceNames.ARANGODB]: arangodb.schema,
|
[SourceName.ARANGODB]: arangodb.schema,
|
||||||
[SourceNames.REST]: rest.schema,
|
[SourceName.REST]: rest.schema,
|
||||||
[SourceNames.FIRESTORE]: firebase.schema,
|
[SourceName.FIRESTORE]: firebase.schema,
|
||||||
[SourceNames.REDIS]: redis.schema,
|
[SourceName.REDIS]: redis.schema,
|
||||||
[SourceNames.SNOWFLAKE]: snowflake.schema,
|
[SourceName.SNOWFLAKE]: snowflake.schema,
|
||||||
}
|
}
|
||||||
|
|
||||||
const INTEGRATIONS = {
|
const INTEGRATIONS = {
|
||||||
[SourceNames.POSTGRES]: postgres.integration,
|
[SourceName.POSTGRES]: postgres.integration,
|
||||||
[SourceNames.DYNAMODB]: dynamodb.integration,
|
[SourceName.DYNAMODB]: dynamodb.integration,
|
||||||
[SourceNames.MONGODB]: mongodb.integration,
|
[SourceName.MONGODB]: mongodb.integration,
|
||||||
[SourceNames.ELASTICSEARCH]: elasticsearch.integration,
|
[SourceName.ELASTICSEARCH]: elasticsearch.integration,
|
||||||
[SourceNames.COUCHDB]: couchdb.integration,
|
[SourceName.COUCHDB]: couchdb.integration,
|
||||||
[SourceNames.SQL_SERVER]: sqlServer.integration,
|
[SourceName.SQL_SERVER]: sqlServer.integration,
|
||||||
[SourceNames.S3]: s3.integration,
|
[SourceName.S3]: s3.integration,
|
||||||
[SourceNames.AIRTABLE]: airtable.integration,
|
[SourceName.AIRTABLE]: airtable.integration,
|
||||||
[SourceNames.MYSQL]: mysql.integration,
|
[SourceName.MYSQL]: mysql.integration,
|
||||||
[SourceNames.ARANGODB]: arangodb.integration,
|
[SourceName.ARANGODB]: arangodb.integration,
|
||||||
[SourceNames.REST]: rest.integration,
|
[SourceName.REST]: rest.integration,
|
||||||
[SourceNames.FIRESTORE]: firebase.integration,
|
[SourceName.FIRESTORE]: firebase.integration,
|
||||||
[SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
|
[SourceName.GOOGLE_SHEETS]: googlesheets.integration,
|
||||||
[SourceNames.REDIS]: redis.integration,
|
[SourceName.REDIS]: redis.integration,
|
||||||
[SourceNames.FIREBASE]: firebase.integration,
|
[SourceName.FIREBASE]: firebase.integration,
|
||||||
[SourceNames.SNOWFLAKE]: snowflake.integration,
|
[SourceName.SNOWFLAKE]: snowflake.integration,
|
||||||
}
|
}
|
||||||
|
|
||||||
// optionally add oracle integration if the oracle binary can be installed
|
// optionally add oracle integration if the oracle binary can be installed
|
||||||
if (process.arch && !process.arch.startsWith("arm")) {
|
if (process.arch && !process.arch.startsWith("arm")) {
|
||||||
const oracle = require("./oracle")
|
const oracle = require("./oracle")
|
||||||
DEFINITIONS[SourceNames.ORACLE] = oracle.schema
|
DEFINITIONS[SourceName.ORACLE] = oracle.schema
|
||||||
INTEGRATIONS[SourceNames.ORACLE] = oracle.integration
|
INTEGRATIONS[SourceName.ORACLE] = oracle.integration
|
||||||
}
|
}
|
||||||
|
|
||||||
if (environment.SELF_HOSTED) {
|
if (environment.SELF_HOSTED) {
|
||||||
DEFINITIONS[SourceNames.GOOGLE_SHEETS] = googlesheets.schema
|
DEFINITIONS[SourceName.GOOGLE_SHEETS] = googlesheets.schema
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import {
|
import {
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
Integration,
|
Integration,
|
||||||
Operation,
|
Operation,
|
||||||
Table,
|
Table,
|
||||||
TableSchema,
|
TableSchema,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
SqlQuery,
|
SqlQuery,
|
||||||
DatasourcePlus,
|
DatasourcePlus,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
|
@ -14,7 +14,7 @@ import {
|
||||||
buildExternalTableId,
|
buildExternalTableId,
|
||||||
convertSqlType,
|
convertSqlType,
|
||||||
finaliseExternalTables,
|
finaliseExternalTables,
|
||||||
SqlClients,
|
SqlClient,
|
||||||
} from "./utils"
|
} from "./utils"
|
||||||
|
|
||||||
module MSSQLModule {
|
module MSSQLModule {
|
||||||
|
@ -48,48 +48,48 @@ module MSSQLModule {
|
||||||
type: "Relational",
|
type: "Relational",
|
||||||
datasource: {
|
datasource: {
|
||||||
user: {
|
user: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
default: "localhost",
|
default: "localhost",
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "localhost",
|
default: "localhost",
|
||||||
},
|
},
|
||||||
port: {
|
port: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
required: false,
|
required: false,
|
||||||
default: 1433,
|
default: 1433,
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "root",
|
default: "root",
|
||||||
},
|
},
|
||||||
schema: {
|
schema: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: DEFAULT_SCHEMA,
|
default: DEFAULT_SCHEMA,
|
||||||
},
|
},
|
||||||
encrypt: {
|
encrypt: {
|
||||||
type: DatasourceFieldTypes.BOOLEAN,
|
type: DatasourceFieldType.BOOLEAN,
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ module MSSQLModule {
|
||||||
"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"
|
"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"
|
||||||
|
|
||||||
constructor(config: MSSQLConfig) {
|
constructor(config: MSSQLConfig) {
|
||||||
super(SqlClients.MS_SQL)
|
super(SqlClient.MS_SQL)
|
||||||
this.config = config
|
this.config = config
|
||||||
const clientCfg = {
|
const clientCfg = {
|
||||||
...this.config,
|
...this.config,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import {
|
import {
|
||||||
|
@ -29,38 +29,38 @@ module MongoDBModule {
|
||||||
"MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
|
"MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
|
||||||
datasource: {
|
datasource: {
|
||||||
connectionString: {
|
connectionString: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
default: "mongodb://localhost:27017",
|
default: "mongodb://localhost:27017",
|
||||||
},
|
},
|
||||||
db: {
|
db: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
extra: {
|
extra: {
|
||||||
collection: {
|
collection: {
|
||||||
displayName: "Collection",
|
displayName: "Collection",
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
actionTypes: {
|
actionTypes: {
|
||||||
displayName: "Action Types",
|
displayName: "Action Types",
|
||||||
type: DatasourceFieldTypes.LIST,
|
type: DatasourceFieldType.LIST,
|
||||||
required: true,
|
required: true,
|
||||||
data: {
|
data: {
|
||||||
read: ["find", "findOne", "findOneAndUpdate", "count", "distinct"],
|
read: ["find", "findOne", "findOneAndUpdate", "count", "distinct"],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
SqlQuery,
|
SqlQuery,
|
||||||
Table,
|
Table,
|
||||||
|
@ -10,7 +10,7 @@ import {
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import {
|
import {
|
||||||
getSqlQuery,
|
getSqlQuery,
|
||||||
SqlClients,
|
SqlClient,
|
||||||
buildExternalTableId,
|
buildExternalTableId,
|
||||||
convertSqlType,
|
convertSqlType,
|
||||||
finaliseExternalTables,
|
finaliseExternalTables,
|
||||||
|
@ -42,51 +42,51 @@ module MySQLModule {
|
||||||
"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
|
"MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
|
||||||
datasource: {
|
datasource: {
|
||||||
host: {
|
host: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "localhost",
|
default: "localhost",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
port: {
|
port: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
default: 3306,
|
default: 3306,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "root",
|
default: "root",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
default: "root",
|
default: "root",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
ssl: {
|
ssl: {
|
||||||
type: DatasourceFieldTypes.OBJECT,
|
type: DatasourceFieldType.OBJECT,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
rejectUnauthorized: {
|
rejectUnauthorized: {
|
||||||
type: DatasourceFieldTypes.BOOLEAN,
|
type: DatasourceFieldType.BOOLEAN,
|
||||||
default: true,
|
default: true,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -120,7 +120,7 @@ module MySQLModule {
|
||||||
public schemaErrors: Record<string, string> = {}
|
public schemaErrors: Record<string, string> = {}
|
||||||
|
|
||||||
constructor(config: MySQLConfig) {
|
constructor(config: MySQLConfig) {
|
||||||
super(SqlClients.MY_SQL)
|
super(SqlClient.MY_SQL)
|
||||||
this.config = config
|
this.config = config
|
||||||
if (config.ssl && Object.keys(config.ssl).length === 0) {
|
if (config.ssl && Object.keys(config.ssl).length === 0) {
|
||||||
delete config.ssl
|
delete config.ssl
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {
|
import {
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
Integration,
|
Integration,
|
||||||
Operation,
|
Operation,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
SqlQuery,
|
SqlQuery,
|
||||||
Table,
|
Table,
|
||||||
DatasourcePlus,
|
DatasourcePlus,
|
||||||
|
@ -13,7 +13,7 @@ import {
|
||||||
convertSqlType,
|
convertSqlType,
|
||||||
finaliseExternalTables,
|
finaliseExternalTables,
|
||||||
getSqlQuery,
|
getSqlQuery,
|
||||||
SqlClients,
|
SqlClient,
|
||||||
} from "./utils"
|
} from "./utils"
|
||||||
import oracledb, {
|
import oracledb, {
|
||||||
BindParameters,
|
BindParameters,
|
||||||
|
@ -45,40 +45,40 @@ module OracleModule {
|
||||||
"Oracle Database is an object-relational database management system developed by Oracle Corporation",
|
"Oracle Database is an object-relational database management system developed by Oracle Corporation",
|
||||||
datasource: {
|
datasource: {
|
||||||
host: {
|
host: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "localhost",
|
default: "localhost",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
port: {
|
port: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
required: true,
|
required: true,
|
||||||
default: 1521,
|
default: 1521,
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ module OracleModule {
|
||||||
OR cons.status IS NULL)
|
OR cons.status IS NULL)
|
||||||
`
|
`
|
||||||
constructor(config: OracleConfig) {
|
constructor(config: OracleConfig) {
|
||||||
super(SqlClients.ORACLE)
|
super(SqlClient.ORACLE)
|
||||||
this.config = config
|
this.config = config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
QueryJson,
|
QueryJson,
|
||||||
SqlQuery,
|
SqlQuery,
|
||||||
Table,
|
Table,
|
||||||
|
@ -12,7 +12,7 @@ import {
|
||||||
buildExternalTableId,
|
buildExternalTableId,
|
||||||
convertSqlType,
|
convertSqlType,
|
||||||
finaliseExternalTables,
|
finaliseExternalTables,
|
||||||
SqlClients,
|
SqlClient,
|
||||||
} from "./utils"
|
} from "./utils"
|
||||||
|
|
||||||
module PostgresModule {
|
module PostgresModule {
|
||||||
|
@ -52,63 +52,63 @@ module PostgresModule {
|
||||||
"PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
|
"PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
|
||||||
datasource: {
|
datasource: {
|
||||||
host: {
|
host: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "localhost",
|
default: "localhost",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
port: {
|
port: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
required: true,
|
required: true,
|
||||||
default: 5432,
|
default: 5432,
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "postgres",
|
default: "postgres",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "root",
|
default: "root",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
password: {
|
password: {
|
||||||
type: DatasourceFieldTypes.PASSWORD,
|
type: DatasourceFieldType.PASSWORD,
|
||||||
default: "root",
|
default: "root",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
schema: {
|
schema: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "public",
|
default: "public",
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
ssl: {
|
ssl: {
|
||||||
type: DatasourceFieldTypes.BOOLEAN,
|
type: DatasourceFieldType.BOOLEAN,
|
||||||
default: false,
|
default: false,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
rejectUnauthorized: {
|
rejectUnauthorized: {
|
||||||
type: DatasourceFieldTypes.BOOLEAN,
|
type: DatasourceFieldType.BOOLEAN,
|
||||||
default: false,
|
default: false,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
ca: {
|
ca: {
|
||||||
type: DatasourceFieldTypes.LONGFORM,
|
type: DatasourceFieldType.LONGFORM,
|
||||||
default: false,
|
default: false,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ module PostgresModule {
|
||||||
`
|
`
|
||||||
|
|
||||||
constructor(config: PostgresConfig) {
|
constructor(config: PostgresConfig) {
|
||||||
super(SqlClients.POSTGRES)
|
super(SqlClient.POSTGRES)
|
||||||
this.config = config
|
this.config = config
|
||||||
|
|
||||||
let newConfig = {
|
let newConfig = {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { DatasourceFieldTypes, Integration, QueryTypes } from "@budibase/types"
|
import { DatasourceFieldType, Integration, QueryType } from "@budibase/types"
|
||||||
import Redis from "ioredis"
|
import Redis from "ioredis"
|
||||||
|
|
||||||
module RedisModule {
|
module RedisModule {
|
||||||
|
@ -36,36 +36,36 @@ module RedisModule {
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
key: {
|
key: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
value: {
|
value: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
ttl: {
|
ttl: {
|
||||||
type: DatasourceFieldTypes.NUMBER,
|
type: DatasourceFieldType.NUMBER,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
readable: true,
|
readable: true,
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
key: {
|
key: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
key: {
|
key: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -73,7 +73,7 @@ module RedisModule {
|
||||||
command: {
|
command: {
|
||||||
readable: true,
|
readable: true,
|
||||||
displayName: "Redis Command",
|
displayName: "Redis Command",
|
||||||
type: QueryTypes.JSON,
|
type: QueryType.JSON,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import {
|
import {
|
||||||
Integration,
|
Integration,
|
||||||
DatasourceFieldTypes,
|
DatasourceFieldType,
|
||||||
QueryTypes,
|
QueryType,
|
||||||
PaginationConfig,
|
PaginationConfig,
|
||||||
IntegrationBase,
|
IntegrationBase,
|
||||||
PaginationValues,
|
PaginationValues,
|
||||||
|
RestQueryFields as RestQuery,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import {
|
import {
|
||||||
RestConfig,
|
RestConfig,
|
||||||
RestQueryFields as RestQuery,
|
|
||||||
AuthType,
|
AuthType,
|
||||||
BasicAuthConfig,
|
BasicAuthConfig,
|
||||||
BearerAuthConfig,
|
BearerAuthConfig,
|
||||||
|
@ -26,27 +26,27 @@ const BodyTypes = {
|
||||||
|
|
||||||
const coreFields = {
|
const coreFields = {
|
||||||
path: {
|
path: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
display: "URL",
|
display: "URL",
|
||||||
},
|
},
|
||||||
queryString: {
|
queryString: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
},
|
},
|
||||||
headers: {
|
headers: {
|
||||||
type: DatasourceFieldTypes.OBJECT,
|
type: DatasourceFieldType.OBJECT,
|
||||||
},
|
},
|
||||||
enabledHeaders: {
|
enabledHeaders: {
|
||||||
type: DatasourceFieldTypes.OBJECT,
|
type: DatasourceFieldType.OBJECT,
|
||||||
},
|
},
|
||||||
requestBody: {
|
requestBody: {
|
||||||
type: DatasourceFieldTypes.JSON,
|
type: DatasourceFieldType.JSON,
|
||||||
},
|
},
|
||||||
bodyType: {
|
bodyType: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
enum: Object.values(BodyTypes),
|
enum: Object.values(BodyTypes),
|
||||||
},
|
},
|
||||||
pagination: {
|
pagination: {
|
||||||
type: DatasourceFieldTypes.OBJECT,
|
type: DatasourceFieldType.OBJECT,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,13 +69,13 @@ module RestModule {
|
||||||
type: "API",
|
type: "API",
|
||||||
datasource: {
|
datasource: {
|
||||||
url: {
|
url: {
|
||||||
type: DatasourceFieldTypes.STRING,
|
type: DatasourceFieldType.STRING,
|
||||||
default: "",
|
default: "",
|
||||||
required: false,
|
required: false,
|
||||||
deprecated: true,
|
deprecated: true,
|
||||||
},
|
},
|
||||||
defaultHeaders: {
|
defaultHeaders: {
|
||||||
type: DatasourceFieldTypes.OBJECT,
|
type: DatasourceFieldType.OBJECT,
|
||||||
required: false,
|
required: false,
|
||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
|
@ -84,30 +84,30 @@ module RestModule {
|
||||||
create: {
|
create: {
|
||||||
readable: true,
|
readable: true,
|
||||||
displayName: "POST",
|
displayName: "POST",
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: coreFields,
|
fields: coreFields,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
displayName: "GET",
|
displayName: "GET",
|
||||||
readable: true,
|
readable: true,
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: coreFields,
|
fields: coreFields,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
displayName: "PUT",
|
displayName: "PUT",
|
||||||
readable: true,
|
readable: true,
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: coreFields,
|
fields: coreFields,
|
||||||
},
|
},
|
||||||
patch: {
|
patch: {
|
||||||
displayName: "PATCH",
|
displayName: "PATCH",
|
||||||
readable: true,
|
readable: true,
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: coreFields,
|
fields: coreFields,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
displayName: "DELETE",
|
displayName: "DELETE",
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: coreFields,
|
fields: coreFields,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Integration, QueryTypes, IntegrationBase } from "@budibase/types"
|
import { Integration, QueryType, IntegrationBase } from "@budibase/types"
|
||||||
|
|
||||||
module S3Module {
|
module S3Module {
|
||||||
const AWS = require("aws-sdk")
|
const AWS = require("aws-sdk")
|
||||||
|
@ -43,7 +43,7 @@ module S3Module {
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.FIELDS,
|
type: QueryType.FIELDS,
|
||||||
fields: {
|
fields: {
|
||||||
bucket: {
|
bucket: {
|
||||||
type: "string",
|
type: "string",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Integration, QueryTypes, SqlQuery } from "@budibase/types"
|
import { Integration, QueryType, SqlQuery } from "@budibase/types"
|
||||||
import { Snowflake } from "snowflake-promise"
|
import { Snowflake } from "snowflake-promise"
|
||||||
|
|
||||||
module SnowflakeModule {
|
module SnowflakeModule {
|
||||||
|
@ -45,16 +45,16 @@ module SnowflakeModule {
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
create: {
|
create: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
read: {
|
read: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
type: QueryTypes.SQL,
|
type: QueryType.SQL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const Sql = require("../base/sql")
|
const Sql = require("../base/sql")
|
||||||
const { SqlClients } = require("../utils")
|
const { SqlClient } = require("../utils")
|
||||||
|
|
||||||
const TABLE_NAME = "test"
|
const TABLE_NAME = "test"
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ function generateDeleteJson(table = TABLE_NAME, filters = {}) {
|
||||||
|
|
||||||
describe("SQL query builder", () => {
|
describe("SQL query builder", () => {
|
||||||
const limit = 500
|
const limit = 500
|
||||||
const client = SqlClients.POSTGRES
|
const client = SqlClient.POSTGRES
|
||||||
let sql
|
let sql
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
@ -174,7 +174,7 @@ describe("SQL query builder", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should work with MS-SQL", () => {
|
it("should work with MS-SQL", () => {
|
||||||
const query = new Sql(SqlClients.MS_SQL, 10)._query(generateReadJson())
|
const query = new Sql(SqlClient.MS_SQL, 10)._query(generateReadJson())
|
||||||
expect(query).toEqual({
|
expect(query).toEqual({
|
||||||
bindings: [10],
|
bindings: [10],
|
||||||
sql: `select * from (select top (@p0) * from [${TABLE_NAME}]) as [${TABLE_NAME}]`
|
sql: `select * from (select top (@p0) * from [${TABLE_NAME}]) as [${TABLE_NAME}]`
|
||||||
|
@ -182,7 +182,7 @@ describe("SQL query builder", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should work with MySQL", () => {
|
it("should work with MySQL", () => {
|
||||||
const query = new Sql(SqlClients.MY_SQL, 10)._query(generateReadJson())
|
const query = new Sql(SqlClient.MY_SQL, 10)._query(generateReadJson())
|
||||||
expect(query).toEqual({
|
expect(query).toEqual({
|
||||||
bindings: [10],
|
bindings: [10],
|
||||||
sql: `select * from (select * from \`${TABLE_NAME}\` limit ?) as \`${TABLE_NAME}\``
|
sql: `select * from (select * from \`${TABLE_NAME}\` limit ?) as \`${TABLE_NAME}\``
|
||||||
|
@ -241,7 +241,7 @@ describe("SQL query builder", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should use like expression for MS-SQL when filter is contains", () => {
|
it("should use like expression for MS-SQL when filter is contains", () => {
|
||||||
const query = new Sql(SqlClients.MS_SQL, 10)._query(generateReadJson({
|
const query = new Sql(SqlClient.MS_SQL, 10)._query(generateReadJson({
|
||||||
filters: {
|
filters: {
|
||||||
contains: {
|
contains: {
|
||||||
age: 20,
|
age: 20,
|
||||||
|
@ -256,7 +256,7 @@ describe("SQL query builder", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should use JSON_CONTAINS expression for MySQL when filter is contains", () => {
|
it("should use JSON_CONTAINS expression for MySQL when filter is contains", () => {
|
||||||
const query = new Sql(SqlClients.MY_SQL, 10)._query(generateReadJson({
|
const query = new Sql(SqlClient.MY_SQL, 10)._query(generateReadJson({
|
||||||
filters: {
|
filters: {
|
||||||
contains: {
|
contains: {
|
||||||
age: 20,
|
age: 20,
|
||||||
|
@ -271,7 +271,7 @@ describe("SQL query builder", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should use jsonb operator expression for PostgreSQL when filter is contains", () => {
|
it("should use jsonb operator expression for PostgreSQL when filter is contains", () => {
|
||||||
const query = new Sql(SqlClients.POSTGRES, 10)._query(generateReadJson({
|
const query = new Sql(SqlClient.POSTGRES, 10)._query(generateReadJson({
|
||||||
filters: {
|
filters: {
|
||||||
contains: {
|
contains: {
|
||||||
age: 20,
|
age: 20,
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { SourceNames, SqlQuery } from "../definitions/datasource"
|
import { SourceName, SqlQuery, Datasource, Table } from "@budibase/types"
|
||||||
import { Datasource, Table } from "../definitions/common"
|
import { DocumentType, SEPARATOR } from "../db/utils"
|
||||||
import { DocumentTypes, SEPARATOR } from "../db/utils"
|
|
||||||
import { FieldTypes, BuildSchemaErrors, InvalidColumns } from "../constants"
|
import { FieldTypes, BuildSchemaErrors, InvalidColumns } from "../constants"
|
||||||
|
|
||||||
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
|
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
|
||||||
|
@ -68,7 +67,7 @@ const SQL_TYPE_MAP = {
|
||||||
...SQL_MISC_TYPE_MAP,
|
...SQL_MISC_TYPE_MAP,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SqlClients {
|
export enum SqlClient {
|
||||||
MS_SQL = "mssql",
|
MS_SQL = "mssql",
|
||||||
POSTGRES = "pg",
|
POSTGRES = "pg",
|
||||||
MY_SQL = "mysql2",
|
MY_SQL = "mysql2",
|
||||||
|
@ -76,7 +75,7 @@ export enum SqlClients {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isExternalTable(tableId: string) {
|
export function isExternalTable(tableId: string) {
|
||||||
return tableId.includes(DocumentTypes.DATASOURCE)
|
return tableId.includes(DocumentType.DATASOURCE)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function buildExternalTableId(datasourceId: string, tableName: string) {
|
export function buildExternalTableId(datasourceId: string, tableName: string) {
|
||||||
|
@ -169,10 +168,10 @@ export function isSQL(datasource: Datasource): boolean {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
const SQL = [
|
const SQL = [
|
||||||
SourceNames.POSTGRES,
|
SourceName.POSTGRES,
|
||||||
SourceNames.SQL_SERVER,
|
SourceName.SQL_SERVER,
|
||||||
SourceNames.MYSQL,
|
SourceName.MYSQL,
|
||||||
SourceNames.ORACLE,
|
SourceName.ORACLE,
|
||||||
]
|
]
|
||||||
return SQL.indexOf(datasource.source) !== -1
|
return SQL.indexOf(datasource.source) !== -1
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ const {
|
||||||
setDebounce,
|
setDebounce,
|
||||||
} = require("../utilities/redis")
|
} = require("../utilities/redis")
|
||||||
const { doWithDB } = require("@budibase/backend-core/db")
|
const { doWithDB } = require("@budibase/backend-core/db")
|
||||||
const { DocumentTypes, getGlobalIDFromUserMetadataID } = require("../db/utils")
|
const { DocumentType, getGlobalIDFromUserMetadataID } = require("../db/utils")
|
||||||
const { PermissionTypes } = require("@budibase/backend-core/permissions")
|
const { PermissionTypes } = require("@budibase/backend-core/permissions")
|
||||||
const { app: appCache } = require("@budibase/backend-core/cache")
|
const { app: appCache } = require("@budibase/backend-core/cache")
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ async function updateAppUpdatedAt(ctx) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
await doWithDB(appId, async db => {
|
await doWithDB(appId, async db => {
|
||||||
const metadata = await db.get(DocumentTypes.APP_METADATA)
|
const metadata = await db.get(DocumentType.APP_METADATA)
|
||||||
metadata.updatedAt = new Date().toISOString()
|
metadata.updatedAt = new Date().toISOString()
|
||||||
|
|
||||||
metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user.userId)
|
metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user.userId)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { DocumentTypes } = require("@budibase/backend-core/db")
|
const { DocumentType } = require("@budibase/backend-core/db")
|
||||||
import { getAppUrl } from "../../api/controllers/application"
|
import { getAppUrl } from "../../api/controllers/application"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,7 +11,7 @@ import { getAppUrl } from "../../api/controllers/application"
|
||||||
export const run = async (appDb: any) => {
|
export const run = async (appDb: any) => {
|
||||||
let metadata
|
let metadata
|
||||||
try {
|
try {
|
||||||
metadata = await appDb.get(DocumentTypes.APP_METADATA)
|
metadata = await appDb.get(DocumentType.APP_METADATA)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// sometimes the metadata document doesn't exist
|
// sometimes the metadata document doesn't exist
|
||||||
// exit early instead of failing the migration
|
// exit early instead of failing the migration
|
||||||
|
|
|
@ -62,7 +62,7 @@ export const run = async (appDb: any) => {
|
||||||
await events.backfillCache.start(EVENTS)
|
await events.backfillCache.start(EVENTS)
|
||||||
|
|
||||||
let timestamp: string | number = DEFAULT_TIMESTAMP
|
let timestamp: string | number = DEFAULT_TIMESTAMP
|
||||||
const app: App = await appDb.get(dbUtils.DocumentTypes.APP_METADATA)
|
const app: App = await appDb.get(dbUtils.DocumentType.APP_METADATA)
|
||||||
if (app.createdAt) {
|
if (app.createdAt) {
|
||||||
timestamp = app.createdAt as string
|
timestamp = app.createdAt as string
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { events } from "@budibase/backend-core"
|
import { events } from "@budibase/backend-core"
|
||||||
import { getQueryParams } from "../../../../db/utils"
|
import { getQueryParams } from "../../../../db/utils"
|
||||||
import { Query, Datasource, SourceNames } from "@budibase/types"
|
import { Query, Datasource, SourceName } from "@budibase/types"
|
||||||
|
|
||||||
const getQueries = async (appDb: any): Promise<Query[]> => {
|
const getQueries = async (appDb: any): Promise<Query[]> => {
|
||||||
const response = await appDb.allDocs(
|
const response = await appDb.allDocs(
|
||||||
|
@ -33,7 +33,7 @@ export const backfill = async (appDb: any, timestamp: string | number) => {
|
||||||
datasource = {
|
datasource = {
|
||||||
type: "unknown",
|
type: "unknown",
|
||||||
_id: query.datasourceId,
|
_id: query.datasourceId,
|
||||||
source: SourceNames.UNKNOWN,
|
source: SourceName.UNKNOWN,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw e
|
throw e
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { DEFAULT_TIMESTAMP } from ".."
|
||||||
|
|
||||||
// manually define user doc params - normally server doesn't read users from the db
|
// manually define user doc params - normally server doesn't read users from the db
|
||||||
const getUserParams = (props: any) => {
|
const getUserParams = (props: any) => {
|
||||||
return dbUtils.getDocParams(dbUtils.DocumentTypes.USER, null, props)
|
return dbUtils.getDocParams(dbUtils.DocumentType.USER, null, props)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getUsers = async (globalDb: any): Promise<User[]> => {
|
export const getUsers = async (globalDb: any): Promise<User[]> => {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const { DocumentTypes, doWithDB } = require("@budibase/backend-core/db")
|
const { DocumentType, doWithDB } = require("@budibase/backend-core/db")
|
||||||
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
||||||
|
|
||||||
const migration = require("../appUrls")
|
const migration = require("../appUrls")
|
||||||
|
@ -15,11 +15,11 @@ describe("run", () => {
|
||||||
it("runs successfully", async () => {
|
it("runs successfully", async () => {
|
||||||
const app = await config.createApp("testApp")
|
const app = await config.createApp("testApp")
|
||||||
const metadata = await doWithDB(app.appId, async db => {
|
const metadata = await doWithDB(app.appId, async db => {
|
||||||
const metadataDoc = await db.get(DocumentTypes.APP_METADATA)
|
const metadataDoc = await db.get( DocumentType.APP_METADATA)
|
||||||
delete metadataDoc.url
|
delete metadataDoc.url
|
||||||
await db.put(metadataDoc)
|
await db.put(metadataDoc)
|
||||||
await migration.run(db)
|
await migration.run(db)
|
||||||
return await db.get(DocumentTypes.APP_METADATA)
|
return await db.get( DocumentType.APP_METADATA)
|
||||||
})
|
})
|
||||||
expect(metadata.url).toEqual("/testapp")
|
expect(metadata.url).toEqual("/testapp")
|
||||||
})
|
})
|
||||||
|
|
|
@ -2,7 +2,7 @@ import {
|
||||||
events,
|
events,
|
||||||
migrations,
|
migrations,
|
||||||
tenancy,
|
tenancy,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
context,
|
context,
|
||||||
db,
|
db,
|
||||||
} from "@budibase/backend-core"
|
} from "@budibase/backend-core"
|
||||||
|
@ -17,7 +17,7 @@ const timestamp = mocks.date.MOCK_DATE.toISOString()
|
||||||
const clearMigrations = async () => {
|
const clearMigrations = async () => {
|
||||||
const dbs = [context.getDevAppDB(), context.getProdAppDB()]
|
const dbs = [context.getDevAppDB(), context.getProdAppDB()]
|
||||||
for (const db of dbs) {
|
for (const db of dbs) {
|
||||||
const doc = await db.get(DocumentTypes.MIGRATIONS)
|
const doc = await db.get(DocumentType.MIGRATIONS)
|
||||||
const newDoc = { _id: doc._id, _rev: doc._rev }
|
const newDoc = { _id: doc._id, _rev: doc._rev }
|
||||||
await db.put(newDoc)
|
await db.put(newDoc)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ const newid = require("../../db/newid")
|
||||||
const context = require("@budibase/backend-core/context")
|
const context = require("@budibase/backend-core/context")
|
||||||
const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db")
|
const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db")
|
||||||
const { encrypt } = require("@budibase/backend-core/encryption")
|
const { encrypt } = require("@budibase/backend-core/encryption")
|
||||||
const { DocumentTypes } = require("../../db/utils")
|
const { DocumentType } = require("../../db/utils")
|
||||||
|
|
||||||
const GLOBAL_USER_ID = "us_uuid1"
|
const GLOBAL_USER_ID = "us_uuid1"
|
||||||
const EMAIL = "babs@babs.com"
|
const EMAIL = "babs@babs.com"
|
||||||
|
@ -344,7 +344,7 @@ class TestConfiguration {
|
||||||
|
|
||||||
return context.doInAppContext(prodAppId, async () => {
|
return context.doInAppContext(prodAppId, async () => {
|
||||||
const db = context.getProdAppDB()
|
const db = context.getProdAppDB()
|
||||||
return await db.get(DocumentTypes.APP_METADATA)
|
return await db.get(DocumentType.APP_METADATA)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { storeLog } from "../automations/logging"
|
||||||
import { Automation, AutomationStep, AutomationStatus } from "@budibase/types"
|
import { Automation, AutomationStep, AutomationStatus } from "@budibase/types"
|
||||||
import {
|
import {
|
||||||
LoopStep,
|
LoopStep,
|
||||||
LoopStepTypes,
|
LoopStepType,
|
||||||
LoopInput,
|
LoopInput,
|
||||||
AutomationEvent,
|
AutomationEvent,
|
||||||
TriggerOutput,
|
TriggerOutput,
|
||||||
|
@ -35,12 +35,12 @@ function typecastForLooping(loopStep: LoopStep, input: LoopInput) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
switch (loopStep.inputs.option) {
|
switch (loopStep.inputs.option) {
|
||||||
case LoopStepTypes.ARRAY:
|
case LoopStepType.ARRAY:
|
||||||
if (typeof input.binding === "string") {
|
if (typeof input.binding === "string") {
|
||||||
return JSON.parse(input.binding)
|
return JSON.parse(input.binding)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case LoopStepTypes.STRING:
|
case LoopStepType.STRING:
|
||||||
if (Array.isArray(input.binding)) {
|
if (Array.isArray(input.binding)) {
|
||||||
return input.binding.join(",")
|
return input.binding.join(",")
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ const {
|
||||||
lowerBuiltinRoleID,
|
lowerBuiltinRoleID,
|
||||||
getBuiltinRoles,
|
getBuiltinRoles,
|
||||||
} = require("@budibase/backend-core/roles")
|
} = require("@budibase/backend-core/roles")
|
||||||
const { DocumentTypes } = require("../db/utils")
|
const { DocumentType } = require("../db/utils")
|
||||||
|
|
||||||
const CURRENTLY_SUPPORTED_LEVELS = [
|
const CURRENTLY_SUPPORTED_LEVELS = [
|
||||||
PermissionLevels.WRITE,
|
PermissionLevels.WRITE,
|
||||||
|
@ -17,19 +17,19 @@ const CURRENTLY_SUPPORTED_LEVELS = [
|
||||||
]
|
]
|
||||||
|
|
||||||
exports.getPermissionType = resourceId => {
|
exports.getPermissionType = resourceId => {
|
||||||
const docType = Object.values(DocumentTypes).filter(docType =>
|
const docType = Object.values(DocumentType).filter(docType =>
|
||||||
resourceId.startsWith(docType)
|
resourceId.startsWith(docType)
|
||||||
)[0]
|
)[0]
|
||||||
switch (docType) {
|
switch (docType) {
|
||||||
case DocumentTypes.TABLE:
|
case DocumentType.TABLE:
|
||||||
case DocumentTypes.ROW:
|
case DocumentType.ROW:
|
||||||
return PermissionTypes.TABLE
|
return PermissionTypes.TABLE
|
||||||
case DocumentTypes.AUTOMATION:
|
case DocumentType.AUTOMATION:
|
||||||
return PermissionTypes.AUTOMATION
|
return PermissionTypes.AUTOMATION
|
||||||
case DocumentTypes.WEBHOOK:
|
case DocumentType.WEBHOOK:
|
||||||
return PermissionTypes.WEBHOOK
|
return PermissionTypes.WEBHOOK
|
||||||
case DocumentTypes.QUERY:
|
case DocumentType.QUERY:
|
||||||
case DocumentTypes.DATASOURCE:
|
case DocumentType.DATASOURCE:
|
||||||
return PermissionTypes.QUERY
|
return PermissionTypes.QUERY
|
||||||
default:
|
default:
|
||||||
// views don't have an ID, will end up here
|
// views don't have an ID, will end up here
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { Document } from "../document"
|
import { Document } from "../document"
|
||||||
import { SourceNames } from "../../sdk"
|
import { SourceName } from "../../sdk"
|
||||||
import { Table } from "./table"
|
import { Table } from "./table"
|
||||||
|
|
||||||
export interface Datasource extends Document {
|
export interface Datasource extends Document {
|
||||||
type: string
|
type: string
|
||||||
name?: string
|
name?: string
|
||||||
source: SourceNames
|
source: SourceName
|
||||||
// the config is defined by the schema
|
// the config is defined by the schema
|
||||||
config?: {
|
config?: {
|
||||||
[key: string]: string | number | boolean
|
[key: string]: string | number | boolean
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Document } from "../document"
|
import { Document } from "../document"
|
||||||
|
|
||||||
export enum FieldTypes {
|
export enum FieldType {
|
||||||
STRING = "string",
|
STRING = "string",
|
||||||
LONGFORM = "longform",
|
LONGFORM = "longform",
|
||||||
OPTIONS = "options",
|
OPTIONS = "options",
|
||||||
|
|
|
@ -2,3 +2,4 @@ export * from "./account"
|
||||||
export * from "./app"
|
export * from "./app"
|
||||||
export * from "./global"
|
export * from "./global"
|
||||||
export * from "./platform"
|
export * from "./platform"
|
||||||
|
export * from "./document"
|
||||||
|
|
|
@ -16,13 +16,13 @@ export enum SortDirection {
|
||||||
DESCENDING = "DESCENDING",
|
DESCENDING = "DESCENDING",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum QueryTypes {
|
export enum QueryType {
|
||||||
SQL = "sql",
|
SQL = "sql",
|
||||||
JSON = "json",
|
JSON = "json",
|
||||||
FIELDS = "fields",
|
FIELDS = "fields",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DatasourceFieldTypes {
|
export enum DatasourceFieldType {
|
||||||
STRING = "string",
|
STRING = "string",
|
||||||
LONGFORM = "longForm",
|
LONGFORM = "longForm",
|
||||||
BOOLEAN = "boolean",
|
BOOLEAN = "boolean",
|
||||||
|
@ -34,7 +34,7 @@ export enum DatasourceFieldTypes {
|
||||||
FILE = "file",
|
FILE = "file",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SourceNames {
|
export enum SourceName {
|
||||||
POSTGRES = "POSTGRES",
|
POSTGRES = "POSTGRES",
|
||||||
DYNAMODB = "DYNAMODB",
|
DYNAMODB = "DYNAMODB",
|
||||||
MONGODB = "MONGODB",
|
MONGODB = "MONGODB",
|
||||||
|
@ -54,12 +54,12 @@ export enum SourceNames {
|
||||||
UNKNOWN = "unknown",
|
UNKNOWN = "unknown",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum IncludeRelationships {
|
export enum IncludeRelationship {
|
||||||
INCLUDE = 1,
|
INCLUDE = 1,
|
||||||
EXCLUDE = 0,
|
EXCLUDE = 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum FilterTypes {
|
export enum FilterType {
|
||||||
STRING = "string",
|
STRING = "string",
|
||||||
FUZZY = "fuzzy",
|
FUZZY = "fuzzy",
|
||||||
RANGE = "range",
|
RANGE = "range",
|
||||||
|
@ -71,7 +71,7 @@ export enum FilterTypes {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface QueryDefinition {
|
export interface QueryDefinition {
|
||||||
type: QueryTypes
|
type: QueryType
|
||||||
displayName?: string
|
displayName?: string
|
||||||
readable?: boolean
|
readable?: boolean
|
||||||
customisable?: boolean
|
customisable?: boolean
|
||||||
|
|
|
@ -2,7 +2,7 @@ const { getAllRoles } = require("@budibase/backend-core/roles")
|
||||||
const {
|
const {
|
||||||
getAllApps,
|
getAllApps,
|
||||||
getProdAppID,
|
getProdAppID,
|
||||||
DocumentTypes,
|
DocumentType,
|
||||||
} = require("@budibase/backend-core/db")
|
} = require("@budibase/backend-core/db")
|
||||||
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
|
const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
|
||||||
const { user: userCache } = require("@budibase/backend-core/cache")
|
const { user: userCache } = require("@budibase/backend-core/cache")
|
||||||
|
@ -36,7 +36,7 @@ exports.find = async ctx => {
|
||||||
const appId = ctx.params.appId
|
const appId = ctx.params.appId
|
||||||
await doInAppContext(appId, async () => {
|
await doInAppContext(appId, async () => {
|
||||||
const db = getAppDB()
|
const db = getAppDB()
|
||||||
const app = await db.get(DocumentTypes.APP_METADATA)
|
const app = await db.get(DocumentType.APP_METADATA)
|
||||||
ctx.body = {
|
ctx.body = {
|
||||||
roles: await getAllRoles(),
|
roles: await getAllRoles(),
|
||||||
name: app.name,
|
name: app.name,
|
||||||
|
|
Loading…
Reference in New Issue