sugar-generate
Version:
Auto generate OAS 3.0 REST + GraphQL APIs (Node + MongoDB)
74 lines (70 loc) • 2.44 kB
JavaScript
const fs = require('fs');
const beautify = require('js-beautify').js;
module.exports = ({ schema, logging, destination, name }) => {
const action = 'getOne';
const { uppercase, sugarGenerated } = require('../utils');
if (logging) console.log(` API => REST => GET ONE ${name}`);
const controllerSubFolder = `${destination}/controller/${name}`;
const createFile = `${controllerSubFolder}/getOne.js`;
let code = [];
const top = [
sugarGenerated(),
`const ${uppercase(name)} = require("../../models/${uppercase(name)}");`,
// `const { userCanApiKey } = require('../../configs/config');`,
// `const userCan = require('../../user-can')(userCanApiKey);`,
];
const swagger = [
"/*",
`* @oas [get] /${name}/{id}`,
`* summary: "get one ${name}"`,
`* tags: ["${name}"]`,
`* parameters:`,
`* - name: 'id'`,
`* in: 'path'`,
`* description: id of the ${name}`,
`* schema:`,
`* type: 'string'`,
`* example: "123456"`,
`* responses:`,
`* "200":`,
`* description: "get one ${name}"`,
`* schema:`,
`* type: "${uppercase(name)}"`,
"*/",
];
const func = [
`module.exports = async (req, res) => {`,
` try {`,
` const { id } = req.params;`,
` const existing${uppercase(name)} = await ${uppercase(name)}.findOne({ _id: id });`,
` if (!existing${uppercase(name)}) throw new Error('${name} not found.');`,
];
const end = [
` `,
` } catch (e) {`,
` console.error('GetOne => ${name}', e);`,
` return res.status(500).json({ error: e.message ? e.message : e });`,
` }`,
`};`,
];
const permissions = [
// ``,
// `// @TODO Permissions`,
// `const permission = userCan('${action}', '${name}', { user: req.user, body: req.body, params: req.params, query: req.query });`,
// `if (!permission) throw new Error('Permission denied for userCan ${action} ${name}');`,
// ``
];
const safeArea = [
`// @TODO handle safe area. Should be idempotent.`,
``,
`// maybe with @sugar-safe-start`,
`// @sugar-safe-end`,
``
];
const save = [
`return res.json({ ${name}: existing${uppercase(name)} });`
];
code = code.concat(top, swagger, func, permissions, safeArea, save, end);
const pretty = beautify(code.join('\n'), { indent_size: 2, space_in_empty_paren: true });
fs.writeFileSync(createFile, pretty);
};