Skip to content

Commit 8095b60

Browse files
committed
feat: update middlewares
1 parent 7a119db commit 8095b60

File tree

9 files changed

+125
-338
lines changed

9 files changed

+125
-338
lines changed

packages/core/server/middlewares/clone.ts

Lines changed: 0 additions & 117 deletions
This file was deleted.

packages/core/server/middlewares/delete.ts renamed to packages/core/server/middlewares/delete-url-alias.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Modules } from '@strapi/strapi';
22
import { isContentTypeEnabled } from '../util/enabledContentTypes';
33

4-
const deleteMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => {
4+
const deleteUrlAliasMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => {
55
const { uid, action, params } = context;
66
const hasWT = isContentTypeEnabled(uid);
77

@@ -38,4 +38,4 @@ const deleteMiddleware: Modules.Documents.Middleware.Middleware = async (context
3838
return next();
3939
};
4040

41-
export default deleteMiddleware;
41+
export default deleteUrlAliasMiddleware;

packages/core/server/middlewares/create.ts renamed to packages/core/server/middlewares/generate-url-alias.ts

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { Modules, Data } from '@strapi/strapi';
22
import { isContentTypeEnabled } from '../util/enabledContentTypes';
33
import { getPluginService } from '../util/getPluginService';
44

5-
const createMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => {
5+
// eslint-disable-next-line max-len
6+
const generateUrlAliasMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => {
67
const { uid, action } = context;
78
const hasWT = isContentTypeEnabled(uid);
89

@@ -11,12 +12,12 @@ const createMiddleware: Modules.Documents.Middleware.Middleware = async (context
1112
return next();
1213
}
1314

14-
// Run this middleware only for the create action.
15-
if (action !== 'create') {
15+
// Run this middleware only for the create, update and clone action.
16+
if (!['clone', 'create', 'update'].includes(action)) {
1617
return next();
1718
}
1819

19-
const params = context.params as Modules.Documents.ServiceParams<'api::test.test'>['create'];
20+
const params = context.params as Modules.Documents.ServiceParams<'api::test.test'>['create' | 'update' | 'clone'];
2021

2122
// Fetch the URL pattern for this content type.
2223
let relations: string[] = [];
@@ -38,37 +39,41 @@ const createMiddleware: Modules.Documents.Middleware.Middleware = async (context
3839
});
3940
}));
4041

41-
// If a URL alias was created, fetch it.
42-
if (params.data.url_alias?.[0]) {
43-
urlAliasEntity = await strapi.documents('plugin::webtools.url-alias').findOne({
44-
documentId: params.data.url_alias[0],
45-
});
46-
}
47-
48-
// If a URL alias was created and 'generated' is set to false, do nothing.
49-
if (urlAliasEntity?.generated === false) {
50-
return next();
51-
}
52-
53-
// Ideally here we would create the URL alias an directly fire
54-
// the `service.create.call` function with the new URL alias id.
55-
// Though it is possible that the `id` field is used in the URL.
56-
// In that case we have to create the entity first. Then when we know
57-
// the id, can we create the URL alias entity and can we update
58-
// the previously created entity.
59-
const newEntity = await next() as Modules.Documents.AnyDocument;
42+
// Fire the action.
43+
const entity = await next() as Modules.Documents.AnyDocument;
6044

45+
// Fetch the full entity.
6146
const fullEntity = await strapi.documents(uid as 'api::test.test').findOne({
62-
documentId: newEntity.documentId,
47+
documentId: entity.documentId,
6348
populate: {
49+
...relations.reduce((obj, key) => ({ ...obj, [key]: {} }), {}),
50+
url_alias: {
51+
fields: ['id', 'generated'],
52+
},
6453
localizations: {
6554
populate: {
66-
url_alias: true,
55+
url_alias: {
56+
fields: ['id'],
57+
},
6758
},
6859
},
6960
},
7061
});
7162

63+
// If the document already has an URL alias, fetch it.
64+
if (params.data.url_alias?.[0]) {
65+
urlAliasEntity = await strapi.documents('plugin::webtools.url-alias').findOne({
66+
documentId: params.data.url_alias[0],
67+
});
68+
} else if (fullEntity.url_alias[0]) {
69+
[urlAliasEntity] = fullEntity.url_alias;
70+
}
71+
72+
// If the URL alias has 'generated' set to false, do nothing.
73+
if (urlAliasEntity?.generated === false) {
74+
return next();
75+
}
76+
7277
// Fetch the URL alias localizations.
7378
const urlAliasLocalizations = fullEntity.localizations
7479
// @todo check all url aliases, not just the first.
@@ -129,14 +134,9 @@ const createMiddleware: Modules.Documents.Middleware.Middleware = async (context
129134
}));
130135

131136
// Eventually update the entity to include the URL alias.
132-
const updatedEntity = await strapi.documents(uid as 'api::test.test').update({
133-
documentId: fullEntity.documentId,
134-
data: {
135-
url_alias: [urlAliasEntity.documentId],
136-
},
137-
});
137+
params.data.url_alias = [urlAliasEntity?.documentId];
138138

139-
return updatedEntity;
139+
return next();
140140
};
141141

142-
export default createMiddleware;
142+
export default generateUrlAliasMiddleware;
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import cloneMiddleware from './clone';
2-
import deleteMiddleware from './delete';
3-
import creatMiddleware from './create';
4-
import updateMiddleware from './update';
1+
import generateUrlAlias from './generate-url-alias';
2+
import preventDuplicateUrls from './prevent-duplicate-urls';
3+
import deleteUrlAlias from './delete-url-alias';
54

65
export default {
7-
clone: cloneMiddleware,
8-
delete: deleteMiddleware,
9-
create: creatMiddleware,
10-
update: updateMiddleware,
6+
generateUrlAlias,
7+
preventDuplicateUrls,
8+
deleteUrlAlias,
119
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Modules } from '@strapi/strapi';
2+
import { getPluginService } from '../util/getPluginService';
3+
4+
// eslint-disable-next-line max-len
5+
const preventDuplicateUrlsMiddleware: Modules.Documents.Middleware.Middleware = async (context, next) => {
6+
const { uid, action } = context;
7+
8+
// Only run this for the URL alias entities.
9+
if (uid !== 'plugin::webtools.url-alias') {
10+
return next();
11+
}
12+
13+
// Run this middleware only for the create, update and clone action.
14+
if (!['create', 'update', 'clone'].includes(action)) {
15+
return next();
16+
}
17+
18+
const params = context.params as Modules.Documents.ServiceParams<'plugin::webtools.url-alias'>['create' | 'update' | 'clone'] & { documentId: string };
19+
20+
if (params.data.url_path) {
21+
params.data.url_path = await getPluginService('url-alias').makeUniquePath(params.data.url_path, params.documentId);
22+
}
23+
24+
return next();
25+
};
26+
27+
export default preventDuplicateUrlsMiddleware;

0 commit comments

Comments
 (0)