@solidstarters/solid-core 1.2.174 → 1.2.175

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 (50) hide show
  1. package/dev-grooming-docs/ozzy-prompts.txt +13 -0
  2. package/dist/config/iam.config.js +2 -2
  3. package/dist/config/iam.config.js.map +1 -1
  4. package/dist/constants/chatter-message.constants.d.ts +11 -0
  5. package/dist/constants/chatter-message.constants.d.ts.map +1 -0
  6. package/dist/constants/chatter-message.constants.js +14 -0
  7. package/dist/constants/chatter-message.constants.js.map +1 -0
  8. package/dist/controllers/authentication.controller.d.ts +1 -2
  9. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  10. package/dist/controllers/chatter-message-details.controller.d.ts +0 -16
  11. package/dist/controllers/chatter-message-details.controller.d.ts.map +1 -1
  12. package/dist/controllers/chatter-message-details.controller.js +0 -109
  13. package/dist/controllers/chatter-message-details.controller.js.map +1 -1
  14. package/dist/controllers/chatter-message.controller.d.ts +10 -13
  15. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  16. package/dist/controllers/chatter-message.controller.js +19 -88
  17. package/dist/controllers/chatter-message.controller.js.map +1 -1
  18. package/dist/entities/chatter-message-details.entity.d.ts +1 -0
  19. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  20. package/dist/entities/chatter-message-details.entity.js +5 -1
  21. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  22. package/dist/entities/chatter-message.entity.d.ts +4 -0
  23. package/dist/entities/chatter-message.entity.d.ts.map +1 -1
  24. package/dist/entities/chatter-message.entity.js +14 -1
  25. package/dist/entities/chatter-message.entity.js.map +1 -1
  26. package/dist/seeders/seed-data/solid-core-metadata.json +39 -1
  27. package/dist/services/authentication.service.d.ts +2 -3
  28. package/dist/services/authentication.service.d.ts.map +1 -1
  29. package/dist/services/authentication.service.js +4 -4
  30. package/dist/services/authentication.service.js.map +1 -1
  31. package/dist/services/chatter-message.service.d.ts +16 -3
  32. package/dist/services/chatter-message.service.d.ts.map +1 -1
  33. package/dist/services/chatter-message.service.js +120 -25
  34. package/dist/services/chatter-message.service.js.map +1 -1
  35. package/dist/services/refresh-token-ids-storage.service.d.ts +2 -1
  36. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  37. package/dist/services/refresh-token-ids-storage.service.js +6 -7
  38. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  39. package/dist/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +1 -1
  41. package/src/config/iam.config.ts +2 -2
  42. package/src/constants/chatter-message.constants.ts +11 -0
  43. package/src/controllers/chatter-message-details.controller.ts +44 -44
  44. package/src/controllers/chatter-message.controller.ts +58 -38
  45. package/src/entities/chatter-message-details.entity.ts +3 -0
  46. package/src/entities/chatter-message.entity.ts +9 -2
  47. package/src/seeders/seed-data/solid-core-metadata.json +39 -1
  48. package/src/services/authentication.service.ts +9 -4
  49. package/src/services/chatter-message.service.ts +143 -24
  50. package/src/services/refresh-token-ids-storage.service.ts +11 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.174",
3
+ "version": "1.2.175",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -32,7 +32,7 @@ export const jwtConfig = registerAs('jwt', () => {
32
32
  secret: process.env.IAM_JWT_SECRET,
33
33
  audience: process.env.IAM_JWT_TOKEN_AUDIENCE,
34
34
  issuer: process.env.IAM_JWT_TOKEN_ISSUER,
35
- accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? '3600', 10),
36
- refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '86400', 10),
35
+ accessTokenTtl: parseInt(process.env.IAM_JWT_ACCESS_TOKEN_TTL ?? '1200', 10), // 20 minutes
36
+ refreshTokenTtl: parseInt(process.env.IAM_JWT_REFRESH_TOKEN_TTL ?? '604800', 10), // 7 days
37
37
  };
38
38
  });
@@ -0,0 +1,11 @@
1
+ export const CHATTER_MESSAGE_TYPE = {
2
+ AUDIT: 'audit',
3
+ CUSTOM: 'custom',
4
+ } as const;
5
+
6
+ export const CHATTER_MESSAGE_SUBTYPE = {
7
+ AUDIT_INSERT: 'audit_insert',
8
+ AUDIT_UPDATE: 'audit_update',
9
+ AUDIT_DELETE: 'audit_delete',
10
+ CUSTOM: 'custom',
11
+ } as const;
@@ -15,46 +15,46 @@ enum ShowSoftDeleted {
15
15
  export class ChatterMessageDetailsController {
16
16
  constructor(private readonly service: ChatterMessageDetailsService) {}
17
17
 
18
- @ApiBearerAuth("jwt")
19
- @Post()
20
- @UseInterceptors(AnyFilesInterceptor())
21
- create(@Body() createDto: CreateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
22
- return this.service.create(createDto, files);
23
- }
18
+ // @ApiBearerAuth("jwt")
19
+ // @Post()
20
+ // @UseInterceptors(AnyFilesInterceptor())
21
+ // create(@Body() createDto: CreateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
22
+ // return this.service.create(createDto, files);
23
+ // }
24
24
 
25
- @ApiBearerAuth("jwt")
26
- @Post('/bulk')
27
- @UseInterceptors(AnyFilesInterceptor())
28
- insertMany(@Body() createDtos: CreateChatterMessageDetailsDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {
29
- return this.service.insertMany(createDtos, filesArray);
30
- }
25
+ // @ApiBearerAuth("jwt")
26
+ // @Post('/bulk')
27
+ // @UseInterceptors(AnyFilesInterceptor())
28
+ // insertMany(@Body() createDtos: CreateChatterMessageDetailsDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {
29
+ // return this.service.insertMany(createDtos, filesArray);
30
+ // }
31
31
 
32
32
 
33
- @ApiBearerAuth("jwt")
34
- @Put(':id')
35
- @UseInterceptors(AnyFilesInterceptor())
36
- update(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
37
- return this.service.update(id, updateDto, files);
38
- }
33
+ // @ApiBearerAuth("jwt")
34
+ // @Put(':id')
35
+ // @UseInterceptors(AnyFilesInterceptor())
36
+ // update(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
37
+ // return this.service.update(id, updateDto, files);
38
+ // }
39
39
 
40
- @ApiBearerAuth("jwt")
41
- @Patch(':id')
42
- @UseInterceptors(AnyFilesInterceptor())
43
- partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
44
- return this.service.update(id, updateDto, files, true);
45
- }
40
+ // @ApiBearerAuth("jwt")
41
+ // @Patch(':id')
42
+ // @UseInterceptors(AnyFilesInterceptor())
43
+ // partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDetailsDto, @UploadedFiles() files: Array<Express.Multer.File>) {
44
+ // return this.service.update(id, updateDto, files, true);
45
+ // }
46
46
 
47
- @ApiBearerAuth("jwt")
48
- @Post('/bulk-recover')
49
- async recoverMany(@Body() ids: number[]) {
50
- return this.service.recoverMany(ids);
51
- }
47
+ // @ApiBearerAuth("jwt")
48
+ // @Post('/bulk-recover')
49
+ // async recoverMany(@Body() ids: number[]) {
50
+ // return this.service.recoverMany(ids);
51
+ // }
52
52
 
53
- @ApiBearerAuth("jwt")
54
- @Get('/recover/:id')
55
- async recover(@Param('id') id: number) {
56
- return this.service.recover(id);
57
- }
53
+ // @ApiBearerAuth("jwt")
54
+ // @Get('/recover/:id')
55
+ // async recover(@Param('id') id: number) {
56
+ // return this.service.recover(id);
57
+ // }
58
58
 
59
59
  @ApiBearerAuth("jwt")
60
60
  @ApiQuery({ name: 'showSoftDeleted', required: false, enum: ShowSoftDeleted })
@@ -77,16 +77,16 @@ export class ChatterMessageDetailsController {
77
77
  return this.service.findOne(+id, query);
78
78
  }
79
79
 
80
- @ApiBearerAuth("jwt")
81
- @Delete('/bulk')
82
- async deleteMany(@Body() ids: number[]) {
83
- return this.service.deleteMany(ids);
84
- }
80
+ // @ApiBearerAuth("jwt")
81
+ // @Delete('/bulk')
82
+ // async deleteMany(@Body() ids: number[]) {
83
+ // return this.service.deleteMany(ids);
84
+ // }
85
85
 
86
- @ApiBearerAuth("jwt")
87
- @Delete(':id')
88
- async delete(@Param('id') id: number) {
89
- return this.service.delete(id);
90
- }
86
+ // @ApiBearerAuth("jwt")
87
+ // @Delete(':id')
88
+ // async delete(@Param('id') id: number) {
89
+ // return this.service.delete(id);
90
+ // }
91
91
 
92
92
  }
@@ -7,6 +7,7 @@ import { UpdateChatterMessageDto } from '../dtos/update-chatter-message.dto';
7
7
  import { PostChatterMessageDto } from '../dtos/post-chatter-message.dto';
8
8
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
9
9
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
10
+ import { Public } from 'src/decorators/public.decorator';
10
11
 
11
12
  enum ShowSoftDeleted {
12
13
  INCLUSIVE = "inclusive",
@@ -25,40 +26,59 @@ export class ChatterMessageController {
25
26
  return this.service.create(createDto, files);
26
27
  }
27
28
 
28
- @ApiBearerAuth("jwt")
29
- @Post('/bulk')
30
- @UseInterceptors(AnyFilesInterceptor())
31
- insertMany(@Body() createDtos: CreateChatterMessageDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {
32
- return this.service.insertMany(createDtos, filesArray);
33
- }
29
+ // @ApiBearerAuth("jwt")
30
+ // @Post('/bulk')
31
+ // @UseInterceptors(AnyFilesInterceptor())
32
+ // insertMany(@Body() createDtos: CreateChatterMessageDto[], @UploadedFiles() filesArray: Express.Multer.File[][] = []) {
33
+ // return this.service.insertMany(createDtos, filesArray);
34
+ // }
34
35
 
35
36
 
36
- @ApiBearerAuth("jwt")
37
- @Put(':id')
38
- @UseInterceptors(AnyFilesInterceptor())
39
- update(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDto, @UploadedFiles() files: Array<Express.Multer.File>) {
40
- return this.service.update(id, updateDto, files);
41
- }
37
+ // @ApiBearerAuth("jwt")
38
+ // @Put(':id')
39
+ // @UseInterceptors(AnyFilesInterceptor())
40
+ // update(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDto, @UploadedFiles() files: Array<Express.Multer.File>) {
41
+ // return this.service.update(id, updateDto, files);
42
+ // }
42
43
 
43
- @ApiBearerAuth("jwt")
44
- @Patch(':id')
45
- @UseInterceptors(AnyFilesInterceptor())
46
- partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDto, @UploadedFiles() files: Array<Express.Multer.File>) {
47
- return this.service.update(id, updateDto, files, true);
48
- }
44
+ // @ApiBearerAuth("jwt")
45
+ // @Patch(':id')
46
+ // @UseInterceptors(AnyFilesInterceptor())
47
+ // partialUpdate(@Param('id') id: number, @Body() updateDto: UpdateChatterMessageDto, @UploadedFiles() files: Array<Express.Multer.File>) {
48
+ // return this.service.update(id, updateDto, files, true);
49
+ // }
49
50
 
50
- @ApiBearerAuth("jwt")
51
- @Post('/bulk-recover')
52
- async recoverMany(@Body() ids: number[]) {
53
- return this.service.recoverMany(ids);
54
- }
51
+ // @ApiBearerAuth("jwt")
52
+ // @Post('/bulk-recover')
53
+ // async recoverMany(@Body() ids: number[]) {
54
+ // return this.service.recoverMany(ids);
55
+ // }
55
56
 
56
- @ApiBearerAuth("jwt")
57
- @Get('/recover/:id')
58
- async recover(@Param('id') id: number) {
59
- return this.service.recover(id);
57
+ // @ApiBearerAuth("jwt")
58
+ // @Get('/recover/:id')
59
+ // async recover(@Param('id') id: number) {
60
+ // return this.service.recover(id);
61
+ // }
62
+
63
+ @Public()
64
+ @Get('/getChatterMessages/:entityId/:entityName')
65
+ @ApiQuery({ name: 'showSoftDeleted', required: false, enum: ShowSoftDeleted })
66
+ @ApiQuery({ name: 'limit', required: false, type: Number })
67
+ @ApiQuery({ name: 'offset', required: false, type: Number })
68
+ @ApiQuery({ name: 'fields', required: false, type: Array })
69
+ @ApiQuery({ name: 'sort', required: false, type: Array })
70
+ @ApiQuery({ name: 'groupBy', required: false, type: Array })
71
+ @ApiQuery({ name: 'populate', required: false, type: Array })
72
+ @ApiQuery({ name: 'populateMedia', required: false, type: Array })
73
+ @ApiQuery({ name: 'filters', required: false, type: Array })
74
+ async getChatterMessages(
75
+ @Param('entityId') entityId: number,
76
+ @Param('entityName') entityName: string,
77
+ @Query() query: any
78
+ ) {
79
+ return this.service.getChatterMessages(entityId, entityName, query);
60
80
  }
61
-
81
+
62
82
  @ApiBearerAuth("jwt")
63
83
  @ApiQuery({ name: 'showSoftDeleted', required: false, enum: ShowSoftDeleted })
64
84
  @ApiQuery({ name: 'limit', required: false, type: Number })
@@ -80,17 +100,17 @@ export class ChatterMessageController {
80
100
  return this.service.findOne(+id, query);
81
101
  }
82
102
 
83
- @ApiBearerAuth("jwt")
84
- @Delete('/bulk')
85
- async deleteMany(@Body() ids: number[]) {
86
- return this.service.deleteMany(ids);
87
- }
103
+ // @ApiBearerAuth("jwt")
104
+ // @Delete('/bulk')
105
+ // async deleteMany(@Body() ids: number[]) {
106
+ // return this.service.deleteMany(ids);
107
+ // }
88
108
 
89
- @ApiBearerAuth("jwt")
90
- @Delete(':id')
91
- async delete(@Param('id') id: number) {
92
- return this.service.delete(id);
93
- }
109
+ // @ApiBearerAuth("jwt")
110
+ // @Delete(':id')
111
+ // async delete(@Param('id') id: number) {
112
+ // return this.service.delete(id);
113
+ // }
94
114
 
95
115
  @ApiBearerAuth("jwt")
96
116
  @Post('post')
@@ -22,4 +22,7 @@ newValueDisplay: string;
22
22
 
23
23
  @Column({ type: "varchar" })
24
24
  fieldName: string;
25
+
26
+ @Column({ type: "text", nullable: true })
27
+ fieldDisplayName: string;
25
28
  }
@@ -1,6 +1,7 @@
1
1
  import { CommonEntity } from 'src/entities/common.entity'
2
- import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
2
+ import {Entity, Column, Index, JoinColumn, ManyToOne, OneToMany} from 'typeorm';
3
3
  import { User } from 'src/entities/user.entity'
4
+ import { ChatterMessageDetails } from './chatter-message-details.entity';
4
5
 
5
6
  @Entity("ss_chatter_message")
6
7
  export class ChatterMessage extends CommonEntity {
@@ -8,7 +9,7 @@ export class ChatterMessage extends CommonEntity {
8
9
  @Column({ type: "varchar" })
9
10
  messageType: string; // audit | custom
10
11
  @Column({ type: "varchar" })
11
- messageSubType: string; // update | insert | delete | post_message
12
+ messageSubType: string; // audit_update | audit_insert | audit_delete | custom
12
13
  @Column({ type: "text" })
13
14
  messageBody: string;
14
15
  @Index()
@@ -19,4 +20,10 @@ export class ChatterMessage extends CommonEntity {
19
20
  @ManyToOne(() => User, { onDelete: "CASCADE", nullable: true })
20
21
  @JoinColumn()
21
22
  user: User;
23
+ @OneToMany(() => ChatterMessageDetails, (chatterMessageDetails) => chatterMessageDetails.chatterMessage, { cascade: true })
24
+ chatterMessageDetails: ChatterMessageDetails[];
25
+ @Column({ type: "text", nullable: true })
26
+ modelDisplayName: string;
27
+ @Column({ type: "text", nullable: true })
28
+ modelUserKey: string;
22
29
  }
@@ -3748,7 +3748,8 @@
3748
3748
  "selectionStaticValues": [
3749
3749
  "audit_insert:audit_insert",
3750
3750
  "audit_update:audit_update",
3751
- "audit_delete:audit_delete"
3751
+ "audit_delete:audit_delete",
3752
+ "custom:custom"
3752
3753
  ]
3753
3754
  },
3754
3755
  {
@@ -3835,6 +3836,30 @@
3835
3836
  "columnName": null,
3836
3837
  "relationJoinTableName": "",
3837
3838
  "isRelationManyToManyOwner": null
3839
+ },
3840
+ {
3841
+ "name": "modelDisplayName",
3842
+ "displayName": "Model Display Name",
3843
+ "type": "shortText",
3844
+ "ormType": "text",
3845
+ "required": false,
3846
+ "unique": false,
3847
+ "index": false,
3848
+ "private": false,
3849
+ "encrypt": false,
3850
+ "isSystem": false
3851
+ },
3852
+ {
3853
+ "name": "modelUserKey",
3854
+ "displayName": "Model User Key",
3855
+ "type": "shortText",
3856
+ "ormType": "text",
3857
+ "required": false,
3858
+ "unique": false,
3859
+ "index": false,
3860
+ "private": false,
3861
+ "encrypt": false,
3862
+ "isSystem": false
3838
3863
  }
3839
3864
  ]
3840
3865
  },
@@ -3910,6 +3935,19 @@
3910
3935
  "encrypt": false,
3911
3936
  "isSystem": false
3912
3937
  },
3938
+ {
3939
+ "name": "fieldDisplayName",
3940
+ "displayName": "Field Display Name",
3941
+ "type": "shortText",
3942
+ "ormType": "varchar",
3943
+ "length": 512,
3944
+ "required": false,
3945
+ "unique": false,
3946
+ "index": false,
3947
+ "private": false,
3948
+ "encrypt": false,
3949
+ "isSystem": false
3950
+ },
3913
3951
  {
3914
3952
  "name": "chatterMessage",
3915
3953
  "displayName": "Chatter Message",
@@ -986,7 +986,7 @@ export class AuthenticationService {
986
986
  return accessToken;
987
987
  }
988
988
 
989
- async generateRefreshToken(user: User) {
989
+ async generateRefreshToken(user: User, previousRefreshToken?: string) {
990
990
  const refreshTokenId = randomUUID();
991
991
 
992
992
  const refreshToken = await this.signToken(user.id, this.jwtConfiguration.refreshTokenTtl, {
@@ -994,7 +994,7 @@ export class AuthenticationService {
994
994
  })
995
995
 
996
996
  // store the refresh token id in the redis storage.
997
- await this.refreshTokenIdsStorage.insert(user.id, refreshToken);
997
+ await this.refreshTokenIdsStorage.insert(user.id, refreshToken, previousRefreshToken);
998
998
 
999
999
  return refreshToken;
1000
1000
  }
@@ -1164,7 +1164,11 @@ export class AuthenticationService {
1164
1164
  roles: true
1165
1165
  }
1166
1166
  });
1167
- const tokens = await this.generateTokens(user);
1167
+
1168
+ // const tokens = await this.generateTokens(user);
1169
+
1170
+ // Get the refresh token for a user from refresh token storage.
1171
+ const refreshTokenState = await this.refreshTokenIdsStorage.getCurrentRefreshTokenState(user.id);
1168
1172
 
1169
1173
  const response = {
1170
1174
  user: {
@@ -1175,7 +1179,8 @@ export class AuthenticationService {
1175
1179
  id: user.id,
1176
1180
  roles: user.roles.map((role) => role.name)
1177
1181
  },
1178
- ...tokens
1182
+ refreshToken: refreshTokenState.currentRefreshToken,
1183
+ // ...tokens
1179
1184
  }
1180
1185
  return response;
1181
1186
  }