56 lines
1.6 KiB
JavaScript

'use strict';
const _ = require('lodash');
const { getPluginService } = require('../utils/getPluginService');
const { isValidFindSlugParams } = require('../utils/isValidFindSlugParams');
const { sanitizeOutput } = require('../utils/sanitizeOutput');
const { hasRequiredModelScopes } = require('../utils/hasRequiredModelScopes');
const transform = require('../utils/transform');
module.exports = ({ strapi }) => ({
async findSlug(ctx) {
const { modelsByName } = getPluginService('settingsService').get();
const { modelName, slug } = ctx.request.params;
const { auth } = ctx.state;
try {
isValidFindSlugParams({
modelName,
slug,
modelsByName,
});
} catch (error) {
return ctx.badRequest(error.message);
}
const { uid, field, contentType } = modelsByName[modelName];
try {
await hasRequiredModelScopes(strapi, uid, auth);
} catch (error) {
return ctx.forbidden();
}
// add slug filter to any already existing query restrictions
let query = ctx.query || {};
if (!query.filters) {
query.filters = {};
}
query.filters[field] = slug;
// only return published entries by default if content type has draftAndPublish enabled
if (_.get(contentType, ['options', 'draftAndPublish'], false) && !query.publicationState) {
query.publicationState = 'live';
}
const data = await getPluginService('slugService').findOne(uid, query);
if (data) {
const sanitizedEntity = await sanitizeOutput(data, contentType, auth);
ctx.body = transform.response({ data: sanitizedEntity, schema: contentType });
} else {
ctx.notFound();
}
},
});