@hed-hog/core 0.0.360 → 0.0.362

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 (153) 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/ai/ai.service.d.ts +1 -1
  7. package/dist/auth/auth.controller.d.ts +27 -26
  8. package/dist/auth/auth.controller.d.ts.map +1 -1
  9. package/dist/auth/auth.controller.js +6 -2
  10. package/dist/auth/auth.controller.js.map +1 -1
  11. package/dist/auth/auth.service.d.ts +35 -34
  12. package/dist/auth/auth.service.d.ts.map +1 -1
  13. package/dist/auth/auth.service.js +15 -5
  14. package/dist/auth/auth.service.js.map +1 -1
  15. package/dist/auth/guards/auth.guard.d.ts +1 -0
  16. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  17. package/dist/auth/guards/auth.guard.js +11 -4
  18. package/dist/auth/guards/auth.guard.js.map +1 -1
  19. package/dist/challenge/challenge.service.d.ts +12 -12
  20. package/dist/core/system.controller.d.ts +2 -2
  21. package/dist/core/system.service.d.ts +2 -2
  22. package/dist/dashboard/dashboard/dashboard.controller.d.ts +66 -66
  23. package/dist/dashboard/dashboard/dashboard.service.d.ts +66 -66
  24. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +26 -26
  25. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +26 -26
  26. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +34 -34
  27. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +34 -34
  28. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +8 -8
  29. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +8 -8
  30. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +5 -5
  31. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +5 -5
  32. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +25 -25
  33. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +25 -25
  34. package/dist/file/file.controller.d.ts +6 -6
  35. package/dist/file/file.module.d.ts.map +1 -1
  36. package/dist/file/file.module.js +3 -2
  37. package/dist/file/file.module.js.map +1 -1
  38. package/dist/file/file.service.d.ts +121 -25
  39. package/dist/file/file.service.d.ts.map +1 -1
  40. package/dist/file/file.service.js +217 -32
  41. package/dist/file/file.service.js.map +1 -1
  42. package/dist/file/image-optimization.service.d.ts +20 -0
  43. package/dist/file/image-optimization.service.d.ts.map +1 -0
  44. package/dist/file/image-optimization.service.js +126 -0
  45. package/dist/file/image-optimization.service.js.map +1 -0
  46. package/dist/file/provider/local.provider.d.ts +1 -1
  47. package/dist/file/provider/local.provider.d.ts.map +1 -1
  48. package/dist/file/provider/local.provider.js +2 -9
  49. package/dist/file/provider/local.provider.js.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/integration-profile/integration-profile.controller.d.ts +15 -15
  55. package/dist/integration-profile/integration-profile.service.d.ts +15 -15
  56. package/dist/locale/locale.controller.d.ts +4 -4
  57. package/dist/locale/locale.service.d.ts +4 -4
  58. package/dist/mail/mail.controller.d.ts +7 -7
  59. package/dist/mail/mail.service.d.ts +7 -7
  60. package/dist/mail-sent/mail-sent.controller.d.ts +12 -12
  61. package/dist/mail-sent/mail-sent.service.d.ts +12 -12
  62. package/dist/mcp/mcp-api-key.controller.d.ts +2 -2
  63. package/dist/mcp/mcp-api-key.service.d.ts +2 -2
  64. package/dist/mcp/tools/core-users.mcp-tools.d.ts +1 -1
  65. package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -1
  66. package/dist/mcp/tools/core-users.mcp-tools.js +2 -2
  67. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  68. package/dist/mcp-chat/mcp-chat.controller.d.ts +8 -8
  69. package/dist/mcp-chat/mcp-chat.service.d.ts +8 -8
  70. package/dist/menu/menu.controller.d.ts +10 -10
  71. package/dist/menu/menu.service.d.ts +10 -10
  72. package/dist/notification/notification.controller.d.ts +36 -36
  73. package/dist/notification/notification.service.d.ts +36 -36
  74. package/dist/profile/profile.controller.d.ts +16 -16
  75. package/dist/profile/profile.service.d.ts +16 -16
  76. package/dist/profile/profile.service.d.ts.map +1 -1
  77. package/dist/profile/profile.service.js +44 -23
  78. package/dist/profile/profile.service.js.map +1 -1
  79. package/dist/role/role.controller.d.ts +6 -6
  80. package/dist/role/role.service.d.ts +6 -6
  81. package/dist/screen/screen.controller.d.ts +3 -3
  82. package/dist/screen/screen.service.d.ts +3 -3
  83. package/dist/session/session.controller.d.ts +2 -2
  84. package/dist/session/session.service.d.ts +6 -6
  85. package/dist/session/session.service.d.ts.map +1 -1
  86. package/dist/session/session.service.js +7 -2
  87. package/dist/session/session.service.js.map +1 -1
  88. package/dist/setting/setting.controller.d.ts +18 -18
  89. package/dist/setting/setting.service.d.ts +18 -18
  90. package/dist/setting/setting.service.d.ts.map +1 -1
  91. package/dist/setting/setting.service.js +0 -1
  92. package/dist/setting/setting.service.js.map +1 -1
  93. package/dist/token/token.service.d.ts +1 -0
  94. package/dist/token/token.service.d.ts.map +1 -1
  95. package/dist/token/token.service.js +23 -6
  96. package/dist/token/token.service.js.map +1 -1
  97. package/dist/user/user.controller.d.ts +30 -30
  98. package/dist/user/user.controller.d.ts.map +1 -1
  99. package/dist/user/user.controller.js +4 -3
  100. package/dist/user/user.controller.js.map +1 -1
  101. package/dist/user/user.service.d.ts +68 -68
  102. package/dist/user/user.service.d.ts.map +1 -1
  103. package/dist/user/user.service.js +6 -6
  104. package/dist/user/user.service.js.map +1 -1
  105. package/dist/webhook-integration/webhook-integration.controller.d.ts +2 -2
  106. package/dist/webhook-integration/webhook-integration.service.d.ts +2 -2
  107. package/hedhog/data/route.yaml +2 -0
  108. package/hedhog/data/setting_group.yaml +117 -26
  109. package/hedhog/data/setting_subgroup.yaml +8 -0
  110. package/hedhog/frontend/app/access-log/page.tsx.ejs +170 -11
  111. package/hedhog/frontend/app/account/components/remove-mfa-dialog.tsx.ejs +1 -1
  112. package/hedhog/frontend/app/account/components/verify-before-add-dialog.tsx.ejs +1 -1
  113. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +113 -38
  114. package/hedhog/frontend/app/users/page.tsx.ejs +7 -7
  115. package/hedhog/frontend/app/users/permissions.tsx.ejs +137 -83
  116. package/hedhog/frontend/app/users/user-access-sheet.tsx.ejs +28 -26
  117. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +207 -75
  118. package/hedhog/frontend/messages/en.json +9 -2
  119. package/hedhog/frontend/messages/pt.json +9 -2
  120. package/hedhog/table/setting_runtime_state.yaml +9 -0
  121. package/package.json +12 -6
  122. package/src/access-log/access-log.service.ts +19 -1
  123. package/src/auth/auth.controller.ts +5 -0
  124. package/src/auth/auth.service.ts +14 -4
  125. package/src/auth/guards/auth.guard.ts +10 -3
  126. package/src/file/file.module.ts +3 -2
  127. package/src/file/file.service.ts +448 -46
  128. package/src/file/image-optimization.service.ts +123 -0
  129. package/src/file/provider/local.provider.ts +2 -9
  130. package/src/index.ts +1 -0
  131. package/src/mcp/tools/core-users.mcp-tools.ts +267 -267
  132. package/src/profile/profile.service.ts +40 -22
  133. package/src/session/session.service.ts +10 -2
  134. package/src/setting/setting.service.ts +0 -1
  135. package/src/token/token.service.ts +26 -6
  136. package/src/user/user.controller.ts +5 -2
  137. package/src/user/user.service.ts +11 -8
  138. package/dist/menu/menu.service.spec.d.ts +0 -1
  139. package/dist/menu/menu.service.spec.d.ts.map +0 -1
  140. package/dist/menu/menu.service.spec.js +0 -208
  141. package/dist/menu/menu.service.spec.js.map +0 -1
  142. package/dist/route/route.service.spec.d.ts +0 -1
  143. package/dist/route/route.service.spec.d.ts.map +0 -1
  144. package/dist/route/route.service.spec.js +0 -262
  145. package/dist/route/route.service.spec.js.map +0 -1
  146. package/dist/screen/screen.service.spec.d.ts +0 -1
  147. package/dist/screen/screen.service.spec.d.ts.map +0 -1
  148. package/dist/screen/screen.service.spec.js +0 -259
  149. package/dist/screen/screen.service.spec.js.map +0 -1
  150. package/dist/user/user.service.spec.d.ts +0 -1
  151. package/dist/user/user.service.spec.d.ts.map +0 -1
  152. package/dist/user/user.service.spec.js +0 -261
  153. package/dist/user/user.service.spec.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
+ import { basename, extname } from 'path';
3
+ import sharp from 'sharp';
4
+ import { SettingService } from '../setting/setting.service';
5
+
6
+ export interface OptimizedImage {
7
+ buffer: Buffer;
8
+ mimetype: string;
9
+ originalname: string;
10
+ }
11
+
12
+ @Injectable()
13
+ export class ImageOptimizationService {
14
+ private readonly logger = new Logger(ImageOptimizationService.name);
15
+
16
+ constructor(
17
+ @Inject(forwardRef(() => SettingService))
18
+ private readonly settingService: SettingService,
19
+ ) {}
20
+
21
+ private parseArraySetting(raw: string | undefined): string[] {
22
+ if (!raw) return [];
23
+ try {
24
+ const parsed = JSON.parse(raw);
25
+ return Array.isArray(parsed) ? parsed : [];
26
+ } catch {
27
+ return [];
28
+ }
29
+ }
30
+
31
+ private replaceExtension(filename: string, newExt: string): string {
32
+ const base = basename(filename, extname(filename));
33
+ return `${base}.${newExt}`;
34
+ }
35
+
36
+ /**
37
+ * Applies image compression and/or WebP conversion to the given buffer
38
+ * based on the current settings. Returns the original data unchanged if
39
+ * the settings are disabled or the MIME type is not in the configured lists.
40
+ */
41
+ async optimizeBuffer(
42
+ buffer: Buffer,
43
+ mimetype: string,
44
+ originalname: string,
45
+ ): Promise<OptimizedImage> {
46
+ if (!mimetype.startsWith('image/')) {
47
+ return { buffer, mimetype, originalname };
48
+ }
49
+
50
+ const settings = await this.settingService.getSettingValues([
51
+ 'image-compression-enabled',
52
+ 'image-compression-quality',
53
+ 'image-compression-types',
54
+ 'image-webp-conversion-enabled',
55
+ 'image-webp-convert-types',
56
+ ]);
57
+
58
+ const compressionEnabled = settings['image-compression-enabled'] === 'true';
59
+ const webpEnabled = settings['image-webp-conversion-enabled'] === 'true';
60
+
61
+ if (!compressionEnabled && !webpEnabled) {
62
+ return { buffer, mimetype, originalname };
63
+ }
64
+
65
+ const quality = Math.min(
66
+ 100,
67
+ Math.max(1, Number(settings['image-compression-quality']) || 80),
68
+ );
69
+ const compressionTypes = this.parseArraySetting(settings['image-compression-types']);
70
+ const webpConvertTypes = this.parseArraySetting(settings['image-webp-convert-types']);
71
+
72
+ // WebP conversion has priority over plain compression
73
+ if (webpEnabled && webpConvertTypes.includes(mimetype)) {
74
+ try {
75
+ const optimized = await sharp(buffer).webp({ quality }).toBuffer();
76
+ return {
77
+ buffer: optimized,
78
+ mimetype: 'image/webp',
79
+ originalname: this.replaceExtension(originalname, 'webp'),
80
+ };
81
+ } catch (err) {
82
+ this.logger.warn(
83
+ `WebP conversion failed for "${originalname}" (${mimetype}): ${err instanceof Error ? err.message : String(err)}. Falling back to original.`,
84
+ );
85
+ return { buffer, mimetype, originalname };
86
+ }
87
+ }
88
+
89
+ if (compressionEnabled && compressionTypes.includes(mimetype)) {
90
+ try {
91
+ let instance = sharp(buffer);
92
+ if (mimetype === 'image/jpeg') {
93
+ instance = instance.jpeg({ quality });
94
+ } else if (mimetype === 'image/png') {
95
+ // sharp compressionLevel is 0-9 (9 = max); invert from quality scale
96
+ const compressionLevel = Math.round(((100 - quality) / 100) * 9);
97
+ instance = instance.png({ compressionLevel });
98
+ } else if (mimetype === 'image/webp') {
99
+ instance = instance.webp({ quality });
100
+ } else if (mimetype === 'image/bmp' || mimetype === 'image/tiff') {
101
+ // Convert to PNG as a compressed lossless alternative
102
+ instance = instance.png({ compressionLevel: Math.round(((100 - quality) / 100) * 9) });
103
+ return {
104
+ buffer: await instance.toBuffer(),
105
+ mimetype: 'image/png',
106
+ originalname: this.replaceExtension(originalname, 'png'),
107
+ };
108
+ } else {
109
+ return { buffer, mimetype, originalname };
110
+ }
111
+ const optimized = await instance.toBuffer();
112
+ return { buffer: optimized, mimetype, originalname };
113
+ } catch (err) {
114
+ this.logger.warn(
115
+ `Image compression failed for "${originalname}" (${mimetype}): ${err instanceof Error ? err.message : String(err)}. Falling back to original.`,
116
+ );
117
+ return { buffer, mimetype, originalname };
118
+ }
119
+ }
120
+
121
+ return { buffer, mimetype, originalname };
122
+ }
123
+ }
@@ -27,15 +27,8 @@ export class LocalProvider extends AbstractProvider {
27
27
  }
28
28
  }
29
29
 
30
- async createFolderRecursive(path: string) {
31
- const folders = join(path).split(sep);
32
- let currentPath = '';
33
- for (const folder of folders) {
34
- currentPath = join(currentPath, folder);
35
- if (!existsSync(currentPath)) {
36
- await mkdir(currentPath, { recursive: true });
37
- }
38
- }
30
+ async createFolderRecursive(folderPath: string): Promise<void> {
31
+ await mkdir(folderPath, { recursive: true });
39
32
  }
40
33
 
41
34
  private resolveFilepath(filepath: string): string {
package/src/index.ts CHANGED
@@ -39,6 +39,7 @@ export * from './ai/ai.service';
39
39
 
40
40
  export * from './webhook-integration/event-webhook.service';
41
41
  export * from './webhook-integration/integration-event-catalog.service';
42
+ export * from './webhook-integration/webhook-command.registry';
42
43
  export * from './webhook-integration/webhook-integration.module';
43
44
  export * from './webhook-integration/webhook-integration.service';
44
45