UNPKG

@digicms/cms

Version:

An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite

85 lines (65 loc) 2.17 kB
'use strict'; const { pipe, omit, pick } = require('lodash/fp'); const { createController } = require('./core-api/controller'); const { createService } = require('./core-api/service'); const { createRoutes } = require('./core-api/routes'); const createCoreController = (uid, cfg = {}) => { return ({ strapi }) => { const baseController = createController({ contentType: strapi.contentType(uid), }); const userCtrl = typeof cfg === 'function' ? cfg({ strapi }) : cfg; for (const methodName of Object.keys(baseController)) { if (userCtrl[methodName] === undefined) { userCtrl[methodName] = baseController[methodName]; } } Object.setPrototypeOf(userCtrl, baseController); return userCtrl; }; }; const createCoreService = (uid, cfg = {}) => { return ({ strapi }) => { const baseService = createService({ contentType: strapi.contentType(uid), }); const userService = typeof cfg === 'function' ? cfg({ strapi }) : cfg; for (const methodName of Object.keys(baseService)) { if (userService[methodName] === undefined) { userService[methodName] = baseService[methodName]; } } Object.setPrototypeOf(userService, baseService); return userService; }; }; const createCoreRouter = (uid, cfg = {}) => { const { prefix, config = {}, only, except } = cfg; let routes; return { get prefix() { return prefix; }, get routes() { if (!routes) { const contentType = strapi.contentType(uid); const defaultRoutes = createRoutes({ contentType }); Object.keys(defaultRoutes).forEach((routeName) => { const defaultRoute = defaultRoutes[routeName]; Object.assign(defaultRoute.config, config[routeName] || {}); }); const selectedRoutes = pipe( (routes) => (except ? omit(except, routes) : routes), (routes) => (only ? pick(only, routes) : routes) )(defaultRoutes); routes = Object.values(selectedRoutes); } return routes; }, }; }; module.exports = { createCoreController, createCoreService, createCoreRouter, };