@hed-hog/core 0.0.361 → 0.0.364

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 (103) hide show
  1. package/dist/access-log/access-log.controller.d.ts +1 -1
  2. package/dist/access-log/access-log.service.d.ts +1 -1
  3. package/dist/access-log/access-log.service.d.ts.map +1 -1
  4. package/dist/access-log/access-log.service.js +43 -1
  5. package/dist/access-log/access-log.service.js.map +1 -1
  6. package/dist/auth/auth.controller.d.ts +1 -0
  7. package/dist/auth/auth.controller.d.ts.map +1 -1
  8. package/dist/auth/auth.controller.js +6 -2
  9. package/dist/auth/auth.controller.js.map +1 -1
  10. package/dist/auth/auth.service.d.ts +1 -0
  11. package/dist/auth/auth.service.d.ts.map +1 -1
  12. package/dist/auth/auth.service.js +15 -5
  13. package/dist/auth/auth.service.js.map +1 -1
  14. package/dist/auth/guards/auth.guard.d.ts +1 -0
  15. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  16. package/dist/auth/guards/auth.guard.js +11 -4
  17. package/dist/auth/guards/auth.guard.js.map +1 -1
  18. package/dist/file/file.module.d.ts.map +1 -1
  19. package/dist/file/file.module.js +3 -2
  20. package/dist/file/file.module.js.map +1 -1
  21. package/dist/file/file.service.d.ts +71 -1
  22. package/dist/file/file.service.d.ts.map +1 -1
  23. package/dist/file/file.service.js +180 -32
  24. package/dist/file/file.service.js.map +1 -1
  25. package/dist/file/image-optimization.service.d.ts +20 -0
  26. package/dist/file/image-optimization.service.d.ts.map +1 -0
  27. package/dist/file/image-optimization.service.js +126 -0
  28. package/dist/file/image-optimization.service.js.map +1 -0
  29. package/dist/file/provider/local.provider.d.ts +1 -1
  30. package/dist/file/provider/local.provider.d.ts.map +1 -1
  31. package/dist/file/provider/local.provider.js +2 -9
  32. package/dist/file/provider/local.provider.js.map +1 -1
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/mcp/tools/core-users.mcp-tools.d.ts +1 -1
  38. package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -1
  39. package/dist/mcp/tools/core-users.mcp-tools.js +2 -2
  40. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  41. package/dist/profile/profile.service.d.ts.map +1 -1
  42. package/dist/profile/profile.service.js +44 -23
  43. package/dist/profile/profile.service.js.map +1 -1
  44. package/dist/session/session.service.d.ts.map +1 -1
  45. package/dist/session/session.service.js +7 -2
  46. package/dist/session/session.service.js.map +1 -1
  47. package/dist/token/token.service.d.ts +1 -0
  48. package/dist/token/token.service.d.ts.map +1 -1
  49. package/dist/token/token.service.js +23 -6
  50. package/dist/token/token.service.js.map +1 -1
  51. package/dist/user/user.controller.d.ts +1 -1
  52. package/dist/user/user.controller.d.ts.map +1 -1
  53. package/dist/user/user.controller.js +4 -3
  54. package/dist/user/user.controller.js.map +1 -1
  55. package/dist/user/user.service.d.ts +1 -1
  56. package/dist/user/user.service.d.ts.map +1 -1
  57. package/dist/user/user.service.js +6 -6
  58. package/dist/user/user.service.js.map +1 -1
  59. package/hedhog/data/route.yaml +2 -0
  60. package/hedhog/data/setting_group.yaml +117 -0
  61. package/hedhog/data/setting_subgroup.yaml +8 -0
  62. package/hedhog/frontend/app/access-log/page.tsx.ejs +170 -11
  63. package/hedhog/frontend/app/account/components/remove-mfa-dialog.tsx.ejs +1 -1
  64. package/hedhog/frontend/app/account/components/verify-before-add-dialog.tsx.ejs +1 -1
  65. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +112 -5
  66. package/hedhog/frontend/app/users/page.tsx.ejs +7 -7
  67. package/hedhog/frontend/app/users/permissions.tsx.ejs +137 -83
  68. package/hedhog/frontend/app/users/user-access-sheet.tsx.ejs +28 -26
  69. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +207 -75
  70. package/hedhog/frontend/messages/en.json +9 -2
  71. package/hedhog/frontend/messages/pt.json +9 -2
  72. package/package.json +9 -4
  73. package/src/access-log/access-log.service.ts +19 -1
  74. package/src/auth/auth.controller.ts +5 -0
  75. package/src/auth/auth.service.ts +14 -4
  76. package/src/auth/guards/auth.guard.ts +10 -3
  77. package/src/file/file.module.ts +3 -2
  78. package/src/file/file.service.ts +361 -47
  79. package/src/file/image-optimization.service.ts +123 -0
  80. package/src/file/provider/local.provider.ts +2 -9
  81. package/src/index.ts +1 -0
  82. package/src/mcp/tools/core-users.mcp-tools.ts +267 -267
  83. package/src/profile/profile.service.ts +40 -22
  84. package/src/session/session.service.ts +10 -2
  85. package/src/token/token.service.ts +26 -6
  86. package/src/user/user.controller.ts +5 -2
  87. package/src/user/user.service.ts +11 -8
  88. package/dist/menu/menu.service.spec.d.ts +0 -1
  89. package/dist/menu/menu.service.spec.d.ts.map +0 -1
  90. package/dist/menu/menu.service.spec.js +0 -208
  91. package/dist/menu/menu.service.spec.js.map +0 -1
  92. package/dist/route/route.service.spec.d.ts +0 -1
  93. package/dist/route/route.service.spec.d.ts.map +0 -1
  94. package/dist/route/route.service.spec.js +0 -262
  95. package/dist/route/route.service.spec.js.map +0 -1
  96. package/dist/screen/screen.service.spec.d.ts +0 -1
  97. package/dist/screen/screen.service.spec.d.ts.map +0 -1
  98. package/dist/screen/screen.service.spec.js +0 -259
  99. package/dist/screen/screen.service.spec.js.map +0 -1
  100. package/dist/user/user.service.spec.d.ts +0 -1
  101. package/dist/user/user.service.spec.d.ts.map +0 -1
  102. package/dist/user/user.service.spec.js +0 -261
  103. package/dist/user/user.service.spec.js.map +0 -1
@@ -1,267 +1,267 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { UserService } from '../../user/user.service';
3
- import { McpTool } from '../decorators/mcp-tool.decorator';
4
- import { McpContext } from '../types/mcp-context.type';
5
-
6
- @Injectable()
7
- export class CoreUsersMcpTools {
8
- constructor(private readonly userService: UserService) {}
9
-
10
- @McpTool({
11
- name: 'core.users.me',
12
- description: 'Returns the authenticated user profile',
13
- inputSchema: { type: 'object', properties: {} },
14
- readOnly: true,
15
- })
16
- async getMe(_args: Record<string, any>, context: McpContext): Promise<any> {
17
- return this.userService.findUserById(context.locale, context.userId);
18
- }
19
-
20
- @McpTool({
21
- name: 'core.users.list',
22
- description: 'Lists all users with optional pagination and search. Admin only.',
23
- inputSchema: {
24
- type: 'object',
25
- properties: {
26
- page: { type: 'number', description: 'Page number (default: 1)' },
27
- pageSize: { type: 'number', description: 'Items per page (default: 20)' },
28
- search: { type: 'string', description: 'Search term to filter users' },
29
- sortField: { type: 'string', description: 'Field to sort by' },
30
- sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort direction' },
31
- },
32
- },
33
- readOnly: true,
34
- })
35
- async listUsers(
36
- args: {
37
- page?: number;
38
- pageSize?: number;
39
- search?: string;
40
- sortField?: string;
41
- sortOrder?: string;
42
- },
43
- _context: McpContext,
44
- ): Promise<any> {
45
- return this.userService.list({
46
- page: args.page ?? 1,
47
- pageSize: args.pageSize ?? 20,
48
- search: args.search ?? '',
49
- sortField: args.sortField ?? 'id',
50
- sortOrder: (args.sortOrder as any) ?? 'asc',
51
- fields: '',
52
- });
53
- }
54
-
55
- @McpTool({
56
- name: 'core.users.get',
57
- description: 'Returns a single user by ID. Admin only.',
58
- inputSchema: {
59
- type: 'object',
60
- properties: {
61
- userId: { type: 'number', description: 'User ID' },
62
- },
63
- required: ['userId'],
64
- },
65
- readOnly: true,
66
- })
67
- async getUser(
68
- args: { userId: number },
69
- context: McpContext,
70
- ): Promise<any> {
71
- return this.userService.get(context.locale, args.userId);
72
- }
73
-
74
- @McpTool({
75
- name: 'core.users.create',
76
- description: 'Creates a new user with email and password. Admin only.',
77
- inputSchema: {
78
- type: 'object',
79
- properties: {
80
- email: { type: 'string', description: 'User email address' },
81
- password: { type: 'string', description: 'User password' },
82
- name: { type: 'string', description: 'User full name' },
83
- },
84
- required: ['email', 'password', 'name'],
85
- },
86
- })
87
- async createUser(
88
- args: { email: string; password: string; name: string },
89
- context: McpContext,
90
- ): Promise<any> {
91
- return this.userService.createWithEmailAndPassword(context.locale, args as any);
92
- }
93
-
94
- @McpTool({
95
- name: 'core.users.update',
96
- description: 'Updates a user name by ID. Admin only.',
97
- inputSchema: {
98
- type: 'object',
99
- properties: {
100
- userId: { type: 'number', description: 'User ID' },
101
- name: { type: 'string', description: 'New user name' },
102
- },
103
- required: ['userId'],
104
- },
105
- })
106
- async updateUser(
107
- args: { userId: number; name?: string },
108
- context: McpContext,
109
- ): Promise<any> {
110
- return this.userService.update(context.locale, args.userId, { name: args.name } as any);
111
- }
112
-
113
- @McpTool({
114
- name: 'core.users.reset-password',
115
- description: 'Resets the password of a user by ID. Admin only.',
116
- inputSchema: {
117
- type: 'object',
118
- properties: {
119
- userId: { type: 'number', description: 'User ID' },
120
- password: { type: 'string', description: 'New password (must meet strength requirements)' },
121
- },
122
- required: ['userId'],
123
- },
124
- })
125
- async resetPassword(
126
- args: { userId: number; password?: string },
127
- context: McpContext,
128
- ): Promise<any> {
129
- return this.userService.resetPassword(context.locale, args.userId, { password: args.password } as any);
130
- }
131
-
132
- @McpTool({
133
- name: 'core.users.delete',
134
- description: 'Deletes one or more users by their IDs. Admin only.',
135
- inputSchema: {
136
- type: 'object',
137
- properties: {
138
- ids: {
139
- type: 'array',
140
- items: { type: 'number' },
141
- description: 'Array of user IDs to delete',
142
- },
143
- },
144
- required: ['ids'],
145
- },
146
- })
147
- async deleteUsers(
148
- args: { ids: number[] },
149
- context: McpContext,
150
- ): Promise<any> {
151
- return this.userService.delete(context.locale, { ids: args.ids });
152
- }
153
-
154
- @McpTool({
155
- name: 'core.users.roles',
156
- description: 'Returns the roles assigned to a user. Admin only.',
157
- inputSchema: {
158
- type: 'object',
159
- properties: {
160
- userId: { type: 'number', description: 'User ID' },
161
- },
162
- required: ['userId'],
163
- },
164
- readOnly: true,
165
- })
166
- async getUserRoles(
167
- args: { userId: number },
168
- _context: McpContext,
169
- ): Promise<any> {
170
- return this.userService.getUserRoles(args.userId);
171
- }
172
-
173
- @McpTool({
174
- name: 'core.users.menus',
175
- description: 'Returns the menu items accessible to a user. Admin only.',
176
- inputSchema: {
177
- type: 'object',
178
- properties: {
179
- userId: { type: 'number', description: 'User ID' },
180
- },
181
- required: ['userId'],
182
- },
183
- readOnly: true,
184
- })
185
- async getUserMenus(
186
- args: { userId: number },
187
- context: McpContext,
188
- ): Promise<any> {
189
- return this.userService.getUserMenus(context.locale, args.userId);
190
- }
191
-
192
- @McpTool({
193
- name: 'core.users.routes',
194
- description: 'Returns the routes accessible to a user. Admin only.',
195
- inputSchema: {
196
- type: 'object',
197
- properties: {
198
- userId: { type: 'number', description: 'User ID' },
199
- },
200
- required: ['userId'],
201
- },
202
- readOnly: true,
203
- })
204
- async getUserRoutes(
205
- args: { userId: number },
206
- context: McpContext,
207
- ): Promise<any> {
208
- return this.userService.getUserRoutes(context.locale, args.userId);
209
- }
210
-
211
- @McpTool({
212
- name: 'core.users.assign-role',
213
- description: 'Assigns a role to a user. Admin only.',
214
- inputSchema: {
215
- type: 'object',
216
- properties: {
217
- userId: { type: 'number', description: 'User ID' },
218
- roleId: { type: 'number', description: 'Role ID to assign' },
219
- },
220
- required: ['userId', 'roleId'],
221
- },
222
- })
223
- async assignRole(
224
- args: { userId: number; roleId: number },
225
- context: McpContext,
226
- ): Promise<any> {
227
- return this.userService.assignRoleToUser(context.locale, args.userId, args.roleId);
228
- }
229
-
230
- @McpTool({
231
- name: 'core.users.remove-role',
232
- description: 'Removes a role from a user. Admin only.',
233
- inputSchema: {
234
- type: 'object',
235
- properties: {
236
- userId: { type: 'number', description: 'User ID' },
237
- roleId: { type: 'number', description: 'Role ID to remove' },
238
- },
239
- required: ['userId', 'roleId'],
240
- },
241
- })
242
- async removeRole(
243
- args: { userId: number; roleId: number },
244
- context: McpContext,
245
- ): Promise<any> {
246
- return this.userService.removeRoleFromUser(context.locale, args.userId, args.roleId);
247
- }
248
-
249
- @McpTool({
250
- name: 'core.users.verify-identifier',
251
- description: 'Verifies a user identifier (e.g. email confirmation). Admin only.',
252
- inputSchema: {
253
- type: 'object',
254
- properties: {
255
- userId: { type: 'number', description: 'User ID' },
256
- identifierId: { type: 'number', description: 'Identifier ID to verify' },
257
- },
258
- required: ['userId', 'identifierId'],
259
- },
260
- })
261
- async verifyIdentifier(
262
- args: { userId: number; identifierId: number },
263
- context: McpContext,
264
- ): Promise<any> {
265
- return this.userService.verifyIdentifier(context.locale, args.userId, args.identifierId);
266
- }
267
- }
1
+ import { Injectable } from '@nestjs/common';
2
+ import { UserService } from '../../user/user.service';
3
+ import { McpTool } from '../decorators/mcp-tool.decorator';
4
+ import { McpContext } from '../types/mcp-context.type';
5
+
6
+ @Injectable()
7
+ export class CoreUsersMcpTools {
8
+ constructor(private readonly userService: UserService) {}
9
+
10
+ @McpTool({
11
+ name: 'core.users.me',
12
+ description: 'Returns the authenticated user profile',
13
+ inputSchema: { type: 'object', properties: {} },
14
+ readOnly: true,
15
+ })
16
+ async getMe(_args: Record<string, any>, context: McpContext): Promise<any> {
17
+ return this.userService.findUserById(context.locale, context.userId);
18
+ }
19
+
20
+ @McpTool({
21
+ name: 'core.users.list',
22
+ description: 'Lists all users with optional pagination and search. Admin only.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ page: { type: 'number', description: 'Page number (default: 1)' },
27
+ pageSize: { type: 'number', description: 'Items per page (default: 20)' },
28
+ search: { type: 'string', description: 'Search term to filter users' },
29
+ sortField: { type: 'string', description: 'Field to sort by' },
30
+ sortOrder: { type: 'string', enum: ['asc', 'desc'], description: 'Sort direction' },
31
+ },
32
+ },
33
+ readOnly: true,
34
+ })
35
+ async listUsers(
36
+ args: {
37
+ page?: number;
38
+ pageSize?: number;
39
+ search?: string;
40
+ sortField?: string;
41
+ sortOrder?: string;
42
+ },
43
+ _context: McpContext,
44
+ ): Promise<any> {
45
+ return this.userService.list({
46
+ page: args.page ?? 1,
47
+ pageSize: args.pageSize ?? 20,
48
+ search: args.search ?? '',
49
+ sortField: args.sortField ?? 'id',
50
+ sortOrder: (args.sortOrder as any) ?? 'asc',
51
+ fields: '',
52
+ });
53
+ }
54
+
55
+ @McpTool({
56
+ name: 'core.users.get',
57
+ description: 'Returns a single user by ID. Admin only.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ userId: { type: 'number', description: 'User ID' },
62
+ },
63
+ required: ['userId'],
64
+ },
65
+ readOnly: true,
66
+ })
67
+ async getUser(
68
+ args: { userId: number },
69
+ context: McpContext,
70
+ ): Promise<any> {
71
+ return this.userService.get(context.locale, args.userId);
72
+ }
73
+
74
+ @McpTool({
75
+ name: 'core.users.create',
76
+ description: 'Creates a new user with email and password. Admin only.',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {
80
+ email: { type: 'string', description: 'User email address' },
81
+ password: { type: 'string', description: 'User password' },
82
+ name: { type: 'string', description: 'User full name' },
83
+ },
84
+ required: ['email', 'password', 'name'],
85
+ },
86
+ })
87
+ async createUser(
88
+ args: { email: string; password: string; name: string },
89
+ context: McpContext,
90
+ ): Promise<any> {
91
+ return this.userService.createWithEmailAndPassword(context.locale, args as any);
92
+ }
93
+
94
+ @McpTool({
95
+ name: 'core.users.update',
96
+ description: 'Updates a user name by ID. Admin only.',
97
+ inputSchema: {
98
+ type: 'object',
99
+ properties: {
100
+ userId: { type: 'number', description: 'User ID' },
101
+ name: { type: 'string', description: 'New user name' },
102
+ },
103
+ required: ['userId'],
104
+ },
105
+ })
106
+ async updateUser(
107
+ args: { userId: number; name?: string },
108
+ context: McpContext,
109
+ ): Promise<any> {
110
+ return this.userService.update(context.locale, args.userId, { name: args.name } as any);
111
+ }
112
+
113
+ @McpTool({
114
+ name: 'core.users.reset-password',
115
+ description: 'Resets the password of a user by ID. Admin only.',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ userId: { type: 'number', description: 'User ID' },
120
+ password: { type: 'string', description: 'New password (must meet strength requirements)' },
121
+ },
122
+ required: ['userId'],
123
+ },
124
+ })
125
+ async resetPassword(
126
+ args: { userId: number; password?: string },
127
+ context: McpContext,
128
+ ): Promise<any> {
129
+ return this.userService.resetPassword(context.locale, args.userId, { password: args.password } as any);
130
+ }
131
+
132
+ @McpTool({
133
+ name: 'core.users.delete',
134
+ description: 'Deletes one or more users by their IDs. Admin only.',
135
+ inputSchema: {
136
+ type: 'object',
137
+ properties: {
138
+ ids: {
139
+ type: 'array',
140
+ items: { type: 'number' },
141
+ description: 'Array of user IDs to delete',
142
+ },
143
+ },
144
+ required: ['ids'],
145
+ },
146
+ })
147
+ async deleteUsers(
148
+ args: { ids: number[] },
149
+ context: McpContext,
150
+ ): Promise<any> {
151
+ return this.userService.delete(context.locale, { ids: args.ids });
152
+ }
153
+
154
+ @McpTool({
155
+ name: 'core.users.roles',
156
+ description: 'Returns the roles assigned to a user. Admin only.',
157
+ inputSchema: {
158
+ type: 'object',
159
+ properties: {
160
+ userId: { type: 'number', description: 'User ID' },
161
+ },
162
+ required: ['userId'],
163
+ },
164
+ readOnly: true,
165
+ })
166
+ async getUserRoles(
167
+ args: { userId: number },
168
+ context: McpContext,
169
+ ): Promise<any> {
170
+ return this.userService.getUserRoles(context.locale, args.userId);
171
+ }
172
+
173
+ @McpTool({
174
+ name: 'core.users.menus',
175
+ description: 'Returns the menu items accessible to a user. Admin only.',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ userId: { type: 'number', description: 'User ID' },
180
+ },
181
+ required: ['userId'],
182
+ },
183
+ readOnly: true,
184
+ })
185
+ async getUserMenus(
186
+ args: { userId: number },
187
+ context: McpContext,
188
+ ): Promise<any> {
189
+ return this.userService.getUserMenus(context.locale, args.userId);
190
+ }
191
+
192
+ @McpTool({
193
+ name: 'core.users.routes',
194
+ description: 'Returns the routes accessible to a user. Admin only.',
195
+ inputSchema: {
196
+ type: 'object',
197
+ properties: {
198
+ userId: { type: 'number', description: 'User ID' },
199
+ },
200
+ required: ['userId'],
201
+ },
202
+ readOnly: true,
203
+ })
204
+ async getUserRoutes(
205
+ args: { userId: number },
206
+ context: McpContext,
207
+ ): Promise<any> {
208
+ return this.userService.getUserRoutes(context.locale, args.userId);
209
+ }
210
+
211
+ @McpTool({
212
+ name: 'core.users.assign-role',
213
+ description: 'Assigns a role to a user. Admin only.',
214
+ inputSchema: {
215
+ type: 'object',
216
+ properties: {
217
+ userId: { type: 'number', description: 'User ID' },
218
+ roleId: { type: 'number', description: 'Role ID to assign' },
219
+ },
220
+ required: ['userId', 'roleId'],
221
+ },
222
+ })
223
+ async assignRole(
224
+ args: { userId: number; roleId: number },
225
+ context: McpContext,
226
+ ): Promise<any> {
227
+ return this.userService.assignRoleToUser(context.locale, args.userId, args.roleId);
228
+ }
229
+
230
+ @McpTool({
231
+ name: 'core.users.remove-role',
232
+ description: 'Removes a role from a user. Admin only.',
233
+ inputSchema: {
234
+ type: 'object',
235
+ properties: {
236
+ userId: { type: 'number', description: 'User ID' },
237
+ roleId: { type: 'number', description: 'Role ID to remove' },
238
+ },
239
+ required: ['userId', 'roleId'],
240
+ },
241
+ })
242
+ async removeRole(
243
+ args: { userId: number; roleId: number },
244
+ context: McpContext,
245
+ ): Promise<any> {
246
+ return this.userService.removeRoleFromUser(context.locale, args.userId, args.roleId);
247
+ }
248
+
249
+ @McpTool({
250
+ name: 'core.users.verify-identifier',
251
+ description: 'Verifies a user identifier (e.g. email confirmation). Admin only.',
252
+ inputSchema: {
253
+ type: 'object',
254
+ properties: {
255
+ userId: { type: 'number', description: 'User ID' },
256
+ identifierId: { type: 'number', description: 'Identifier ID to verify' },
257
+ },
258
+ required: ['userId', 'identifierId'],
259
+ },
260
+ })
261
+ async verifyIdentifier(
262
+ args: { userId: number; identifierId: number },
263
+ context: McpContext,
264
+ ): Promise<any> {
265
+ return this.userService.verifyIdentifier(context.locale, args.userId, args.identifierId);
266
+ }
267
+ }