Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion src/commands/server/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const NewCommand: ExtendedGluegunCommand = {
parameters,
patching,
print: { divider, error, info, spin, success },
prompt: { ask, confirm },
server,
strings: { camelCase, kebabCase, pascalCase },
system,
Expand All @@ -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);
Expand Down Expand Up @@ -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 },
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -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
Expand Down
45 changes: 45 additions & 0 deletions src/templates/nest-server-module/template.controller.ts.ejs
Original file line number Diff line number Diff line change
@@ -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<any> {
return await this.<%= props.nameCamel %>Service.create(input);
}

@Get()
@Roles(RoleEnum.ADMIN)
async get(@Body() filterArgs: FilterArgs): Promise<any> {
return await this.<%= props.nameCamel %>Service.find(filterArgs);
}

@Get(':id')
@Roles(RoleEnum.ADMIN)
async getById(@Param('id') id: string): Promise<any> {
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<any> {
return await this.<%= props.nameCamel %>Service.update(id, input);
}

@Delete(':id')
@Roles(RoleEnum.ADMIN)
async delete(@Param('id') id: string): Promise<any> {
return await this.<%= props.nameCamel %>Service.delete(id);
}

}
28 changes: 17 additions & 11 deletions src/templates/nest-server-module/template.module.ts.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
2 changes: 1 addition & 1 deletion src/templates/nest-server-module/template.resolver.ts.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
}