From f7d812fca68fbbb718442ce2f37ac4c7017a1408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Fri, 1 May 2026 07:52:01 +0200 Subject: [PATCH] fix: disable sync on seeded message and calendar channels (#20168) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary The dev seeder creates `ConnectedAccount` records with fake OAuth tokens (`'exampleRefreshToken'` / `'exampleAccessToken'`) and points `MessageChannel` / `CalendarChannel` records at them with `isSyncEnabled: true`. When the sync cron jobs run in the demo workspace, they: 1. Pick up these seeded channels (filter is `isSyncEnabled: true` + pending sync stage) 2. Try to refresh the fake OAuth tokens 3. Mark the channels as `FAILED_INSUFFICIENT_PERMISSIONS` 4. Surface a "Sync lost with mailbox X — please reconnect" banner in the UI This banner appears every time the demo workspace is loaded, even though nothing is actually broken. ## Fix Set `isSyncEnabled: false` on all 12 seeded channels (6 message, 6 calendar). This is the canonical "don't sync this channel" mechanism — the same state a real user lands in when they toggle sync off in account settings. ## Why this approach - **ConnectedAccount records stay**: the demo workspace still shows Tim, Jony, Phil, Jane as having connected their email/calendar — realistic - **Pre-seeded messages and calendar events stay visible**: those don't depend on `isSyncEnabled` - **Crons no longer pick them up**: they filter on `isSyncEnabled: true`, so `false` short-circuits the entire sync attempt — no failure, no banner - **Semantically correct**: the seeded accounts have fake tokens that were never going to sync successfully; `isSyncEnabled: true` was effectively a lie - **No production code touched**: no `isDemo` flags, no magic-string detection, no workspace-ID filters in the cron path ## Alternatives considered and rejected - **Add an `isDemo` flag**: schema change, leaks demo knowledge into production tables - **Skip channels with fake tokens (`example*` pattern)**: hacky magic-string detection in the auth refresh path - **Filter demo workspace IDs in the cron**: production paths shouldn't reference demo IDs - **Don't activate demo workspaces**: breaks the demo workspace UX entirely ## Test plan - [ ] Reset the database and reseed (`npx nx database:reset twenty-server`) - [ ] Load the demo workspace — confirm no "Sync lost with mailbox" banner appears - [ ] Confirm seeded connected accounts still show in Settings → Accounts - [ ] Confirm pre-seeded messages and calendar events still appear in the UI - [ ] Confirm a real connected account (added via OAuth) still syncs normally — its channel will have `isSyncEnabled: true` and the cron will pick it up ## Related Companion to https://github.com/twentyhq/twenty/pull/20167, which removes the `--dev-mode` cron filter that was masking this banner issue in the dev image. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 --- .../calendar-channel-data-seeds.constant.ts | 12 ++++++------ .../constants/message-channel-data-seeds.constant.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/calendar-channel-data-seeds.constant.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/calendar-channel-data-seeds.constant.ts index f18158261e..c0df03b973 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/calendar-channel-data-seeds.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/calendar-channel-data-seeds.constant.ts @@ -42,7 +42,7 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'tim@apple.dev', visibility: CalendarChannelVisibility.METADATA, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, { id: CALENDAR_CHANNEL_DATA_SEED_IDS.JONY, @@ -50,7 +50,7 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'jony@apple.dev', visibility: CalendarChannelVisibility.SHARE_EVERYTHING, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, { id: CALENDAR_CHANNEL_DATA_SEED_IDS.PHIL, @@ -58,7 +58,7 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'phil@apple.dev', visibility: CalendarChannelVisibility.METADATA, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, { id: CALENDAR_CHANNEL_DATA_SEED_IDS.JANE, @@ -66,7 +66,7 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'jane.austen@apple.dev', visibility: CalendarChannelVisibility.SHARE_EVERYTHING, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, { id: CALENDAR_CHANNEL_DATA_SEED_IDS.COMPANY_MAIN, @@ -74,7 +74,7 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'company-main@apple.dev', visibility: CalendarChannelVisibility.SHARE_EVERYTHING, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, { id: CALENDAR_CHANNEL_DATA_SEED_IDS.TEAM_CALENDAR, @@ -82,6 +82,6 @@ export const CALENDAR_CHANNEL_DATA_SEEDS: CalendarChannelDataSeed[] = [ handle: 'team-calendar@apple.dev', visibility: CalendarChannelVisibility.SHARE_EVERYTHING, isContactAutoCreationEnabled: true, - isSyncEnabled: true, + isSyncEnabled: false, }, ]; diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/message-channel-data-seeds.constant.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/message-channel-data-seeds.constant.ts index 0925195616..f7cdcd6697 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/message-channel-data-seeds.constant.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/data/constants/message-channel-data-seeds.constant.ts @@ -59,7 +59,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.TIM, handle: 'tim@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, }, @@ -72,7 +72,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.JONY, handle: 'jony.ive@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, }, @@ -85,7 +85,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.PHIL, handle: 'phil.schiler@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, }, @@ -98,7 +98,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.JANE, handle: 'jane.austen@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, }, @@ -111,7 +111,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.TIM, // Use TIM's connected account for shared inbox handle: 'support@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, }, @@ -124,7 +124,7 @@ export const MESSAGE_CHANNEL_DATA_SEEDS: MessageChannelDataSeed[] = [ type: MessageChannelType.EMAIL, connectedAccountId: CONNECTED_ACCOUNT_DATA_SEED_IDS.TIM, // Use TIM's connected account for shared inbox handle: 'sales@apple.dev', - isSyncEnabled: true, + isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, },