From 51ed23d0a72c753c62b318bd5676ea8253a508de Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 25 Feb 2021 15:21:08 +0000 Subject: [PATCH 1/3] Updating link controller to manage existing column comparison a bit better. --- .../src/db/linkedRows/LinkController.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/server/src/db/linkedRows/LinkController.js b/packages/server/src/db/linkedRows/LinkController.js index b01d5eede5..b629c4b1f0 100644 --- a/packages/server/src/db/linkedRows/LinkController.js +++ b/packages/server/src/db/linkedRows/LinkController.js @@ -3,7 +3,6 @@ const { IncludeDocs, getLinkDocuments } = require("./linkUtils") const { generateLinkID } = require("../utils") const Sentry = require("@sentry/node") const { FieldTypes, RelationshipTypes } = require("../../constants") -const { isEqual } = require("lodash") /** * Creates a new link document structure which can be put to the database. It is important to @@ -133,6 +132,19 @@ class LinkController { } } + /** + * Returns whether the two schemas are equal (in the important parts, not a pure equality check) + */ + areSchemasEqual(schema1, schema2) { + const compareFields = ["name", "type", "tableId", "fieldName", "autocolumn"] + for (let field of compareFields) { + if (schema1[field] !== schema2[field]) { + return false + } + } + return true + } + // all operations here will assume that the table // this operation is related to has linked rows /** @@ -315,7 +327,10 @@ class LinkController { } // check the linked table to make sure we aren't overwriting an existing column const existingSchema = linkedTable.schema[field.fieldName] - if (existingSchema != null && !isEqual(existingSchema, linkConfig)) { + if ( + existingSchema != null && + !this.areSchemasEqual(existingSchema, linkConfig) + ) { throw new Error("Cannot overwrite existing column.") } // create the link field in the other table From bf7bc51566a6f0b748656c70bb636716475ad559 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 25 Feb 2021 15:24:54 +0000 Subject: [PATCH 2/3] fix user creation relationships bug --- packages/server/src/api/controllers/row.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js index 413fedc6cd..5d783b7d18 100644 --- a/packages/server/src/api/controllers/row.js +++ b/packages/server/src/api/controllers/row.js @@ -7,6 +7,7 @@ const { DocumentTypes, SEPARATOR, ViewNames, + generateUserID, } = require("../../db/utils") const usersController = require("./user") const { @@ -140,7 +141,11 @@ exports.save = async function(ctx) { } if (!inputs._rev && !inputs._id) { - inputs._id = generateRowID(inputs.tableId) + if (inputs.tableId === ViewNames.USERS) { + inputs._id = generateUserID(inputs.email) + } else { + inputs._id = generateRowID(inputs.tableId) + } } // this returns the table and row incase they have been updated From c73c77448c91168a51d9dcd498e57f28387e23b2 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 25 Feb 2021 16:21:41 +0000 Subject: [PATCH 3/3] bugfixes --- .../DataTable/modals/CreateEditRow.svelte | 6 ++---- .../DataTable/modals/CreateEditUser.svelte | 2 +- .../common/LinkedRowSelector.svelte | 20 +++++++++---------- .../src/db/linkedRows/LinkController.js | 13 ++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditRow.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditRow.svelte index 790a74df53..cda1ee2e26 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditRow.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditRow.svelte @@ -28,10 +28,8 @@ .flat() // Prevent modal closing if there were errors return false - } - - if (rowResponse.status === 500) { - notifier.danger(rowResponse.message) + } else if (rowResponse.status === 400 || rowResponse.status === 500) { + errors = [{ message: rowResponse.message }] return false } diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte index d5b242cc46..db92abc065 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte @@ -60,7 +60,7 @@ .flat() } return false - } else if (rowResponse.status === 400 && rowResponse.message) { + } else if (rowResponse.status === 400 || rowResponse.status === 500) { errors = [{ message: rowResponse.message }] return false } diff --git a/packages/builder/src/components/common/LinkedRowSelector.svelte b/packages/builder/src/components/common/LinkedRowSelector.svelte index d470aa74de..5ac1efbc54 100644 --- a/packages/builder/src/components/common/LinkedRowSelector.svelte +++ b/packages/builder/src/components/common/LinkedRowSelector.svelte @@ -43,16 +43,6 @@ {:else} {#if schema.relationshipType === 'one-to-many'} - - {#each rows as row} - - {/each} - - {:else} + {:else} + + {#each rows as row} + + {/each} + {/if} {/if} diff --git a/packages/server/src/db/linkedRows/LinkController.js b/packages/server/src/db/linkedRows/LinkController.js index b629c4b1f0..a5404709f2 100644 --- a/packages/server/src/db/linkedRows/LinkController.js +++ b/packages/server/src/db/linkedRows/LinkController.js @@ -322,9 +322,22 @@ class LinkController { tableId: table._id, fieldName: fieldName, } + if (field.autocolumn) { linkConfig.autocolumn = field.autocolumn } + + if (field.relationshipType) { + // Ensure that the other side of the relationship is locked to one record + linkConfig.relationshipType = field.relationshipType + + // Update this table to be the many + table.schema[field.name].relationshipType = + RelationshipTypes.MANY_TO_MANY + const response = await this._db.put(table) + table._rev = response.rev + } + // check the linked table to make sure we aren't overwriting an existing column const existingSchema = linkedTable.schema[field.fieldName] if (