From 88c0a183be9940d31a6e9a0ec6e2db17aa2603da Mon Sep 17 00:00:00 2001 From: Boaz Poolman Date: Sun, 19 Apr 2026 21:29:24 +0200 Subject: [PATCH] fix: regenerate url alias if generated is set from false to true --- .changeset/late-boxes-sniff.md | 5 ++ .../server/middlewares/generate-url-alias.ts | 61 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .changeset/late-boxes-sniff.md diff --git a/.changeset/late-boxes-sniff.md b/.changeset/late-boxes-sniff.md new file mode 100644 index 00000000..e4052f11 --- /dev/null +++ b/.changeset/late-boxes-sniff.md @@ -0,0 +1,5 @@ +--- +"strapi-plugin-webtools": patch +--- + +fix: regenerate url alias if generated is set from false to true diff --git a/packages/core/server/middlewares/generate-url-alias.ts b/packages/core/server/middlewares/generate-url-alias.ts index 1b5dc614..30203b10 100644 --- a/packages/core/server/middlewares/generate-url-alias.ts +++ b/packages/core/server/middlewares/generate-url-alias.ts @@ -5,6 +5,67 @@ import { getPluginService } from '../util/getPluginService'; // eslint-disable-next-line max-len const generateUrlAliasMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => { const { uid, action, contentType } = context; + + if (uid === 'plugin::webtools.url-alias' && action === 'update') { + const { params } = context; + + const shouldRegenerate = params.data?.generated === true; + if (shouldRegenerate) { + const { entity, contentType: relatedContentType } = + await getPluginService('url-alias').findRelatedEntity( + params.data?.url_path, + { + fields: ['documentId', 'locale'], + }, + ); + + if (entity && relatedContentType) { + let relations: string[] = []; + + const urlPatterns = await getPluginService('url-pattern').findByUid( + relatedContentType, + entity.locale, + ); + + urlPatterns.forEach((urlPattern) => { + const patternRelations = + getPluginService('url-pattern').getRelationsFromPattern(urlPattern); + relations = [...relations, ...patternRelations]; + }); + + const fullEntity = await strapi.documents(relatedContentType as 'api::test.test').findOne({ + documentId: entity.documentId, + ...(entity.locale ? { locale: entity.locale } : {}), + populate: { + ...relations.reduce((obj, key) => ({ ...obj, [key]: {} }), {}), + }, + }); + + if (fullEntity) { + let generatedPath: string | null = null; + urlPatterns.forEach((urlPattern) => { + generatedPath = getPluginService('url-pattern').resolvePattern( + relatedContentType, + fullEntity, + urlPattern, + ); + }); + + if (generatedPath) { + params.data = { + ...params.data, + generated: true, + contenttype: relatedContentType, + url_path: generatedPath, + }; + } + } + } + } + + return next(); + } + const hasWT = isContentTypeEnabled(contentType); // If Webtools isn't enabled, do nothing.