From a9d79bec775daaf0da4e506b2aebafdb4ca95b06 Mon Sep 17 00:00:00 2001 From: markkaylor Date: Fri, 8 Mar 2024 14:39:10 +0100 Subject: [PATCH] fix(content-releases): exclude release content-types from graphql (#19703) --- .../server/src/__tests__/index.test.ts | 51 ++++++++++++++++--- .../core/content-releases/server/src/index.ts | 4 +- .../content-releases/server/src/register.ts | 9 +++- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/packages/core/content-releases/server/src/__tests__/index.test.ts b/packages/core/content-releases/server/src/__tests__/index.test.ts index a9801fba03..e99b09c348 100644 --- a/packages/core/content-releases/server/src/__tests__/index.test.ts +++ b/packages/core/content-releases/server/src/__tests__/index.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable node/no-missing-require */ -import { ACTIONS } from '../constants'; +import { ACTIONS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants'; const { features } = require('@strapi/strapi/dist/utils/ee'); const { register } = require('../register'); @@ -18,18 +18,31 @@ jest.mock('../utils', () => ({ getService: jest.fn(), })); +const mockGraphQlDisable = jest.fn(); +const mockGraphQlShadowCrud = jest.fn(() => ({ + disable: mockGraphQlDisable, +})); describe('register', () => { const strapi = { features: { future: { - isEnabled: () => true, + isEnabled: jest.fn(() => true), }, }, - plugin: jest.fn(() => ({ - service: jest.fn(() => ({ - addDestroyListenerCallback: jest.fn(), - })), - })), + plugins: { + 'content-releases': { + service: jest.fn(() => ({ + addDestroyListenerCallback: jest.fn(), + })), + }, + graphql: { + service: jest.fn(() => ({ + shadowCRUD: mockGraphQlShadowCrud, + })), + }, + }, + // @ts-expect-error ignore + plugin: (plugin) => strapi.plugins[plugin], hook: jest.fn(() => ({ register: jest.fn().mockReturnThis(), })), @@ -50,7 +63,9 @@ describe('register', () => { it('should register permissions if cms-content-releases feature is enabled', () => { features.isEnabled.mockReturnValue(true); + register({ strapi }); + expect(strapi.admin.services.permission.actionProvider.registerMany).toHaveBeenCalledWith( ACTIONS ); @@ -58,9 +73,31 @@ describe('register', () => { it('should not register permissions if cms-content-releases feature is disabled', () => { features.isEnabled.mockReturnValue(false); + register({ strapi }); + expect(strapi.admin.services.permission.actionProvider.registerMany).not.toHaveBeenCalled(); }); + + it('should exclude the release and release action models from the GraphQL schema when the feature is enabled', async () => { + features.isEnabled.mockReturnValue(true); + + await register({ strapi }); + + expect(mockGraphQlShadowCrud).toHaveBeenNthCalledWith(1, RELEASE_MODEL_UID); + expect(mockGraphQlShadowCrud).toHaveBeenNthCalledWith(2, RELEASE_ACTION_MODEL_UID); + expect(mockGraphQlDisable).toHaveBeenCalledTimes(2); + }); + + it('should exclude the release and release action models from the GraphQL schema when the feature is disabled', async () => { + features.isEnabled.mockReturnValue(false); + + await register({ strapi }); + + expect(mockGraphQlShadowCrud).toHaveBeenNthCalledWith(1, RELEASE_MODEL_UID); + expect(mockGraphQlShadowCrud).toHaveBeenNthCalledWith(2, RELEASE_ACTION_MODEL_UID); + expect(mockGraphQlDisable).toHaveBeenCalledTimes(2); + }); }); describe('bootstrap', () => { diff --git a/packages/core/content-releases/server/src/index.ts b/packages/core/content-releases/server/src/index.ts index 71e2a62075..8847c6b925 100644 --- a/packages/core/content-releases/server/src/index.ts +++ b/packages/core/content-releases/server/src/index.ts @@ -22,8 +22,10 @@ const getPlugin = () => { }; } - // We keep returning contentTypes to avoid lost the data if feature is disabled return { + // Always return register, it handles its own feature check + register, + // Always return contentTypes to avoid losing data when the feature is disabled contentTypes, }; }; diff --git a/packages/core/content-releases/server/src/register.ts b/packages/core/content-releases/server/src/register.ts index 6fd36f5d99..cc26340914 100644 --- a/packages/core/content-releases/server/src/register.ts +++ b/packages/core/content-releases/server/src/register.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-var-requires */ import type { LoadedStrapi } from '@strapi/types'; -import { ACTIONS } from './constants'; +import { ACTIONS, RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from './constants'; import { deleteActionsOnDeleteContentType, deleteActionsOnDisableDraftAndPublish, @@ -28,4 +28,11 @@ export const register = async ({ strapi }: { strapi: LoadedStrapi }) => { .register(revalidateChangedContentTypes) .register(migrateIsValidAndStatusReleases); } + + if (strapi.plugin('graphql')) { + const graphqlExtensionService = strapi.plugin('graphql').service('extension'); + // Exclude the release and release action models from the GraphQL schema + graphqlExtensionService.shadowCRUD(RELEASE_MODEL_UID).disable(); + graphqlExtensionService.shadowCRUD(RELEASE_ACTION_MODEL_UID).disable(); + } };