From a1f79c4f4008c17728744f7b6b9cb85e5b0a45f3 Mon Sep 17 00:00:00 2001 From: Weiko Date: Wed, 17 Jun 2026 19:19:46 +0200 Subject: [PATCH] fix(server): enforce lowercase universalIdentifier in sync (#21754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Context App sync fails when a manifest defines an entity with an uppercase UUID `universalIdentifier`. Postgres `uuid` columns normalize to lowercase on write, but the sync diff matches `universalIdentifier` strings case-sensitively. So an uppercase-defined entity never matches its lowercased DB row and is seen as delete + create on every sync, which trips downstream guards like "Parent navigation menu item not found". ## Change Reject non-lowercase `universalIdentifier`s at validation time in `WorkspaceEntityMigrationBuilderService.validateUniversalIdentifier` (right after the existing UUID-v4 check). This lives in the abstract base builder, so it covers every syncable entity type. App authors now get a clear "must be lowercase" error on the first sync instead of confusing downstream failures. Validation is sufficient here, no normalization needed — because the DB side is always lowercase, so rejecting uppercase input guarantees both sides of the diff match. Review in cubic --- .../workspace-entity-migration-builder.service.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts index 2a73347cc5..fe3c167847 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts @@ -390,6 +390,16 @@ export abstract class WorkspaceEntityMigrationBuilderService< ]; } + if (universalIdentifier !== universalIdentifier.toLowerCase()) { + return [ + { + code: FlatEntityMapsExceptionCode.ENTITY_MALFORMED, + message: `Invalid universalIdentifier: "${universalIdentifier}" must be lowercase`, + value: universalIdentifier, + }, + ]; + } + return []; }