@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.
- package/dist/access-log/access-log.controller.d.ts +1 -1
- package/dist/access-log/access-log.service.d.ts +1 -1
- package/dist/access-log/access-log.service.d.ts.map +1 -1
- package/dist/access-log/access-log.service.js +43 -1
- package/dist/access-log/access-log.service.js.map +1 -1
- package/dist/ai/ai.service.d.ts +1 -1
- package/dist/auth/auth.controller.d.ts +27 -26
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +6 -2
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.service.d.ts +35 -34
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +15 -5
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +1 -0
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +11 -4
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +12 -12
- package/dist/core/system.controller.d.ts +2 -2
- package/dist/core/system.service.d.ts +2 -2
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +66 -66
- package/dist/dashboard/dashboard/dashboard.service.d.ts +66 -66
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +26 -26
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +26 -26
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +34 -34
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +34 -34
- package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +8 -8
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +8 -8
- package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +5 -5
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +5 -5
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +25 -25
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +25 -25
- package/dist/file/file.controller.d.ts +6 -6
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +3 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +121 -25
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +217 -32
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/image-optimization.service.d.ts +20 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -0
- package/dist/file/image-optimization.service.js +126 -0
- package/dist/file/image-optimization.service.js.map +1 -0
- package/dist/file/provider/local.provider.d.ts +1 -1
- package/dist/file/provider/local.provider.d.ts.map +1 -1
- package/dist/file/provider/local.provider.js +2 -9
- package/dist/file/provider/local.provider.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.controller.d.ts +15 -15
- package/dist/integration-profile/integration-profile.service.d.ts +15 -15
- package/dist/locale/locale.controller.d.ts +4 -4
- package/dist/locale/locale.service.d.ts +4 -4
- package/dist/mail/mail.controller.d.ts +7 -7
- package/dist/mail/mail.service.d.ts +7 -7
- package/dist/mail-sent/mail-sent.controller.d.ts +12 -12
- package/dist/mail-sent/mail-sent.service.d.ts +12 -12
- package/dist/mcp/mcp-api-key.controller.d.ts +2 -2
- package/dist/mcp/mcp-api-key.service.d.ts +2 -2
- package/dist/mcp/tools/core-users.mcp-tools.d.ts +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -2
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp-chat/mcp-chat.controller.d.ts +8 -8
- package/dist/mcp-chat/mcp-chat.service.d.ts +8 -8
- package/dist/menu/menu.controller.d.ts +10 -10
- package/dist/menu/menu.service.d.ts +10 -10
- package/dist/notification/notification.controller.d.ts +36 -36
- package/dist/notification/notification.service.d.ts +36 -36
- package/dist/profile/profile.controller.d.ts +16 -16
- package/dist/profile/profile.service.d.ts +16 -16
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +44 -23
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/role/role.controller.d.ts +6 -6
- package/dist/role/role.service.d.ts +6 -6
- package/dist/screen/screen.controller.d.ts +3 -3
- package/dist/screen/screen.service.d.ts +3 -3
- package/dist/session/session.controller.d.ts +2 -2
- package/dist/session/session.service.d.ts +6 -6
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +7 -2
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +18 -18
- package/dist/setting/setting.service.d.ts +18 -18
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +0 -1
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/token/token.service.d.ts +1 -0
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +23 -6
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user.controller.d.ts +30 -30
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.controller.js +4 -3
- package/dist/user/user.controller.js.map +1 -1
- package/dist/user/user.service.d.ts +68 -68
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +6 -6
- package/dist/user/user.service.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.controller.d.ts +2 -2
- package/dist/webhook-integration/webhook-integration.service.d.ts +2 -2
- package/hedhog/data/route.yaml +2 -0
- package/hedhog/data/setting_group.yaml +117 -26
- package/hedhog/data/setting_subgroup.yaml +8 -0
- package/hedhog/frontend/app/access-log/page.tsx.ejs +170 -11
- package/hedhog/frontend/app/account/components/remove-mfa-dialog.tsx.ejs +1 -1
- package/hedhog/frontend/app/account/components/verify-before-add-dialog.tsx.ejs +1 -1
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +113 -38
- package/hedhog/frontend/app/users/page.tsx.ejs +7 -7
- package/hedhog/frontend/app/users/permissions.tsx.ejs +137 -83
- package/hedhog/frontend/app/users/user-access-sheet.tsx.ejs +28 -26
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +207 -75
- package/hedhog/frontend/messages/en.json +9 -2
- package/hedhog/frontend/messages/pt.json +9 -2
- package/hedhog/table/setting_runtime_state.yaml +9 -0
- package/package.json +12 -6
- package/src/access-log/access-log.service.ts +19 -1
- package/src/auth/auth.controller.ts +5 -0
- package/src/auth/auth.service.ts +14 -4
- package/src/auth/guards/auth.guard.ts +10 -3
- package/src/file/file.module.ts +3 -2
- package/src/file/file.service.ts +448 -46
- package/src/file/image-optimization.service.ts +123 -0
- package/src/file/provider/local.provider.ts +2 -9
- package/src/index.ts +1 -0
- package/src/mcp/tools/core-users.mcp-tools.ts +267 -267
- package/src/profile/profile.service.ts +40 -22
- package/src/session/session.service.ts +10 -2
- package/src/setting/setting.service.ts +0 -1
- package/src/token/token.service.ts +26 -6
- package/src/user/user.controller.ts +5 -2
- package/src/user/user.service.ts +11 -8
- package/dist/menu/menu.service.spec.d.ts +0 -1
- package/dist/menu/menu.service.spec.d.ts.map +0 -1
- package/dist/menu/menu.service.spec.js +0 -208
- package/dist/menu/menu.service.spec.js.map +0 -1
- package/dist/route/route.service.spec.d.ts +0 -1
- package/dist/route/route.service.spec.d.ts.map +0 -1
- package/dist/route/route.service.spec.js +0 -262
- package/dist/route/route.service.spec.js.map +0 -1
- package/dist/screen/screen.service.spec.d.ts +0 -1
- package/dist/screen/screen.service.spec.d.ts.map +0 -1
- package/dist/screen/screen.service.spec.js +0 -259
- package/dist/screen/screen.service.spec.js.map +0 -1
- package/dist/user/user.service.spec.d.ts +0 -1
- package/dist/user/user.service.spec.d.ts.map +0 -1
- package/dist/user/user.service.spec.js +0 -261
- 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(
|
|
31
|
-
|
|
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
|
|