From 475ef78c75f47ffbed35baf4ead7bd25f28afc6f Mon Sep 17 00:00:00 2001 From: Marc Roig Date: Thu, 3 Oct 2024 10:02:19 +0200 Subject: [PATCH] feat: base files for static preview (#21555) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: base files for static preview * Update packages/core/content-manager/server/src/preview/routes/index.ts Co-authored-by: Rémi de Juvigny <8087692+remidej@users.noreply.github.com> * chore: comment controllers type --------- Co-authored-by: Rémi de Juvigny <8087692+remidej@users.noreply.github.com> --- .../server/src/controllers/index.ts | 2 ++ .../server/src/preview/controllers/index.ts | 10 ++++++++++ .../server/src/preview/controllers/preview.ts | 16 +++++++++++++++ .../server/src/preview/index.ts | 19 +++++++++++++++++- .../server/src/preview/routes/index.ts | 10 ++++++++++ .../server/src/preview/routes/preview.ts | 20 +++++++++++++++++++ .../server/src/preview/services/index.ts | 6 ++++++ .../server/src/preview/services/preview.ts | 6 ++++++ .../server/src/preview/utils.ts | 10 ++++++++++ .../server/src/routes/index.ts | 2 ++ .../server/src/services/index.ts | 2 ++ 11 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 packages/core/content-manager/server/src/preview/controllers/index.ts create mode 100644 packages/core/content-manager/server/src/preview/controllers/preview.ts create mode 100644 packages/core/content-manager/server/src/preview/routes/index.ts create mode 100644 packages/core/content-manager/server/src/preview/routes/preview.ts create mode 100644 packages/core/content-manager/server/src/preview/services/index.ts create mode 100644 packages/core/content-manager/server/src/preview/services/preview.ts create mode 100644 packages/core/content-manager/server/src/preview/utils.ts diff --git a/packages/core/content-manager/server/src/controllers/index.ts b/packages/core/content-manager/server/src/controllers/index.ts index 984aa30c8d..1d079d1ca9 100644 --- a/packages/core/content-manager/server/src/controllers/index.ts +++ b/packages/core/content-manager/server/src/controllers/index.ts @@ -6,6 +6,7 @@ import relations from './relations'; import singleTypes from './single-types'; import uid from './uid'; import history from '../history'; +import preview from '../preview'; export default { 'collection-types': collectionTypes, @@ -16,4 +17,5 @@ export default { 'single-types': singleTypes, uid, ...(history.controllers ? history.controllers : {}), + ...(preview.controllers ? preview.controllers : {}), }; diff --git a/packages/core/content-manager/server/src/preview/controllers/index.ts b/packages/core/content-manager/server/src/preview/controllers/index.ts new file mode 100644 index 0000000000..146198fe0d --- /dev/null +++ b/packages/core/content-manager/server/src/preview/controllers/index.ts @@ -0,0 +1,10 @@ +import type { Plugin } from '@strapi/types'; +import { createPreviewController } from './preview'; + +export const controllers = { + preview: createPreviewController, + /** + * Casting is needed because the types aren't aware that Strapi supports + * passing a controller factory as the value, instead of a controller object directly + */ +} as unknown as Plugin.LoadedPlugin['controllers']; diff --git a/packages/core/content-manager/server/src/preview/controllers/preview.ts b/packages/core/content-manager/server/src/preview/controllers/preview.ts new file mode 100644 index 0000000000..f0f94562b9 --- /dev/null +++ b/packages/core/content-manager/server/src/preview/controllers/preview.ts @@ -0,0 +1,16 @@ +import type { Core } from '@strapi/types'; + +const createPreviewController = () => { + return { + async getPreviewURL(ctx) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const request = ctx.request; + + return { + data: { url: '' }, + }; + }, + } satisfies Core.Controller; +}; + +export { createPreviewController }; diff --git a/packages/core/content-manager/server/src/preview/index.ts b/packages/core/content-manager/server/src/preview/index.ts index 8096d4c101..ff2ba6ee2e 100644 --- a/packages/core/content-manager/server/src/preview/index.ts +++ b/packages/core/content-manager/server/src/preview/index.ts @@ -1,21 +1,38 @@ import type { Plugin } from '@strapi/types'; + import { FEATURE_ID } from './constants'; +import { routes } from './routes'; +import { controllers } from './controllers'; +import { services } from './services'; /** * Check once if the feature is enabled before loading it, * so that we can assume it is enabled in the other files. */ const getFeature = (): Partial => { - // TODO: Add license registry check when it's available if (!strapi.features.future.isEnabled(FEATURE_ID)) { return {}; } + // TODO: Add license registry check when it's available + // if (!strapi.ee.features.isEnabled('cms-content-preview')) { + // return {}; + // } + return { bootstrap() { // eslint-disable-next-line no-console -- TODO remove when we have real functionality console.log('Bootstrapping preview server'); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars -- TODO: Remove when implemented + const config = strapi.config.get('admin.preview'); + + // TODO: Validation + // TODO: Disable feature if config is not valid }, + routes, + controllers, + services, }; }; diff --git a/packages/core/content-manager/server/src/preview/routes/index.ts b/packages/core/content-manager/server/src/preview/routes/index.ts new file mode 100644 index 0000000000..b6a769bbc9 --- /dev/null +++ b/packages/core/content-manager/server/src/preview/routes/index.ts @@ -0,0 +1,10 @@ +import type { Plugin } from '@strapi/types'; +import { previewRouter } from './preview'; + +/** + * The routes will be merged with the other Content Manager routers, + * so we need to avoid conficts in the router name, and to prefix the path for each route. + */ +export const routes = { + preview: previewRouter, +} satisfies Plugin.LoadedPlugin['routes']; diff --git a/packages/core/content-manager/server/src/preview/routes/preview.ts b/packages/core/content-manager/server/src/preview/routes/preview.ts new file mode 100644 index 0000000000..c9506995d7 --- /dev/null +++ b/packages/core/content-manager/server/src/preview/routes/preview.ts @@ -0,0 +1,20 @@ +import type { Plugin } from '@strapi/types'; + +const info = { pluginName: 'content-manager', type: 'admin' }; + +const previewRouter: Plugin.LoadedPlugin['routes'][string] = { + type: 'admin', + routes: [ + { + method: 'GET', + info, + path: '/preview/url/:contentType', + handler: 'preview.getPreviewURL', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, + ], +}; + +export { previewRouter }; diff --git a/packages/core/content-manager/server/src/preview/services/index.ts b/packages/core/content-manager/server/src/preview/services/index.ts new file mode 100644 index 0000000000..f1fa9b69db --- /dev/null +++ b/packages/core/content-manager/server/src/preview/services/index.ts @@ -0,0 +1,6 @@ +import type { Plugin } from '@strapi/types'; +import { createPreviewService } from './preview'; + +export const services = { + preview: createPreviewService, +} satisfies Plugin.LoadedPlugin['services']; diff --git a/packages/core/content-manager/server/src/preview/services/preview.ts b/packages/core/content-manager/server/src/preview/services/preview.ts new file mode 100644 index 0000000000..4d507b2788 --- /dev/null +++ b/packages/core/content-manager/server/src/preview/services/preview.ts @@ -0,0 +1,6 @@ +/** + * Responsible of routing an entry to a preview URL. + */ +const createPreviewService = () => {}; + +export { createPreviewService }; diff --git a/packages/core/content-manager/server/src/preview/utils.ts b/packages/core/content-manager/server/src/preview/utils.ts new file mode 100644 index 0000000000..b228641489 --- /dev/null +++ b/packages/core/content-manager/server/src/preview/utils.ts @@ -0,0 +1,10 @@ +import type { Core } from '@strapi/types'; + +type PreviewServices = typeof import('./services').services; + +function getService(strapi: Core.Strapi, name: T) { + // Cast is needed because the return type of strapi.service is too vague + return strapi.service(`plugin::content-manager.${name}`) as ReturnType; +} + +export { getService }; diff --git a/packages/core/content-manager/server/src/routes/index.ts b/packages/core/content-manager/server/src/routes/index.ts index 2ddb4c9aac..10acf732a2 100644 --- a/packages/core/content-manager/server/src/routes/index.ts +++ b/packages/core/content-manager/server/src/routes/index.ts @@ -1,7 +1,9 @@ import admin from './admin'; import history from '../history'; +import preview from '../preview'; export default { admin, ...(history.routes ? history.routes : {}), + ...(preview.routes ? preview.routes : {}), }; diff --git a/packages/core/content-manager/server/src/services/index.ts b/packages/core/content-manager/server/src/services/index.ts index 843277c9a5..4abae41239 100644 --- a/packages/core/content-manager/server/src/services/index.ts +++ b/packages/core/content-manager/server/src/services/index.ts @@ -8,6 +8,7 @@ import permission from './permission'; import populateBuilder from './populate-builder'; import uid from './uid'; import history from '../history'; +import preview from '../preview'; import documentMetadata from './document-metadata'; import documentManager from './document-manager'; @@ -24,4 +25,5 @@ export default { 'populate-builder': populateBuilder, uid, ...(history.services ? history.services : {}), + ...(preview.services ? preview.services : {}), };