Skip to content

Commit

Permalink
Merge pull request #12034 from Budibase/fix/budi-7552-csv-import-mess…
Browse files Browse the repository at this point in the history
…es-up-auto-generated-auto-id-column

Fix bulk import messing up auto ID columns
  • Loading branch information
mike12345567 authored Oct 11, 2023
2 parents 080cd35 + b855f09 commit 5fdf076
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 6 deletions.
6 changes: 5 additions & 1 deletion packages/server/src/api/controllers/table/external.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ import { context, events } from "@budibase/backend-core"
import { isRows, isSchema, parse } from "../../../utilities/schema"
import {
BulkImportRequest,
BulkImportResponse,
Datasource,
FieldSchema,
ManyToManyRelationshipFieldMetadata,
ManyToOneRelationshipFieldMetadata,
OneToManyRelationshipFieldMetadata,
Expand Down Expand Up @@ -385,7 +387,9 @@ export async function destroy(ctx: UserCtx) {
return tableToDelete
}

export async function bulkImport(ctx: UserCtx<BulkImportRequest>) {
export async function bulkImport(
ctx: UserCtx<BulkImportRequest, BulkImportResponse>
) {
const table = await sdk.tables.getTable(ctx.params.tableId)
const { rows } = ctx.request.body
const schema = table.schema
Expand Down
15 changes: 12 additions & 3 deletions packages/server/src/api/controllers/table/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { isExternalTable, isSQL } from "../../../integrations/utils"
import { events } from "@budibase/backend-core"
import {
BulkImportRequest,
BulkImportResponse,
FetchTablesResponse,
SaveTableRequest,
SaveTableResponse,
Expand All @@ -19,7 +20,7 @@ import {
import sdk from "../../../sdk"
import { jsonFromCsvString } from "../../../utilities/csv"
import { builderSocket } from "../../../websockets"
import { cloneDeep } from "lodash"
import { cloneDeep, isEqual } from "lodash"

function pickApi({ tableId, table }: { tableId?: string; table?: Table }) {
if (table && !tableId) {
Expand Down Expand Up @@ -98,9 +99,17 @@ export async function destroy(ctx: UserCtx) {
builderSocket?.emitTableDeletion(ctx, deletedTable)
}

export async function bulkImport(ctx: UserCtx<BulkImportRequest>) {
export async function bulkImport(
ctx: UserCtx<BulkImportRequest, BulkImportResponse>
) {
const tableId = ctx.params.tableId
await pickApi({ tableId }).bulkImport(ctx)
let tableBefore = await sdk.tables.getTable(tableId)
let tableAfter = await pickApi({ tableId }).bulkImport(ctx)

if (!isEqual(tableBefore, tableAfter)) {
await sdk.tables.saveTable(tableAfter)
}

// right now we don't trigger anything for bulk import because it
// can only be done in the builder, but in the future we may need to
// think about events for bulk items
Expand Down
5 changes: 4 additions & 1 deletion packages/server/src/api/controllers/table/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
import { runStaticFormulaChecks } from "./bulkFormula"
import {
BulkImportRequest,
BulkImportResponse,
RenameColumn,
SaveTableRequest,
SaveTableResponse,
Expand Down Expand Up @@ -207,7 +208,9 @@ export async function destroy(ctx: any) {
return tableToDelete
}

export async function bulkImport(ctx: UserCtx<BulkImportRequest>) {
export async function bulkImport(
ctx: UserCtx<BulkImportRequest, BulkImportResponse>
) {
const table = await sdk.tables.getTable(ctx.params.tableId)
const { rows, identifierFields } = ctx.request.body
await handleDataImport(ctx.user, table, rows, identifierFields)
Expand Down
32 changes: 31 additions & 1 deletion packages/server/src/api/routes/tests/table.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { generator } from "@budibase/backend-core/tests"
import { events, context } from "@budibase/backend-core"
import {
FieldType,
SaveTableRequest,
RelationshipType,
Table,
ViewCalculation,
AutoFieldSubTypes,
} from "@budibase/types"
import { checkBuilderEndpoint } from "./utilities/TestFunctions"
import * as setup from "./utilities"
Expand Down Expand Up @@ -188,6 +188,36 @@ describe("/tables", () => {
1
)
})

it("should update Auto ID field after bulk import", async () => {
const table = await config.createTable({
name: "TestTable",
type: "table",
schema: {
autoId: {
name: "id",
type: FieldType.NUMBER,
subtype: AutoFieldSubTypes.AUTO_ID,
autocolumn: true,
constraints: {
type: "number",
presence: false,
},
},
},
})

let row = await config.api.row.save(table._id!, {})
expect(row.autoId).toEqual(1)

await config.api.row.bulkImport(table._id!, {
rows: [{ autoId: 2 }],
identifierFields: [],
})

row = await config.api.row.save(table._id!, {})
expect(row.autoId).toEqual(3)
})
})

describe("fetch", () => {
Expand Down
15 changes: 15 additions & 0 deletions packages/server/src/tests/utilities/api/row.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import {
Row,
ValidateResponse,
ExportRowsRequest,
BulkImportRequest,
BulkImportResponse,
} from "@budibase/types"
import TestConfiguration from "../TestConfiguration"
import { TestAPI } from "./base"
Expand Down Expand Up @@ -123,6 +125,19 @@ export class RowAPI extends TestAPI {
return request
}

bulkImport = async (
tableId: string,
body: BulkImportRequest,
{ expectStatus } = { expectStatus: 200 }
): Promise<BulkImportResponse> => {
let request = this.request
.post(`/api/tables/${tableId}/import`)
.send(body)
.set(this.config.defaultHeaders())
.expect(expectStatus)
return (await request).body
}

search = async (
sourceId: string,
{ expectStatus } = { expectStatus: 200 }
Expand Down
4 changes: 4 additions & 0 deletions packages/types/src/api/web/app/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ export interface BulkImportRequest {
rows: Row[]
identifierFields?: Array<string>
}

export interface BulkImportResponse {
message: string
}

0 comments on commit 5fdf076

Please sign in to comment.