typescript-express-api-generator
Version:
this is a file generator utility that can be used with my express typescript starter repo https://github.com/ShashiSrinath/node-express-typescript-starter
108 lines (86 loc) • 4.2 kB
JavaScript
const { pascalCase, camelCase } = require('change-case');
const generate = (meta) => {
const name = meta.name;
let dtoFile = `import { Create${pascalCase(name)}ReqDto } from './dto/create-${name}-req.dto';
import { I${pascalCase(name)}, ${pascalCase(name)}Model } from './${name}.model';
import configLogger from '../../utils/logger';
import { HttpError } from '../../lib/http-error';
import { Create${pascalCase(name)}ResDto } from './dto/create-${name}-res.dto';
import { GetOne${pascalCase(name)}ReqDto } from './dto/get-one-${name}-req.dto';
import { Get${pascalCase(name)}ListReqDto } from './dto/get-${name}-list-req.dto';
import { Update${pascalCase(name)}ReqDto } from './dto/update-${name}-req.dto';
import { GetOne${pascalCase(name)}ResDto } from './dto/get-one-${name}-res.dto';
import { Get${pascalCase(name)}ListResDto } from './dto/get-${name}-list-res.dto';
import { Update${pascalCase(name)}ResDto } from './dto/update-${name}-res.dto';
import { DeleteOne${pascalCase(name)}ReqDto } from './dto/delete-one-${name}-req.dto';
import { DeleteOne${pascalCase(name)}ResDto } from './dto/delete-one-${name}-res.dto';
const logger = configLogger('${name}.service');
`;
dtoFile += `const create${pascalCase(name)} = async (
data: Create${pascalCase(name)}ReqDto
): Promise<Create${pascalCase(name)}ResDto> => {
logger.info(\`Creating new ${name} with the payload: \${JSON.stringify(data)}\`);
const created${pascalCase(name)} = await ${pascalCase(name)}Model.create(data);
logger.info(\`${pascalCase(name)} created: \${JSON.stringify(created${pascalCase(name)})}\`);
return created${pascalCase(name)};
};
`;
dtoFile += `const getOne${pascalCase(name)} = async ({
id,
}: GetOne${pascalCase(name)}ReqDto): Promise<GetOne${pascalCase(name)}ResDto> => {
logger.info(\`Finding ${name} by id: \${id}\`);
const ${camelCase(name)} = await ${pascalCase(name)}Model.findById(id);
if (!${camelCase(name)}) {
logger.warn(\`${pascalCase(name)} not found by id: \${id}\`);
throw new HttpError(404, \`${pascalCase(name)} not found by id: \${id}\`, 'NotFound');
}
logger.info(\`Found ${name}: \${JSON.stringify(${camelCase(name)})}\`);
return ${camelCase(name)};
};
const get${pascalCase(name)}List = async (
query: Get${pascalCase(name)}ListReqDto
): Promise<Get${pascalCase(name)}ListResDto> => {
logger.info(\`Fetching ${name} list by query: \${JSON.stringify(query)}\`);
const total${pascalCase(name)}s = await ${pascalCase(name)}Model.count(query.filter);
const ${camelCase(name)}s = await ${pascalCase(name)}Model.find(query.filter)
.sort(query.sort)
.skip(query.pagination.perPage * (query.pagination.page - 1))
.limit(query.pagination.perPage);
logger.info(\`\${${camelCase(name)}s.length} records found\`);
return { total: total${pascalCase(name)}s, data: ${camelCase(name)}s };
};
const update${pascalCase(name)} = async (
payload: Update${pascalCase(name)}ReqDto
): Promise<Update${pascalCase(name)}ResDto> => {
const { id, ...updateData } = payload;
logger.info(\`Updating ${name}: \${id} with data: \${JSON.stringify(updateData)}\`);
// updating the ${name}
const ${camelCase(name)} = await ${pascalCase(name)}Model.findByIdAndUpdate(id, updateData, {
new: true,
});
logger.info(\`${pascalCase(name)} updated: \${JSON.stringify(${camelCase(name)})}\`);
return ${camelCase(name)};
};
const deleteOne${pascalCase(name)} = async ({
id,
}: DeleteOne${pascalCase(name)}ReqDto): Promise<DeleteOne${pascalCase(name)}ResDto> => {
logger.info(\`Deleting ${name} by id: \${id}\`);
const ${camelCase(name)} = await ${pascalCase(name)}Model.findByIdAndRemove(id);
if (!${camelCase(name)}) {
logger.warn(\`${pascalCase(name)} not found by id: \${id}\`);
throw new HttpError(404, \`${pascalCase(name)} not found by id: \${id}\`, 'NotFound');
}
logger.info(\`${pascalCase(name)} Deleted: \${JSON.stringify(${camelCase(name)})}\`);
return ${camelCase(name)};
};
export default {
create${pascalCase(name)},
getOne${pascalCase(name)},
get${pascalCase(name)}List,
update${pascalCase(name)},
deleteOne${pascalCase(name)},
};
`;
return dtoFile;
};
module.exports = generate;