diff --git a/.changeset/cute-words-melt.md b/.changeset/cute-words-melt.md new file mode 100644 index 00000000..1aea9ffb --- /dev/null +++ b/.changeset/cute-words-melt.md @@ -0,0 +1,5 @@ +--- +"strapi-plugin-webtools": patch +--- + +Bad URL when pattern refers to empty singular relationship diff --git a/packages/core/server/controllers/url-pattern.ts b/packages/core/server/controllers/url-pattern.ts index d233d1a8..667c15e3 100644 --- a/packages/core/server/controllers/url-pattern.ts +++ b/packages/core/server/controllers/url-pattern.ts @@ -1,6 +1,5 @@ -import get from 'lodash/get'; import { Context } from 'koa'; import { factories, Schema, UID } from '@strapi/strapi'; import { KoaContext } from '../types/koa'; diff --git a/packages/core/server/services/__tests__/url-pattern.test.ts b/packages/core/server/services/__tests__/url-pattern.test.ts index 7f30c2fc..ee94ae3a 100644 --- a/packages/core/server/services/__tests__/url-pattern.test.ts +++ b/packages/core/server/services/__tests__/url-pattern.test.ts @@ -143,6 +143,21 @@ describe('URL Pattern Service', () => { // Current implementation replaces with empty string if missing. expect(resolved).toBe('/articles/my-article'); }); + + it('test', () => { + const uid = 'api::category.category'; + const entity = { + title: 'My Category', + test: undefined, + }; + const pattern = '/category/[test.title]/[title]'; + + const resolved = service.resolvePattern(uid, entity, pattern); + + // Should probably result in empty string for that part or handle it? + // Current implementation replaces with empty string if missing. + expect(resolved).toBe('/category/my-category'); + }); }); describe('validatePattern', () => { @@ -182,6 +197,7 @@ describe('URL Pattern Service', () => { expect(result.valid).toBe(true); }); + it('should invalidate pattern with forbidden fields', () => { const pattern = '/articles/[forbidden]/[title]'; const allowedFields = ['title']; diff --git a/packages/core/server/services/url-pattern.ts b/packages/core/server/services/url-pattern.ts index 96132b6c..e60fc8ca 100644 --- a/packages/core/server/services/url-pattern.ts +++ b/packages/core/server/services/url-pattern.ts @@ -194,27 +194,26 @@ const customServices = () => ({ const relationEntity = entity[relationName]; - if (Array.isArray(relationEntity) && relationIndex !== null) { - const subEntity = relationEntity[relationIndex] as - | Record - | undefined; - const value = subEntity?.[relationalField[1]]; - resolvedPattern = resolvedPattern.replace( - `[${field}]`, - value ? slugify(String(value)) : '', - ); - } else if ( - typeof relationEntity === 'object' - && relationEntity !== null - && !Array.isArray(relationEntity) - ) { + if (Array.isArray(relationEntity)) { + if (relationIndex === null) { + strapi.log.error(`Pattern ${pattern} refers to plural relationship ${relationName}, but does not contain an index.`); + resolvedPattern = resolvedPattern.replace(`[${field}]`, ''); + } else { + const subEntity = relationEntity[relationIndex] as + | Record + | undefined; + const value = subEntity?.[relationalField[1]]; + resolvedPattern = resolvedPattern.replace( + `[${field}]`, + value ? slugify(String(value)) : '', + ); + } + } else { const value = (relationEntity as Record)?.[relationalField[1]]; resolvedPattern = resolvedPattern.replace( `[${field}]`, value ? slugify(String(value)) : '', ); - } else { - strapi.log.error('Something went wrong whilst resolving the pattern.'); } } });