@lenne.tech/cli 0.0.70 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/commands/server/module.js +8 -1
- package/build/templates/model.ts.ejs +3 -0
- package/build/templates/nest-server-module/inputs/template-create.input.ts.ejs +21 -0
- package/build/templates/nest-server-module/inputs/template.input.ts.ejs +22 -0
- package/build/templates/nest-server-module/template.model.ts.ejs +63 -0
- package/build/templates/nest-server-module/template.module.ts.ejs +27 -0
- package/build/templates/nest-server-module/template.resolver.ts.ejs +136 -0
- package/build/templates/nest-server-module/template.service.ts.ejs +74 -0
- package/build/templates/nest-server-starter/README.md.ejs +61 -0
- package/build/templates/nest-server-tests/tests.e2e-spec.ts.ejs +165 -0
- package/build/templates/typescript-starter/README.md.ejs +30 -0
- package/package.json +8 -8
|
@@ -95,14 +95,21 @@ const NewCommand = {
|
|
|
95
95
|
const serverModule = (0, path_1.join)(path, 'src', 'server', 'server.module.ts');
|
|
96
96
|
if (filesystem.exists(serverModule)) {
|
|
97
97
|
const includeSpinner = spin('Include module into server');
|
|
98
|
+
// Import module
|
|
98
99
|
yield patching.patch(serverModule, {
|
|
99
100
|
insert: `import { ${namePascal}Module } from './modules/${nameKebab}/${nameKebab}.module';\n`,
|
|
100
101
|
before: 'import',
|
|
101
102
|
});
|
|
103
|
+
// Add Module
|
|
102
104
|
yield patching.patch(serverModule, {
|
|
103
105
|
insert: ` ${namePascal}Module,\n `,
|
|
104
106
|
after: new RegExp('imports:[^\\]]*', 'm'),
|
|
105
107
|
});
|
|
108
|
+
// Add comma if necessary
|
|
109
|
+
yield patching.patch(serverModule, {
|
|
110
|
+
insert: '$1,$2',
|
|
111
|
+
replace: new RegExp('([^,\\s])(\\s*' + namePascal + 'Module,\\s*\\])'),
|
|
112
|
+
});
|
|
106
113
|
if (filesystem.exists(prettier)) {
|
|
107
114
|
yield system.run(prettier + ' ' + serverModule);
|
|
108
115
|
}
|
|
@@ -123,4 +130,4 @@ const NewCommand = {
|
|
|
123
130
|
}),
|
|
124
131
|
};
|
|
125
132
|
exports.default = NewCommand;
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBNEI7QUFHNUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkJBQTZCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Field, InputType } from '@nestjs/graphql';
|
|
2
|
+
import { IsOptional } from 'class-validator';
|
|
3
|
+
import { <%= props.namePascal %>Input } from './<%= props.nameKebab %>.input';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* <%= props.namePascal %> create input
|
|
7
|
+
*/
|
|
8
|
+
@InputType({ description: 'Input data to create a new <%= props.namePascal %>' })
|
|
9
|
+
export class <%= props.namePascal %>CreateInput extends <%= props.namePascal %>Input {
|
|
10
|
+
|
|
11
|
+
// ===================================================================================================================
|
|
12
|
+
// Properties
|
|
13
|
+
// ===================================================================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Description of the properties
|
|
17
|
+
*/
|
|
18
|
+
@Field(() => [String], { description: 'Description of the properties', nullable: true })
|
|
19
|
+
@IsOptional()
|
|
20
|
+
properties?: string[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Field, InputType } from '@nestjs/graphql';
|
|
3
|
+
import { IsOptional } from 'class-validator';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* <%= props.namePascal %> input
|
|
7
|
+
*/
|
|
8
|
+
@InputType({ description: 'Input data to update an existing <%= props.namePascal %>' })
|
|
9
|
+
export class <%= props.namePascal %>Input {
|
|
10
|
+
|
|
11
|
+
// ===================================================================================================================
|
|
12
|
+
// Properties
|
|
13
|
+
// ===================================================================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Description of the properties
|
|
17
|
+
*/
|
|
18
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
19
|
+
@Field(() => [String], { description: 'Description of the properties', nullable: true })
|
|
20
|
+
@IsOptional()
|
|
21
|
+
properties?: string[];
|
|
22
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { mapClasses, Restricted, RoleEnum } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Field, ObjectType } from '@nestjs/graphql';
|
|
3
|
+
import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
|
|
4
|
+
import { Document, Schema } from 'mongoose';
|
|
5
|
+
import { PersistenceModel } from '../../common/models/persistence.model';
|
|
6
|
+
import { User } from '../user/user.model';
|
|
7
|
+
|
|
8
|
+
export type <%= props.namePascal %>Document = <%= props.namePascal %> & Document;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* <%= props.namePascal %> model
|
|
12
|
+
*/
|
|
13
|
+
@ObjectType({ description: '<%= props.namePascal %>' })
|
|
14
|
+
@MongooseSchema({ timestamps: true })
|
|
15
|
+
export class <%= props.namePascal %> extends PersistenceModel {
|
|
16
|
+
|
|
17
|
+
// ===================================================================================================================
|
|
18
|
+
// Properties
|
|
19
|
+
// ===================================================================================================================
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Description of properties
|
|
23
|
+
*/
|
|
24
|
+
@Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
|
|
25
|
+
@Field(() => [String], { description: 'Properties of <%= props.namePascal %>', nullable: 'items'})
|
|
26
|
+
@Prop([String])
|
|
27
|
+
properties: string[] = undefined;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* User how has tested the <%= props.namePascal %>
|
|
31
|
+
*/
|
|
32
|
+
@Field(() => User, {
|
|
33
|
+
description: 'User who has tested the <%= props.namePascal %>',
|
|
34
|
+
nullable: true,
|
|
35
|
+
})
|
|
36
|
+
@Prop({ type: Schema.Types.ObjectId, ref: 'User' })
|
|
37
|
+
testedBy: User = undefined;
|
|
38
|
+
|
|
39
|
+
// ===================================================================================================================
|
|
40
|
+
// Methods
|
|
41
|
+
// ===================================================================================================================
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Initialize instance with default values instead of undefined
|
|
45
|
+
*/
|
|
46
|
+
init() {
|
|
47
|
+
super.init();
|
|
48
|
+
this.properties = [];
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Map input
|
|
54
|
+
*
|
|
55
|
+
* Hint: Non-primitive variables should always be mapped (see mapClasses / mapClassesAsync in ModelHelper)
|
|
56
|
+
*/
|
|
57
|
+
map(input) {
|
|
58
|
+
super.map(input);
|
|
59
|
+
return mapClasses(input, {user: User}, this);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const <%= props.namePascal %>Schema = SchemaFactory.createForClass(<%= props.namePascal %>);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JSON } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Module } from '@nestjs/common';
|
|
3
|
+
import { MongooseModule } from '@nestjs/mongoose';
|
|
4
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
5
|
+
import { UserModule } from '../user/user.module';
|
|
6
|
+
import { <%= props.namePascal %>, <%= props.namePascal %>Schema } from './<%= props.nameKebab %>.model';
|
|
7
|
+
import { <%= props.namePascal %>Resolver } from './<%= props.nameKebab %>.resolver';
|
|
8
|
+
import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* <%= props.namePascal %> module
|
|
12
|
+
*/
|
|
13
|
+
@Module({
|
|
14
|
+
imports: [MongooseModule.forFeature([{ name: <%= props.namePascal %>.name, schema: <%= props.namePascal %>Schema }]), UserModule],
|
|
15
|
+
controllers: [],
|
|
16
|
+
providers: [
|
|
17
|
+
<%= props.namePascal %>Resolver,
|
|
18
|
+
<%= props.namePascal %>Service,
|
|
19
|
+
JSON,
|
|
20
|
+
{
|
|
21
|
+
provide: 'PUB_SUB',
|
|
22
|
+
useValue: new PubSub(),
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
exports: [MongooseModule, <%= props.namePascal %>Resolver, <%= props.namePascal %>Service]
|
|
26
|
+
})
|
|
27
|
+
export class <%= props.namePascal %>Module {}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { FilterArgs, GraphQLUser, RoleEnum, Roles } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Inject } from '@nestjs/common';
|
|
3
|
+
import { Args, Info, Mutation, Query, Resolver, Subscription } from '@nestjs/graphql';
|
|
4
|
+
import { GraphQLResolveInfo } from 'graphql';
|
|
5
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
6
|
+
import { User } from '../user/user.model';
|
|
7
|
+
import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
|
|
8
|
+
import { <%= props.namePascal %>Input } from './inputs/<%= props.nameKebab %>.input';
|
|
9
|
+
import { <%= props.namePascal %> } from './<%= props.nameKebab %>.model';
|
|
10
|
+
import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolver to process with <%= props.namePascal %> data
|
|
14
|
+
*/
|
|
15
|
+
@Resolver(() => <%= props.namePascal %>)
|
|
16
|
+
export class <%= props.namePascal %>Resolver {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Import services
|
|
20
|
+
*/
|
|
21
|
+
constructor(
|
|
22
|
+
private readonly <%= props.nameCamel %>Service: <%= props.namePascal %>Service,
|
|
23
|
+
@Inject('PUB_SUB') protected readonly pubSub: PubSub
|
|
24
|
+
) {}
|
|
25
|
+
|
|
26
|
+
// ===========================================================================
|
|
27
|
+
// Queries
|
|
28
|
+
// ===========================================================================
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get <%= props.namePascal %>s (via filter)
|
|
32
|
+
*/
|
|
33
|
+
@Roles(RoleEnum.S_USER)
|
|
34
|
+
@Query(() => [<%= props.namePascal %>], { description: 'Find <%= props.namePascal %> (via filter)' })
|
|
35
|
+
async find<%= props.namePascal %>s(
|
|
36
|
+
@Info() info: GraphQLResolveInfo,
|
|
37
|
+
@GraphQLUser() user: User,
|
|
38
|
+
@Args() args?: FilterArgs
|
|
39
|
+
) {
|
|
40
|
+
return await this.<%= props.nameCamel %>Service.find(args, {
|
|
41
|
+
currentUser: user,
|
|
42
|
+
fieldSelection: { info, select: 'find<%= props.namePascal %>s' },
|
|
43
|
+
inputType: FilterArgs
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get <%= props.namePascal %> via ID
|
|
49
|
+
*/
|
|
50
|
+
@Roles(RoleEnum.S_USER)
|
|
51
|
+
@Query(() => <%= props.namePascal %>, { description: 'Get <%= props.namePascal %> with specified ID' })
|
|
52
|
+
async get<%= props.namePascal %>(
|
|
53
|
+
@Info() info: GraphQLResolveInfo,
|
|
54
|
+
@GraphQLUser() user: User,
|
|
55
|
+
@Args('id') id: string,
|
|
56
|
+
): Promise<<%= props.namePascal %>> {
|
|
57
|
+
return await this.<%= props.nameCamel %>Service.get(id, {
|
|
58
|
+
currentUser: user,
|
|
59
|
+
fieldSelection: { info, select: 'get<%= props.namePascal %>' },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ===========================================================================
|
|
64
|
+
// Mutations
|
|
65
|
+
// ===========================================================================
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create new <%= props.namePascal %>
|
|
69
|
+
*/
|
|
70
|
+
@Roles(RoleEnum.S_USER)
|
|
71
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Create a new <%= props.namePascal %>' })
|
|
72
|
+
async create<%= props.namePascal %>(
|
|
73
|
+
@Info() info: GraphQLResolveInfo,
|
|
74
|
+
@GraphQLUser() user: User,
|
|
75
|
+
@Args('input') input: <%= props.namePascal %>CreateInput
|
|
76
|
+
): Promise<<%= props.namePascal %>> {
|
|
77
|
+
return await this.<%= props.nameCamel %>Service.create(input, {
|
|
78
|
+
currentUser: user,
|
|
79
|
+
fieldSelection: { info, select: 'create<%= props.namePascal %>' },
|
|
80
|
+
inputType: <%= props.namePascal %>CreateInput
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Delete existing <%= props.namePascal %>
|
|
86
|
+
*/
|
|
87
|
+
@Roles(RoleEnum.S_USER)
|
|
88
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Delete existing <%= props.namePascal %>' })
|
|
89
|
+
async delete<%= props.namePascal %>(
|
|
90
|
+
@Info() info: GraphQLResolveInfo,
|
|
91
|
+
@GraphQLUser() user: User,
|
|
92
|
+
@Args('id') id: string
|
|
93
|
+
): Promise<<%= props.namePascal %>> {
|
|
94
|
+
return await this.<%= props.nameCamel %>Service.delete(id, {
|
|
95
|
+
currentUser: user,
|
|
96
|
+
fieldSelection: { info, select: 'delete<%= props.namePascal %>' },
|
|
97
|
+
roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Update existing <%= props.namePascal %>
|
|
103
|
+
*/
|
|
104
|
+
@Roles(RoleEnum.S_USER)
|
|
105
|
+
@Mutation(() => <%= props.namePascal %>, { description: 'Update existing <%= props.namePascal %>' })
|
|
106
|
+
async update<%= props.namePascal %>(
|
|
107
|
+
@Info() info: GraphQLResolveInfo,
|
|
108
|
+
@GraphQLUser() user: User,
|
|
109
|
+
@Args('id') id: string,
|
|
110
|
+
@Args('input') input: <%= props.namePascal %>Input
|
|
111
|
+
): Promise<<%= props.namePascal %>> {
|
|
112
|
+
return await this.<%= props.nameCamel %>Service.update(id, input, {
|
|
113
|
+
currentUser: user,
|
|
114
|
+
fieldSelection: { info, select: 'update<%= props.namePascal %>' },
|
|
115
|
+
inputType: <%= props.namePascal %>Input,
|
|
116
|
+
roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ===========================================================================
|
|
121
|
+
// Subscriptions
|
|
122
|
+
// ===========================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Subscription for create <%= props.namePascal %>
|
|
126
|
+
*/
|
|
127
|
+
@Subscription(() => <%= props.namePascal %>, {
|
|
128
|
+
filter(this: <%= props.namePascal %>Resolver, payload, variables, context) {
|
|
129
|
+
return context?.user?.hasRole?.(RoleEnum.ADMIN);
|
|
130
|
+
},
|
|
131
|
+
resolve: (value) => value,
|
|
132
|
+
})
|
|
133
|
+
async <%= props.nameCamel %>Created() {
|
|
134
|
+
return this.pubSub.asyncIterator('<%= props.nameCamel %>Created');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { assignPlain, CrudService, ServiceOptions } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
3
|
+
import { InjectModel } from '@nestjs/mongoose';
|
|
4
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
5
|
+
import { Model } from 'mongoose';
|
|
6
|
+
import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
|
|
7
|
+
import { <%= props.namePascal %>, <%= props.namePascal %>Document } from './<%= props.nameKebab %>.model';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* <%= props.namePascal %> service
|
|
11
|
+
*/
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class <%= props.namePascal %>Service extends CrudService<<%= props.namePascal %>> {
|
|
14
|
+
|
|
15
|
+
// ===================================================================================================================
|
|
16
|
+
// Properties
|
|
17
|
+
// ===================================================================================================================
|
|
18
|
+
|
|
19
|
+
// ===================================================================================================================
|
|
20
|
+
// Injections
|
|
21
|
+
// ===================================================================================================================
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Constructor for injecting services
|
|
25
|
+
*/
|
|
26
|
+
constructor(
|
|
27
|
+
@InjectModel('<%= props.namePascal %>') protected readonly <%= props.nameCamel %>Model: Model<<%= props.namePascal %>Document>,
|
|
28
|
+
@Inject('PUB_SUB') protected readonly pubSub: PubSub
|
|
29
|
+
) {
|
|
30
|
+
super({mainDbModel: <%= props.nameCamel %>Model, mainModelConstructor: <%= props.namePascal %>});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ===================================================================================================================
|
|
34
|
+
// Methods
|
|
35
|
+
// ===================================================================================================================
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Create new <%= props.namePascal %>
|
|
39
|
+
* Overwrites create method from CrudService
|
|
40
|
+
*/
|
|
41
|
+
async create(input: <%= props.namePascal %>CreateInput, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
|
|
42
|
+
// Get new <%= props.namePascal %>
|
|
43
|
+
const created<%= props.namePascal %> = await super.create(input, serviceOptions);
|
|
44
|
+
|
|
45
|
+
// Inform subscriber
|
|
46
|
+
if (serviceOptions?.pubSub === undefined || serviceOptions.pubSub) {
|
|
47
|
+
await this.pubSub.publish('<%= props.nameCamel %>Created', <%= props.namePascal %>.map(created<%= props.namePascal %>));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Return created <%= props.namePascal %>
|
|
51
|
+
return created<%= props.namePascal %>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Example method
|
|
56
|
+
* Extends the CrudService
|
|
57
|
+
*/
|
|
58
|
+
async exampleMethode(id: string, input: Record<string, any>, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
|
|
59
|
+
|
|
60
|
+
// Get and check <%= props.namePascal %>
|
|
61
|
+
const <%= props.nameCamel %> = await this.mainDbModel.findById(id).exec();
|
|
62
|
+
if (!<%= props.nameCamel %>) {
|
|
63
|
+
throw new NotFoundException(`<%= props.namePascal %> not found with ID: ${id}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Process input and output
|
|
67
|
+
return await this.process(async (data) => {
|
|
68
|
+
|
|
69
|
+
// Update, save and return <%= props.namePascal %>
|
|
70
|
+
return await assignPlain(<%= props.nameCamel %>, data.input).save();
|
|
71
|
+
|
|
72
|
+
}, {input, serviceOptions});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# <%= props.name %>
|
|
2
|
+
<%= props.description %>
|
|
3
|
+
|
|
4
|
+
## Requirements
|
|
5
|
+
|
|
6
|
+
- [Node.js incl. npm](https://nodejs.org):
|
|
7
|
+
the runtime environment for your server
|
|
8
|
+
|
|
9
|
+
- [MongoDB](https://docs.mongodb.com/manual/installation/#mongodb-community-edition-installation-tutorials)
|
|
10
|
+
the database for your objects
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## Start the server
|
|
14
|
+
|
|
15
|
+
`$ npm run start:dev`
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Extend the server
|
|
19
|
+
|
|
20
|
+
This server is based on [lenne.Tech Nest Server](https://github.com/lenneTech/nest-server).
|
|
21
|
+
|
|
22
|
+
Since the lenne.Tech Nest Server is based on [Nest](https://nestjs.com/), you can find all information about extending
|
|
23
|
+
the **<%= props.name %>** in the [documentation of Nest](https://docs.nestjs.com/).
|
|
24
|
+
|
|
25
|
+
The documentation of the extensions and auxiliary classes that the
|
|
26
|
+
[lenne.Tech Nest Server](https://github.com/lenneTech/nest-server) contains is currently under construction.
|
|
27
|
+
As long as this is not yet available,have a look at the
|
|
28
|
+
[source code](https://github.com/lenneTech/nest-server/tree/master/src/core).
|
|
29
|
+
There you will find a lot of things that will help you to extend your server, such as:
|
|
30
|
+
|
|
31
|
+
- [GraphQL scalars](https://github.com/lenneTech/nest-server/tree/master/src/core/common/scalars)
|
|
32
|
+
- [Filter and pagination](https://github.com/lenneTech/nest-server/tree/master/src/core/common/args)
|
|
33
|
+
- [Decorators for restrictions and roles](https://github.com/lenneTech/nest-server/tree/master/src/core/common/decorators)
|
|
34
|
+
- [Authorisation handling](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/auth)
|
|
35
|
+
- [Ready to use user module](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/user)
|
|
36
|
+
- [Common helpers](https://github.com/lenneTech/nest-server/tree/master/src/core/common/helpers) and
|
|
37
|
+
[helpers for tests](https://github.com/lenneTech/nest-server/blob/master/src/test/test.helper.ts)
|
|
38
|
+
- ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## Further information
|
|
42
|
+
|
|
43
|
+
### Running the app
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Development
|
|
47
|
+
$ npm start
|
|
48
|
+
|
|
49
|
+
# Watch mode
|
|
50
|
+
$ npm run start:dev
|
|
51
|
+
|
|
52
|
+
# Production mode
|
|
53
|
+
$ npm run start:prod
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Test
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# e2e tests
|
|
60
|
+
$ npm run test:e2e
|
|
61
|
+
```
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { RoleEnum, TestGraphQLType, TestHelper } from '@lenne.tech/nest-server';
|
|
2
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
3
|
+
import { PubSub } from 'graphql-subscriptions';
|
|
4
|
+
import envConfig from '../src/config.env';
|
|
5
|
+
import { User } from '../src/server/modules/user/user.model';
|
|
6
|
+
import { UserService } from '../src/server/modules/user/user.service';
|
|
7
|
+
import { ServerModule } from '../src/server/server.module';
|
|
8
|
+
import { MongoClient, ObjectId } from 'mongodb';
|
|
9
|
+
|
|
10
|
+
describe('<%= props.namePascal %> (e2e)', () => {
|
|
11
|
+
let app;
|
|
12
|
+
let testHelper: TestHelper;
|
|
13
|
+
|
|
14
|
+
// database
|
|
15
|
+
let connection;
|
|
16
|
+
let db;
|
|
17
|
+
|
|
18
|
+
// Global vars
|
|
19
|
+
let userService: UserService;
|
|
20
|
+
const users: Partial<User & { token: string }>[] = [];
|
|
21
|
+
|
|
22
|
+
// ===================================================================================================================
|
|
23
|
+
// Preparations
|
|
24
|
+
// ===================================================================================================================
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Before all tests
|
|
28
|
+
*/
|
|
29
|
+
beforeAll(async () => {
|
|
30
|
+
try {
|
|
31
|
+
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
32
|
+
imports: [ServerModule],
|
|
33
|
+
providers: [
|
|
34
|
+
UserService,
|
|
35
|
+
{
|
|
36
|
+
provide: 'PUB_SUB',
|
|
37
|
+
useValue: new PubSub(),
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
}).compile();
|
|
41
|
+
app = moduleFixture.createNestApplication();
|
|
42
|
+
app.setBaseViewsDir(envConfig.templates.path);
|
|
43
|
+
app.setViewEngine(envConfig.templates.engine);
|
|
44
|
+
await app.init();
|
|
45
|
+
testHelper = new TestHelper(app);
|
|
46
|
+
userService = moduleFixture.get<UserService>(UserService);
|
|
47
|
+
|
|
48
|
+
// Connection to database
|
|
49
|
+
connection = await MongoClient.connect(envConfig.mongoose.uri);
|
|
50
|
+
db = await connection.db();
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.log('beforeAllError', e);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* After all tests are finished
|
|
58
|
+
*/
|
|
59
|
+
afterAll(async () => {
|
|
60
|
+
await connection.close();
|
|
61
|
+
await app.close();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ===================================================================================================================
|
|
65
|
+
// Initialization tests
|
|
66
|
+
// ===================================================================================================================
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create and verify users for testing
|
|
70
|
+
*/
|
|
71
|
+
it('createAndVerifyUsers', async () => {
|
|
72
|
+
const userCount = 2;
|
|
73
|
+
for (let i = 0; i < userCount; i++) {
|
|
74
|
+
const random = Math.random().toString(36).substring(7);
|
|
75
|
+
const input = {
|
|
76
|
+
password: random,
|
|
77
|
+
email: random + '@testusers.com',
|
|
78
|
+
firstName: 'Test' + random,
|
|
79
|
+
lastName: 'User' + random,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Sign up user
|
|
83
|
+
const res: any = await testHelper.graphQl({
|
|
84
|
+
name: 'signUp',
|
|
85
|
+
type: TestGraphQLType.MUTATION,
|
|
86
|
+
arguments: { input },
|
|
87
|
+
fields: [{ user: ['id', 'email', 'firstName', 'lastName'] }],
|
|
88
|
+
});
|
|
89
|
+
res.user.password = input.password;
|
|
90
|
+
users.push(res.user);
|
|
91
|
+
|
|
92
|
+
// Verify user
|
|
93
|
+
await db.collection('users').updateOne({ _id: new ObjectId(res.id) }, { $set: { verified: true } });
|
|
94
|
+
}
|
|
95
|
+
expect(users.length).toBeGreaterThanOrEqual(userCount);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Sign in users
|
|
100
|
+
*/
|
|
101
|
+
it('signInUsers', async () => {
|
|
102
|
+
for (const user of users) {
|
|
103
|
+
const res: any = await testHelper.graphQl({
|
|
104
|
+
name: 'signIn',
|
|
105
|
+
arguments: {
|
|
106
|
+
input: {
|
|
107
|
+
email: user.email,
|
|
108
|
+
password: user.password,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
fields: ['token', { user: ['id', 'email'] }],
|
|
112
|
+
});
|
|
113
|
+
expect(res.user.id).toEqual(user.id);
|
|
114
|
+
expect(res.user.email).toEqual(user.email);
|
|
115
|
+
user.token = res.token;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Prepare users
|
|
121
|
+
*/
|
|
122
|
+
it('prepareUsers', async () => {
|
|
123
|
+
await db
|
|
124
|
+
.collection('users')
|
|
125
|
+
.findOneAndUpdate({ _id: new ObjectId(users[0].id) }, { $set: { roles: [RoleEnum.ADMIN] } });
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ===================================================================================================================
|
|
129
|
+
// Tests for <%= props.namePascal %>
|
|
130
|
+
// ===================================================================================================================
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Test
|
|
134
|
+
*/
|
|
135
|
+
it('test', async () => {
|
|
136
|
+
console.log('Implement <%= props.namePascal %> test here');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// ===================================================================================================================
|
|
140
|
+
// Clean up tests
|
|
141
|
+
// ===================================================================================================================
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Delete users
|
|
145
|
+
*/
|
|
146
|
+
it('deleteUsers', async () => {
|
|
147
|
+
// Add admin role to user 2
|
|
148
|
+
await userService.setRoles(users[1].id, ['admin']);
|
|
149
|
+
|
|
150
|
+
for (const user of users) {
|
|
151
|
+
const res: any = await testHelper.graphQl(
|
|
152
|
+
{
|
|
153
|
+
name: 'deleteUser',
|
|
154
|
+
type: TestGraphQLType.MUTATION,
|
|
155
|
+
arguments: {
|
|
156
|
+
id: user.id,
|
|
157
|
+
},
|
|
158
|
+
fields: ['id'],
|
|
159
|
+
},
|
|
160
|
+
{ token: users[1].token }
|
|
161
|
+
);
|
|
162
|
+
expect(res.id).toEqual(user.id);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# <%= props.name %>
|
|
2
|
+
|
|
3
|
+
[](/LICENSE) [](https://circleci.com/gh/<%= props.nameKebab %>/tree/master)
|
|
4
|
+
[](https://david-dm.org/<%= props.nameKebab %>) [](https://david-dm.org/<%= props.nameKebab %>?type=dev)
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
[](https://github.com/<%= props.nameKebab %>/fork) [](https://github.com/<%= props.nameKebab %>)
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- [Node.js incl. npm](https://nodejs.org):
|
|
14
|
+
the runtime environment for your project
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Scripts
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Lint
|
|
21
|
+
$ npm run lint
|
|
22
|
+
|
|
23
|
+
# Test
|
|
24
|
+
$ npm test
|
|
25
|
+
$ npm run watch
|
|
26
|
+
$ npm run coverage
|
|
27
|
+
|
|
28
|
+
# Build
|
|
29
|
+
$ npm build
|
|
30
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lenne.tech/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.74",
|
|
4
4
|
"description": "lenne.Tech CLI: lt",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lenne.Tech",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"build": "npm run lint && npm run test && npm run clean-build && npm run compile && npm run copy-templates",
|
|
22
22
|
"clean-build": "rimraf ./build",
|
|
23
23
|
"compile": "tsc -p .",
|
|
24
|
-
"copy-templates": "
|
|
24
|
+
"copy-templates": "cp -R ./src/templates ./build/templates",
|
|
25
25
|
"coverage": "jest --coverage",
|
|
26
26
|
"format": "prettier --write 'src/**/*.{js,ts,tsx,json}' '!src/templates/**/*'",
|
|
27
27
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix --cache",
|
|
@@ -53,18 +53,18 @@
|
|
|
53
53
|
"find-file-up": "2.0.1",
|
|
54
54
|
"gluegun": "5.1.2",
|
|
55
55
|
"open": "8.4.0",
|
|
56
|
-
"standard-version": "
|
|
57
|
-
"ts-node": "10.
|
|
56
|
+
"standard-version": "9.5.0",
|
|
57
|
+
"ts-node": "10.8.0",
|
|
58
58
|
"typescript": "4.6.4"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@lenne.tech/npm-package-helper": "0.0.12",
|
|
62
62
|
"@types/jest": "27.5.1",
|
|
63
|
-
"@types/node": "
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
65
|
-
"@typescript-eslint/parser": "5.
|
|
63
|
+
"@types/node": "16.11.36",
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "5.25.0",
|
|
65
|
+
"@typescript-eslint/parser": "5.25.0",
|
|
66
66
|
"cpy-cli": "4.1.0",
|
|
67
|
-
"eslint": "8.
|
|
67
|
+
"eslint": "8.16.0",
|
|
68
68
|
"eslint-config-prettier": "8.5.0",
|
|
69
69
|
"husky": "8.0.1",
|
|
70
70
|
"jest": "28.1.0",
|