Skip to content
This repository was archived by the owner on Sep 16, 2025. It is now read-only.

Commit 70e1151

Browse files
fix (findSlug query): default live publication state (#9)
* fix(findSlug query): only return published records by default * refactor(settingsService): add build util * refactor(slugService): remove unnecessary validation
1 parent b5ef5bc commit 70e1151

File tree

5 files changed

+54
-22
lines changed

5 files changed

+54
-22
lines changed

server/bootstrap.js

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,16 @@ const { SUPPORTED_LIFECYCLES } = require('./utils/constants');
55
const { getPluginService } = require('./utils/getPluginService');
66

77
module.exports = ({ strapi }) => {
8-
const settings = getPluginService(strapi, 'settingsService').get();
8+
const settingsService = getPluginService(strapi, 'settingsService');
9+
const settings = settingsService.get();
910

1011
const { contentTypes, slugifyOptions } = settings;
1112

1213
// build settings structure
13-
const models = {};
14-
_.forEach(strapi.contentTypes, (value, key) => {
15-
if (contentTypes[value.modelName]) {
16-
const data = {
17-
uid: value.uid,
18-
...contentTypes[value.modelName],
19-
contentType: value,
20-
};
21-
models[key] = data;
22-
models[value.modelName] = data;
23-
}
24-
});
14+
const models = settingsService.build(contentTypes);
2515

2616
// reset plugin settings
27-
getPluginService(strapi, 'settingsService').set({
17+
settingsService.set({
2818
models,
2919
slugifyOptions,
3020
});

server/controllers/slug-controller.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
const { getPluginService } = require('../utils/getPluginService');
4+
const _ = require('lodash');
45

56
module.exports = ({ strapi }) => ({
67
async findSlug(ctx) {
@@ -24,15 +25,20 @@ module.exports = ({ strapi }) => ({
2425
);
2526
}
2627

27-
const { uid, field } = model;
28+
const { uid, field, contentType } = model;
2829

2930
// add slug filter to any already existing query restrictions
30-
let query = ctx.query;
31+
let query = ctx.query || {};
3132
if (!query.filters) {
3233
query.filters = {};
3334
}
3435
query.filters[field] = slug;
3536

37+
// only return published entries by default if content type has draftAndPublish enabled
38+
if (_.get(contentType, ['options', 'draftAndPublish'], false) && !query.publicationState) {
39+
query.publicationState = 'live';
40+
}
41+
3642
const data = await getPluginService(strapi, 'slugService').findOne(uid, query);
3743

3844
if (data) {

server/graphql/types.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,18 @@ const getCustomTypes = (strapi, nexus) => {
5656
return toEntityResponse(null, { resourceUID: uid });
5757
}
5858

59-
const { uid, field } = model;
59+
const { uid, field, contentType } = model;
6060
let query = {
6161
filters: {
6262
[field]: slug,
6363
},
6464
};
6565

66+
// only return published entries
67+
if (_.get(contentType, ['options', 'draftAndPublish'], false)) {
68+
query.publicationState = 'live';
69+
}
70+
6671
const data = await getPluginService(strapi, 'slugService').findOne(uid, query);
6772
return toEntityResponse(data, { resourceUID: uid });
6873
},

server/services/settings-service.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
const _ = require('lodash');
34
const { pluginId } = require('../utils/pluginId');
45

56
module.exports = ({ strapi }) => ({
@@ -9,4 +10,34 @@ module.exports = ({ strapi }) => ({
910
set(settings) {
1011
return strapi.config.set(`plugin.${pluginId}`, settings);
1112
},
13+
build(contentTypes) {
14+
let models = {};
15+
16+
_.filter(strapi.contentTypes, (value, uid) => {
17+
const model = contentTypes[value.modelName];
18+
if (!model) {
19+
return;
20+
}
21+
22+
// ensure provided fields are present on the model
23+
const hasField = _.get(value, ['attributes', model.field], false);
24+
const hasReference = _.get(value, ['attributes', model.references], false);
25+
if (!hasField || !hasReference) {
26+
strapi.log.warn(
27+
`[slugify] skipping ${value.info.singularName} registration, invalid field and/or reference provided.`
28+
);
29+
return;
30+
}
31+
32+
const data = {
33+
uid,
34+
...contentTypes[value.modelName],
35+
contentType: value,
36+
};
37+
models[uid] = data;
38+
models[value.modelName] = data;
39+
});
40+
41+
return models;
42+
},
1243
});

server/services/slug-service.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ module.exports = ({ strapi }) => ({
1515
return;
1616
}
1717

18-
const field = model.field;
19-
const references = data[model.references];
18+
const { field, references } = model;
19+
const referenceFieldValue = data[references];
2020

21-
// for empty values they are null, undefined means they are not on the model.
22-
if (!field || typeof data[model.field] === 'undefined' || typeof references === 'undefined') {
21+
// ensure the reference field has data
22+
if (typeof referenceFieldValue === 'undefined') {
2323
return;
2424
}
2525

26-
data[field] = stringToSlug(references, slugifyOptions);
26+
data[field] = stringToSlug(referenceFieldValue, slugifyOptions);
2727
},
2828

2929
async findOne(uid, query) {

0 commit comments

Comments
 (0)