Tags: Fugaru/twenty
Tags
Fix participant matching failing due to updating all columns instead … …of only changed fields (twentyhq#18105) The updateMany in matchParticipants was spreading the entire participant object into the SET clause, which included generated columns (searchVector) and composite field columns (createdBySource) that can't be written to. Narrowed the update to only set personId and workspaceMemberId. ``` [1] query failed: UPDATE "workspace_3ixj3i1a5avy16ptijtb3lae3"."calendarEventParticipant" SET "id" = $1, "createdAt" = $2, "updatedAt" = $3, "deletedAt" = $4, "createdBySource" = $5, "createdByWorkspaceMemberId" = $6, "createdByName" = $7, "createdByContext" = $8, "updatedBySource" = $9, "updatedByWorkspaceMemberId" = $10, "updatedByName" = $11, "updatedByContext" = $12, "position" = $13, "searchVector" = $14, "handle" = $15, "displayName" = $16, "isOrganizer" = $17, "responseStatus" = $18, "calendarEventId" = $19, "personId" = $20, "workspaceMemberId" = $21 WHERE "id" = $22 RETURNING * -- PARAMETERS: ["f1526103-451a-429f-9743-3a81c3a3e3aa","2026-02-19T22:23:32.354Z","2026-02-19T22:23:32.354Z",null,"MANUAL",null,"System",null,"MANUAL",null,"System",null,0,"'test@test.com':1","test@test.com","",false,"NEEDS_ACTION","fb1892a8-6daf-435b-a43b-e8fe8693eb99","60bf9e82-f1b7-4bed-a1af-7039fb9c32f5",null,"f1526103-451a-429f-9743-3a81c3a3e3aa"] [1] error: error: column "searchVector" can only be updated to DEFAULT [1] Exception Captured [1] undefined [1] [ [1] PostgresException [Error]: Data validation error. [1] at computeTwentyORMException (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/engine/twenty-orm/error-handling/compute-twenty-orm-exception.js:35:19) [1] at WorkspaceUpdateQueryBuilder.executeMany (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/engine/twenty-orm/repository/workspace-update-query-builder.js:269:82) [1] at process.processTicksAndRejections (node:internal/process/task_queues:105:5) [1] at async WorkspaceRepository.updateMany (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/engine/twenty-orm/repository/workspace.repository.js:234:25) [1] at async MatchParticipantService.matchParticipants (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/modules/match-participant/match-participant.service.js:93:13) [1] at async /Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/modules/match-participant/match-participant.service.js:160:13 [1] at async MatchParticipantService.matchParticipantsForPeople (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/modules/match-participant/match-participant.service.js:130:9) [1] at async CalendarEventParticipantMatchParticipantJob.handle (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/modules/calendar/calendar-event-participant-manager/jobs/calendar-event-participant-match-participant.job.js:45:13) [1] at async MessageQueueExplorer.invokeProcessMethods (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/engine/core-modules/message-queue/message-queue.explorer.js:113:17) [1] at async MessageQueueExplorer.handleProcessor (/Users/huzef/Documents/bounties/twenty/packages/twenty-server/dist/engine/core-modules/message-queue/message-queue.explorer.js:104:13) { [1] code: '428C9' [1] } [1] ] ```
Fix commands order for v1.17.0 (twentyhq#17839) Order should be 1. We delete all the file records (from core.file table) 2. We add the foreign key file / applicationId (pg constraint) 3. We further update the table structure: fullPath is deleted; path is created; unicity constraint between workspaceId/applicationId/path is created (pg constraint) 4. we migrate the workflow steps (this will create files in core.file) 5. we backfill the application package (same) --------- Co-authored-by: Charles Bochet <charles@twenty.com>
fix: add command to fix morph relation field name mismatches (twentyh… …q#17757) ## Summary When a custom object is renamed after creation, the relation fields on `noteTarget`, `taskTarget`, `attachment`, and `timelineActivity` keep their old names but point to the renamed object. For example: - User creates custom object `solution` - System creates field `solution` on NoteTarget → pointing to Solution - User renames object from `solution` to `productCatalog` - Field name stays as `solution` but points to `productCatalog` - Migration runs: `solution` → `targetSolution` - Now `targetSolution` points to `productCatalog` ❌ This causes the morph name computation to fail: - `getMorphNameFromMorphFieldMetadataName("targetSolution", "productCatalog")` - Tries to remove `ProductCatalog` from `targetSolution` → no match - Name stays as `targetSolution` instead of becoming `target` - Frontend computes: `targetSolution` + `Company` = `targetSolutionCompany` 💥 ## The Fix This command finds and fixes all such mismatches by: 1. Finding MORPH_RELATION fields where `field.name != target${capitalize(targetObject.nameSingular)}` 2. Renaming the column in the workspace schema 3. Updating the field metadata (name + joinColumnName in settings) 4. Invalidating the cache ## Usage **Dry run (to see what would be fixed):** ```bash npx nx run twenty-server:command upgrade:1-17:fix-morph-relation-field-names -- --workspace-id <id> --dry-run ``` **Fix a specific workspace:** ```bash npx nx run twenty-server:command upgrade:1-17:fix-morph-relation-field-names -- --workspace-id <id> ``` **Fix all workspaces:** ```bash npx nx run twenty-server:command upgrade:1-17:fix-morph-relation-field-names ``` ## SQL to find affected workspaces ```sql SELECT fm."workspaceId", COUNT(*) AS mismatched_fields FROM core."fieldMetadata" fm JOIN core."objectMetadata" target_om ON fm."relationTargetObjectMetadataId" = target_om.id JOIN core."objectMetadata" source_om ON fm."objectMetadataId" = source_om.id WHERE fm.type = 'MORPH_RELATION' AND fm.name LIKE 'target%' AND source_om."nameSingular" IN ('noteTarget', 'taskTarget', 'attachment', 'timelineActivity') GROUP BY fm."workspaceId" HAVING COUNT(*) FILTER ( WHERE fm.name != 'target' || initcap(replace(target_om."nameSingular", '_', '')) ) > 0; ```
Never display broken relations in record page layouts (twentyhq#17738) We generate Field widgets for relations on-the-fly, when a record page layout is first requested by the user. When the user changed their data model and then returned to a record page layout, the Field widgets weren't updated. **This PR ensures Field widgets are recomputed when relations change.** Future subjects: - Now that we will fetch the configuration from the backend and start storing updates, we will have to think about how we deal with these generated relation Field widgets. ## Before https://github.com/user-attachments/assets/99d53b19-b231-435f-b14f-4473ba269ad2 ## After https://github.com/user-attachments/assets/357d956d-8b3b-448c-a983-82569a7dd0a0 --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
i18n - docs translations (twentyhq#17692) Created by Github action --------- Co-authored-by: github-actions <github-actions@twenty.com>
Allow twenty standard app to access messaging items (twentyhq#17659)
PreviousNext