From a9db84a78509d775b68a662b2b2db9c6f949a468 Mon Sep 17 00:00:00 2001 From: nicokampf Date: Wed, 16 Apr 2025 15:26:25 +0200 Subject: [PATCH] feat(DEV-126): Add option for rest controller. --- src/commands/server/module.ts | 26 ++++++++++- .../template.controller.ts.ejs | 45 +++++++++++++++++++ .../nest-server-module/template.module.ts.ejs | 28 +++++++----- .../template.resolver.ts.ejs | 2 +- 4 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 src/templates/nest-server-module/template.controller.ts.ejs diff --git a/src/commands/server/module.ts b/src/commands/server/module.ts index c4ea324..3c9ee8a 100644 --- a/src/commands/server/module.ts +++ b/src/commands/server/module.ts @@ -38,6 +38,7 @@ const NewCommand: ExtendedGluegunCommand = { parameters, patching, print: { divider, error, info, spin, success }, + prompt: { ask, confirm }, server, strings: { camelCase, kebabCase, pascalCase }, system, @@ -62,6 +63,14 @@ const NewCommand: ExtendedGluegunCommand = { return; } + + const controller = (await ask({ + choices: ['Rest', 'GraphQL', 'Both'], + message: 'What controller type?', + name: 'controller', + type: 'select', + })).controller; + // Set up initial props (to pass into templates) const nameCamel = camelCase(name); const nameKebab = kebabCase(name); @@ -96,6 +105,14 @@ const NewCommand: ExtendedGluegunCommand = { template: 'nest-server-module/inputs/template.input.ts.ejs', }); + if (controller === 'Rest' || controller === 'Both') { + await template.generate({ + props: { lowercase: name.toLowerCase(), nameCamel: camelCase(name), nameKebab: kebabCase(name), namePascal: pascalCase(name) }, + target: join(directory, `${nameKebab}.controller.ts`), + template: 'nest-server-module/template.controller.ts.ejs', + }); + } + // nest-server-module/inputs/xxx-create.input.ts await template.generate({ props: { imports: createTemplate.imports, nameCamel, nameKebab, namePascal, props: createTemplate.props }, @@ -126,17 +143,19 @@ const NewCommand: ExtendedGluegunCommand = { // nest-server-module/xxx.module.ts await template.generate({ - props: { nameCamel, nameKebab, namePascal }, + props: { controller, nameCamel, nameKebab, namePascal }, target: join(directory, `${nameKebab}.module.ts`), template: 'nest-server-module/template.module.ts.ejs', }); + if (controller === 'GraphQL' || controller === 'Both') { // nest-server-module/xxx.resolver.ts await template.generate({ props: { nameCamel, nameKebab, namePascal }, target: join(directory, `${nameKebab}.resolver.ts`), template: 'nest-server-module/template.resolver.ts.ejs', }); + } // nest-server-module/xxx.service.ts await template.generate({ @@ -198,6 +217,11 @@ const NewCommand: ExtendedGluegunCommand = { await genObject.run(toolbox, { currentItem: nextObj, objectsToAdd, preventExitProcess: true, referencesToAdd }); } + // Prettier + if (await confirm('Run Prettier?', true)) { + await system.run('npx prettier --write .'); + } + divider(); // We're done, so show what to do next diff --git a/src/templates/nest-server-module/template.controller.ts.ejs b/src/templates/nest-server-module/template.controller.ts.ejs new file mode 100644 index 0000000..c116657 --- /dev/null +++ b/src/templates/nest-server-module/template.controller.ts.ejs @@ -0,0 +1,45 @@ +import { ApiCommonErrorResponses, FilterArgs, RoleEnum, Roles } from '@lenne.tech/nest-server'; +import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common'; + +import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service'; +import { <%= props.namePascal %>Input } from './inputs/<%= props.nameKebab %>.input'; +import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input'; + +@ApiCommonErrorResponses() +@Controller('<%= props.lowercase %>') +@Roles(RoleEnum.ADMIN) +export class <%= props.namePascal %>Controller { + +constructor(protected readonly <%= props.nameCamel %>Service: <%= props.namePascal %>Service) {} + + @Post() + @Roles(RoleEnum.ADMIN) + async create(@Body() input: <%= props.namePascal %>CreateInput): Promise { + return await this.<%= props.nameCamel %>Service.create(input); + } + + @Get() + @Roles(RoleEnum.ADMIN) + async get(@Body() filterArgs: FilterArgs): Promise { + return await this.<%= props.nameCamel %>Service.find(filterArgs); + } + + @Get(':id') + @Roles(RoleEnum.ADMIN) + async getById(@Param('id') id: string): Promise { + return await this.<%= props.nameCamel %>Service.findOne({filterQuery: { _id: id }}) + } + + @Put(':id') + @Roles(RoleEnum.ADMIN) + async update(@Param('id') id: string, @Body() input: <%= props.namePascal %>Input): Promise { + return await this.<%= props.nameCamel %>Service.update(id, input); + } + + @Delete(':id') + @Roles(RoleEnum.ADMIN) + async delete(@Param('id') id: string): Promise { + return await this.<%= props.nameCamel %>Service.delete(id); + } + +} diff --git a/src/templates/nest-server-module/template.module.ts.ejs b/src/templates/nest-server-module/template.module.ts.ejs index 0f495a7..57d4582 100644 --- a/src/templates/nest-server-module/template.module.ts.ejs +++ b/src/templates/nest-server-module/template.module.ts.ejs @@ -5,23 +5,29 @@ import { PubSub } from 'graphql-subscriptions'; import { UserModule } from '../user/user.module'; import { <%= props.namePascal %>, <%= props.namePascal %>Schema } from './<%= props.nameKebab %>.model'; +<% if ((props.controller === 'GraphQL') || (props.controller === 'Both')) { -%> import { <%= props.namePascal %>Resolver } from './<%= props.nameKebab %>.resolver'; +<% } -%> import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service'; +<% if ((props.controller === 'Rest') || (props.controller === 'Both')) { -%> + import { <%= props.namePascal %>Controller } from './<%= props.nameKebab %>.controller'; +<% } -%> /** - * <%= props.namePascal %> module - */ +* <%= props.namePascal %> module +*/ @Module({ - controllers: [], - exports: [MongooseModule, <%= props.namePascal %>Resolver, <%= props.namePascal %>Service], - imports: [ - MongooseModule.forFeature([{ name: <%= props.namePascal %>.name, schema: <%= props.namePascal %>Schema }]), - forwardRef(() => UserModule), - ], +<% if ((props.controller === 'Rest') || (props.controller === 'Both')) { -%> + controllers: [<%= props.namePascal %>Controller], +<% } -%> + exports: [ MongooseModule, <% if ((props.controller === 'GraphQL') || (props.controller === 'Both')) { -%> <%= props.namePascal %>Resolver, <% } -%> <%= props.namePascal %>Service], + imports: [ MongooseModule.forFeature([{ name: <%= props.namePascal %>.name, schema: <%= props.namePascal %>Schema }]), forwardRef(() => UserModule) ], providers: [ - ConfigService, - <%= props.namePascal %>Resolver, - <%= props.namePascal %>Service, + ConfigService, +<% if ((props.controller === 'GraphQL') || (props.controller === 'Both')) { -%> + <%= props.namePascal %>Resolver, +<% } -%> + <%= props.namePascal %>Service, { provide: 'PUB_SUB', useValue: new PubSub(), diff --git a/src/templates/nest-server-module/template.resolver.ts.ejs b/src/templates/nest-server-module/template.resolver.ts.ejs index 2d01a2e..efa3c24 100644 --- a/src/templates/nest-server-module/template.resolver.ts.ejs +++ b/src/templates/nest-server-module/template.resolver.ts.ejs @@ -135,6 +135,6 @@ export class <%= props.namePascal %>Resolver { resolve: (value) => value, }) async <%= props.nameCamel %>Created() { - return this.pubSub.asyncIterator('<%= props.nameCamel %>Created'); + return this.pubSub.asyncIterableIterator('<%= props.nameCamel %>Created'); } }