node-apis
Version:
🚀 Advanced TypeScript API generator with clean architecture, comprehensive testing, and automatic formatting. Generate production-ready Node.js APIs with complete integration test suites.
117 lines (108 loc) • 4.01 kB
JavaScript
"use strict";
/**
* Custom controller templates
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCustomControllerContent = exports.getCustomControllerFileNames = void 0;
/**
* Gets custom controller file names for a module
*/
const getCustomControllerFileNames = ({ customNames, moduleName, }) => {
return customNames.map(customName => `${customName}.${moduleName}.ts`);
};
exports.getCustomControllerFileNames = getCustomControllerFileNames;
/**
* Generates TypeScript controller file content for custom operations
*/
const generateCustomControllerContent = ({ customName, moduleName, framework = 'express', }) => {
const capitalizedModule = moduleName.charAt(0).toUpperCase() + moduleName.slice(1);
const capitalizedCustom = customName.charAt(0).toUpperCase() + customName.slice(1);
return generateGenericCustomControllerContent(customName, capitalizedModule, capitalizedCustom, moduleName, framework);
};
exports.generateCustomControllerContent = generateCustomControllerContent;
/**
* Generates generic custom controller content
*/
const generateGenericCustomControllerContent = (customName, capitalizedModule, _capitalizedCustom, moduleName, framework = 'express') => {
if (framework === 'hono') {
return `import type { Context } from 'hono';
import { validatePayload } from '../validators/${customName}.${moduleName}';
import { ${customName}${capitalizedModule} as ${customName}${capitalizedModule}Service } from '../services/${customName}.${moduleName}';
import { randomBytes } from 'crypto';
export const ${customName}${capitalizedModule} = async (c: Context): Promise<Response> => {
const requestId = randomBytes(16).toString('hex');
try {
const body = await c.req.json();
// Validate request payload
const validation = validatePayload(body);
if (!validation.success) {
return c.json({
data: null,
error: {
code: 'VALIDATION_ERROR',
message: validation.error.message,
statusCode: 400,
requestId
}
}, 400);
}
// Call service layer with requestId
const result = await ${customName}${capitalizedModule}Service({ ...validation.data, requestId });
// Return service result
const statusCode = result.error ? result.error.statusCode || 500 : 200;
return c.json(result, statusCode);
} catch (error) {
return c.json({
data: null,
error: {
code: 'INTERNAL_ERROR',
message: 'Failed to process request',
statusCode: 500,
requestId
}
}, 500);
}
};
`;
}
return `import type { Request, Response } from 'express';
import { validatePayload } from '../validators/${customName}.${moduleName}';
import { ${customName}${capitalizedModule} as ${customName}${capitalizedModule}Service } from '../services/${customName}.${moduleName}';
import { randomBytes } from 'crypto';
export const ${customName}${capitalizedModule} = async (req: Request, res: Response): Promise<void> => {
const requestId = randomBytes(16).toString('hex');
try {
// Validate request payload
const validation = validatePayload(req.body);
if (!validation.success) {
res.status(400).json({
data: null,
error: {
code: 'VALIDATION_ERROR',
message: validation.error.message,
statusCode: 400,
requestId
}
});
return;
}
// Call service layer with requestId
const result = await ${customName}${capitalizedModule}Service({ ...validation.data, requestId });
// Return service result
const statusCode = result.error ? result.error.statusCode || 500 : 200;
res.status(statusCode).json(result);
} catch (error) {
res.status(500).json({
data: null,
error: {
code: 'INTERNAL_ERROR',
message: 'Failed to process request',
statusCode: 500,
requestId
}
});
}
};
`;
};
//# sourceMappingURL=custom.controllers.js.map