const defaults = require('./defaults') const asyncHandler = require('express-async-handler') const {verify, permissions} = require('../controllers/auth') module.exports = (opts) => { opts = defaults(opts) const { app, controller } = opts const TYPE_VIEW = `${opts.constantName}_VIEW` const TYPE_CREATE = `${opts.constantName}_CREATE` const TYPE_READ = `${opts.constantName}_READ` const TYPE_UPDATE = `${opts.constantName}_UPDATE` const TYPE_DELETE = `${opts.constantName}_DELETE` const TYPE_UNDELETE = `${opts.constantName}_UNDELETE` permissions.register(TYPE_VIEW, `Display ${opts.titleName} links in the nav bar.`) permissions.register(TYPE_CREATE, `Create ${opts.titlePlural}.`) permissions.register(TYPE_READ, `List and read ${opts.titlePlural}.`) permissions.register(TYPE_UPDATE, `Update ${opts.titlePlural}.`) permissions.register(TYPE_DELETE, `Delete ${opts.titlePlural}.`) permissions.register(TYPE_UNDELETE, `View undeleted ${opts.titlePlural} and restore deleted ${opts.titlePlural}.`) if (controller.list) app.get(`${opts.apiPrefix}`, verify(TYPE_READ), asyncHandler(controller.list)) if (controller.create) app.post(`${opts.apiPrefix}`, verify(TYPE_CREATE), asyncHandler(controller.create)) if (controller.trash) app.get(`${opts.apiPrefix}/trash`, verify(TYPE_UNDELETE), asyncHandler(controller.trash)) if (controller.read) app.get(`${opts.apiPrefix}/:${opts.routeParam}`, verify(TYPE_READ), asyncHandler(controller.read)) if (controller.update) app.patch(`${opts.apiPrefix}/:${opts.routeParam}`, verify(TYPE_UPDATE), asyncHandler(controller.update)) if (controller.delete) app.delete(`${opts.apiPrefix}/:${opts.routeParam}`, verify(TYPE_DELETE), asyncHandler(controller.delete)) if (controller.undelete) app.delete(`${opts.apiPrefix}/trash/:${opts.routeParam}`, verify(TYPE_UNDELETE), asyncHandler(controller.undelete)) console.log(`crud: /api/${opts.paramPlural}`) }