From 883f4fcabd28de02b78b7b00a70e33cd2d151d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20de=20Juvigny?= <8087692+remidej@users.noreply.github.com> Date: Tue, 27 May 2025 18:24:14 +0200 Subject: [PATCH] fix: avoid history data loss when license is missing (#23562) * fix: avoid history data loss when license is missing * fix: history lifecycle test * fix: restore ts-expect-error --- .../history/services/__tests__/lifecycles.test.ts | 12 ++++++++---- .../server/src/history/services/lifecycles.ts | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/core/content-manager/server/src/history/services/__tests__/lifecycles.test.ts b/packages/core/content-manager/server/src/history/services/__tests__/lifecycles.test.ts index 103249a1bc..ab8058a7c0 100644 --- a/packages/core/content-manager/server/src/history/services/__tests__/lifecycles.test.ts +++ b/packages/core/content-manager/server/src/history/services/__tests__/lifecycles.test.ts @@ -21,7 +21,11 @@ const mockGetRequestContext = jest.fn(() => { }); const mockStrapi = { - service: jest.fn(), + service: jest.fn((name: string) => { + if (name === 'admin::persist-tables') { + return { persistTablesWithPrefix: jest.fn() }; + } + }), plugins: { 'content-manager': { service: jest.fn(() => ({ @@ -81,9 +85,9 @@ describe('history lifecycles service', () => { jest.useRealTimers(); }); - it('inits service only once', () => { - lifecyclesService.bootstrap(); - lifecyclesService.bootstrap(); + it('inits service only once', async () => { + await lifecyclesService.bootstrap(); + await lifecyclesService.bootstrap(); // @ts-expect-error - ignore expect(mockStrapi.documents.use).toHaveBeenCalledTimes(1); }); diff --git a/packages/core/content-manager/server/src/history/services/lifecycles.ts b/packages/core/content-manager/server/src/history/services/lifecycles.ts index e2574eaeed..ffa54d4d35 100644 --- a/packages/core/content-manager/server/src/history/services/lifecycles.ts +++ b/packages/core/content-manager/server/src/history/services/lifecycles.ts @@ -101,6 +101,7 @@ const createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => { }; const serviceUtils = createServiceUtils({ strapi }); + const { persistTablesWithPrefix } = strapi.service('admin::persist-tables'); return { async bootstrap() { @@ -109,6 +110,9 @@ const createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => { return; } + // Avoid data loss in case users temporarily don't have a license + await persistTablesWithPrefix('strapi_history_versions'); + strapi.documents.use(async (context, next) => { const result = (await next()) as any;