@hed-hog/core 0.0.398 → 0.0.400
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/ai/ai-agent.sort.d.ts +6 -0
- package/dist/ai/ai-agent.sort.d.ts.map +1 -0
- package/dist/ai/ai-agent.sort.js +21 -0
- package/dist/ai/ai-agent.sort.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +4 -4
- package/dist/ai/ai.service.d.ts +35 -4
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +51 -137
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +26 -23
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
- package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
- package/dist/ai-instruction/ai-instruction.sort.js +32 -0
- package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +24 -8
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +8 -1
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +72 -25
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +41 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +3 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +12 -3
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/authorize/authorize.controller.d.ts +30 -6
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +120 -13
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.errors.d.ts +34 -0
- package/dist/authorize/authorize.errors.d.ts.map +1 -0
- package/dist/authorize/authorize.errors.js +37 -0
- package/dist/authorize/authorize.errors.js.map +1 -0
- package/dist/authorize/authorize.module.d.ts.map +1 -1
- package/dist/authorize/authorize.module.js +6 -1
- package/dist/authorize/authorize.module.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +78 -4
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +212 -21
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.js +16 -1
- package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
- package/dist/authorize/dto/consent.dto.d.ts +10 -1
- package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
- package/dist/authorize/dto/consent.dto.js +16 -1
- package/dist/authorize/dto/consent.dto.js.map +1 -1
- package/dist/authorize/dto/token.dto.d.ts +12 -0
- package/dist/authorize/dto/token.dto.d.ts.map +1 -1
- package/dist/authorize/dto/token.dto.js +21 -1
- package/dist/authorize/dto/token.dto.js.map +1 -1
- package/dist/authorize/oauth-exception.filter.d.ts +17 -0
- package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
- package/dist/authorize/oauth-exception.filter.js +54 -0
- package/dist/authorize/oauth-exception.filter.js.map +1 -0
- package/dist/authorize/oauth-metadata.service.d.ts +39 -0
- package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
- package/dist/authorize/oauth-metadata.service.js +81 -0
- package/dist/authorize/oauth-metadata.service.js.map +1 -0
- package/dist/authorize/well-known.controller.d.ts +67 -0
- package/dist/authorize/well-known.controller.d.ts.map +1 -0
- package/dist/authorize/well-known.controller.js +126 -0
- package/dist/authorize/well-known.controller.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +32 -2
- package/dist/captcha/captcha.service.d.ts.map +1 -1
- package/dist/captcha/captcha.service.js +85 -12
- package/dist/captcha/captcha.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +2 -2
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +6 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
- package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
- package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
- package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +160 -0
- package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
- package/dist/file/file-upload-ticket.service.js +382 -0
- package/dist/file/file-upload-ticket.service.js.map +1 -0
- package/dist/file/file.controller.d.ts +24 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +63 -2
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +14 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +182 -6
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +385 -36
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/filename-encoding.util.d.ts +24 -0
- package/dist/file/filename-encoding.util.d.ts.map +1 -0
- package/dist/file/filename-encoding.util.js +63 -0
- package/dist/file/filename-encoding.util.js.map +1 -0
- package/dist/file/image-optimization.service.d.ts +27 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +63 -14
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts +33 -0
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
- package/dist/file/mcp-file-source.schema.js +75 -0
- package/dist/file/mcp-file-source.schema.js.map +1 -0
- package/dist/file/mcp-file-source.service.d.ts +124 -0
- package/dist/file/mcp-file-source.service.d.ts.map +1 -0
- package/dist/file/mcp-file-source.service.js +262 -0
- package/dist/file/mcp-file-source.service.js.map +1 -0
- package/dist/file/mimetype-sniff.util.d.ts +62 -0
- package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
- package/dist/file/mimetype-sniff.util.js +226 -0
- package/dist/file/mimetype-sniff.util.js.map +1 -0
- package/dist/file/remote-fetch.util.d.ts +35 -0
- package/dist/file/remote-fetch.util.d.ts.map +1 -0
- package/dist/file/remote-fetch.util.js +236 -0
- package/dist/file/remote-fetch.util.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
- package/dist/impersonation/impersonation.service.d.ts +8 -3
- package/dist/impersonation/impersonation.service.d.ts.map +1 -1
- package/dist/impersonation/impersonation.service.js +14 -4
- package/dist/impersonation/impersonation.service.js.map +1 -1
- package/dist/incident/incident.controller.d.ts +2 -1
- package/dist/incident/incident.controller.d.ts.map +1 -1
- package/dist/incident/incident.controller.js +10 -6
- package/dist/incident/incident.controller.js.map +1 -1
- package/dist/incident/incident.service.d.ts +2 -0
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js +4 -0
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +7 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +0 -13
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +5 -40
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +5 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/index.d.ts.map +1 -1
- package/dist/integration-profile/testers/index.js +2 -0
- package/dist/integration-profile/testers/index.js.map +1 -1
- package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
- package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/shipping.testers.js +71 -0
- package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
- package/dist/locale/locale.controller.d.ts +1 -1
- package/dist/locale/locale.service.d.ts +1 -1
- package/dist/mail/dto/send.dto.d.ts +6 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.service.d.ts +9 -0
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +34 -14
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +2 -1
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
- package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
- package/dist/mail-sent/mail-sent.sort.js +19 -0
- package/dist/mail-sent/mail-sent.sort.js.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
- package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +19 -5
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.js +46 -26
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
- package/dist/mcp/mcp-audit.service.js +32 -3
- package/dist/mcp/mcp-audit.service.js.map +1 -1
- package/dist/mcp/mcp-permission.service.d.ts +64 -0
- package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
- package/dist/mcp/mcp-permission.service.js +178 -0
- package/dist/mcp/mcp-permission.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +3 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +36 -15
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +10 -2
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +5 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
- package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
- package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
- package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/types/mcp-context.type.d.ts +9 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +8 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +115 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/meeting/meeting.constants.d.ts +70 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -1
- package/dist/meeting/meeting.constants.js +9 -1
- package/dist/meeting/meeting.constants.js.map +1 -1
- package/dist/menu/menu.service.d.ts.map +1 -1
- package/dist/menu/menu.service.js +29 -9
- package/dist/menu/menu.service.js.map +1 -1
- package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
- package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
- package/dist/message-template/dto/update-message-template.dto.js +38 -0
- package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
- package/dist/message-template/message-template-admin.service.d.ts +70 -0
- package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
- package/dist/message-template/message-template-admin.service.js +226 -0
- package/dist/message-template/message-template-admin.service.js.map +1 -0
- package/dist/message-template/message-template.controller.d.ts +29 -0
- package/dist/message-template/message-template.controller.d.ts.map +1 -0
- package/dist/message-template/message-template.controller.js +101 -0
- package/dist/message-template/message-template.controller.js.map +1 -0
- package/dist/message-template/message-template.module.d.ts +10 -0
- package/dist/message-template/message-template.module.d.ts.map +1 -0
- package/dist/message-template/message-template.module.js +33 -0
- package/dist/message-template/message-template.module.js.map +1 -0
- package/dist/message-template/message-template.registry.d.ts +55 -0
- package/dist/message-template/message-template.registry.d.ts.map +1 -0
- package/dist/message-template/message-template.registry.js +64 -0
- package/dist/message-template/message-template.registry.js.map +1 -0
- package/dist/message-template/message-template.service.d.ts +59 -0
- package/dist/message-template/message-template.service.d.ts.map +1 -0
- package/dist/message-template/message-template.service.js +166 -0
- package/dist/message-template/message-template.service.js.map +1 -0
- package/dist/notification/notification.constants.d.ts +11 -0
- package/dist/notification/notification.constants.d.ts.map +1 -0
- package/dist/notification/notification.constants.js +14 -0
- package/dist/notification/notification.constants.js.map +1 -0
- package/dist/notification/notification.controller.d.ts +20 -20
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/notification.service.d.ts +33 -21
- package/dist/notification/notification.service.d.ts.map +1 -1
- package/dist/notification/notification.service.js +36 -2
- package/dist/notification/notification.service.js.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -6
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +0 -1
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.errors.d.ts +15 -1
- package/dist/oauth/oauth.errors.d.ts.map +1 -1
- package/dist/oauth/oauth.errors.js +9 -1
- package/dist/oauth/oauth.errors.js.map +1 -1
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +6 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +25 -5
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +63 -27
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +10 -0
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/abstract.provider.js +39 -12
- package/dist/oauth/providers/abstract.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +1 -1
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +48 -22
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +29 -12
- package/dist/observability/monitored-cron.d.ts.map +1 -1
- package/dist/observability/monitored-cron.js +131 -46
- package/dist/observability/monitored-cron.js.map +1 -1
- package/dist/pairing/pairing.controller.d.ts +9 -9
- package/dist/pairing/pairing.service.d.ts +15 -11
- package/dist/pairing/pairing.service.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.js +4 -6
- package/dist/profile/dto/change-password.dto.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +1 -1
- package/dist/profile/profile.service.d.ts +1 -1
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +9 -3
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
- package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
- package/dist/realtime/realtime-tick.coalescer.js +60 -0
- package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +2 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -1
- package/dist/realtime/realtime.service.js +22 -2
- package/dist/realtime/realtime.service.js.map +1 -1
- package/dist/redis/redis-kv.service.d.ts +90 -0
- package/dist/redis/redis-kv.service.d.ts.map +1 -0
- package/dist/redis/redis-kv.service.js +247 -0
- package/dist/redis/redis-kv.service.js.map +1 -0
- package/dist/redis/redis-master.d.ts +29 -0
- package/dist/redis/redis-master.d.ts.map +1 -0
- package/dist/redis/redis-master.js +81 -0
- package/dist/redis/redis-master.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +12 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +25 -2
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/redis/redis.module.d.ts +11 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +30 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/session/session.controller.d.ts +6 -2
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +118 -15
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +251 -77
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.map +1 -1
- package/dist/setting/setting.service.d.ts +7 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +38 -3
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +17 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +48 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/token/token.service.d.ts +19 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -2
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user-credential.util.d.ts +10 -0
- package/dist/user/user-credential.util.d.ts.map +1 -1
- package/dist/user/user-credential.util.js +14 -1
- package/dist/user/user-credential.util.js.map +1 -1
- package/dist/user/user.service.d.ts +12 -4
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +2 -11
- package/dist/user/user.service.js.map +1 -1
- package/dist/user/user.sort.d.ts +16 -0
- package/dist/user/user.sort.d.ts.map +1 -0
- package/dist/user/user.sort.js +25 -0
- package/dist/user/user.sort.js.map +1 -0
- package/dist/utils/abbreviate-name.d.ts +13 -0
- package/dist/utils/abbreviate-name.d.ts.map +1 -0
- package/dist/utils/abbreviate-name.js +42 -0
- package/dist/utils/abbreviate-name.js.map +1 -0
- package/dist/utils/date-range-query.dto.d.ts +11 -0
- package/dist/utils/date-range-query.dto.d.ts.map +1 -0
- package/dist/utils/date-range-query.dto.js +63 -0
- package/dist/utils/date-range-query.dto.js.map +1 -0
- package/dist/utils/date-range.d.ts +96 -0
- package/dist/utils/date-range.d.ts.map +1 -0
- package/dist/utils/date-range.js +172 -0
- package/dist/utils/date-range.js.map +1 -0
- package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-utils.js +24 -0
- package/dist/webhook-integration/webhook-utils.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/locale.yaml +0 -1
- package/hedhog/data/mail.yaml +2 -2
- package/hedhog/data/mail_layout.yaml +6 -3
- package/hedhog/data/menu.yaml +25 -5
- package/hedhog/data/route.yaml +140 -0
- package/hedhog/data/setting_group.yaml +137 -3
- package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
- package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
- package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
- package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
- package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
- package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
- package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
- package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
- package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
- package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
- package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
- package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
- package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
- package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
- package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
- package/hedhog/frontend/messages/en.json +183 -36
- package/hedhog/frontend/messages/pt.json +183 -36
- package/hedhog/table/cron_lock.yaml +17 -0
- package/hedhog/table/file.yaml +13 -1
- package/hedhog/table/file_upload_chunk.yaml +23 -0
- package/hedhog/table/file_upload_ticket.yaml +67 -0
- package/hedhog/table/mcp_tool_call_log.yaml +30 -22
- package/hedhog/table/message_template.yaml +33 -0
- package/hedhog/table/setting.yaml +8 -0
- package/hedhog/table/user_session.yaml +36 -1
- package/package.json +8 -6
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +64 -193
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -0
- package/src/auth/auth.module.ts +8 -1
- package/src/auth/auth.service.spec.ts +108 -1
- package/src/auth/auth.service.ts +59 -5
- package/src/auth/guards/auth.guard.ts +9 -1
- package/src/authorize/authorize.controller.ts +126 -11
- package/src/authorize/authorize.errors.ts +55 -0
- package/src/authorize/authorize.module.ts +6 -1
- package/src/authorize/authorize.service.spec.ts +379 -7
- package/src/authorize/authorize.service.ts +309 -23
- package/src/authorize/dto/authorize-info.dto.ts +21 -3
- package/src/authorize/dto/consent.dto.ts +21 -3
- package/src/authorize/dto/token.dto.ts +24 -2
- package/src/authorize/oauth-exception.filter.ts +58 -0
- package/src/authorize/oauth-metadata.service.ts +67 -0
- package/src/authorize/well-known.controller.spec.ts +84 -0
- package/src/authorize/well-known.controller.ts +96 -0
- package/src/captcha/captcha.service.spec.ts +211 -4
- package/src/captcha/captcha.service.ts +127 -10
- package/src/core.module.ts +6 -0
- package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
- package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
- package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
- package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
- package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
- package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
- package/src/file/file-upload-ticket.service.spec.ts +422 -0
- package/src/file/file-upload-ticket.service.ts +513 -0
- package/src/file/file.controller.ts +65 -0
- package/src/file/file.module.ts +14 -2
- package/src/file/file.service.spec.ts +94 -0
- package/src/file/file.service.ts +432 -30
- package/src/file/filename-encoding.util.spec.ts +54 -0
- package/src/file/filename-encoding.util.ts +67 -0
- package/src/file/image-optimization.service.spec.ts +156 -19
- package/src/file/image-optimization.service.ts +106 -21
- package/src/file/mcp-file-source.schema.ts +83 -0
- package/src/file/mcp-file-source.service.spec.ts +473 -0
- package/src/file/mcp-file-source.service.ts +445 -0
- package/src/file/mimetype-sniff.util.spec.ts +126 -0
- package/src/file/mimetype-sniff.util.ts +265 -0
- package/src/file/remote-fetch.util.spec.ts +117 -0
- package/src/file/remote-fetch.util.ts +330 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
- package/src/impersonation/impersonation.service.spec.ts +24 -1
- package/src/impersonation/impersonation.service.ts +14 -4
- package/src/incident/incident.controller.ts +9 -1
- package/src/incident/incident.service.ts +7 -0
- package/src/index.ts +17 -0
- package/src/integration-profile/integration-profile.secrets.ts +7 -0
- package/src/integration-profile/integration-profile.service.ts +7 -64
- package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
- package/src/integration-profile/integration-profile.utils.ts +5 -5
- package/src/integration-profile/testers/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
- package/src/integration-profile/testers/shipping.testers.ts +94 -0
- package/src/mail/dto/send.dto.ts +6 -1
- package/src/mail/mail-template.spec.ts +58 -1
- package/src/mail/mail.service.spec.ts +112 -0
- package/src/mail/mail.service.ts +42 -4
- package/src/mail-sent/mail-sent.service.ts +3 -0
- package/src/mail-sent/mail-sent.sort.ts +19 -0
- package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
- package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
- package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
- package/src/mcp/guards/mcp-auth.guard.ts +24 -1
- package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
- package/src/mcp/guards/mcp-permission.guard.ts +76 -51
- package/src/mcp/mcp-audit.service.spec.ts +107 -0
- package/src/mcp/mcp-audit.service.ts +37 -1
- package/src/mcp/mcp-permission.service.spec.ts +197 -0
- package/src/mcp/mcp-permission.service.ts +184 -0
- package/src/mcp/mcp-server.service.spec.ts +84 -2
- package/src/mcp/mcp-server.service.ts +111 -87
- package/src/mcp/mcp.controller.ts +8 -1
- package/src/mcp/mcp.module.ts +5 -1
- package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
- package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
- package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
- package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
- package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/types/mcp-context.type.ts +15 -6
- package/src/mcp-chat/mcp-chat.service.ts +8 -0
- package/src/meeting/meeting-provider.registry.ts +121 -0
- package/src/meeting/meeting.constants.ts +74 -0
- package/src/menu/menu.service.spec.ts +89 -0
- package/src/menu/menu.service.ts +29 -11
- package/src/message-template/dto/update-message-template.dto.ts +22 -0
- package/src/message-template/message-template-admin.service.spec.ts +163 -0
- package/src/message-template/message-template-admin.service.ts +239 -0
- package/src/message-template/message-template.controller.ts +52 -0
- package/src/message-template/message-template.module.ts +21 -0
- package/src/message-template/message-template.registry.spec.ts +62 -0
- package/src/message-template/message-template.registry.ts +125 -0
- package/src/message-template/message-template.service.spec.ts +149 -0
- package/src/message-template/message-template.service.ts +149 -0
- package/src/notification/notification.constants.ts +10 -0
- package/src/notification/notification.module.ts +3 -0
- package/src/notification/notification.service.spec.ts +75 -1
- package/src/notification/notification.service.ts +39 -1
- package/src/oauth/oauth.controller.ts +0 -1
- package/src/oauth/oauth.errors.ts +7 -0
- package/src/oauth/oauth.module.ts +6 -1
- package/src/oauth/oauth.service.spec.ts +58 -7
- package/src/oauth/oauth.service.ts +71 -32
- package/src/oauth/providers/abstract.provider.spec.ts +192 -0
- package/src/oauth/providers/abstract.provider.ts +46 -14
- package/src/oauth/providers/github.provider.ts +57 -34
- package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- package/src/profile/dto/change-password.dto.ts +25 -7
- package/src/profile/profile.service.spec.ts +97 -0
- package/src/profile/profile.service.ts +9 -3
- package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
- package/src/realtime/realtime-tick.coalescer.ts +60 -0
- package/src/realtime/realtime.service.spec.ts +33 -0
- package/src/realtime/realtime.service.ts +28 -2
- package/src/redis/redis-kv.service.ts +261 -0
- package/src/redis/redis-master.spec.ts +111 -0
- package/src/redis/redis-master.ts +86 -0
- package/src/redis/redis-pubsub.ts +27 -3
- package/src/redis/redis.module.ts +17 -0
- package/src/session/session.service.spec.ts +121 -42
- package/src/session/session.service.ts +279 -82
- package/src/setting/setting.service.ts +44 -3
- package/src/task/task.service.spec.ts +41 -0
- package/src/task/task.service.ts +53 -13
- package/src/token/token.service.spec.ts +90 -0
- package/src/token/token.service.ts +48 -2
- package/src/user/user-credential.util.ts +14 -5
- package/src/user/user.service.ts +2 -12
- package/src/user/user.sort.ts +25 -0
- package/src/utils/abbreviate-name.spec.ts +50 -0
- package/src/utils/abbreviate-name.ts +44 -0
- package/src/utils/date-range-query.dto.ts +56 -0
- package/src/utils/date-range.spec.ts +175 -0
- package/src/utils/date-range.ts +246 -0
- package/src/webhook-integration/webhook-utils.spec.ts +67 -0
- package/src/webhook-integration/webhook-utils.ts +26 -0
- package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
- package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
|
@@ -32,7 +32,7 @@ export class CoreRolesMcpTools {
|
|
|
32
32
|
page: args.page ?? 1,
|
|
33
33
|
pageSize: args.pageSize ?? 20,
|
|
34
34
|
search: args.search ?? '',
|
|
35
|
-
sortField: args.sortField
|
|
35
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
36
36
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
37
37
|
fields: '',
|
|
38
38
|
},
|
|
@@ -130,7 +130,6 @@ export class CoreRolesMcpTools {
|
|
|
130
130
|
page: args.page ?? 1,
|
|
131
131
|
pageSize: args.pageSize ?? 20,
|
|
132
132
|
search: '',
|
|
133
|
-
sortField: 'id',
|
|
134
133
|
sortOrder: PageOrderDirection.Asc,
|
|
135
134
|
fields: '',
|
|
136
135
|
});
|
|
@@ -171,7 +170,6 @@ export class CoreRolesMcpTools {
|
|
|
171
170
|
page: args.page ?? 1,
|
|
172
171
|
pageSize: args.pageSize ?? 20,
|
|
173
172
|
search: '',
|
|
174
|
-
sortField: 'id',
|
|
175
173
|
sortOrder: PageOrderDirection.Asc,
|
|
176
174
|
fields: '',
|
|
177
175
|
});
|
|
@@ -219,7 +217,6 @@ export class CoreRolesMcpTools {
|
|
|
219
217
|
page: args.page ?? 1,
|
|
220
218
|
pageSize: args.pageSize ?? 20,
|
|
221
219
|
search: '',
|
|
222
|
-
sortField: 'id',
|
|
223
220
|
sortOrder: PageOrderDirection.Asc,
|
|
224
221
|
fields: '',
|
|
225
222
|
},
|
|
@@ -264,7 +261,6 @@ export class CoreRolesMcpTools {
|
|
|
264
261
|
page: args.page ?? 1,
|
|
265
262
|
pageSize: args.pageSize ?? 20,
|
|
266
263
|
search: '',
|
|
267
|
-
sortField: 'id',
|
|
268
264
|
sortOrder: PageOrderDirection.Asc,
|
|
269
265
|
fields: '',
|
|
270
266
|
});
|
|
@@ -31,7 +31,7 @@ export class CoreRoutesMcpTools {
|
|
|
31
31
|
page: args.page ?? 1,
|
|
32
32
|
pageSize: args.pageSize ?? 20,
|
|
33
33
|
search: args.search ?? '',
|
|
34
|
-
sortField: args.sortField
|
|
34
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
35
35
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
36
36
|
fields: '',
|
|
37
37
|
});
|
|
@@ -131,7 +131,6 @@ export class CoreRoutesMcpTools {
|
|
|
131
131
|
page: args.page ?? 1,
|
|
132
132
|
pageSize: args.pageSize ?? 20,
|
|
133
133
|
search: '',
|
|
134
|
-
sortField: 'id',
|
|
135
134
|
sortOrder: PageOrderDirection.Asc,
|
|
136
135
|
fields: '',
|
|
137
136
|
});
|
|
@@ -172,7 +171,6 @@ export class CoreRoutesMcpTools {
|
|
|
172
171
|
page: args.page ?? 1,
|
|
173
172
|
pageSize: args.pageSize ?? 20,
|
|
174
173
|
search: '',
|
|
175
|
-
sortField: 'id',
|
|
176
174
|
sortOrder: PageOrderDirection.Asc,
|
|
177
175
|
fields: '',
|
|
178
176
|
});
|
|
@@ -31,7 +31,7 @@ export class CoreScreensMcpTools {
|
|
|
31
31
|
page: args.page ?? 1,
|
|
32
32
|
pageSize: args.pageSize ?? 20,
|
|
33
33
|
search: args.search ?? '',
|
|
34
|
-
sortField: args.sortField
|
|
34
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
35
35
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
36
36
|
fields: '',
|
|
37
37
|
});
|
|
@@ -121,7 +121,6 @@ export class CoreScreensMcpTools {
|
|
|
121
121
|
page: args.page ?? 1,
|
|
122
122
|
pageSize: args.pageSize ?? 20,
|
|
123
123
|
search: '',
|
|
124
|
-
sortField: 'id',
|
|
125
124
|
sortOrder: PageOrderDirection.Asc,
|
|
126
125
|
fields: '',
|
|
127
126
|
});
|
|
@@ -162,7 +161,6 @@ export class CoreScreensMcpTools {
|
|
|
162
161
|
page: args.page ?? 1,
|
|
163
162
|
pageSize: args.pageSize ?? 20,
|
|
164
163
|
search: '',
|
|
165
|
-
sortField: 'id',
|
|
166
164
|
sortOrder: PageOrderDirection.Asc,
|
|
167
165
|
fields: '',
|
|
168
166
|
});
|
|
@@ -26,7 +26,6 @@ export class CoreSessionsMcpTools {
|
|
|
26
26
|
page: args.page ?? 1,
|
|
27
27
|
pageSize: args.pageSize ?? 20,
|
|
28
28
|
search: '',
|
|
29
|
-
sortField: 'id',
|
|
30
29
|
sortOrder: PageOrderDirection.Asc,
|
|
31
30
|
fields: '',
|
|
32
31
|
},
|
|
@@ -53,7 +52,6 @@ export class CoreSessionsMcpTools {
|
|
|
53
52
|
page: args.page ?? 1,
|
|
54
53
|
pageSize: args.pageSize ?? 20,
|
|
55
54
|
search: '',
|
|
56
|
-
sortField: 'id',
|
|
57
55
|
sortOrder: PageOrderDirection.Asc,
|
|
58
56
|
fields: '',
|
|
59
57
|
},
|
|
@@ -74,7 +74,7 @@ export class CoreSettingsMcpTools {
|
|
|
74
74
|
page: args.page ?? 1,
|
|
75
75
|
pageSize: args.pageSize ?? 20,
|
|
76
76
|
search: args.search ?? '',
|
|
77
|
-
sortField: args.sortField
|
|
77
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
78
78
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
79
79
|
fields: '',
|
|
80
80
|
});
|
|
@@ -117,7 +117,6 @@ export class CoreSettingsMcpTools {
|
|
|
117
117
|
page: args.page ?? 1,
|
|
118
118
|
pageSize: args.pageSize ?? 20,
|
|
119
119
|
search: args.search ?? '',
|
|
120
|
-
sortField: 'id',
|
|
121
120
|
sortOrder: 'asc' as any,
|
|
122
121
|
fields: '',
|
|
123
122
|
});
|
|
@@ -46,7 +46,7 @@ export class CoreUsersMcpTools {
|
|
|
46
46
|
page: args.page ?? 1,
|
|
47
47
|
pageSize: args.pageSize ?? 20,
|
|
48
48
|
search: args.search ?? '',
|
|
49
|
-
sortField: args.sortField
|
|
49
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
50
50
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
51
51
|
fields: '',
|
|
52
52
|
});
|
|
@@ -30,7 +30,7 @@ export class CoreWebhooksMcpTools {
|
|
|
30
30
|
page: args.page ?? 1,
|
|
31
31
|
pageSize: args.pageSize ?? 20,
|
|
32
32
|
search: args.search ?? '',
|
|
33
|
-
sortField: args.sortField
|
|
33
|
+
...(args.sortField ? { sortField: args.sortField } : {}),
|
|
34
34
|
sortOrder: (args.sortOrder as any) ?? 'asc',
|
|
35
35
|
fields: '',
|
|
36
36
|
});
|
|
@@ -191,7 +191,6 @@ export class CoreWebhooksMcpTools {
|
|
|
191
191
|
page: args.page ?? 1,
|
|
192
192
|
pageSize: args.pageSize ?? 20,
|
|
193
193
|
search: '',
|
|
194
|
-
sortField: 'id',
|
|
195
194
|
sortOrder: 'desc' as any,
|
|
196
195
|
fields: '',
|
|
197
196
|
});
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
export type McpContext = {
|
|
2
|
-
userId: number;
|
|
3
|
-
sessionId: string;
|
|
4
|
-
locale: string;
|
|
5
|
-
toolName: string;
|
|
6
|
-
|
|
1
|
+
export type McpContext = {
|
|
2
|
+
userId: number;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
locale: string;
|
|
5
|
+
toolName: string;
|
|
6
|
+
/**
|
|
7
|
+
* Client OAuth externo que originou a chamada (hoje `claude-connector`), ou
|
|
8
|
+
* null para o caminho interno — chave `hedhog_mcp_`, JWT de login, mcp-chat.
|
|
9
|
+
*
|
|
10
|
+
* Vale por dois motivos: a auditoria precisa distinguir uma acao feita pelo
|
|
11
|
+
* Claude Desktop de uma feita pelo Claude Code, e o teto de permissao so se
|
|
12
|
+
* aplica a cliente externo.
|
|
13
|
+
*/
|
|
14
|
+
clientId: string | null;
|
|
15
|
+
};
|
|
@@ -562,6 +562,10 @@ export class McpChatService {
|
|
|
562
562
|
sessionId: '',
|
|
563
563
|
locale,
|
|
564
564
|
toolName: originalName,
|
|
565
|
+
// O chat do admin e caminho interno: quem chama e o proprio
|
|
566
|
+
// operador, com a tela na frente. Nao ha client OAuth externo, e
|
|
567
|
+
// por isso o teto do conector nao se aplica aqui.
|
|
568
|
+
clientId: null,
|
|
565
569
|
};
|
|
566
570
|
try {
|
|
567
571
|
const result = await entry.handler(args, context);
|
|
@@ -746,6 +750,10 @@ export class McpChatService {
|
|
|
746
750
|
sessionId: '',
|
|
747
751
|
locale,
|
|
748
752
|
toolName: originalName,
|
|
753
|
+
// O chat do admin e caminho interno: quem chama e o proprio
|
|
754
|
+
// operador, com a tela na frente. Nao ha client OAuth externo, e
|
|
755
|
+
// por isso o teto do conector nao se aplica aqui.
|
|
756
|
+
clientId: null,
|
|
749
757
|
};
|
|
750
758
|
try {
|
|
751
759
|
const result = await entry.handler(args ?? {}, context);
|
|
@@ -25,6 +25,12 @@ export interface CreateMeetingInput {
|
|
|
25
25
|
* participante comum.
|
|
26
26
|
*/
|
|
27
27
|
coOrganizerUserIds?: number[];
|
|
28
|
+
/**
|
|
29
|
+
* E-mails/UPNs adicionais do Entra ID a coorganizar, além dos resolvidos por
|
|
30
|
+
* {@link coOrganizerUserIds}. Resolvidos pelo provedor — quem não existir no
|
|
31
|
+
* diretório é apenas ignorado, nunca falha a criação da reunião.
|
|
32
|
+
*/
|
|
33
|
+
coOrganizerEmails?: string[];
|
|
28
34
|
/** Convidados do evento de calendário. */
|
|
29
35
|
attendeeEmails?: string[];
|
|
30
36
|
/** Local do evento (aula presencial/híbrida com reunião gerenciada). */
|
|
@@ -77,6 +83,40 @@ export interface UpdateMeetingDetailsInput {
|
|
|
77
83
|
description?: string | null;
|
|
78
84
|
}
|
|
79
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Pedido de troca dos coorganizadores extras de uma reunião já existente.
|
|
88
|
+
*
|
|
89
|
+
* Separado de `createMeeting` pelo mesmo motivo de `updateAttendees`: corrigir
|
|
90
|
+
* a reunião de uma aula que já foi criada não pode gerar link novo. Só cobre
|
|
91
|
+
* os coorganizadores extras (por e-mail) — o coorganizador derivado do
|
|
92
|
+
* instrutor não é tocado por este caminho.
|
|
93
|
+
*/
|
|
94
|
+
export interface UpdateMeetingCoOrganizersInput {
|
|
95
|
+
sourceModule: string;
|
|
96
|
+
sourceEntity: string;
|
|
97
|
+
sourceEntityId: string;
|
|
98
|
+
coOrganizerEmails: string[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Estado da tarefa que traz a gravação do provedor para o storage local.
|
|
103
|
+
*
|
|
104
|
+
* Descrito em termos genéricos de propósito: a origem precisa saber se a
|
|
105
|
+
* importação está andando, travou ou vai retentar, mas não pode depender de
|
|
106
|
+
* como o provedor a executa. Hoje é um job da fila do módulo Microsoft; num
|
|
107
|
+
* provedor com webhook não haveria job nenhum, e o contrato continua valendo.
|
|
108
|
+
*/
|
|
109
|
+
export interface MeetingRecordingImport {
|
|
110
|
+
status: 'pending' | 'running' | 'done' | 'failed';
|
|
111
|
+
attempts: number;
|
|
112
|
+
maxAttempts: number;
|
|
113
|
+
lastError: string | null;
|
|
114
|
+
startedAt: Date | null;
|
|
115
|
+
finishedAt: Date | null;
|
|
116
|
+
/** Quando a próxima tentativa acontece, se houver uma agendada. */
|
|
117
|
+
nextRetryAt: Date | null;
|
|
118
|
+
}
|
|
119
|
+
|
|
80
120
|
/**
|
|
81
121
|
* Estado de uma reunião, na forma em que o módulo de origem precisa ver.
|
|
82
122
|
*
|
|
@@ -107,6 +147,12 @@ export interface MeetingSummary {
|
|
|
107
147
|
* acompanha a turma.
|
|
108
148
|
*/
|
|
109
149
|
attendeeEmails: string[];
|
|
150
|
+
/**
|
|
151
|
+
* Coorganizadores extras (por e-mail) atualmente aplicados na reunião, para
|
|
152
|
+
* o módulo de origem comparar antes de mandar atualizar — mesmo motivo de
|
|
153
|
+
* `attendeeEmails`. Não inclui o coorganizador derivado do instrutor.
|
|
154
|
+
*/
|
|
155
|
+
coOrganizerEmails: string[];
|
|
110
156
|
/** Estado da importação da gravação, quando `autoRecord` está ligado. */
|
|
111
157
|
recordingStatus:
|
|
112
158
|
| 'not_requested'
|
|
@@ -116,6 +162,60 @@ export interface MeetingSummary {
|
|
|
116
162
|
| 'failed';
|
|
117
163
|
recordingFileId: number | null;
|
|
118
164
|
lastError: string | null;
|
|
165
|
+
/**
|
|
166
|
+
* Quando o provedor procurou a gravação pela última vez, e quantas vezes já
|
|
167
|
+
* procurou.
|
|
168
|
+
*
|
|
169
|
+
* Existe para a origem distinguir "ainda não deu tempo" de "está procurando e
|
|
170
|
+
* não acha": os dois são `recordingStatus: 'pending'`, e sem isto a tela do
|
|
171
|
+
* módulo de origem só pode dizer "aguardando", que é a mesma frase por horas.
|
|
172
|
+
*/
|
|
173
|
+
recordingCheckedAt: Date | null;
|
|
174
|
+
recordingAttempts: number;
|
|
175
|
+
recordingImportedAt: Date | null;
|
|
176
|
+
/**
|
|
177
|
+
* Janela em que o provedor procura a gravação, já resolvida em instantes.
|
|
178
|
+
*
|
|
179
|
+
* Derivada aqui, e não na origem, porque a carência antes da primeira busca e
|
|
180
|
+
* a largura da janela são conhecimento do provedor — o LMS não deve saber que
|
|
181
|
+
* o Teams leva 15 minutos para publicar nem que a busca desiste em 48 h.
|
|
182
|
+
* `null` quando não há gravação pedida ou o provedor não expõe a janela.
|
|
183
|
+
*/
|
|
184
|
+
recordingSearchStartsAt: Date | null;
|
|
185
|
+
recordingSearchExpiresAt: Date | null;
|
|
186
|
+
/**
|
|
187
|
+
* Andamento do download da gravação, quando o provedor já o iniciou.
|
|
188
|
+
*
|
|
189
|
+
* Vem do provedor e não da origem porque só ele sabe como importa — a
|
|
190
|
+
* alternativa seria o módulo de origem vasculhar a fila de outro módulo por
|
|
191
|
+
* `source_entity`, que é exatamente o acoplamento que este contrato evita.
|
|
192
|
+
*/
|
|
193
|
+
recordingImport: MeetingRecordingImport | null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Pedido do conteúdo de um anexo do chat de uma reunião.
|
|
198
|
+
*
|
|
199
|
+
* A origem repassa os identificadores que recebeu no evento do chat; traduzi-los
|
|
200
|
+
* em chamadas ao provedor é problema de quem implementa.
|
|
201
|
+
*/
|
|
202
|
+
export interface FetchMeetingChatAttachmentInput {
|
|
203
|
+
sourceModule: string;
|
|
204
|
+
sourceEntity: string;
|
|
205
|
+
sourceEntityId: string;
|
|
206
|
+
providerMessageId: string;
|
|
207
|
+
providerAttachmentId: string;
|
|
208
|
+
/** O que veio no evento; alguns provedores só sabem baixar por ele. */
|
|
209
|
+
contentUrl?: string | null;
|
|
210
|
+
/** Acima disso o provedor desiste antes de transferir. */
|
|
211
|
+
maxBytes?: number;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export interface MeetingChatAttachmentContent {
|
|
215
|
+
buffer: Buffer;
|
|
216
|
+
filename: string;
|
|
217
|
+
mimetype: string;
|
|
218
|
+
size: number;
|
|
119
219
|
}
|
|
120
220
|
|
|
121
221
|
/**
|
|
@@ -146,8 +246,29 @@ export interface IMeetingProvider {
|
|
|
146
246
|
* link novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
|
|
147
247
|
*/
|
|
148
248
|
updateDetails(input: UpdateMeetingDetailsInput): Promise<void>;
|
|
249
|
+
/**
|
|
250
|
+
* Troca os coorganizadores extras de uma reunião já criada, sem gerar link
|
|
251
|
+
* novo. Tolerante a reunião inexistente (mesmo padrão de updateAttendees).
|
|
252
|
+
*/
|
|
253
|
+
updateCoOrganizers(input: UpdateMeetingCoOrganizersInput): Promise<void>;
|
|
149
254
|
/** Estado das reuniões das origens informadas, para a UI do módulo de origem. */
|
|
150
255
|
findBySource(ref: MeetingSourceRef): Promise<MeetingSummary[]>;
|
|
256
|
+
/**
|
|
257
|
+
* Baixa o conteúdo de um anexo do chat da reunião.
|
|
258
|
+
*
|
|
259
|
+
* Opcional de propósito: o chat é o terceiro artefato pós-reunião e nem todo
|
|
260
|
+
* provedor o expõe. Quem chama testa a existência do método antes — assim um
|
|
261
|
+
* provedor mais antigo continua válido sem alteração.
|
|
262
|
+
*
|
|
263
|
+
* Devolve `null` quando o anexo não pôde ser lido (permissão do arquivo,
|
|
264
|
+
* item removido, tamanho acima do teto). Não é erro: o arquivo do anexo mora
|
|
265
|
+
* no drive de quem o enviou, não na caixa que organizou a reunião, então
|
|
266
|
+
* negativa é desfecho esperado e a origem precisa de um plano B em vez de uma
|
|
267
|
+
* exceção.
|
|
268
|
+
*/
|
|
269
|
+
fetchChatAttachment?(
|
|
270
|
+
input: FetchMeetingChatAttachmentInput,
|
|
271
|
+
): Promise<MeetingChatAttachmentContent | null>;
|
|
151
272
|
}
|
|
152
273
|
|
|
153
274
|
/**
|
|
@@ -51,3 +51,77 @@ export interface MeetingAttendanceAvailablePayload {
|
|
|
51
51
|
providerMeetingId?: string | null;
|
|
52
52
|
records: MeetingAttendanceRecord[];
|
|
53
53
|
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Evento publicado quando o chat de uma reunião foi capturado.
|
|
57
|
+
*
|
|
58
|
+
* Terceiro do mesmo desenho, depois de gravação e presença, e pela mesma razão:
|
|
59
|
+
* o provedor sabe o que foi escrito no chat, mas não sabe o que é uma aula; o
|
|
60
|
+
* módulo de origem sabe quem é o instrutor, mas não conhece o Graph.
|
|
61
|
+
*/
|
|
62
|
+
export const MEETING_CHAT_AVAILABLE_EVENT = 'microsoft.meeting.chat.available';
|
|
63
|
+
|
|
64
|
+
/** Arquivo ou imagem que acompanha uma mensagem do chat. */
|
|
65
|
+
export interface MeetingChatAttachment {
|
|
66
|
+
providerAttachmentId: string;
|
|
67
|
+
/**
|
|
68
|
+
* `attachment` é arquivo compartilhado na conversa; `hosted_content` é imagem
|
|
69
|
+
* colada no corpo da mensagem. A origem costuma querer só o primeiro — print
|
|
70
|
+
* de tela raramente é material de aula.
|
|
71
|
+
*/
|
|
72
|
+
kind: 'attachment' | 'hosted_content';
|
|
73
|
+
name: string | null;
|
|
74
|
+
contentType: string | null;
|
|
75
|
+
/**
|
|
76
|
+
* Endereço do arquivo no provedor. Não é baixável sem token: serve de rastro
|
|
77
|
+
* e é o que a origem devolve ao provedor para pedir o conteúdo.
|
|
78
|
+
*/
|
|
79
|
+
contentUrl: string | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Uma mensagem do chat, na forma em que a origem precisa ver. */
|
|
83
|
+
export interface MeetingChatMessage {
|
|
84
|
+
providerMessageId: string;
|
|
85
|
+
/** Mensagem à qual esta responde, quando houver. */
|
|
86
|
+
replyToId: string | null;
|
|
87
|
+
/**
|
|
88
|
+
* Nulo quando o provedor não identificou quem escreveu (convidado anônimo,
|
|
89
|
+
* aplicativo, ou evento de sistema). A origem decide o que fazer — e quando a
|
|
90
|
+
* decisão publica conteúdo para terceiros, o certo é descartar: casar por
|
|
91
|
+
* nome confundiria homônimos.
|
|
92
|
+
*/
|
|
93
|
+
senderEmail: string | null;
|
|
94
|
+
senderDisplayName: string;
|
|
95
|
+
/** ISO-8601. */
|
|
96
|
+
sentAt: string;
|
|
97
|
+
/** `message`, `systemEventMessage`, … — como o provedor classificou. */
|
|
98
|
+
messageType: string;
|
|
99
|
+
/**
|
|
100
|
+
* Texto puro, nunca HTML.
|
|
101
|
+
*
|
|
102
|
+
* O payload é persistido como jsonb no outbox, e o HTML do Teams é gordo o
|
|
103
|
+
* bastante para que uma aula inteira não caiba. Quem precisar do original lê
|
|
104
|
+
* a tabela do provedor.
|
|
105
|
+
*/
|
|
106
|
+
text: string;
|
|
107
|
+
attachments: MeetingChatAttachment[];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface MeetingChatAvailablePayload {
|
|
111
|
+
sourceModule: string;
|
|
112
|
+
sourceEntity: string;
|
|
113
|
+
sourceEntityId: string;
|
|
114
|
+
providerMeetingId?: string | null;
|
|
115
|
+
providerChatId?: string | null;
|
|
116
|
+
/** Quantas mensagens o chat tem de verdade, mesmo se `messages` foi cortado. */
|
|
117
|
+
messageCount: number;
|
|
118
|
+
firstMessageAt: string | null;
|
|
119
|
+
lastMessageAt: string | null;
|
|
120
|
+
/** Mensagens em ordem cronológica, limitadas ao teto do evento. */
|
|
121
|
+
messages: MeetingChatMessage[];
|
|
122
|
+
/**
|
|
123
|
+
* `messages` não traz tudo: o chat passou do teto do evento ou da paginação
|
|
124
|
+
* do provedor. `messageCount` continua sendo o número real.
|
|
125
|
+
*/
|
|
126
|
+
truncated: boolean;
|
|
127
|
+
}
|
|
@@ -74,3 +74,92 @@ describe('MenuService.ensureValidParent', () => {
|
|
|
74
74
|
await expect(call('en', 5, 10)).rejects.toThrow(BadRequestException);
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
|
+
|
|
78
|
+
describe('MenuService.getMenus', () => {
|
|
79
|
+
let prisma: any;
|
|
80
|
+
let service: MenuService;
|
|
81
|
+
|
|
82
|
+
const row = (id: number, menuId: number | null, name: string) => ({
|
|
83
|
+
id,
|
|
84
|
+
menu_id: menuId,
|
|
85
|
+
order: id,
|
|
86
|
+
menu_locale: [{ name }],
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
beforeEach(() => {
|
|
90
|
+
prisma = {
|
|
91
|
+
user: { count: jest.fn<any>().mockResolvedValue(1) },
|
|
92
|
+
menu: { findMany: jest.fn<any>().mockResolvedValue([]) },
|
|
93
|
+
};
|
|
94
|
+
service = makeService(prisma);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
afterEach(() => {
|
|
98
|
+
jest.clearAllMocks();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('lança BadRequestException quando o usuário não existe', async () => {
|
|
102
|
+
prisma.user.count.mockResolvedValue(0);
|
|
103
|
+
await expect(service.getMenus('en', 42)).rejects.toThrow(BadRequestException);
|
|
104
|
+
expect(prisma.menu.findMany).not.toHaveBeenCalled();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('monta a árvore inteira com uma única consulta', async () => {
|
|
108
|
+
prisma.menu.findMany.mockResolvedValue([
|
|
109
|
+
row(1, null, 'LMS'),
|
|
110
|
+
row(2, 1, 'Cursos'),
|
|
111
|
+
row(3, 2, 'Estrutura'),
|
|
112
|
+
row(4, null, 'CRM'),
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
const tree = await service.getMenus('en', 42);
|
|
116
|
+
|
|
117
|
+
// O ponto da correção: uma query para tudo, não uma por nó.
|
|
118
|
+
expect(prisma.menu.findMany).toHaveBeenCalledTimes(1);
|
|
119
|
+
expect(prisma.user.count).toHaveBeenCalledTimes(1);
|
|
120
|
+
|
|
121
|
+
expect(tree.map((m: any) => m.id)).toEqual([1, 4]);
|
|
122
|
+
expect(tree[0].name).toBe('LMS');
|
|
123
|
+
expect(tree[0].menu.map((m: any) => m.id)).toEqual([2]);
|
|
124
|
+
expect(tree[0].menu[0].menu.map((m: any) => m.id)).toEqual([3]);
|
|
125
|
+
expect(tree[1].menu).toEqual([]);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('não promove a raiz um menu cujo pai o usuário não acessa', async () => {
|
|
129
|
+
// O pai (10) não veio do banco porque o usuário não tem o papel dele; o
|
|
130
|
+
// filho não pode aparecer solto na raiz por causa disso.
|
|
131
|
+
prisma.menu.findMany.mockResolvedValue([
|
|
132
|
+
row(1, null, 'LMS'),
|
|
133
|
+
row(11, 10, 'Filho de menu inacessível'),
|
|
134
|
+
]);
|
|
135
|
+
|
|
136
|
+
const tree = await service.getMenus('en', 42);
|
|
137
|
+
|
|
138
|
+
expect(tree.map((m: any) => m.id)).toEqual([1]);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('respeita a ordem dos irmãos vinda da consulta', async () => {
|
|
142
|
+
prisma.menu.findMany.mockResolvedValue([
|
|
143
|
+
row(7, 1, 'Segundo'),
|
|
144
|
+
row(1, null, 'Raiz'),
|
|
145
|
+
row(5, 1, 'Primeiro'),
|
|
146
|
+
]);
|
|
147
|
+
|
|
148
|
+
const tree = await service.getMenus('en', 42);
|
|
149
|
+
|
|
150
|
+
expect(tree[0].menu.map((m: any) => m.id)).toEqual([7, 5]);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('retorna apenas a subárvore quando um menuId é informado', async () => {
|
|
154
|
+
prisma.menu.findMany.mockResolvedValue([
|
|
155
|
+
row(1, null, 'LMS'),
|
|
156
|
+
row(2, 1, 'Cursos'),
|
|
157
|
+
row(3, 2, 'Estrutura'),
|
|
158
|
+
]);
|
|
159
|
+
|
|
160
|
+
const tree = await service.getMenus('en', 42, 1);
|
|
161
|
+
|
|
162
|
+
expect(tree.map((m: any) => m.id)).toEqual([2]);
|
|
163
|
+
expect(tree[0].menu.map((m: any) => m.id)).toEqual([3]);
|
|
164
|
+
});
|
|
165
|
+
});
|
package/src/menu/menu.service.ts
CHANGED
|
@@ -258,7 +258,6 @@ export class MenuService {
|
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
async getMenus(locale: string, userId: number, menuId = 0) {
|
|
261
|
-
|
|
262
261
|
const userExists = await this.prismaService.user.count({
|
|
263
262
|
where: {
|
|
264
263
|
id: userId,
|
|
@@ -271,13 +270,13 @@ export class MenuService {
|
|
|
271
270
|
);
|
|
272
271
|
}
|
|
273
272
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
273
|
+
// Uma consulta para a árvore inteira, em vez de uma por nó. A versão
|
|
274
|
+
// recursiva anterior repetia esta busca — e o `user.count` acima — a cada
|
|
275
|
+
// nível: com os ~260 itens de menu que as libraries registram, eram
|
|
276
|
+
// centenas de idas ao banco em série e o `/menu/system` levava ~2s a cada
|
|
277
|
+
// navegação do admin, mesmo quando a resposta terminava em 304.
|
|
278
|
+
const rows = (await this.prismaService.menu.findMany({
|
|
279
279
|
where: {
|
|
280
|
-
menu_id: menuId,
|
|
281
280
|
role_menu: {
|
|
282
281
|
some: {
|
|
283
282
|
role: {
|
|
@@ -307,13 +306,32 @@ export class MenuService {
|
|
|
307
306
|
},
|
|
308
307
|
})) as unknown[] as any[];
|
|
309
308
|
|
|
310
|
-
|
|
309
|
+
const childrenByParent = new Map<number | null, any[]>();
|
|
310
|
+
|
|
311
|
+
for (const row of rows) {
|
|
312
|
+
const item = itemTranslations('menu_locale', row) as any;
|
|
313
|
+
const parentId = item.menu_id ?? null;
|
|
314
|
+
const siblings = childrenByParent.get(parentId);
|
|
311
315
|
|
|
312
|
-
|
|
313
|
-
|
|
316
|
+
if (siblings) siblings.push(item);
|
|
317
|
+
else childrenByParent.set(parentId, [item]);
|
|
314
318
|
}
|
|
315
319
|
|
|
316
|
-
|
|
320
|
+
// Descer apenas pelos filhos presentes no resultado preserva a regra
|
|
321
|
+
// anterior: um menu cujo pai o usuário não acessa continua invisível, em
|
|
322
|
+
// vez de subir para a raiz. Os irmãos já vêm ordenados por `order` da
|
|
323
|
+
// consulta, e o agrupamento acima mantém essa ordem.
|
|
324
|
+
const buildTree = (parentId: number | null): any[] => {
|
|
325
|
+
const children = childrenByParent.get(parentId) ?? [];
|
|
326
|
+
|
|
327
|
+
for (const child of children) {
|
|
328
|
+
child.menu = buildTree(child.id);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return children;
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
return buildTree(menuId === 0 ? null : menuId);
|
|
317
335
|
}
|
|
318
336
|
|
|
319
337
|
async getSystemMenu(locale: string, userId: number) {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IsBoolean, IsObject, IsOptional } from 'class-validator';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Corpo aceito pela edição de um modelo de mensagem.
|
|
5
|
+
*
|
|
6
|
+
* `slug` fica de fora de propósito: quem procura o modelo é o código, e
|
|
7
|
+
* renomeá-lo pelo painel desligaria o aviso em silêncio. O que se edita aqui é o
|
|
8
|
+
* texto.
|
|
9
|
+
*
|
|
10
|
+
* `name` e `description` também não entram: eles moram no registry, declarados
|
|
11
|
+
* pela library dona do modelo. Deixar editá-los aqui criaria um rótulo que
|
|
12
|
+
* diverge do que o código diz — e a tela não teria como saber qual vale.
|
|
13
|
+
*/
|
|
14
|
+
export class UpdateMessageTemplateDTO {
|
|
15
|
+
@IsOptional()
|
|
16
|
+
@IsBoolean()
|
|
17
|
+
is_active?: boolean;
|
|
18
|
+
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@IsObject()
|
|
21
|
+
locale?: Record<string, { body?: string }>;
|
|
22
|
+
}
|