@hed-hog/core 0.0.370 → 0.0.371
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/LICENSE.md +21 -0
- package/README.md +2 -0
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +10 -7
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/app-command/app-command.module.d.ts +3 -0
- package/dist/app-command/app-command.module.d.ts.map +1 -0
- package/dist/app-command/app-command.module.js +22 -0
- package/dist/app-command/app-command.module.js.map +1 -0
- package/dist/app-command/app-command.registry.d.ts +22 -0
- package/dist/app-command/app-command.registry.d.ts.map +1 -0
- package/dist/{webhook-integration/webhook-command.registry.js → app-command/app-command.registry.js} +6 -6
- package/dist/app-command/app-command.registry.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +2 -2
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +20 -7
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.service.d.ts +3 -3
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +10 -36
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/dto/forget.dto.d.ts +1 -0
- package/dist/auth/dto/forget.dto.d.ts.map +1 -1
- package/dist/auth/dto/forget.dto.js +5 -0
- package/dist/auth/dto/forget.dto.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +4 -1
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +8 -7
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +27 -19
- package/dist/challenge/challenge.service.js.map +1 -1
- package/dist/file/dto/upload.dto.d.ts +3 -0
- package/dist/file/dto/upload.dto.d.ts.map +1 -1
- package/dist/file/dto/upload.dto.js +22 -0
- package/dist/file/dto/upload.dto.js.map +1 -1
- package/dist/file/file.controller.d.ts +2 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +29 -16
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.service.d.ts +51 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +250 -18
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/image-optimization.service.d.ts +17 -4
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +101 -46
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +15 -7
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +18 -8
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/integration/services/event-subscriber.registry.d.ts +5 -0
- package/dist/integration/services/event-subscriber.registry.d.ts.map +1 -1
- package/dist/integration/services/event-subscriber.registry.js +15 -0
- package/dist/integration/services/event-subscriber.registry.js.map +1 -1
- package/dist/integration/services/outbox.processor.d.ts.map +1 -1
- package/dist/integration/services/outbox.processor.js +2 -4
- package/dist/integration/services/outbox.processor.js.map +1 -1
- package/dist/integration/services/outbox.service.d.ts +4 -2
- package/dist/integration/services/outbox.service.d.ts.map +1 -1
- package/dist/integration/services/outbox.service.js +26 -15
- package/dist/integration/services/outbox.service.js.map +1 -1
- package/dist/integration-profile/integration-credential-crypto.service.d.ts +43 -0
- package/dist/integration-profile/integration-credential-crypto.service.d.ts.map +1 -0
- package/dist/integration-profile/integration-credential-crypto.service.js +142 -0
- package/dist/integration-profile/integration-credential-crypto.service.js.map +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts +6 -7
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.controller.js +4 -3
- package/dist/integration-profile/integration-profile.controller.js.map +1 -1
- package/dist/integration-profile/integration-profile.module.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.module.js +5 -2
- package/dist/integration-profile/integration-profile.module.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts +16 -0
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -0
- package/dist/integration-profile/integration-profile.secrets.js +56 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -0
- package/dist/integration-profile/integration-profile.service.d.ts +125 -8
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +257 -68
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.d.ts +17 -0
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +31 -0
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/language/en.json +178 -0
- package/dist/language/pt.json +178 -0
- package/dist/mail/mail.controller.d.ts.map +1 -1
- package/dist/mail/mail.controller.js +5 -28
- package/dist/mail/mail.controller.js.map +1 -1
- package/dist/mail/mail.module.js +18 -18
- package/dist/mail/mail.module.js.map +1 -1
- package/dist/mail/mail.service.d.ts +13 -2
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +25 -15
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +6 -5
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/oauth/providers/facebook.provider.js +5 -5
- package/dist/oauth/providers/facebook.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.js +5 -5
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/google.provider.js +5 -5
- package/dist/oauth/providers/google.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +5 -5
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft.provider.js +5 -5
- package/dist/oauth/providers/microsoft.provider.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +4 -0
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +16 -9
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +7 -7
- package/dist/profile/profile.controller.d.ts.map +1 -1
- package/dist/profile/profile.controller.js +28 -21
- package/dist/profile/profile.controller.js.map +1 -1
- package/dist/profile/profile.service.d.ts +7 -7
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +21 -25
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/setting/setting.service.d.ts +1 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +15 -2
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +2 -1
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user.controller.d.ts +9 -0
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.controller.js +13 -0
- package/dist/user/user.controller.js.map +1 -1
- package/dist/user/user.service.d.ts +7 -0
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +19 -0
- package/dist/user/user.service.js.map +1 -1
- package/dist/utils/webauthn-origin.d.ts +11 -0
- package/dist/utils/webauthn-origin.d.ts.map +1 -0
- package/dist/utils/webauthn-origin.js +37 -0
- package/dist/utils/webauthn-origin.js.map +1 -0
- package/dist/webhook-integration/webhook-integration.controller.d.ts +13 -0
- package/dist/webhook-integration/webhook-integration.controller.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.controller.js +29 -0
- package/dist/webhook-integration/webhook-integration.controller.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.module.js +3 -3
- package/dist/webhook-integration/webhook-integration.module.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.d.ts +18 -2
- package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.js +110 -6
- package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/menu.yaml +6 -0
- package/hedhog/data/role.yaml +7 -0
- package/hedhog/data/route.yaml +36 -0
- package/hedhog/data/setting_group.yaml +119 -13
- package/hedhog/frontend/app/access-log/page.tsx.ejs +35 -3
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +36 -3
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +39 -4
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +39 -4
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +35 -2
- package/hedhog/frontend/app/configurations/[slug]/components/byte-size-input.tsx.ejs +160 -0
- package/hedhog/frontend/app/configurations/[slug]/components/duration-input.tsx.ejs +157 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +244 -63
- package/hedhog/frontend/app/dashboard/[slug]/dashboard-content.tsx.ejs +33 -1
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +35 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +36 -4
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +35 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +36 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +35 -3
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +141 -29
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +118 -11
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +37 -4
- package/hedhog/frontend/app/menu/page.tsx.ejs +34 -2
- package/hedhog/frontend/app/preferences/page.tsx.ejs +77 -0
- package/hedhog/frontend/app/roles/menus.tsx.ejs +35 -3
- package/hedhog/frontend/app/roles/page.tsx.ejs +34 -2
- package/hedhog/frontend/app/roles/routes.tsx.ejs +36 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +36 -4
- package/hedhog/frontend/app/routes/page.tsx.ejs +34 -2
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +34 -2
- package/hedhog/frontend/app/users/page.tsx.ejs +51 -21
- package/hedhog/frontend/messages/en.json +69 -4
- package/hedhog/frontend/messages/pt.json +69 -4
- package/hedhog/table/setting.yaml +2 -0
- package/hedhog/table/webhook_call_log.yaml +49 -46
- package/package.json +8 -3
- package/src/ai/ai.service.ts +9 -6
- package/src/app-command/app-command.module.ts +9 -0
- package/src/{webhook-integration/webhook-command.registry.ts → app-command/app-command.registry.ts} +9 -9
- package/src/auth/auth.controller.ts +20 -4
- package/src/auth/auth.service.ts +10 -36
- package/src/auth/dto/forget.dto.ts +5 -1
- package/src/auth/guards/auth.guard.ts +4 -1
- package/src/challenge/challenge.service.ts +30 -19
- package/src/file/dto/upload.dto.ts +25 -1
- package/src/file/file.controller.ts +31 -18
- package/src/file/file.service.ts +341 -16
- package/src/file/image-optimization.service.ts +111 -46
- package/src/file/provider/s3.provider.ts +16 -7
- package/src/file/provider/spaces.provider.ts +15 -5
- package/src/index.ts +4 -1
- package/src/integration/services/event-subscriber.registry.ts +15 -0
- package/src/integration/services/outbox.processor.ts +2 -5
- package/src/integration/services/outbox.service.ts +35 -17
- package/src/integration-profile/integration-credential-crypto.service.ts +146 -0
- package/src/integration-profile/integration-profile.controller.ts +2 -0
- package/src/integration-profile/integration-profile.module.ts +5 -2
- package/src/integration-profile/integration-profile.secrets.ts +51 -0
- package/src/integration-profile/integration-profile.service.ts +335 -54
- package/src/integration-profile/integration-profile.utils.ts +56 -0
- package/src/language/en.json +5 -1
- package/src/language/pt.json +5 -1
- package/src/mail/mail.controller.ts +5 -29
- package/src/mail/mail.module.ts +5 -5
- package/src/mail/mail.service.ts +37 -13
- package/src/mcp-chat/mcp-chat.service.ts +5 -5
- package/src/oauth/oauth-callback-coordinator.service.spec.ts +159 -0
- package/src/oauth/providers/facebook.provider.ts +3 -3
- package/src/oauth/providers/github.provider.ts +3 -3
- package/src/oauth/providers/google.provider.ts +3 -3
- package/src/oauth/providers/microsoft-entra-id.provider.ts +3 -3
- package/src/oauth/providers/microsoft.provider.ts +3 -3
- package/src/pdf/pdf.service.ts +19 -6
- package/src/profile/profile.controller.ts +21 -14
- package/src/profile/profile.service.ts +23 -20
- package/src/security/security.service.spec.ts +222 -0
- package/src/setting/setting.service.ts +15 -2
- package/src/token/token.service.ts +2 -1
- package/src/user/user.controller.ts +26 -16
- package/src/user/user.service.ts +25 -0
- package/src/utils/webauthn-origin.ts +38 -0
- package/src/webhook-integration/webhook-integration.controller.ts +23 -0
- package/src/webhook-integration/webhook-integration.module.ts +3 -3
- package/src/webhook-integration/webhook-integration.service.ts +115 -5
- package/dist/webhook-integration/webhook-command.registry.d.ts +0 -22
- package/dist/webhook-integration/webhook-command.registry.d.ts.map +0 -1
- package/dist/webhook-integration/webhook-command.registry.js.map +0 -1
- package/src/menu/menu.service.spec.ts +0 -247
- package/src/route/route.service.spec.ts +0 -300
- package/src/screen/screen.service.spec.ts +0 -298
- package/src/user/user.service.spec.ts +0 -294
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
CreateWebhookActionDTO,
|
|
25
25
|
UpdateWebhookActionDTO,
|
|
26
26
|
} from './dto/webhook-action.dto';
|
|
27
|
-
import {
|
|
27
|
+
import { AppCommandRegistry } from '../app-command/app-command.registry';
|
|
28
28
|
import {
|
|
29
29
|
createPlainToken,
|
|
30
30
|
createPublicUuid,
|
|
@@ -103,7 +103,7 @@ export class WebhookIntegrationService {
|
|
|
103
103
|
private readonly mailMainService: MailMainService,
|
|
104
104
|
private readonly coreMailService: MailService,
|
|
105
105
|
private readonly settingService: SettingService,
|
|
106
|
-
private readonly commandRegistry:
|
|
106
|
+
private readonly commandRegistry: AppCommandRegistry,
|
|
107
107
|
private readonly mcpApiKeyService: McpApiKeyService,
|
|
108
108
|
) {}
|
|
109
109
|
|
|
@@ -495,7 +495,8 @@ export class WebhookIntegrationService {
|
|
|
495
495
|
pageSize,
|
|
496
496
|
prev: page > 1 ? page - 1 : null,
|
|
497
497
|
next: page < lastPage ? page + 1 : null,
|
|
498
|
-
|
|
498
|
+
// Never expose the raw replay payload (may contain secrets) to clients.
|
|
499
|
+
data: (data || []).map(({ payload_raw, ...rest }: any) => rest),
|
|
499
500
|
};
|
|
500
501
|
|
|
501
502
|
const logIds = (result.data || [])
|
|
@@ -553,7 +554,6 @@ export class WebhookIntegrationService {
|
|
|
553
554
|
async executePublic(uuid: string, body: any, headers: any, req: Request) {
|
|
554
555
|
const startedAt = Date.now();
|
|
555
556
|
const remoteIp = this.getRemoteIp(req);
|
|
556
|
-
const actionLogs: ActionExecutionLog[] = [];
|
|
557
557
|
let integration: any | null = null;
|
|
558
558
|
|
|
559
559
|
try {
|
|
@@ -575,14 +575,70 @@ export class WebhookIntegrationService {
|
|
|
575
575
|
this.validateToken(integration, headers);
|
|
576
576
|
this.validateIp(integration, remoteIp);
|
|
577
577
|
this.validateBodySchema(integration, body);
|
|
578
|
+
} catch (error) {
|
|
579
|
+
const callLog = await this.createCallLog({
|
|
580
|
+
integration,
|
|
581
|
+
uuid,
|
|
582
|
+
status: 'failed',
|
|
583
|
+
remoteIp,
|
|
584
|
+
durationMs: Date.now() - startedAt,
|
|
585
|
+
payload: body,
|
|
586
|
+
response: {
|
|
587
|
+
success: false,
|
|
588
|
+
actions: [],
|
|
589
|
+
},
|
|
590
|
+
error,
|
|
591
|
+
}).catch(() => null);
|
|
592
|
+
|
|
593
|
+
if (integration?.id && callLog?.id) {
|
|
594
|
+
this.logEmitter.emit(`log:${integration.id}`, { id: callLog.id });
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
if (error instanceof HttpException) {
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
return {
|
|
602
|
+
success: false,
|
|
603
|
+
actions: [],
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
return this.runActionsAndLog({
|
|
608
|
+
integration,
|
|
609
|
+
uuid,
|
|
610
|
+
body,
|
|
611
|
+
remoteIp,
|
|
612
|
+
webhookHeaders: normalizeJsonObject(headers) || {},
|
|
613
|
+
startedAt,
|
|
614
|
+
});
|
|
615
|
+
}
|
|
578
616
|
|
|
617
|
+
/**
|
|
618
|
+
* Runs every active action of an integration against `body`, persists a new
|
|
619
|
+
* call log + action logs, and emits the SSE event. Shared by the public
|
|
620
|
+
* webhook entrypoint and by the admin-triggered retry of a failed call.
|
|
621
|
+
*/
|
|
622
|
+
private async runActionsAndLog(input: {
|
|
623
|
+
integration: any;
|
|
624
|
+
uuid: string;
|
|
625
|
+
body: any;
|
|
626
|
+
remoteIp: string | null;
|
|
627
|
+
webhookHeaders: Record<string, unknown>;
|
|
628
|
+
startedAt: number;
|
|
629
|
+
}) {
|
|
630
|
+
const { integration, uuid, body, remoteIp, webhookHeaders, startedAt } =
|
|
631
|
+
input;
|
|
632
|
+
const actionLogs: ActionExecutionLog[] = [];
|
|
633
|
+
|
|
634
|
+
try {
|
|
579
635
|
const actionResults = [];
|
|
580
636
|
for (const action of integration.webhook_action || []) {
|
|
581
637
|
const actionStartedAt = Date.now();
|
|
582
638
|
|
|
583
639
|
try {
|
|
584
640
|
const result = await this.executeAction(action, body, {
|
|
585
|
-
webhookHeaders
|
|
641
|
+
webhookHeaders,
|
|
586
642
|
remoteIp,
|
|
587
643
|
publicUuid: uuid,
|
|
588
644
|
integrationId: integration.id,
|
|
@@ -700,6 +756,56 @@ export class WebhookIntegrationService {
|
|
|
700
756
|
}
|
|
701
757
|
}
|
|
702
758
|
|
|
759
|
+
/**
|
|
760
|
+
* Replays a previously failed webhook call from the Logs tab. Re-executes the
|
|
761
|
+
* whole call (all active actions) using the original stored payload, without
|
|
762
|
+
* re-validating token/IP (the retry is triggered by an authenticated admin).
|
|
763
|
+
* Produces a brand-new call log so the retry is itself auditable.
|
|
764
|
+
*/
|
|
765
|
+
async retryCall(integrationId: number, logId: number) {
|
|
766
|
+
const log = await this.logs?.findFirst({
|
|
767
|
+
where: { id: logId, webhook_integration_id: integrationId },
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
if (!log) {
|
|
771
|
+
throw new NotFoundException('Webhook call log not found.');
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
if (log.status !== 'failed') {
|
|
775
|
+
throw new BadRequestException('Only failed webhook calls can be retried.');
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
if (log.payload_raw === null || log.payload_raw === undefined) {
|
|
779
|
+
throw new BadRequestException(
|
|
780
|
+
'This webhook call cannot be retried because its original payload was not stored.',
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
const integration = await this.integrations.findUnique({
|
|
785
|
+
where: { id: integrationId },
|
|
786
|
+
include: {
|
|
787
|
+
webhook_action: {
|
|
788
|
+
select: this.webhookActionSelect,
|
|
789
|
+
where: { status: 'active' },
|
|
790
|
+
orderBy: [{ order: 'asc' }, { id: 'asc' }],
|
|
791
|
+
},
|
|
792
|
+
},
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
if (!integration) {
|
|
796
|
+
throw new NotFoundException('Webhook integration not found.');
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
return this.runActionsAndLog({
|
|
800
|
+
integration,
|
|
801
|
+
uuid: integration.public_uuid ?? log.public_uuid,
|
|
802
|
+
body: log.payload_raw,
|
|
803
|
+
remoteIp: null,
|
|
804
|
+
webhookHeaders: {},
|
|
805
|
+
startedAt: Date.now(),
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
|
|
703
809
|
private async executeAction(
|
|
704
810
|
action: any,
|
|
705
811
|
body: any,
|
|
@@ -1300,6 +1406,10 @@ export class WebhookIntegrationService {
|
|
|
1300
1406
|
duration_ms: input.durationMs,
|
|
1301
1407
|
error_message: input.error ? this.extractErrorMessage(input.error) : null,
|
|
1302
1408
|
payload_summary: summarizePayload(sanitizeSensitiveData(input.payload)),
|
|
1409
|
+
// Store the full, unsanitized payload only for failed calls so they can
|
|
1410
|
+
// be replayed faithfully from the Logs tab. Successful calls keep just
|
|
1411
|
+
// the sanitized summary to limit secret exposure and storage.
|
|
1412
|
+
payload_raw: input.status === 'failed' ? (input.payload ?? null) : null,
|
|
1303
1413
|
response_summary: summarizePayload(sanitizeSensitiveData(input.response)),
|
|
1304
1414
|
},
|
|
1305
1415
|
select: {
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface WebhookCommandContext extends Record<string, unknown> {
|
|
2
|
-
webhookBody?: unknown;
|
|
3
|
-
webhookHeaders?: Record<string, unknown>;
|
|
4
|
-
remoteIp?: string | null;
|
|
5
|
-
publicUuid?: string;
|
|
6
|
-
integrationId?: number;
|
|
7
|
-
}
|
|
8
|
-
export interface WebhookCommand {
|
|
9
|
-
slug: string;
|
|
10
|
-
name: string;
|
|
11
|
-
description: string;
|
|
12
|
-
inputSchema: Record<string, unknown>;
|
|
13
|
-
handler: (params: Record<string, unknown>, context?: WebhookCommandContext) => Promise<unknown>;
|
|
14
|
-
}
|
|
15
|
-
export declare class WebhookCommandRegistry {
|
|
16
|
-
private readonly commands;
|
|
17
|
-
register(command: WebhookCommand): void;
|
|
18
|
-
find(slug: string): WebhookCommand | undefined;
|
|
19
|
-
list(): WebhookCommand[];
|
|
20
|
-
dispatch(slug: string, params: Record<string, unknown>, context?: WebhookCommandContext): Promise<unknown>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=webhook-command.registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-command.registry.d.ts","sourceRoot":"","sources":["../../src/webhook-integration/webhook-command.registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAsB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,qBACa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI9C,IAAI,IAAI,cAAc,EAAE;IAIlB,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,OAAO,CAAC;CAQpB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-command.registry.js","sourceRoot":"","sources":["../../src/webhook-integration/webhook-command.registry.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAsBrC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAA5B;QACY,aAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IA0BhE,CAAC;IAxBC,QAAQ,CAAC,OAAuB;QAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,MAA+B,EAC/B,OAA+B;QAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;AA3BY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CA2BlC"}
|
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
// import {
|
|
2
|
-
// PageOrderDirection,
|
|
3
|
-
// PaginationDTO,
|
|
4
|
-
// PaginationService,
|
|
5
|
-
// } from '@hed-hog/api-pagination';
|
|
6
|
-
// import { PrismaService } from '@hed-hog/api-prisma';
|
|
7
|
-
// import { BadRequestException } from '@nestjs/common';
|
|
8
|
-
// import { Test, TestingModule } from '@nestjs/testing';
|
|
9
|
-
// import { MenuService } from './menu.service';
|
|
10
|
-
|
|
11
|
-
// describe('MenuService', () => {
|
|
12
|
-
// let menuService: MenuService;
|
|
13
|
-
// let prismaService: PrismaService;
|
|
14
|
-
// let paginationService: PaginationService;
|
|
15
|
-
|
|
16
|
-
// const mockPrismaService = {
|
|
17
|
-
// menu: {
|
|
18
|
-
// create: jest.fn(),
|
|
19
|
-
// update: jest.fn(),
|
|
20
|
-
// deleteMany: jest.fn(),
|
|
21
|
-
// findUnique: jest.fn(),
|
|
22
|
-
// findMany: jest.fn(),
|
|
23
|
-
// count: jest.fn(),
|
|
24
|
-
// },
|
|
25
|
-
// role_menu: {
|
|
26
|
-
// deleteMany: jest.fn(),
|
|
27
|
-
// createMany: jest.fn(),
|
|
28
|
-
// },
|
|
29
|
-
// menu_screen: {
|
|
30
|
-
// deleteMany: jest.fn(),
|
|
31
|
-
// createMany: jest.fn(),
|
|
32
|
-
// },
|
|
33
|
-
// };
|
|
34
|
-
|
|
35
|
-
// const mockPaginationService = {
|
|
36
|
-
// paginate: jest.fn(),
|
|
37
|
-
// createInsensitiveSearch: jest.fn(),
|
|
38
|
-
// };
|
|
39
|
-
|
|
40
|
-
// beforeEach(async () => {
|
|
41
|
-
// const module: TestingModule = await Test.createTestingModule({
|
|
42
|
-
// providers: [
|
|
43
|
-
// MenuService,
|
|
44
|
-
// { provide: PrismaService, useValue: mockPrismaService },
|
|
45
|
-
// { provide: PaginationService, useValue: mockPaginationService },
|
|
46
|
-
// ],
|
|
47
|
-
// }).compile();
|
|
48
|
-
|
|
49
|
-
// menuService = module.get<MenuService>(MenuService);
|
|
50
|
-
// prismaService = module.get<PrismaService>(PrismaService);
|
|
51
|
-
// paginationService = module.get<PaginationService>(PaginationService);
|
|
52
|
-
// });
|
|
53
|
-
|
|
54
|
-
// afterEach(() => {
|
|
55
|
-
// jest.clearAllMocks();
|
|
56
|
-
// });
|
|
57
|
-
|
|
58
|
-
// describe('create', () => {
|
|
59
|
-
// it('should create a new menu', async () => {
|
|
60
|
-
// const createMenuDto = {
|
|
61
|
-
// name: 'Test Menu',
|
|
62
|
-
// url: '/test',
|
|
63
|
-
// icon: 'test-icon',
|
|
64
|
-
// order: 1,
|
|
65
|
-
// menu_id: undefined,
|
|
66
|
-
// };
|
|
67
|
-
// mockPrismaService.menu.create.mockResolvedValue(createMenuDto);
|
|
68
|
-
|
|
69
|
-
// const result = await menuService.create(createMenuDto);
|
|
70
|
-
|
|
71
|
-
// expect(result).toEqual(createMenuDto);
|
|
72
|
-
// expect(prismaService.menu.create).toHaveBeenCalledWith({
|
|
73
|
-
// data: createMenuDto,
|
|
74
|
-
// });
|
|
75
|
-
// });
|
|
76
|
-
// });
|
|
77
|
-
|
|
78
|
-
// describe('update', () => {
|
|
79
|
-
// it('should update a menu', async () => {
|
|
80
|
-
// const updateDto = { id: 1, data: { name: 'Updated Menu' } };
|
|
81
|
-
// mockPrismaService.menu.update.mockResolvedValue(updateDto.data);
|
|
82
|
-
|
|
83
|
-
// const result = await menuService.update(updateDto);
|
|
84
|
-
|
|
85
|
-
// expect(result).toEqual(updateDto.data);
|
|
86
|
-
// expect(prismaService.menu.update).toHaveBeenCalledWith({
|
|
87
|
-
// where: { id: updateDto.id },
|
|
88
|
-
// data: updateDto.data,
|
|
89
|
-
// });
|
|
90
|
-
// });
|
|
91
|
-
// });
|
|
92
|
-
|
|
93
|
-
// describe('delete', () => {
|
|
94
|
-
// it('should delete menu', async () => {
|
|
95
|
-
// const deleteDto = { ids: [1, 2, 3] };
|
|
96
|
-
// mockPrismaService.menu.deleteMany.mockResolvedValue({ count: 3 });
|
|
97
|
-
|
|
98
|
-
// const result = await menuService.delete(deleteDto);
|
|
99
|
-
|
|
100
|
-
// expect(result).toEqual({ count: 3 });
|
|
101
|
-
// expect(prismaService.menu.deleteMany).toHaveBeenCalledWith({
|
|
102
|
-
// where: { id: { in: deleteDto.ids } },
|
|
103
|
-
// });
|
|
104
|
-
// });
|
|
105
|
-
|
|
106
|
-
// it('should throw BadRequestException if no ids are provided', async () => {
|
|
107
|
-
// await expect(menuService.delete({ ids: null })).rejects.toThrow(
|
|
108
|
-
// BadRequestException,
|
|
109
|
-
// );
|
|
110
|
-
// });
|
|
111
|
-
// });
|
|
112
|
-
|
|
113
|
-
// describe('listScreens', () => {
|
|
114
|
-
// it('should paginate screens', async () => {
|
|
115
|
-
// const locale = 'en';
|
|
116
|
-
// const menuId = 1;
|
|
117
|
-
// const paginationParams: PaginationDTO = {
|
|
118
|
-
// page: 1,
|
|
119
|
-
// pageSize: 10,
|
|
120
|
-
// search: '',
|
|
121
|
-
// sortField: '',
|
|
122
|
-
// sortOrder: PageOrderDirection.Asc,
|
|
123
|
-
// fields: '',
|
|
124
|
-
// };
|
|
125
|
-
|
|
126
|
-
// const mockScreens = [{ id: 1, name: 'Screen 1' }];
|
|
127
|
-
// mockPaginationService.paginate.mockResolvedValue(mockScreens);
|
|
128
|
-
|
|
129
|
-
// const result = await menuService.listScreens(
|
|
130
|
-
// locale,
|
|
131
|
-
// menuId,
|
|
132
|
-
// paginationParams,
|
|
133
|
-
// );
|
|
134
|
-
|
|
135
|
-
// expect(result).toEqual(mockScreens);
|
|
136
|
-
// expect(paginationService.paginate).toHaveBeenCalledWith(
|
|
137
|
-
// prismaService.screens,
|
|
138
|
-
// paginationParams,
|
|
139
|
-
// expect.anything(),
|
|
140
|
-
// 'screen_locale',
|
|
141
|
-
// );
|
|
142
|
-
// });
|
|
143
|
-
// });
|
|
144
|
-
|
|
145
|
-
// describe('updateScreens', () => {
|
|
146
|
-
// it('should update screens associated with a menu', async () => {
|
|
147
|
-
// const menuId = 1;
|
|
148
|
-
// const updateData = { ids: [1, 2, 3] };
|
|
149
|
-
|
|
150
|
-
// jest
|
|
151
|
-
// .spyOn(prismaService.menu_screen, 'deleteMany')
|
|
152
|
-
// .mockResolvedValue(null);
|
|
153
|
-
// jest
|
|
154
|
-
// .spyOn(prismaService.menu_screen, 'createMany')
|
|
155
|
-
// .mockResolvedValue(null);
|
|
156
|
-
|
|
157
|
-
// await menuService.updateScreens(menuId, updateData);
|
|
158
|
-
|
|
159
|
-
// expect(prismaService.menu_screen.deleteMany).toHaveBeenCalledWith({
|
|
160
|
-
// where: { menu_id: menuId },
|
|
161
|
-
// });
|
|
162
|
-
|
|
163
|
-
// expect(prismaService.menu_screen.createMany).toHaveBeenCalledWith({
|
|
164
|
-
// data: updateData.ids.map((screenId) => ({
|
|
165
|
-
// menu_id: menuId,
|
|
166
|
-
// screen_id: screenId,
|
|
167
|
-
// })),
|
|
168
|
-
// skipDuplicates: true,
|
|
169
|
-
// });
|
|
170
|
-
// });
|
|
171
|
-
// });
|
|
172
|
-
|
|
173
|
-
// describe('updateRoles', () => {
|
|
174
|
-
// it('should update role associated with a menu', async () => {
|
|
175
|
-
// const menuId = 1;
|
|
176
|
-
// const updateData = { ids: [1, 2] };
|
|
177
|
-
|
|
178
|
-
// jest.spyOn(prismaService.role_menu, 'deleteMany').mockResolvedValue(null);
|
|
179
|
-
// jest.spyOn(prismaService.role_menu, 'createMany').mockResolvedValue(null);
|
|
180
|
-
|
|
181
|
-
// await menuService.updateRoles(menuId, updateData);
|
|
182
|
-
|
|
183
|
-
// expect(prismaService.role_menu.deleteMany).toHaveBeenCalledWith({
|
|
184
|
-
// where: { menu_id: menuId },
|
|
185
|
-
// });
|
|
186
|
-
|
|
187
|
-
// expect(prismaService.role_menu.createMany).toHaveBeenCalledWith({
|
|
188
|
-
// data: updateData.ids.map((roleId) => ({
|
|
189
|
-
// menu_id: menuId,
|
|
190
|
-
// role_id: roleId,
|
|
191
|
-
// })),
|
|
192
|
-
// skipDuplicates: true,
|
|
193
|
-
// });
|
|
194
|
-
// });
|
|
195
|
-
// });
|
|
196
|
-
|
|
197
|
-
// describe('updateOrder', () => {
|
|
198
|
-
// it('should update the order of menu', async () => {
|
|
199
|
-
// const orderData = { ids: [1, 2, 3] };
|
|
200
|
-
|
|
201
|
-
// jest.spyOn(prismaService.menu, 'count').mockResolvedValue(3);
|
|
202
|
-
// jest.spyOn(prismaService.menu, 'update').mockResolvedValue(null);
|
|
203
|
-
|
|
204
|
-
// await menuService.updateOrder(orderData);
|
|
205
|
-
|
|
206
|
-
// expect(prismaService.menu.count).toHaveBeenCalledWith({
|
|
207
|
-
// where: { id: { in: orderData.ids } },
|
|
208
|
-
// });
|
|
209
|
-
|
|
210
|
-
// expect(prismaService.menu.update).toHaveBeenCalledTimes(
|
|
211
|
-
// orderData.ids.length,
|
|
212
|
-
// );
|
|
213
|
-
|
|
214
|
-
// orderData.ids.forEach((id, index) => {
|
|
215
|
-
// expect(prismaService.menu.update).toHaveBeenCalledWith({
|
|
216
|
-
// where: { id },
|
|
217
|
-
// data: { order: index + 1 },
|
|
218
|
-
// });
|
|
219
|
-
// });
|
|
220
|
-
// });
|
|
221
|
-
|
|
222
|
-
// it('should throw BadRequestException if IDs are invalid', async () => {
|
|
223
|
-
// const orderData = { ids: [1, 2, 3] };
|
|
224
|
-
|
|
225
|
-
// jest.spyOn(prismaService.menu, 'count').mockResolvedValue(2); // IDs não batem com o número esperado
|
|
226
|
-
|
|
227
|
-
// await expect(menuService.updateOrder(orderData)).rejects.toThrow(
|
|
228
|
-
// BadRequestException,
|
|
229
|
-
// );
|
|
230
|
-
// });
|
|
231
|
-
// });
|
|
232
|
-
// /*
|
|
233
|
-
// describe('getMenus', () => {
|
|
234
|
-
// it('should get menu for a user', async () => {
|
|
235
|
-
// const locale = 'en';
|
|
236
|
-
// const userId = 1;
|
|
237
|
-
// const mockMenus = [{ id: 1, name: 'Menu 1' }];
|
|
238
|
-
// mockPrismaService.menu.findMany.mockResolvedValue(mockMenus);
|
|
239
|
-
|
|
240
|
-
// const result = await menuService.getMenus(locale, userId);
|
|
241
|
-
|
|
242
|
-
// expect(result).toEqual(mockMenus);
|
|
243
|
-
// expect(prismaService.menu.findMany).toHaveBeenCalled();
|
|
244
|
-
// });
|
|
245
|
-
// });
|
|
246
|
-
// */
|
|
247
|
-
// });
|