@lenne.tech/nest-server 8.2.0 → 8.4.0

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.
Files changed (66) hide show
  1. package/dist/core/common/decorators/restricted.decorator.d.ts +11 -4
  2. package/dist/core/common/decorators/restricted.decorator.js +65 -21
  3. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  4. package/dist/core/common/enums/process-type.enum.d.ts +4 -0
  5. package/dist/core/common/enums/process-type.enum.js +9 -0
  6. package/dist/core/common/enums/process-type.enum.js.map +1 -0
  7. package/dist/core/common/enums/role.enum.d.ts +2 -2
  8. package/dist/core/common/enums/role.enum.js +2 -2
  9. package/dist/core/common/enums/role.enum.js.map +1 -1
  10. package/dist/core/common/helpers/db.helper.d.ts +5 -3
  11. package/dist/core/common/helpers/db.helper.js +36 -25
  12. package/dist/core/common/helpers/db.helper.js.map +1 -1
  13. package/dist/core/common/helpers/input.helper.d.ts +6 -3
  14. package/dist/core/common/helpers/input.helper.js +4 -12
  15. package/dist/core/common/helpers/input.helper.js.map +1 -1
  16. package/dist/core/common/interfaces/service-options.interface.d.ts +0 -2
  17. package/dist/core/common/models/core-persistence.model.d.ts +0 -1
  18. package/dist/core/common/models/core-persistence.model.js +0 -10
  19. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  20. package/dist/core/common/services/module.service.d.ts +3 -2
  21. package/dist/core/common/services/module.service.js +13 -14
  22. package/dist/core/common/services/module.service.js.map +1 -1
  23. package/dist/core/common/types/require-only-one.type.d.ts +3 -0
  24. package/dist/core/common/types/require-only-one.type.js +3 -0
  25. package/dist/core/common/types/require-only-one.type.js.map +1 -0
  26. package/dist/core/common/types/required-at-least-one.type.d.ts +3 -0
  27. package/dist/core/common/types/required-at-least-one.type.js +3 -0
  28. package/dist/core/common/types/required-at-least-one.type.js.map +1 -0
  29. package/dist/core/modules/auth/guards/roles.guard.js +1 -2
  30. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  31. package/dist/core/modules/user/core-user.service.js +1 -6
  32. package/dist/core/modules/user/core-user.service.js.map +1 -1
  33. package/dist/core.module.js +0 -5
  34. package/dist/core.module.js.map +1 -1
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/server/modules/user/avatar.controller.js +1 -1
  39. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  40. package/dist/server/modules/user/user.model.d.ts +1 -1
  41. package/dist/server/modules/user/user.model.js +1 -1
  42. package/dist/server/modules/user/user.model.js.map +1 -1
  43. package/dist/server/modules/user/user.resolver.js +6 -6
  44. package/dist/server/modules/user/user.resolver.js.map +1 -1
  45. package/dist/server/modules/user/user.service.js +5 -1
  46. package/dist/server/modules/user/user.service.js.map +1 -1
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/package.json +6 -6
  49. package/src/core/common/decorators/restricted.decorator.ts +109 -42
  50. package/src/core/common/enums/process-type.enum.ts +7 -0
  51. package/src/core/common/enums/role.enum.ts +21 -6
  52. package/src/core/common/helpers/db.helper.ts +58 -51
  53. package/src/core/common/helpers/input.helper.ts +24 -13
  54. package/src/core/common/interfaces/service-options.interface.ts +2 -6
  55. package/src/core/common/models/core-persistence.model.ts +0 -11
  56. package/src/core/common/services/module.service.ts +16 -15
  57. package/src/core/common/types/require-only-one.type.ts +6 -0
  58. package/src/core/common/types/required-at-least-one.type.ts +6 -0
  59. package/src/core/modules/auth/guards/roles.guard.ts +4 -6
  60. package/src/core/modules/user/core-user.service.ts +1 -6
  61. package/src/core.module.ts +1 -19
  62. package/src/index.ts +3 -0
  63. package/src/server/modules/user/avatar.controller.ts +1 -1
  64. package/src/server/modules/user/user.model.ts +2 -2
  65. package/src/server/modules/user/user.resolver.ts +6 -6
  66. package/src/server/modules/user/user.service.ts +8 -1
@@ -35,7 +35,7 @@ export abstract class CoreUserService<
35
35
  * Create user
36
36
  */
37
37
  async create(input: any, serviceOptions?: ServiceOptions): Promise<TUser> {
38
- merge({ prepareInput: { create: true } }, serviceOptions);
38
+ serviceOptions = merge({ prepareInput: { create: true } }, serviceOptions);
39
39
  return this.process(
40
40
  async (data) => {
41
41
  // Create user with verification token
@@ -47,11 +47,6 @@ export abstract class CoreUserService<
47
47
  // Distinguish between different error messages when saving
48
48
  try {
49
49
  await createdUser.save();
50
- if (!createdUser.ownerIds) {
51
- createdUser.ownerIds = [];
52
- }
53
- createdUser.ownerIds.push(createdUser.id);
54
- await createdUser.save();
55
50
  } catch (error) {
56
51
  if (error.code === 11000) {
57
52
  throw new UnprocessableEntityException(
@@ -1,8 +1,7 @@
1
1
  import { DynamicModule, Global, Module, UnauthorizedException } from '@nestjs/common';
2
- import { APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
2
+ import { APP_PIPE } from '@nestjs/core';
3
3
  import { GraphQLModule } from '@nestjs/graphql';
4
4
  import { merge } from './core/common/helpers/config.helper';
5
- import { CheckResponseInterceptor } from './core/common/interceptors/check-response.interceptor';
6
5
  import { IServerOptions } from './core/common/interfaces/server-options.interface';
7
6
  import { MapAndValidatePipe } from './core/common/pipes/map-and-validate.pipe';
8
7
  import { ConfigService } from './core/common/services/config.service';
@@ -19,8 +18,6 @@ import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
19
18
  * - MongooseModule
20
19
  * - GraphQL
21
20
  * - ConfigService
22
- * - CheckInput
23
- * - CheckResponse
24
21
  *
25
22
  * and sets the following services as globals:
26
23
  * - ConfigService
@@ -99,21 +96,6 @@ export class CoreModule {
99
96
  useValue: new ConfigService(config),
100
97
  },
101
98
 
102
- // [Global] The CheckResponseInterceptor restricts the response to the properties
103
- // that are permitted for the current user
104
- {
105
- provide: APP_INTERCEPTOR,
106
- useClass: CheckResponseInterceptor,
107
- },
108
-
109
- // [Global] The CheckInputPipe checks the permissibility of individual properties of inputs for the resolvers
110
- // in relation to the current user, replaces MapAndValidatePipe
111
- // Does not work yet, because context is missing: https://github.com/nestjs/graphql/issues/325
112
- // {
113
- // provide: APP_PIPE,
114
- // useClass: CheckInputPipe,
115
- // },
116
-
117
99
  // [Global] Map plain objects to metatype and validate
118
100
  {
119
101
  provide: APP_PIPE,
package/src/index.ts CHANGED
@@ -15,6 +15,7 @@ export * from './core/common/decorators/restricted.decorator';
15
15
  export * from './core/common/decorators/roles.decorator';
16
16
  export * from './core/common/enums/comparison-operator.enum';
17
17
  export * from './core/common/enums/logical-operator.enum';
18
+ export * from './core/common/enums/process-type.enum';
18
19
  export * from './core/common/enums/role.enum';
19
20
  export * from './core/common/enums/sort-order.emum';
20
21
  export * from './core/common/helpers/config.helper';
@@ -54,6 +55,8 @@ export * from './core/common/types/core-model-constructor.type';
54
55
  export * from './core/common/types/field-selection.type';
55
56
  export * from './core/common/types/ids.type';
56
57
  export * from './core/common/types/plain-input.type';
58
+ export * from './core/common/types/require-only-one.type';
59
+ export * from './core/common/types/required-at-least-one.type';
57
60
  export * from './core/common/types/string-or-object-id.type';
58
61
 
59
62
  // =====================================================================================================================
@@ -22,7 +22,7 @@ export class AvatarController {
22
22
  /**
23
23
  * Upload files
24
24
  */
25
- @Roles(RoleEnum.USER)
25
+ @Roles(RoleEnum.S_USER)
26
26
  @Post('upload')
27
27
  @UseInterceptors(
28
28
  FileInterceptor(
@@ -1,8 +1,8 @@
1
1
  import { Field, ObjectType } from '@nestjs/graphql';
2
+ import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
3
+ import { Document, Schema } from 'mongoose';
2
4
  import { CoreUserModel } from '../../../core/modules/user/core-user.model';
3
5
  import { PersistenceModel } from '../../common/models/persistence.model';
4
- import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
5
- import { Schema, Document } from 'mongoose';
6
6
 
7
7
  export type UserDocument = User & Document;
8
8
 
@@ -40,13 +40,13 @@ export class UserResolver {
40
40
  /**
41
41
  * Get user via ID
42
42
  */
43
- @Roles(RoleEnum.USER)
43
+ @Roles(RoleEnum.S_USER)
44
44
  @Query((returns) => User, { description: 'Get user with specified ID' })
45
45
  async getUser(@Args('id') id: string, @Info() info: GraphQLResolveInfo, @GraphQLUser() user: User): Promise<User> {
46
46
  return await this.userService.get(id, {
47
47
  currentUser: user,
48
48
  fieldSelection: { info, select: 'getUser' },
49
- roles: [RoleEnum.OWNER, RoleEnum.ADMIN],
49
+ roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR],
50
50
  });
51
51
  }
52
52
 
@@ -89,13 +89,13 @@ export class UserResolver {
89
89
  /**
90
90
  * Delete existing user
91
91
  */
92
- @Roles(RoleEnum.USER)
92
+ @Roles(RoleEnum.S_USER)
93
93
  @Mutation((returns) => User, { description: 'Delete existing user' })
94
94
  async deleteUser(@Args('id') id: string, @Info() info: GraphQLResolveInfo, @GraphQLUser() user: User): Promise<User> {
95
95
  return await this.userService.delete(id, {
96
96
  currentUser: user,
97
97
  fieldSelection: { info, select: 'deleteUser' },
98
- roles: [RoleEnum.ADMIN, RoleEnum.OWNER],
98
+ roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR],
99
99
  });
100
100
  }
101
101
 
@@ -110,7 +110,7 @@ export class UserResolver {
110
110
  /**
111
111
  * Update existing user
112
112
  */
113
- @Roles(RoleEnum.USER)
113
+ @Roles(RoleEnum.S_USER)
114
114
  @Mutation((returns) => User, { description: 'Update existing user' })
115
115
  async updateUser(
116
116
  @Args('input') input: UserInput,
@@ -123,7 +123,7 @@ export class UserResolver {
123
123
  currentUser: user,
124
124
  fieldSelection: { info, select: 'updateUser' },
125
125
  inputType: UserInput,
126
- roles: [RoleEnum.ADMIN, RoleEnum.OWNER],
126
+ roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR],
127
127
  });
128
128
  }
129
129
 
@@ -44,7 +44,14 @@ export class UserService extends CoreUserService<User, UserInput, UserCreateInpu
44
44
  */
45
45
  async create(input: UserCreateInput, serviceOptions?: ServiceOptions): Promise<User> {
46
46
  // Get prepared user
47
- const user = await super.create(input, serviceOptions);
47
+ let user = await super.create(input, serviceOptions);
48
+
49
+ // Add the createdBy information in an extra step if it was not set by the system because the user created himself
50
+ // and could not exist as currentUser before
51
+ if (!user.createdBy) {
52
+ await this.mainDbModel.findByIdAndUpdate(user.id, { createdBy: user.id });
53
+ user = await this.get(user.id, { ...serviceOptions, currentUser: serviceOptions.currentUser || user });
54
+ }
48
55
 
49
56
  // Publish action
50
57
  if (serviceOptions?.pubSub === undefined || serviceOptions.pubSub) {