diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 433271b495..8e6a0620da 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -69,18 +69,20 @@ async function buildFilteredSchema( filter?: string[] ): Promise { let schema = await buildSchemaHelper(datasource) - let filteredSchema: Schema = { tables: {}, errors: {} } - if (filter) { - for (let key in schema.tables) { - if (filter.some(filter => filter.toLowerCase() === key.toLowerCase())) { - filteredSchema.tables[key] = schema.tables[key] - } - } + if (!filter) { + return schema + } - for (let key in schema.errors) { - if (filter.some(filter => filter.toLowerCase() === key.toLowerCase())) { - filteredSchema.errors[key] = schema.errors[key] - } + let filteredSchema: Schema = { tables: {}, errors: {} } + for (let key in schema.tables) { + if (filter.some(filter => filter.toLowerCase() === key.toLowerCase())) { + filteredSchema.tables[key] = schema.tables[key] + } + } + + for (let key in schema.errors) { + if (filter.some(filter => filter.toLowerCase() === key.toLowerCase())) { + filteredSchema.errors[key] = schema.errors[key] } } return filteredSchema diff --git a/packages/server/src/integration-test/postgres.spec.ts b/packages/server/src/integration-test/postgres.spec.ts index 84c19f8bbc..64f29c1a2b 100644 --- a/packages/server/src/integration-test/postgres.spec.ts +++ b/packages/server/src/integration-test/postgres.spec.ts @@ -18,6 +18,7 @@ import _ from "lodash" import { generator } from "@budibase/backend-core/tests" import { utils } from "@budibase/backend-core" import { databaseTestProviders } from "../integrations/tests/utils" +import { Client } from "pg" const config = setup.getConfig()! @@ -1055,4 +1056,53 @@ describe("postgres integrations", () => { expect(response.body.tableNames.indexOf(primaryName)).not.toBe(-1) }) }) + + describe("POST /api/datasources/:datasourceId/schema", () => { + let client: Client + + beforeAll(async () => { + client = new Client( + (await databaseTestProviders.postgres.getDsConfig()).config! + ) + await client.connect() + }) + + afterAll(async () => { + await client.end() + }) + + it("recognises when a table has no primary key", async () => { + await client.query(` + CREATE TABLE table_without_primary_key ( + id SERIAL + ) + `) + + const response = await makeRequest( + "post", + `/api/datasources/${postgresDatasource._id}/schema` + ) + + expect(response.body.errors).toMatchObject({ + table_without_primary_key: "Table must have a primary key.", + }) + }) + + it("recognises when a table is using a reserved column name", async () => { + await client.query(` + CREATE TABLE table_with_reserved_column_name ( + _id SERIAL + ) + `) + + const response = await makeRequest( + "post", + `/api/datasources/${postgresDatasource._id}/schema` + ) + + expect(response.body.errors).toMatchObject({ + table_without_primary_key: "Table must have a primary key.", + }) + }) + }) })