Deprecate workspace metadataVersion and stop consuming it in the frontend (#23189)
## Context Follow-up to #23164. Now that the metadata GraphQL response cache and the workspace SDL cache are keyed on flat-map hashes, `workspace.metadataVersion` no longer drives any cache invalidation. This PR is the next stage of retiring it: the frontend stops consuming the field entirely, and the public GraphQL field is marked deprecated so external API consumers get a migration signal. ## What changed **Frontend stops consuming `metadataVersion`:** - `userQueryFragment.ts` no longer selects the field. - `currentWorkspaceState.ts` drops it from the workspace `Pick`. - `apollo.factory.ts` no longer attaches the `X-Schema-Version` request header. Dropping the header retires the "your workspace has been updated, please refresh the page" error rewrite on the server (it only fired when the header was present, and only on requests that had already failed validation). Metadata staleness detection is unaffected: the frontend has been running on collection hashes plus SSE since the minimal-metadata work, so that path stays intact. Stale clients now surface a raw validation error instead of the friendly message, which we consider an acceptable trade for deleting the mechanism. **Server marks the field deprecated:** - `workspace.entity.ts`: `@Field({ deprecationReason: 'No longer used for metadata cache invalidation, will be removed' })`. **Regenerated (CI-enforced surfaces):** `twenty-front/src/generated-metadata`, and `twenty-client-sdk`'s generated schema, which now carries `@deprecated(reason: ...)`. The `admin` codegen config produced no changes. `packages/twenty-sdk/generated` is intentionally untouched: no in-repo command produces it, CI does not drift-check it, and its committed snapshot lags the live schema, so regenerating it here would pull unrelated schema drift into this PR; it will pick up the directive on its next routine refresh. ## Deployment notes - No ordering constraint with #23164: removing a field selection and a request header is backward compatible against any server, and old frontend bundles keep working during the rollout because the field still exists and the server-side header check is still in place. Same release is fine. - The follow-up server cleanup (removing the `X-Schema-Version` check in `use-graphql-error-handler.hook.ts`, the per-request `metadataVersion` reads and seed in `middleware.service.ts`/`jwt-auth.guard.ts`, and the REST heal block) must wait until the release containing this PR has shipped, since a deployed frontend still selecting the field would break `GetCurrentUser` if the field were removed first. After that cleanup, the only remaining `metadataVersion` consumers are the five pinned upgrade commands (2.8 through 2.20), which hold the column and `WorkspaceMetadataVersionService` until that upgrade window closes; the physical column drop then follows the two-phase pattern used for `gridPosition`. ## Validation - Server and frontend typecheck, lint, and format pass; the apollo factory test suite passes unchanged (it fixtures the field but never asserted the header). - Live introspection against a server running this branch returns `isDeprecated: true` with the reason on `Workspace.metadataVersion`. - CI's pending-codegen check covers the regenerated surfaces (`data`/`metadata`/`admin` configs and `twenty-client-sdk:generate-metadata-client`). <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/twentyhq/twenty/pull/23189?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. -->
This commit is contained in:
@@ -869,7 +869,7 @@ type Workspace {
|
||||
viewFilterGroups: [ViewFilterGroup!]
|
||||
viewGroups: [ViewGroup!]
|
||||
viewSorts: [ViewSort!]
|
||||
metadataVersion: Float!
|
||||
metadataVersion: Float! @deprecated(reason: "No longer used for metadata cache invalidation, will be removed")
|
||||
databaseSchema: String
|
||||
subdomain: String!
|
||||
customDomain: String
|
||||
|
||||
@@ -611,6 +611,7 @@ export interface Workspace {
|
||||
viewFilterGroups?: ViewFilterGroup[]
|
||||
viewGroups?: ViewGroup[]
|
||||
viewSorts?: ViewSort[]
|
||||
/** @deprecated No longer used for metadata cache invalidation, will be removed */
|
||||
metadataVersion: Scalars['Float']
|
||||
databaseSchema?: Scalars['String']
|
||||
subdomain: Scalars['String']
|
||||
@@ -3703,6 +3704,7 @@ export interface WorkspaceGenqlSelection{
|
||||
viewFilterGroups?: ViewFilterGroupGenqlSelection
|
||||
viewGroups?: ViewGroupGenqlSelection
|
||||
viewSorts?: ViewSortGenqlSelection
|
||||
/** @deprecated No longer used for metadata cache invalidation, will be removed */
|
||||
metadataVersion?: boolean | number
|
||||
databaseSchema?: boolean | number
|
||||
subdomain?: boolean | number
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -147,9 +147,6 @@ export class ApolloFactory implements ApolloManager {
|
||||
...optionHeaders,
|
||||
authorization: token ? `Bearer ${token}` : '',
|
||||
'x-locale': locale,
|
||||
...(isDefined(this.currentWorkspace?.metadataVersion) && {
|
||||
'X-Schema-Version': `${this.currentWorkspace.metadataVersion}`,
|
||||
}),
|
||||
...(this.appVersion && { 'X-App-Version': this.appVersion }),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -33,7 +33,6 @@ export type CurrentWorkspace = Pick<
|
||||
| 'subdomain'
|
||||
| 'customDomain'
|
||||
| 'workspaceUrls'
|
||||
| 'metadataVersion'
|
||||
| 'isTwoFactorAuthenticationEnforced'
|
||||
| 'trashRetentionDays'
|
||||
| 'eventLogRetentionDays'
|
||||
|
||||
@@ -81,7 +81,6 @@ export const USER_QUERY_FRAGMENT = gql`
|
||||
key
|
||||
value
|
||||
}
|
||||
metadataVersion
|
||||
currentBillingSubscription {
|
||||
...CurrentBillingSubscriptionFragment
|
||||
}
|
||||
|
||||
@@ -246,7 +246,10 @@ export class WorkspaceEntity {
|
||||
@OneToMany(() => ViewSortEntity, (viewSort) => viewSort.workspace)
|
||||
viewSorts: Relation<ViewSortEntity[]>;
|
||||
|
||||
@Field()
|
||||
@Field({
|
||||
deprecationReason:
|
||||
'No longer used for metadata cache invalidation, will be removed',
|
||||
})
|
||||
@Column({ default: 1 })
|
||||
metadataVersion: number;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user