A quick refactor to get rid of the old 'FieldTypes' enumeration, considering how core it is to all data handling in Budibase, the fact we had both 'FieldType' and 'FieldTypes' was confusing - righting this fully.

This commit is contained in:
mike12345567 2024-01-24 16:58:13 +00:00
parent 34d7fe4372
commit ccc751d09c
31 changed files with 306 additions and 285 deletions

View File

@ -1,4 +1,4 @@
import { FieldTypes, RelationshipType, FormulaTypes } from "../../src/constants"
import { FieldType, FormulaType, RelationshipType } from "@budibase/types"
import { object } from "./utils"
import Resource from "./utils/Resource"
@ -27,7 +27,7 @@ const table = {
const baseColumnDef = {
type: {
type: "string",
enum: Object.values(FieldTypes),
enum: Object.values(FieldType),
description:
"Defines the type of the column, most explain themselves, a link column is a relationship.",
},
@ -81,7 +81,7 @@ const tableSchema = {
...baseColumnDef,
type: {
type: "string",
enum: [FieldTypes.LINK],
enum: [FieldType.LINK],
description: "A relationship column.",
},
fieldName: {
@ -128,7 +128,7 @@ const tableSchema = {
...baseColumnDef,
type: {
type: "string",
enum: [FieldTypes.FORMULA],
enum: [FieldType.FORMULA],
description: "A formula column.",
},
formula: {
@ -138,7 +138,7 @@ const tableSchema = {
},
formulaType: {
type: "string",
enum: Object.values(FormulaTypes),
enum: Object.values(FormulaType),
description:
"Defines whether this is a static or dynamic formula.",
},

View File

@ -1,4 +1,5 @@
import {
AutoFieldSubType,
AutoReason,
Datasource,
FieldSchema,
@ -27,7 +28,6 @@ import {
isSQL,
} from "../../../integrations/utils"
import { getDatasourceAndQuery } from "../../../sdk/app/rows/utils"
import { AutoFieldSubTypes, FieldTypes } from "../../../constants"
import { processObjectSync } from "@budibase/string-templates"
import { cloneDeep } from "lodash/fp"
import { processDates, processFormulas } from "../../../utilities/rowProcessor"
@ -111,10 +111,10 @@ function buildFilters(
*/
function cleanupConfig(config: RunConfig, table: Table): RunConfig {
const primaryOptions = [
FieldTypes.STRING,
FieldTypes.LONGFORM,
FieldTypes.OPTIONS,
FieldTypes.NUMBER,
FieldType.STRING,
FieldType.LONGFORM,
FieldType.OPTIONS,
FieldType.NUMBER,
]
// filter out fields which cannot be keys
const fieldNames = Object.entries(table.schema)
@ -241,10 +241,7 @@ function basicProcessing({
function fixArrayTypes(row: Row, table: Table) {
for (let [fieldName, schema] of Object.entries(table.schema)) {
if (
schema.type === FieldTypes.ARRAY &&
typeof row[fieldName] === "string"
) {
if (schema.type === FieldType.ARRAY && typeof row[fieldName] === "string") {
try {
row[fieldName] = JSON.parse(row[fieldName])
} catch (err) {
@ -274,8 +271,8 @@ function isEditableColumn(column: FieldSchema) {
const isExternalAutoColumn =
column.autocolumn &&
column.autoReason !== AutoReason.FOREIGN_KEY &&
column.subtype !== AutoFieldSubTypes.AUTO_ID
const isFormula = column.type === FieldTypes.FORMULA
column.subtype !== AutoFieldSubType.AUTO_ID
const isFormula = column.type === FieldType.FORMULA
return !(isExternalAutoColumn || isFormula)
}
@ -322,11 +319,11 @@ export class ExternalRequest<T extends Operation> {
continue
}
// parse floats/numbers
if (field.type === FieldTypes.NUMBER && !isNaN(parseFloat(row[key]))) {
if (field.type === FieldType.NUMBER && !isNaN(parseFloat(row[key]))) {
newRow[key] = parseFloat(row[key])
}
// if its not a link then just copy it over
if (field.type !== FieldTypes.LINK) {
if (field.type !== FieldType.LINK) {
newRow[key] = row[key]
continue
}
@ -532,7 +529,7 @@ export class ExternalRequest<T extends Operation> {
buildRelationships(table: Table): RelationshipsJson[] {
const relationships = []
for (let [fieldName, field] of Object.entries(table.schema)) {
if (field.type !== FieldTypes.LINK) {
if (field.type !== FieldType.LINK) {
continue
}
const { tableName: linkTableName } = breakExternalTableId(field.tableId)
@ -586,7 +583,7 @@ export class ExternalRequest<T extends Operation> {
// we need this to work out if any relationships need removed
for (const field of Object.values(table.schema)) {
if (
field.type !== FieldTypes.LINK ||
field.type !== FieldType.LINK ||
!field.fieldName ||
isOneSide(field)
) {
@ -730,15 +727,15 @@ export class ExternalRequest<T extends Operation> {
return Object.entries(table.schema)
.filter(
column =>
column[1].type !== FieldTypes.LINK &&
column[1].type !== FieldTypes.FORMULA &&
column[1].type !== FieldType.LINK &&
column[1].type !== FieldType.FORMULA &&
!existing.find((field: string) => field === column[0])
)
.map(column => `${table.name}.${column[0]}`)
}
let fields = extractRealFields(table)
for (let field of Object.values(table.schema)) {
if (field.type !== FieldTypes.LINK || !includeRelations) {
if (field.type !== FieldType.LINK || !includeRelations) {
continue
}
const { tableName: linkTableName } = breakExternalTableId(field.tableId)

View File

@ -1,4 +1,3 @@
import { FieldTypes } from "../../../constants"
import {
breakExternalTableId,
breakRowIdField,
@ -9,6 +8,7 @@ import {
RunConfig,
} from "./ExternalRequest"
import {
FieldType,
Datasource,
IncludeRelationship,
Operation,
@ -154,7 +154,7 @@ export async function fetchEnrichedRow(ctx: UserCtx) {
// for a single row, there is probably a better way to do this with some smart multi-layer joins
for (let [fieldName, field] of Object.entries(table.schema)) {
if (
field.type !== FieldTypes.LINK ||
field.type !== FieldType.LINK ||
!row[fieldName] ||
row[fieldName].length === 0
) {

View File

@ -6,12 +6,12 @@ import {
inputProcessing,
outputProcessing,
} from "../../../utilities/rowProcessor"
import { FieldTypes } from "../../../constants"
import * as utils from "./utils"
import { cloneDeep } from "lodash/fp"
import { context } from "@budibase/backend-core"
import { finaliseRow, updateRelatedFormula } from "./staticFormula"
import {
FieldType,
LinkDocumentValue,
PatchRowRequest,
PatchRowResponse,
@ -225,7 +225,7 @@ export async function fetchEnrichedRow(ctx: UserCtx) {
// insert the link rows in the correct place throughout the main row
for (let fieldName of Object.keys(table.schema)) {
let field = table.schema[fieldName]
if (field.type === FieldTypes.LINK) {
if (field.type === FieldType.LINK) {
// find the links that pertain to this field
const links = linkVals.filter(link => link.fieldName === fieldName)
// find the rows that the links state are linked to this field

View File

@ -4,9 +4,15 @@ import {
processAutoColumn,
processFormulas,
} from "../../../utilities/rowProcessor"
import { FieldTypes, FormulaTypes } from "../../../constants"
import { context, locks } from "@budibase/backend-core"
import { Table, Row, LockType, LockName } from "@budibase/types"
import {
Table,
Row,
LockType,
LockName,
FormulaType,
FieldType,
} from "@budibase/types"
import * as linkRows from "../../../db/linkedRows"
import sdk from "../../../sdk"
import isEqual from "lodash/isEqual"
@ -35,7 +41,7 @@ export async function updateRelatedFormula(
let relatedRows: Record<string, Row[]> = {}
for (let [key, field] of Object.entries(enrichedRow)) {
const columnDefinition = table.schema[key]
if (columnDefinition && columnDefinition.type === FieldTypes.LINK) {
if (columnDefinition && columnDefinition.type === FieldType.LINK) {
const relatedTableId = columnDefinition.tableId!
if (!relatedRows[relatedTableId]) {
relatedRows[relatedTableId] = []
@ -63,8 +69,8 @@ export async function updateRelatedFormula(
for (let column of Object.values(relatedTable!.schema)) {
// needs updated in related rows
if (
column.type === FieldTypes.FORMULA &&
column.formulaType === FormulaTypes.STATIC
column.type === FieldType.FORMULA &&
column.formulaType === FormulaType.STATIC
) {
// re-enrich rows for all the related, don't update the related formula for them
promises = promises.concat(

View File

@ -1,4 +1,4 @@
import { FormulaTypes } from "../../../constants"
import { FormulaType } from "../../../constants"
import { clearColumns } from "./utils"
import { doesContainStrings } from "@budibase/string-templates"
import { cloneDeep } from "lodash/fp"
@ -17,10 +17,10 @@ import { isRelationshipColumn } from "../../../db/utils"
function isStaticFormula(
column: FieldSchema
): column is FormulaFieldMetadata & { formulaType: FormulaTypes.STATIC } {
): column is FormulaFieldMetadata & { formulaType: FormulaType.STATIC } {
return (
column.type === FieldType.FORMULA &&
column.formulaType === FormulaTypes.STATIC
column.formulaType === FormulaType.STATIC
)
}

View File

@ -1,5 +1,5 @@
import { FieldType } from "@budibase/types"
import { AutoFieldSubTypes } from "../../../../constants"
import { AutoFieldSubType } from "../../../../constants"
import TestConfiguration from "../../../../tests/utilities/TestConfiguration"
import { importToRows } from "../utils"
@ -22,7 +22,7 @@ describe("utils", () => {
autoId: {
name: "autoId",
type: FieldType.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
autocolumn: true,
constraints: {
type: FieldType.NUMBER,
@ -69,7 +69,7 @@ describe("utils", () => {
autoId: {
name: "autoId",
type: FieldType.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
autocolumn: true,
constraints: {
type: FieldType.NUMBER,

View File

@ -2,8 +2,6 @@ import { parse, isSchema, isRows } from "../../../utilities/schema"
import { getRowParams, generateRowID, InternalTables } from "../../../db/utils"
import isEqual from "lodash/isEqual"
import {
AutoFieldSubTypes,
FieldTypes,
GOOGLE_SHEETS_PRIMARY_KEY,
USERS_TABLE_SCHEMA,
SwitchableTypes,
@ -19,6 +17,7 @@ import { cloneDeep } from "lodash/fp"
import { quotas } from "@budibase/pro"
import { events, context } from "@budibase/backend-core"
import {
AutoFieldSubType,
ContextUser,
Datasource,
Row,
@ -106,7 +105,7 @@ export function makeSureTableUpToDate(table: Table, tableToSave: Table) {
for ([field, column] of Object.entries(table.schema)) {
if (
column.autocolumn &&
column.subtype === AutoFieldSubTypes.AUTO_ID &&
column.subtype === AutoFieldSubType.AUTO_ID &&
tableToSave.schema[field]
) {
const tableCol = tableToSave.schema[field] as NumberFieldMetadata
@ -144,8 +143,8 @@ export async function importToRows(
? row[fieldName]
: [row[fieldName]]
if (
(schema.type === FieldTypes.OPTIONS ||
schema.type === FieldTypes.ARRAY) &&
(schema.type === FieldType.OPTIONS ||
schema.type === FieldType.ARRAY) &&
row[fieldName]
) {
let merged = [...schema.constraints!.inclusion!, ...rowVal]
@ -403,7 +402,7 @@ export async function checkForViewUpdates(
)
const newViewTemplate = viewTemplate(
viewMetadata,
groupByField?.type === FieldTypes.ARRAY
groupByField?.type === FieldType.ARRAY
)
const viewName = view.name!
await saveView(null, viewName, newViewTemplate)
@ -434,7 +433,7 @@ export function generateJunctionTableName(
export function foreignKeyStructure(keyName: string, meta?: any) {
const structure: any = {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
constraints: {},
name: keyName,
}

View File

@ -6,8 +6,8 @@ import { fetchView } from "../row"
import { context, events } from "@budibase/backend-core"
import { DocumentType } from "../../../db/utils"
import sdk from "../../../sdk"
import { FieldTypes } from "../../../constants"
import {
FieldType,
Ctx,
Row,
Table,
@ -37,7 +37,7 @@ export async function save(ctx: Ctx) {
(field: any) => field.name == viewToSave.groupBy
)
const view = viewTemplate(viewToSave, groupByField?.type === FieldTypes.ARRAY)
const view = viewTemplate(viewToSave, groupByField?.type === FieldType.ARRAY)
const viewName = viewToSave.name
if (!viewName) {

View File

@ -6,11 +6,11 @@ import * as setup from "./utilities"
import { context, InternalTable, roles, tenancy } from "@budibase/backend-core"
import { quotas } from "@budibase/pro"
import {
AutoFieldSubTypes,
AutoFieldSubType,
FieldSchema,
FieldType,
FieldTypeSubtypes,
FormulaTypes,
FormulaType,
INTERNAL_TABLE_SOURCE_ID,
MonthlyQuotaName,
PermissionLevel,
@ -192,7 +192,7 @@ describe.each([
"Row ID": {
name: "Row ID",
type: FieldType.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
@ -2032,7 +2032,7 @@ describe.each([
name: "formula",
type: FieldType.FORMULA,
formula: "{{ links.0.name }}",
formulaType: FormulaTypes.DYNAMIC,
formulaType: FormulaType.DYNAMIC,
},
},
}
@ -2086,7 +2086,7 @@ describe.each([
name: "formula",
type: FieldType.FORMULA,
formula: `{{ js "${js}"}}`,
formulaType: FormulaTypes.DYNAMIC,
formulaType: FormulaType.DYNAMIC,
},
},
})
@ -2129,7 +2129,7 @@ describe.each([
name: "formula",
type: FieldType.FORMULA,
formula: `{{ js "${js}"}}`,
formulaType: FormulaTypes.DYNAMIC,
formulaType: FormulaType.DYNAMIC,
},
},
})

View File

@ -1,6 +1,6 @@
import { context, events } from "@budibase/backend-core"
import {
AutoFieldSubTypes,
AutoFieldSubType,
FieldSubtype,
FieldType,
INTERNAL_TABLE_SOURCE_ID,
@ -205,7 +205,7 @@ describe("/tables", () => {
autoId: {
name: "id",
type: FieldType.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
autocolumn: true,
constraints: {
type: "number",

View File

@ -1,9 +1,9 @@
import * as rowController from "../../api/controllers/row"
import * as tableController from "../../api/controllers/table"
import { FieldTypes } from "../../constants"
import { buildCtx } from "./utils"
import * as automationUtils from "../automationUtils"
import {
FieldType,
AutomationActionStepId,
AutomationCustomIOType,
AutomationFeature,
@ -115,7 +115,7 @@ function typeCoercion(filters: SearchFilters, table: Table) {
if (!column || typeof value !== "string") {
continue
}
if (column.type === FieldTypes.NUMBER) {
if (column.type === FieldType.NUMBER) {
if (key === "oneOf") {
searchParam[property] = value
.split(",")
@ -148,11 +148,11 @@ export async function run({ inputs, appId }: AutomationStepInput) {
}
}
const table = await getTable(appId, tableId)
let sortType = FieldTypes.STRING
let sortType = FieldType.STRING
if (table && table.schema && table.schema[sortColumn] && sortColumn) {
const fieldType = table.schema[sortColumn].type
sortType =
fieldType === FieldTypes.NUMBER ? FieldTypes.NUMBER : FieldTypes.STRING
fieldType === FieldType.NUMBER ? FieldType.NUMBER : FieldType.STRING
}
const ctx: any = buildCtx(appId, null, {
params: {

View File

@ -1,16 +1,15 @@
import { constants, objectStore, roles } from "@budibase/backend-core"
import {
FieldType as FieldTypes,
FieldType,
INTERNAL_TABLE_SOURCE_ID,
Table,
TableSourceType,
} from "@budibase/types"
export {
FieldType as FieldTypes,
RelationshipType,
AutoFieldSubTypes,
FormulaTypes,
AutoFieldSubType,
FormulaType,
} from "@budibase/types"
export enum FilterTypes {
@ -36,14 +35,14 @@ export const NoEmptyFilterStrings = [
]
export const CanSwitchTypes = [
[FieldTypes.JSON, FieldTypes.ARRAY],
[FieldType.JSON, FieldType.ARRAY],
[
FieldTypes.STRING,
FieldTypes.OPTIONS,
FieldTypes.LONGFORM,
FieldTypes.BARCODEQR,
FieldType.STRING,
FieldType.OPTIONS,
FieldType.LONGFORM,
FieldType.BARCODEQR,
],
[FieldTypes.BOOLEAN, FieldTypes.NUMBER],
[FieldType.BOOLEAN, FieldType.NUMBER],
]
export const SwitchableTypes = CanSwitchTypes.reduce((prev, current) =>
@ -86,9 +85,9 @@ export const USERS_TABLE_SCHEMA: Table = {
// TODO: ADMIN PANEL - when implemented this doesn't need to be carried out
schema: {
email: {
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
email: true,
length: {
maximum: "",
@ -99,34 +98,34 @@ export const USERS_TABLE_SCHEMA: Table = {
},
firstName: {
name: "firstName",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
presence: false,
},
},
lastName: {
name: "lastName",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
presence: false,
},
},
roleId: {
name: "roleId",
type: FieldTypes.OPTIONS,
type: FieldType.OPTIONS,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
presence: false,
inclusion: Object.values(roles.BUILTIN_ROLE_IDS),
},
},
status: {
name: "status",
type: FieldTypes.OPTIONS,
type: FieldType.OPTIONS,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
presence: false,
inclusion: Object.values(constants.UserStatus),
},

View File

@ -1,6 +1,4 @@
import {
AutoFieldSubTypes,
FieldTypes,
DEFAULT_BB_DATASOURCE_ID,
DEFAULT_INVENTORY_TABLE_ID,
DEFAULT_EMPLOYEE_TABLE_ID,
@ -16,6 +14,7 @@ import { jobsImport } from "./jobsImport"
import { expensesImport } from "./expensesImport"
import { db as dbCore } from "@budibase/backend-core"
import {
AutoFieldSubType,
FieldType,
RelationshipType,
Row,
@ -40,7 +39,7 @@ function syncLastIds(table: Table, rowCount: number) {
if (
entry.autocolumn &&
entry.type === FieldType.NUMBER &&
entry.subtype == AutoFieldSubTypes.AUTO_ID
entry.subtype == AutoFieldSubType.AUTO_ID
) {
entry.lastID = rowCount
}
@ -58,12 +57,12 @@ async function tableImport(table: Table, data: Row[]) {
const AUTO_COLUMNS: TableSchema = {
"Created At": {
name: "Created At",
type: FieldTypes.DATETIME,
subtype: AutoFieldSubTypes.CREATED_AT,
type: FieldType.DATETIME,
subtype: AutoFieldSubType.CREATED_AT,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -74,12 +73,12 @@ const AUTO_COLUMNS: TableSchema = {
},
"Updated At": {
name: "Updated At",
type: FieldTypes.DATETIME,
subtype: AutoFieldSubTypes.UPDATED_AT,
type: FieldType.DATETIME,
subtype: AutoFieldSubType.UPDATED_AT,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -101,12 +100,12 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
schema: {
"Item ID": {
name: "Item ID",
type: FieldTypes.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
type: FieldType.NUMBER,
subtype: AutoFieldSubType.AUTO_ID,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: false,
numericality: {
greaterThanOrEqualTo: "",
@ -115,9 +114,9 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
},
},
"Item Name": {
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {
maximum: null,
},
@ -128,9 +127,9 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
name: "Item Name",
},
"Item Tags": {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: {
allowEmpty: false,
},
@ -140,9 +139,9 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
sortable: false,
},
Notes: {
type: FieldTypes.LONGFORM,
type: FieldType.LONGFORM,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
@ -150,9 +149,9 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
useRichText: null,
},
Status: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: {
allowEmpty: false,
},
@ -162,18 +161,18 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
sortable: false,
},
SKU: {
type: FieldTypes.BARCODEQR,
type: FieldType.BARCODEQR,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
name: "SKU",
},
"Purchase Date": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -185,9 +184,9 @@ export const DEFAULT_INVENTORY_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
"Purchase Price": {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: false,
numericality: {
greaterThanOrEqualTo: null,
@ -211,75 +210,75 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
schema: {
"First Name": {
name: "First Name",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
"Last Name": {
name: "Last Name",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
Email: {
name: "Email",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
Address: {
name: "Address",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
City: {
name: "City",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
Postcode: {
name: "Postcode",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
Phone: {
name: "Phone",
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
},
"EMPLOYEE ID": {
name: "EMPLOYEE ID",
type: FieldTypes.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
type: FieldType.NUMBER,
subtype: AutoFieldSubType.AUTO_ID,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: false,
numericality: {
greaterThanOrEqualTo: "",
@ -288,9 +287,9 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
},
},
"Employee Level": {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: false,
inclusion: ["Manager", "Junior", "Senior", "Apprentice", "Contractor"],
},
@ -298,18 +297,18 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
sortable: false,
},
"Badge Photo": {
type: FieldTypes.ATTACHMENT,
type: FieldType.ATTACHMENT,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: false,
},
name: "Badge Photo",
sortable: false,
},
Jobs: {
type: FieldTypes.LINK,
type: FieldType.LINK,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: false,
},
fieldName: "Assigned",
@ -318,9 +317,9 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
tableId: DEFAULT_JOBS_TABLE_ID,
},
"Start Date": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -332,9 +331,9 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
"End Date": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -359,12 +358,12 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
schema: {
"Job ID": {
name: "Job ID",
type: FieldTypes.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
type: FieldType.NUMBER,
subtype: AutoFieldSubType.AUTO_ID,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: false,
numericality: {
greaterThanOrEqualTo: "",
@ -373,9 +372,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
},
},
"Quote Date": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: {
allowEmpty: false,
@ -389,9 +388,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
"Quote Price": {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: {
allowEmpty: false,
},
@ -403,9 +402,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
name: "Quote Price",
},
"Works Start": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -417,9 +416,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
Address: {
type: FieldTypes.LONGFORM,
type: FieldType.LONGFORM,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
@ -427,9 +426,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
useRichText: null,
},
"Customer Name": {
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {
maximum: null,
},
@ -438,9 +437,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
name: "Customer Name",
},
Notes: {
type: FieldTypes.LONGFORM,
type: FieldType.LONGFORM,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
@ -448,9 +447,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
useRichText: null,
},
"Customer Phone": {
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {
maximum: null,
},
@ -459,9 +458,9 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
name: "Customer Phone",
},
"Customer Email": {
type: FieldTypes.STRING,
type: FieldType.STRING,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {
maximum: null,
},
@ -471,14 +470,14 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
},
Assigned: {
name: "Assigned",
type: FieldTypes.LINK,
type: FieldType.LINK,
tableId: DEFAULT_EMPLOYEE_TABLE_ID,
fieldName: "Jobs",
relationshipType: RelationshipType.MANY_TO_MANY,
// sortable: true,
},
"Works End": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: "string",
length: {},
@ -492,7 +491,7 @@ export const DEFAULT_JOBS_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
"Updated Price": {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
constraints: {
type: "number",
presence: false,
@ -518,12 +517,12 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
schema: {
"Expense ID": {
name: "Expense ID",
type: FieldTypes.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
type: FieldType.NUMBER,
subtype: AutoFieldSubType.AUTO_ID,
icon: "ri-magic-line",
autocolumn: true,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: false,
numericality: {
greaterThanOrEqualTo: "",
@ -532,9 +531,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
},
},
"Expense Tags": {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: {
allowEmpty: false,
},
@ -554,9 +553,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
sortable: false,
},
Cost: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
constraints: {
type: FieldTypes.NUMBER,
type: FieldType.NUMBER,
presence: {
allowEmpty: false,
},
@ -568,9 +567,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
name: "Cost",
},
Notes: {
type: FieldTypes.LONGFORM,
type: FieldType.LONGFORM,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
},
@ -578,9 +577,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
useRichText: null,
},
"Payment Due": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -592,9 +591,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
"Date Paid": {
type: FieldTypes.DATETIME,
type: FieldType.DATETIME,
constraints: {
type: FieldTypes.STRING,
type: FieldType.STRING,
length: {},
presence: false,
datetime: {
@ -606,9 +605,9 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
Attachment: {
type: FieldTypes.ATTACHMENT,
type: FieldType.ATTACHMENT,
constraints: {
type: FieldTypes.ARRAY,
type: FieldType.ARRAY,
presence: false,
},
name: "Attachment",

View File

@ -1,6 +1,5 @@
import { IncludeDocs, getLinkDocuments } from "./linkUtils"
import { InternalTables, getUserMetadataParams } from "../utils"
import { FieldTypes } from "../../constants"
import { context, logging } from "@budibase/backend-core"
import LinkDocument from "./LinkDocument"
import {
@ -62,7 +61,7 @@ class LinkController {
}
for (let fieldName of Object.keys(table.schema)) {
const { type } = table.schema[fieldName]
if (type === FieldTypes.LINK) {
if (type === FieldType.LINK) {
return true
}
}
@ -96,7 +95,7 @@ class LinkController {
validateTable(table: Table) {
const usedAlready = []
for (let schema of Object.values(table.schema)) {
if (schema.type !== FieldTypes.LINK) {
if (schema.type !== FieldType.LINK) {
continue
}
const unique = schema.tableId! + schema?.fieldName
@ -172,7 +171,7 @@ class LinkController {
// get the links this row wants to make
const rowField = row[fieldName]
const field = table.schema[fieldName]
if (field.type === FieldTypes.LINK && rowField != null) {
if (field.type === FieldType.LINK && rowField != null) {
// check which links actual pertain to the update in this row
const thisFieldLinkDocs = linkDocs.filter(
linkDoc =>
@ -353,7 +352,7 @@ class LinkController {
const schema = table.schema
for (let fieldName of Object.keys(schema)) {
const field = schema[fieldName]
if (field.type === FieldTypes.LINK && field.fieldName) {
if (field.type === FieldType.LINK && field.fieldName) {
// handle this in a separate try catch, want
// the put to bubble up as an error, if can't update
// table for some reason
@ -366,7 +365,7 @@ class LinkController {
}
const fields = this.handleRelationshipType(field, {
name: field.fieldName,
type: FieldTypes.LINK,
type: FieldType.LINK,
// these are the props of the table that initiated the link
tableId: table._id!,
fieldName: fieldName,
@ -413,10 +412,7 @@ class LinkController {
for (let fieldName of Object.keys(oldTable?.schema || {})) {
const field = oldTable?.schema[fieldName] as FieldSchema
// this field has been removed from the table schema
if (
field.type === FieldTypes.LINK &&
newTable.schema[fieldName] == null
) {
if (field.type === FieldType.LINK && newTable.schema[fieldName] == null) {
await this.removeFieldFromTable(fieldName)
}
}
@ -437,7 +433,7 @@ class LinkController {
for (let fieldName of Object.keys(schema)) {
const field = schema[fieldName]
try {
if (field.type === FieldTypes.LINK && field.fieldName) {
if (field.type === FieldType.LINK && field.fieldName) {
const linkedTable = await this._db.get<Table>(field.tableId)
delete linkedTable.schema[field.fieldName]
field.tableRev = (await this._db.put(linkedTable)).rev

View File

@ -1,6 +1,5 @@
import { generateLinkID } from "../utils"
import { FieldTypes } from "../../constants"
import { LinkDocument } from "@budibase/types"
import { FieldType, LinkDocument } from "@budibase/types"
/**
* Creates a new link document structure which can be put to the database. It is important to
@ -43,7 +42,7 @@ class LinkDocumentImpl implements LinkDocument {
fieldName1,
fieldName2
)
this.type = FieldTypes.LINK
this.type = FieldType.LINK
this.doc1 = {
tableId: tableId1,
fieldName: fieldName1,

View File

@ -1,8 +1,8 @@
import { ViewName, getQueryIndex, isRelationshipColumn } from "../utils"
import { FieldTypes } from "../../constants"
import { createLinkView } from "../views/staticViews"
import { context, logging } from "@budibase/backend-core"
import {
FieldType,
DatabaseQueryOpts,
LinkDocument,
LinkDocumentValue,
@ -131,11 +131,11 @@ export async function getLinkedTable(id: string, tables: Table[]) {
export function getRelatedTableForField(table: Table, fieldName: string) {
// look to see if its on the table, straight in the schema
const field = table.schema[fieldName]
if (field?.type === FieldTypes.LINK) {
if (field?.type === FieldType.LINK) {
return field.tableId
}
for (let column of Object.values(table.schema)) {
if (column.type === FieldTypes.LINK && column.fieldName === fieldName) {
if (column.type === FieldType.LINK && column.fieldName === fieldName) {
return column.tableId
}
}

View File

@ -1,6 +1,7 @@
import newid from "./newid"
import { db as dbCore } from "@budibase/backend-core"
import {
FieldType,
DocumentType,
FieldSchema,
RelationshipFieldMetadata,
@ -8,7 +9,6 @@ import {
INTERNAL_TABLE_SOURCE_ID,
DatabaseQueryOpts,
} from "@budibase/types"
import { FieldTypes } from "../constants"
export { DocumentType, VirtualDocumentType } from "@budibase/types"
@ -315,5 +315,5 @@ export function extractViewInfoFromID(viewId: string) {
export function isRelationshipColumn(
column: FieldSchema
): column is RelationshipFieldMetadata {
return column.type === FieldTypes.LINK
return column.type === FieldType.LINK
}

View File

@ -1,4 +1,5 @@
import {
FieldType,
DatasourceFieldType,
Integration,
Operation,
@ -21,7 +22,6 @@ import {
SqlClient,
} from "./utils"
import Sql from "./base/sql"
import { FieldTypes } from "../constants"
import {
BindParameters,
Connection,
@ -302,7 +302,7 @@ class OracleIntegration extends Sql implements DatasourcePlus {
})
if (this.isBooleanType(oracleColumn)) {
fieldSchema.type = FieldTypes.BOOLEAN
fieldSchema.type = FieldType.BOOLEAN
}
table.schema[columnName] = fieldSchema

View File

@ -1,7 +1,6 @@
import { CouchFindOptions, Table, Row } from "@budibase/types"
import { FieldType, CouchFindOptions, Table, Row } from "@budibase/types"
import { db as dbCore } from "@budibase/backend-core"
import { DocumentType, SEPARATOR } from "../../../db/utils"
import { FieldTypes } from "../../../constants"
// default limit - seems to work well for performance
export const FIND_LIMIT = 25
@ -31,7 +30,7 @@ export async function getRowsWithAttachments(appId: string, table: Table) {
const db = dbCore.getDB(appId)
const attachmentCols: string[] = []
for (let [key, column] of Object.entries(table.schema)) {
if (column.type === FieldTypes.ATTACHMENT) {
if (column.type === FieldType.ATTACHMENT) {
attachmentCols.push(key)
}
}

View File

@ -7,7 +7,7 @@ import {
TableSourceType,
FieldType,
Table,
AutoFieldSubTypes,
AutoFieldSubType,
} from "@budibase/types"
import TestConfiguration from "../../../../tests/utilities/TestConfiguration"
@ -117,7 +117,7 @@ describe("sdk >> rows >> internal", () => {
id: {
name: "id",
type: FieldType.AUTO,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
autocolumn: true,
lastID: 0,
},
@ -181,7 +181,7 @@ describe("sdk >> rows >> internal", () => {
id: {
name: "id",
type: FieldType.AUTO,
subtype: AutoFieldSubTypes.AUTO_ID,
subtype: AutoFieldSubType.AUTO_ID,
autocolumn: true,
lastID: 0,
},

View File

@ -1,7 +1,6 @@
import cloneDeep from "lodash/cloneDeep"
import validateJs from "validate.js"
import { Row, Table, TableSchema } from "@budibase/types"
import { FieldTypes } from "../../../constants"
import { FieldType, Row, Table, TableSchema } from "@budibase/types"
import { makeExternalQuery } from "../../../integrations/base/query"
import { Format } from "../../../api/controllers/view/exporters"
import sdk from "../.."
@ -22,7 +21,7 @@ export function cleanExportRows(
let cleanRows = [...rows]
const relationships = Object.entries(schema)
.filter((entry: any[]) => entry[1].type === FieldTypes.LINK)
.filter((entry: any[]) => entry[1].type === FieldType.LINK)
.map(entry => entry[0])
relationships.forEach(column => {
@ -88,17 +87,17 @@ export async function validate({
continue
}
// formulas shouldn't validated, data will be deleted anyway
if (type === FieldTypes.FORMULA || column.autocolumn) {
if (type === FieldType.FORMULA || column.autocolumn) {
continue
}
// special case for options, need to always allow unselected (empty)
if (type === FieldTypes.OPTIONS && constraints?.inclusion) {
if (type === FieldType.OPTIONS && constraints?.inclusion) {
constraints.inclusion.push(null as any, "")
}
let res
// Validate.js doesn't seem to handle array
if (type === FieldTypes.ARRAY && row[fieldName]) {
if (type === FieldType.ARRAY && row[fieldName]) {
if (row[fieldName].length) {
if (!Array.isArray(row[fieldName])) {
row[fieldName] = row[fieldName].split(",")
@ -116,13 +115,13 @@ export async function validate({
errors[fieldName] = [`${fieldName} is required`]
}
} else if (
(type === FieldTypes.ATTACHMENT || type === FieldTypes.JSON) &&
(type === FieldType.ATTACHMENT || type === FieldType.JSON) &&
typeof row[fieldName] === "string"
) {
// this should only happen if there is an error
try {
const json = JSON.parse(row[fieldName])
if (type === FieldTypes.ATTACHMENT) {
if (type === FieldType.ATTACHMENT) {
if (Array.isArray(json)) {
row[fieldName] = json
} else {

View File

@ -1,4 +1,5 @@
import {
FieldType,
Operation,
RelationshipType,
RenameColumn,
@ -14,7 +15,6 @@ import {
setStaticSchemas,
} from "../../../../api/controllers/table/utils"
import { cloneDeep } from "lodash/fp"
import { FieldTypes } from "../../../../constants"
import { makeTableRequest } from "../../../../api/controllers/table/ExternalRequest"
import {
isRelationshipSetup,
@ -78,7 +78,7 @@ export async function save(
// check if relations need setup
for (let schema of Object.values(tableToSave.schema)) {
if (schema.type !== FieldTypes.LINK || isRelationshipSetup(schema)) {
if (schema.type !== FieldType.LINK || isRelationshipSetup(schema)) {
continue
}
const schemaTableId = schema.tableId

View File

@ -9,7 +9,6 @@ import {
Table,
TableSourceType,
} from "@budibase/types"
import { FieldTypes } from "../../../../constants"
import {
foreignKeyStructure,
generateForeignKey,
@ -27,7 +26,7 @@ export function cleanupRelationships(
// clean up relationships in couch table schemas
for (let [key, schema] of Object.entries(tableToIterate.schema)) {
if (
schema.type === FieldTypes.LINK &&
schema.type === FieldType.LINK &&
(!oldTable || table.schema[key] == null)
) {
const schemaTableId = schema.tableId

View File

@ -1,4 +1,5 @@
import {
FieldType,
RenameColumn,
Table,
ViewStatisticsSchema,
@ -10,7 +11,6 @@ import {
hasTypeChanged,
TableSaveFunctions,
} from "../../../../api/controllers/table/utils"
import { FieldTypes } from "../../../../constants"
import { EventType, updateLinks } from "../../../../db/linkedRows"
import { cloneDeep } from "lodash/fp"
import isEqual from "lodash/isEqual"
@ -63,7 +63,7 @@ export async function save(
}
// rename row fields when table column is renamed
if (renaming && table.schema[renaming.updated].type === FieldTypes.LINK) {
if (renaming && table.schema[renaming.updated].type === FieldType.LINK) {
throw new Error("Cannot rename a linked column.")
}

View File

@ -1,6 +1,12 @@
import { FieldTypes, ObjectStoreBuckets } from "../../constants"
import { ObjectStoreBuckets } from "../../constants"
import { context, db as dbCore, objectStore } from "@budibase/backend-core"
import { RenameColumn, Row, RowAttachment, Table } from "@budibase/types"
import {
FieldType,
RenameColumn,
Row,
RowAttachment,
Table,
} from "@budibase/types"
export class AttachmentCleanup {
static async coreCleanup(fileListFn: () => string[]): Promise<void> {
@ -28,7 +34,7 @@ export class AttachmentCleanup {
let files: string[] = []
const tableSchema = opts.oldTable?.schema || table.schema
for (let [key, schema] of Object.entries(tableSchema)) {
if (schema.type !== FieldTypes.ATTACHMENT) {
if (schema.type !== FieldType.ATTACHMENT) {
continue
}
const columnRemoved = opts.oldTable && !table.schema[key]
@ -62,7 +68,7 @@ export class AttachmentCleanup {
return AttachmentCleanup.coreCleanup(() => {
let files: string[] = []
for (let [key, schema] of Object.entries(table.schema)) {
if (schema.type !== FieldTypes.ATTACHMENT) {
if (schema.type !== FieldType.ATTACHMENT) {
continue
}
rows.forEach(row => {
@ -79,7 +85,7 @@ export class AttachmentCleanup {
return AttachmentCleanup.coreCleanup(() => {
let files: string[] = []
for (let [key, schema] of Object.entries(table.schema)) {
if (schema.type !== FieldTypes.ATTACHMENT) {
if (schema.type !== FieldType.ATTACHMENT) {
continue
}
const oldKeys =

View File

@ -1,10 +1,16 @@
import * as linkRows from "../../db/linkedRows"
import { FieldTypes, AutoFieldSubTypes } from "../../constants"
import { processFormulas, fixAutoColumnSubType } from "./utils"
import { objectStore, utils } from "@budibase/backend-core"
import { InternalTables } from "../../db/utils"
import { TYPE_TRANSFORM_MAP } from "./map"
import { FieldSubtype, Row, RowAttachment, Table } from "@budibase/types"
import {
FieldType,
AutoFieldSubType,
FieldSubtype,
Row,
RowAttachment,
Table,
} from "@budibase/types"
import { cloneDeep } from "lodash/fp"
import {
processInputBBReferences,
@ -54,25 +60,25 @@ export function processAutoColumn(
schema = fixAutoColumnSubType(schema)
}
switch (schema.subtype) {
case AutoFieldSubTypes.CREATED_BY:
case AutoFieldSubType.CREATED_BY:
if (creating && shouldUpdateUserFields && userId) {
row[key] = [userId]
}
break
case AutoFieldSubTypes.CREATED_AT:
case AutoFieldSubType.CREATED_AT:
if (creating) {
row[key] = now
}
break
case AutoFieldSubTypes.UPDATED_BY:
case AutoFieldSubType.UPDATED_BY:
if (shouldUpdateUserFields && userId) {
row[key] = [userId]
}
break
case AutoFieldSubTypes.UPDATED_AT:
case AutoFieldSubType.UPDATED_AT:
row[key] = now
break
case AutoFieldSubTypes.AUTO_ID:
case AutoFieldSubType.AUTO_ID:
if (creating) {
schema.lastID = !schema.lastID ? BASE_AUTO_ID : schema.lastID + 1
row[key] = schema.lastID
@ -134,7 +140,7 @@ export async function inputProcessing(
continue
}
// remove any formula values, they are to be generated
if (field.type === FieldTypes.FORMULA) {
if (field.type === FieldType.FORMULA) {
delete clonedRow[key]
}
// otherwise coerce what is there to correct types
@ -143,7 +149,7 @@ export async function inputProcessing(
}
// remove any attachment urls, they are generated on read
if (field.type === FieldTypes.ATTACHMENT) {
if (field.type === FieldType.ATTACHMENT) {
const attachments = clonedRow[key]
if (attachments?.length) {
attachments.forEach((attachment: RowAttachment) => {
@ -152,7 +158,7 @@ export async function inputProcessing(
}
}
if (field.type === FieldTypes.BB_REFERENCE && value) {
if (field.type === FieldType.BB_REFERENCE && value) {
clonedRow[key] = await processInputBBReferences(
value,
field.subtype as FieldSubtype
@ -214,7 +220,7 @@ export async function outputProcessing<T extends Row[] | Row>(
// process complex types: attachements, bb references...
for (let [property, column] of Object.entries(table.schema)) {
if (column.type === FieldTypes.ATTACHMENT) {
if (column.type === FieldType.ATTACHMENT) {
for (let row of enriched) {
if (row[property] == null || !Array.isArray(row[property])) {
continue
@ -227,7 +233,7 @@ export async function outputProcessing<T extends Row[] | Row>(
}
} else if (
!opts.skipBBReferences &&
column.type == FieldTypes.BB_REFERENCE
column.type == FieldType.BB_REFERENCE
) {
for (let row of enriched) {
row[property] = await processOutputBBReferences(

View File

@ -1,7 +1,6 @@
// @ts-nocheck
import { FieldTypes } from "../../constants"
import { FieldType } from "@budibase/types"
const parseArrayString = value => {
const parseArrayString = (value: any) => {
if (typeof value === "string") {
if (value === "") {
return []
@ -21,11 +20,13 @@ const parseArrayString = value => {
* A map of how we convert various properties in rows to each other based on the row type.
*/
export const TYPE_TRANSFORM_MAP: any = {
[FieldTypes.LINK]: {
[FieldType.LINK]: {
"": [],
//@ts-ignore
[null]: [],
//@ts-ignore
[undefined]: undefined,
parse: link => {
parse: (link: any) => {
if (Array.isArray(link) && typeof link[0] === "object") {
return link.map(el => (el && el._id ? el._id : el))
}
@ -35,75 +36,97 @@ export const TYPE_TRANSFORM_MAP: any = {
return link
},
},
[FieldTypes.OPTIONS]: {
[FieldType.OPTIONS]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.ARRAY]: {
[FieldType.ARRAY]: {
//@ts-ignore
[null]: [],
//@ts-ignore
[undefined]: undefined,
parse: parseArrayString,
},
[FieldTypes.STRING]: {
[FieldType.STRING]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.BARCODEQR]: {
[FieldType.BARCODEQR]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.FORMULA]: {
[FieldType.FORMULA]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.LONGFORM]: {
[FieldType.LONGFORM]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.NUMBER]: {
[FieldType.NUMBER]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
parse: n => parseFloat(n),
parse: (n: any) => parseFloat(n),
},
[FieldTypes.BIGINT]: {
[FieldType.BIGINT]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
},
[FieldTypes.DATETIME]: {
[FieldType.DATETIME]: {
"": null,
[undefined]: undefined,
//@ts-ignore
[null]: null,
parse: date => {
//@ts-ignore
[undefined]: undefined,
parse: (date: any) => {
if (date instanceof Date) {
return date.toISOString()
}
return date
},
},
[FieldTypes.ATTACHMENT]: {
[FieldType.ATTACHMENT]: {
//@ts-ignore
[null]: [],
//@ts-ignore
[undefined]: undefined,
parse: parseArrayString,
},
[FieldTypes.BOOLEAN]: {
[FieldType.BOOLEAN]: {
"": null,
//@ts-ignore
[null]: null,
//@ts-ignore
[undefined]: undefined,
true: true,
false: false,
},
[FieldTypes.AUTO]: {
[FieldType.AUTO]: {
parse: () => undefined,
},
[FieldTypes.JSON]: {
parse: input => {
[FieldType.JSON]: {
parse: (input: any) => {
try {
if (input === "") {
return undefined

View File

@ -1,5 +1,5 @@
import { fixAutoColumnSubType } from "../utils"
import { AutoFieldDefaultNames, AutoFieldSubTypes } from "../../../constants"
import { AutoFieldDefaultNames, AutoFieldSubType } from "../../../constants"
import { FieldSchema, FieldType, RelationshipType } from "@budibase/types"
describe("rowProcessor utility", () => {
@ -20,37 +20,37 @@ describe("rowProcessor utility", () => {
it("updates the schema with the correct subtype", async () => {
schema.name = AutoFieldDefaultNames.CREATED_BY
expect(fixAutoColumnSubType(schema).subtype).toEqual(
AutoFieldSubTypes.CREATED_BY
AutoFieldSubType.CREATED_BY
)
schema.subtype = undefined
schema.name = AutoFieldDefaultNames.UPDATED_BY
expect(fixAutoColumnSubType(schema).subtype).toEqual(
AutoFieldSubTypes.UPDATED_BY
AutoFieldSubType.UPDATED_BY
)
schema.subtype = undefined
schema.name = AutoFieldDefaultNames.CREATED_AT
expect(fixAutoColumnSubType(schema).subtype).toEqual(
AutoFieldSubTypes.CREATED_AT
AutoFieldSubType.CREATED_AT
)
schema.subtype = undefined
schema.name = AutoFieldDefaultNames.UPDATED_AT
expect(fixAutoColumnSubType(schema).subtype).toEqual(
AutoFieldSubTypes.UPDATED_AT
AutoFieldSubType.UPDATED_AT
)
schema.subtype = undefined
schema.name = AutoFieldDefaultNames.AUTO_ID
expect(fixAutoColumnSubType(schema).subtype).toEqual(
AutoFieldSubTypes.AUTO_ID
AutoFieldSubType.AUTO_ID
)
schema.subtype = undefined
})
it("returns the column if subtype exists", async () => {
schema.subtype = AutoFieldSubTypes.CREATED_BY
schema.subtype = AutoFieldSubType.CREATED_BY
schema.name = AutoFieldDefaultNames.CREATED_AT
expect(fixAutoColumnSubType(schema)).toEqual(schema)
})

View File

@ -1,15 +1,13 @@
import {
AutoFieldDefaultNames,
AutoFieldSubTypes,
FieldTypes,
FormulaTypes,
} from "../../constants"
import { AutoFieldDefaultNames } from "../../constants"
import { processStringSync } from "@budibase/string-templates"
import {
AutoColumnFieldMetadata,
FieldSchema,
Row,
Table,
FormulaType,
AutoFieldSubType,
FieldType,
} from "@budibase/types"
import tracer from "dd-trace"
@ -30,15 +28,15 @@ export function fixAutoColumnSubType(
}
// the columns which get auto generated
if (column.name.endsWith(AutoFieldDefaultNames.CREATED_BY)) {
column.subtype = AutoFieldSubTypes.CREATED_BY
column.subtype = AutoFieldSubType.CREATED_BY
} else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_BY)) {
column.subtype = AutoFieldSubTypes.UPDATED_BY
column.subtype = AutoFieldSubType.UPDATED_BY
} else if (column.name.endsWith(AutoFieldDefaultNames.CREATED_AT)) {
column.subtype = AutoFieldSubTypes.CREATED_AT
column.subtype = AutoFieldSubType.CREATED_AT
} else if (column.name.endsWith(AutoFieldDefaultNames.UPDATED_AT)) {
column.subtype = AutoFieldSubTypes.UPDATED_AT
column.subtype = AutoFieldSubType.UPDATED_AT
} else if (column.name.endsWith(AutoFieldDefaultNames.AUTO_ID)) {
column.subtype = AutoFieldSubTypes.AUTO_ID
column.subtype = AutoFieldSubType.AUTO_ID
}
return column
}
@ -57,11 +55,11 @@ export function processFormulas<T extends Row | Row[]>(
const rows = Array.isArray(inputRows) ? inputRows : [inputRows]
if (rows) {
for (let [column, schema] of Object.entries(table.schema)) {
if (schema.type !== FieldTypes.FORMULA) {
if (schema.type !== FieldType.FORMULA) {
continue
}
const isStatic = schema.formulaType === FormulaTypes.STATIC
const isStatic = schema.formulaType === FormulaType.STATIC
if (
schema.formula == null ||
@ -100,7 +98,7 @@ export function processDates<T extends Row | Row[]>(
let rows = Array.isArray(inputRows) ? inputRows : [inputRows]
let datesWithTZ: string[] = []
for (let [column, schema] of Object.entries(table.schema)) {
if (schema.type !== FieldTypes.DATETIME) {
if (schema.type !== FieldType.DATETIME) {
continue
}
if (!schema.timeOnly && !schema.ignoreTimezones) {

View File

@ -1,12 +1,11 @@
import { FieldSubtype } from "@budibase/types"
import { FieldTypes } from "../constants"
import { FieldType, FieldSubtype } from "@budibase/types"
import { ValidColumnNameRegex, utils } from "@budibase/shared-core"
import { db } from "@budibase/backend-core"
import { parseCsvExport } from "../api/controllers/view/exporters"
interface SchemaColumn {
readonly name: string
readonly type: FieldTypes
readonly type: FieldType
readonly subtype: FieldSubtype
readonly autocolumn?: boolean
readonly constraints?: {
@ -36,13 +35,13 @@ interface ValidationResults {
}
const PARSERS: any = {
[FieldTypes.NUMBER]: (attribute?: string) => {
[FieldType.NUMBER]: (attribute?: string) => {
if (!attribute) {
return attribute
}
return Number(attribute)
},
[FieldTypes.DATETIME]: (attribute?: string) => {
[FieldType.DATETIME]: (attribute?: string) => {
if (!attribute) {
return attribute
}
@ -60,7 +59,7 @@ export function isSchema(schema: any): schema is Schema {
column !== null &&
typeof column === "object" &&
typeof column.type === "string" &&
Object.values(FieldTypes).includes(column.type as FieldTypes)
Object.values(FieldType).includes(column.type as FieldType)
)
})
)
@ -110,20 +109,17 @@ export function validate(rows: Rows, schema: Schema): ValidationResults {
isAutoColumn
) {
return
} else if (
columnType === FieldTypes.NUMBER &&
isNaN(Number(columnData))
) {
} else if (columnType === FieldType.NUMBER && isNaN(Number(columnData))) {
// If provided must be a valid number
results.schemaValidation[columnName] = false
} else if (
// If provided must be a valid date
columnType === FieldTypes.DATETIME &&
columnType === FieldType.DATETIME &&
isNaN(new Date(columnData).getTime())
) {
results.schemaValidation[columnName] = false
} else if (
columnType === FieldTypes.BB_REFERENCE &&
columnType === FieldType.BB_REFERENCE &&
!isValidBBReference(columnData, columnSubtype)
) {
results.schemaValidation[columnName] = false
@ -155,15 +151,15 @@ export function parse(rows: Rows, schema: Schema): Rows {
const columnType = schema[columnName].type
const columnSubtype = schema[columnName].subtype
if (columnType === FieldTypes.NUMBER) {
if (columnType === FieldType.NUMBER) {
// If provided must be a valid number
parsedRow[columnName] = columnData ? Number(columnData) : columnData
} else if (columnType === FieldTypes.DATETIME) {
} else if (columnType === FieldType.DATETIME) {
// If provided must be a valid date
parsedRow[columnName] = columnData
? new Date(columnData).toISOString()
: columnData
} else if (columnType === FieldTypes.BB_REFERENCE) {
} else if (columnType === FieldType.BB_REFERENCE) {
const parsedValues =
!!columnData && parseCsvExport<{ _id: string }[]>(columnData)
if (!parsedValues) {