From a598df1f43e8a6aa8fd6ff951c95eb07d6112889 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Thu, 23 Jan 2020 17:25:27 +0100 Subject: [PATCH] Create singleType ctrl and service functions Signed-off-by: Alexandre Bodin --- packages/strapi/lib/core-api/controller.js | 46 +++++++++++++++++----- packages/strapi/lib/core-api/service.js | 38 ++++++++++++++++++ 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/packages/strapi/lib/core-api/controller.js b/packages/strapi/lib/core-api/controller.js index ccb7f590ee..0865f6c6be 100644 --- a/packages/strapi/lib/core-api/controller.js +++ b/packages/strapi/lib/core-api/controller.js @@ -7,17 +7,48 @@ const { parseMultipartData, sanitizeEntity } = require('strapi-utils'); * */ module.exports = ({ service, model }) => { - return { - /** - * expose some utils so the end users can use them - */ + if (model.kind === 'singleType') { + return { + /** + * Retrieve single type content + * + * @return {Object|Array} + */ + async find() { + const entity = await service.find(); + return sanitizeEntity(entity, { model }); + }, + /** + * Update single type content. + * + * @return {Object} + */ + async update(ctx) { + let entity; + if (ctx.is('multipart')) { + const { data, files } = parseMultipartData(ctx); + entity = await service.createOrUpdate(data, { files }); + } else { + entity = await service.createOrUpdate(ctx.request.body); + } + + return sanitizeEntity(entity, { model }); + }, + + async delete() { + const entity = await service.delete(); + return sanitizeEntity(entity, { model }); + }, + }; + } + + return { /** * Retrieve records. * * @return {Object|Array} */ - async find(ctx) { let entities; if (ctx.query._q) { @@ -34,7 +65,6 @@ module.exports = ({ service, model }) => { * * @return {Object} */ - async findOne(ctx) { const entity = await service.findOne(ctx.params); return sanitizeEntity(entity, { model }); @@ -45,7 +75,6 @@ module.exports = ({ service, model }) => { * * @return {Number} */ - count(ctx) { if (ctx.query._q) { return service.countSearch(ctx.query); @@ -58,7 +87,6 @@ module.exports = ({ service, model }) => { * * @return {Object} */ - async create(ctx) { let entity; if (ctx.is('multipart')) { @@ -75,7 +103,6 @@ module.exports = ({ service, model }) => { * * @return {Object} */ - async update(ctx) { let entity; if (ctx.is('multipart')) { @@ -93,7 +120,6 @@ module.exports = ({ service, model }) => { * * @return {Object} */ - async delete(ctx) { const entity = await service.delete(ctx.params); return sanitizeEntity(entity, { model }); diff --git a/packages/strapi/lib/core-api/service.js b/packages/strapi/lib/core-api/service.js index f7711e555f..12d66d6286 100644 --- a/packages/strapi/lib/core-api/service.js +++ b/packages/strapi/lib/core-api/service.js @@ -6,6 +6,44 @@ */ module.exports = ({ model, strapi }) => { + if (model.kind === 'singleType') { + return { + find(populate) { + return strapi.entityService.find({ populate }, { model }); + }, + + async createOrUpdate(data, { files } = {}) { + const entity = await this.find(); + + if (!entity) { + return strapi.entityService.create({ data, files }, { model }); + } else { + return strapi.entityService.update( + { + params: { + id: entity.id, + }, + data, + files, + }, + { model } + ); + } + }, + + async delete() { + const entity = await this.find(); + + if (!entity) return; + + return strapi.entityService.delete( + { params: { id: entity.id } }, + { model } + ); + }, + }; + } + return { /** * Promise to fetch all records