@hed-hog/core 0.0.390 → 0.0.393
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/README.md +39 -0
- package/dist/access-log/access-log.controller.d.ts.map +1 -1
- package/dist/access-log/access-log.controller.js +1 -1
- package/dist/access-log/access-log.controller.js.map +1 -1
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +8 -5
- package/dist/access-log/access-log.interceptor.js.map +1 -1
- package/dist/access-log/access-log.service.d.ts +4 -0
- package/dist/access-log/access-log.service.d.ts.map +1 -1
- package/dist/access-log/access-log.service.js +31 -4
- package/dist/access-log/access-log.service.js.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
- package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
- package/dist/access-log/dto/query-access-log.dto.js +5 -0
- package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
- package/dist/ai/ai.controller.d.ts +12 -8
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.controller.js +17 -2
- package/dist/ai/ai.controller.js.map +1 -1
- package/dist/ai/ai.module.d.ts.map +1 -1
- package/dist/ai/ai.module.js +3 -2
- package/dist/ai/ai.module.js.map +1 -1
- package/dist/ai/ai.service.d.ts +30 -1
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +97 -3
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
- package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
- package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
- package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
- package/dist/ai/richtext-ai.prompts.d.ts +5 -0
- package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
- package/dist/ai/richtext-ai.prompts.js +57 -0
- package/dist/ai/richtext-ai.prompts.js.map +1 -0
- package/dist/ai/richtext-ai.service.d.ts +34 -0
- package/dist/ai/richtext-ai.service.d.ts.map +1 -0
- package/dist/ai/richtext-ai.service.js +95 -0
- package/dist/ai/richtext-ai.service.js.map +1 -0
- package/dist/ai-instruction/ai-instruction.controller.d.ts +5 -5
- package/dist/auth/auth.controller.d.ts +66 -7
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.controller.js +67 -23
- package/dist/auth/auth.controller.js.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +2 -0
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +136 -4
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +246 -48
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
- package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
- package/dist/auth/dto/confirm-email.dto.js +22 -0
- package/dist/auth/dto/confirm-email.dto.js.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
- package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
- package/dist/auth/dto/resend-confirmation.dto.js +36 -0
- package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
- package/dist/authorize/authorize.controller.d.ts +1 -1
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +4 -2
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +7 -0
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +1 -1
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +18 -5
- package/dist/challenge/challenge.service.d.ts.map +1 -1
- package/dist/challenge/challenge.service.js +50 -3
- package/dist/challenge/challenge.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +17 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +6 -6
- package/dist/dashboard/dashboard/dashboard.service.d.ts +6 -6
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +4 -4
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +4 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +1 -1
- package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +2 -2
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +2 -2
- package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
- package/dist/file/file.controller.d.ts +8 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +45 -7
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.service.d.ts +128 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +319 -8
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/image-optimization.service.d.ts +43 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +154 -0
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/provider/abstract.provider.d.ts +16 -0
- package/dist/file/provider/abstract.provider.d.ts.map +1 -1
- package/dist/file/provider/abstract.provider.js +4 -0
- package/dist/file/provider/abstract.provider.js.map +1 -1
- package/dist/file/provider/gcs.provider.d.ts +2 -0
- package/dist/file/provider/gcs.provider.d.ts.map +1 -1
- package/dist/file/provider/gcs.provider.js +10 -0
- package/dist/file/provider/gcs.provider.js.map +1 -1
- package/dist/file/provider/local.provider.d.ts +1 -0
- package/dist/file/provider/local.provider.d.ts.map +1 -1
- package/dist/file/provider/local.provider.js +13 -0
- package/dist/file/provider/local.provider.js.map +1 -1
- package/dist/file/provider/s3.provider.d.ts +5 -0
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +15 -0
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +5 -0
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +16 -0
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
- package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
- package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
- package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
- package/dist/impersonation/impersonation-restrictions.js +76 -0
- package/dist/impersonation/impersonation-restrictions.js.map +1 -0
- package/dist/impersonation/impersonation.controller.d.ts +90 -0
- package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
- package/dist/impersonation/impersonation.controller.js +135 -0
- package/dist/impersonation/impersonation.controller.js.map +1 -0
- package/dist/impersonation/impersonation.module.d.ts +8 -0
- package/dist/impersonation/impersonation.module.d.ts.map +1 -0
- package/dist/impersonation/impersonation.module.js +44 -0
- package/dist/impersonation/impersonation.module.js.map +1 -0
- package/dist/impersonation/impersonation.service.d.ts +164 -0
- package/dist/impersonation/impersonation.service.d.ts.map +1 -0
- package/dist/impersonation/impersonation.service.js +408 -0
- package/dist/impersonation/impersonation.service.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
- package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
- package/dist/integration/services/outbox-polling.coordinator.js +50 -30
- package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
- package/dist/integration/services/outbox.service.d.ts.map +1 -1
- package/dist/integration/services/outbox.service.js +5 -1
- package/dist/integration/services/outbox.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +3 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.d.ts +14 -0
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +26 -0
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/email.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/email.testers.js +28 -0
- package/dist/integration-profile/testers/email.testers.js.map +1 -1
- package/dist/language/en.json +11 -0
- package/dist/language/pt.json +11 -0
- package/dist/mail/dto/send.dto.d.ts +38 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js +10 -0
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +1 -0
- package/dist/mail/mail.controller.d.ts.map +1 -1
- package/dist/mail/mail.module.d.ts.map +1 -1
- package/dist/mail/mail.module.js +2 -0
- package/dist/mail/mail.module.js.map +1 -1
- package/dist/mail/mail.service.d.ts +48 -4
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +187 -35
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
- package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
- package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
- package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.constants.js +31 -0
- package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
- package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.controller.js +53 -0
- package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
- package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.module.js +36 -0
- package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
- package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
- package/dist/mail-delivery/mail-delivery.service.js +140 -0
- package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
- package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
- package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
- package/dist/mail-delivery/ses-event.parser.js +131 -0
- package/dist/mail-delivery/ses-event.parser.js.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
- package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
- package/dist/mail-delivery/ses-webhook.service.js +214 -0
- package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
- package/dist/mail-delivery/sns-message.util.d.ts +38 -0
- package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
- package/dist/mail-delivery/sns-message.util.js +109 -0
- package/dist/mail-delivery/sns-message.util.js.map +1 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
- package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
- package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +39 -0
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +45 -4
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
- package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
- package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
- package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
- package/dist/mailbox/mailbox.module.d.ts +8 -0
- package/dist/mailbox/mailbox.module.d.ts.map +1 -0
- package/dist/mailbox/mailbox.module.js +27 -0
- package/dist/mailbox/mailbox.module.js.map +1 -0
- package/dist/meeting/meeting-provider.registry.d.ts +155 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
- package/dist/meeting/meeting-provider.registry.js +53 -0
- package/dist/meeting/meeting-provider.registry.js.map +1 -0
- package/dist/meeting/meeting.constants.d.ts +47 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -0
- package/dist/meeting/meeting.constants.js +21 -0
- package/dist/meeting/meeting.constants.js.map +1 -0
- package/dist/meeting/meeting.module.d.ts +7 -0
- package/dist/meeting/meeting.module.d.ts.map +1 -0
- package/dist/meeting/meeting.module.js +26 -0
- package/dist/meeting/meeting.module.js.map +1 -0
- package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
- package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
- package/dist/middlewares/locale-injection.middleware.js +20 -4
- package/dist/middlewares/locale-injection.middleware.js.map +1 -1
- package/dist/oauth/providers/google.provider.d.ts +7 -0
- package/dist/oauth/providers/google.provider.d.ts.map +1 -1
- package/dist/oauth/providers/google.provider.js +43 -13
- package/dist/oauth/providers/google.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +34 -0
- package/dist/observability/monitored-cron.d.ts.map +1 -0
- package/dist/observability/monitored-cron.js +118 -0
- package/dist/observability/monitored-cron.js.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
- package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/claim-pairing.dto.js +35 -0
- package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
- package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
- package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
- package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
- package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-pairing.dto.js +30 -0
- package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
- package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
- package/dist/pairing/pairing.controller.d.ts +118 -0
- package/dist/pairing/pairing.controller.d.ts.map +1 -0
- package/dist/pairing/pairing.controller.js +296 -0
- package/dist/pairing/pairing.controller.js.map +1 -0
- package/dist/pairing/pairing.module.d.ts +10 -0
- package/dist/pairing/pairing.module.d.ts.map +1 -0
- package/dist/pairing/pairing.module.js +40 -0
- package/dist/pairing/pairing.module.js.map +1 -0
- package/dist/pairing/pairing.service.d.ts +238 -0
- package/dist/pairing/pairing.service.d.ts.map +1 -0
- package/dist/pairing/pairing.service.js +495 -0
- package/dist/pairing/pairing.service.js.map +1 -0
- package/dist/pdf/pdf.service.d.ts +3 -6
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +8 -20
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +11 -0
- package/dist/profile/profile.controller.d.ts.map +1 -1
- package/dist/profile/profile.service.d.ts +11 -0
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +20 -11
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +44 -0
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/role/guards/role.guard.d.ts +5 -0
- package/dist/role/guards/role.guard.d.ts.map +1 -1
- package/dist/role/guards/role.guard.js +41 -39
- package/dist/role/guards/role.guard.js.map +1 -1
- package/dist/session/session.controller.d.ts +2 -0
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +39 -0
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +91 -8
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/brand-asset.service.d.ts +48 -0
- package/dist/setting/brand-asset.service.d.ts.map +1 -0
- package/dist/setting/brand-asset.service.js +130 -0
- package/dist/setting/brand-asset.service.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +3 -2
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts +33 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +88 -0
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/token/token.service.d.ts +23 -2
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -4
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user.controller.d.ts +8 -22
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.service.d.ts +44 -24
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +89 -6
- package/dist/user/user.service.js.map +1 -1
- package/dist/user-device/user-device.controller.d.ts +54 -0
- package/dist/user-device/user-device.controller.d.ts.map +1 -0
- package/dist/user-device/user-device.controller.js +103 -0
- package/dist/user-device/user-device.controller.js.map +1 -0
- package/dist/user-device/user-device.module.d.ts +3 -0
- package/dist/user-device/user-device.module.d.ts.map +1 -0
- package/dist/user-device/user-device.module.js +26 -0
- package/dist/user-device/user-device.module.js.map +1 -0
- package/dist/user-device/user-device.service.d.ts +71 -0
- package/dist/user-device/user-device.service.d.ts.map +1 -0
- package/dist/user-device/user-device.service.js +158 -0
- package/dist/user-device/user-device.service.js.map +1 -0
- package/dist/utils/device-key.d.ts +23 -0
- package/dist/utils/device-key.d.ts.map +1 -0
- package/dist/utils/device-key.js +31 -0
- package/dist/utils/device-key.js.map +1 -0
- package/dist/utils/geo-ip.d.ts +38 -0
- package/dist/utils/geo-ip.d.ts.map +1 -0
- package/dist/utils/geo-ip.js +122 -0
- package/dist/utils/geo-ip.js.map +1 -0
- package/dist/utils/locale-context.d.ts +10 -7
- package/dist/utils/locale-context.d.ts.map +1 -1
- package/dist/utils/locale-context.js +14 -8
- package/dist/utils/locale-context.js.map +1 -1
- package/dist/utils/security-event-vars.d.ts +56 -0
- package/dist/utils/security-event-vars.d.ts.map +1 -0
- package/dist/utils/security-event-vars.js +109 -0
- package/dist/utils/security-event-vars.js.map +1 -0
- package/dist/utils/user-agent.d.ts +19 -0
- package/dist/utils/user-agent.d.ts.map +1 -0
- package/dist/utils/user-agent.js +36 -0
- package/dist/utils/user-agent.js.map +1 -0
- package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
- package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.js +50 -4
- package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
- package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/mail.yaml +198 -62
- package/hedhog/data/mail_layout.yaml +43 -33
- package/hedhog/data/menu.yaml +2 -0
- package/hedhog/data/role.yaml +16 -0
- package/hedhog/data/route.yaml +172 -3
- package/hedhog/data/setting_group.yaml +178 -2
- package/hedhog/data/setting_subgroup.yaml +8 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
- package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
- package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
- package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
- package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
- package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
- package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
- package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +376 -1236
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +190 -132
- package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
- package/hedhog/frontend/app/users/page.tsx.ejs +69 -10
- package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
- package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
- package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +19 -0
- package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
- package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +46 -24
- package/hedhog/frontend/messages/en.json +146 -48
- package/hedhog/frontend/messages/pt.json +146 -48
- package/hedhog/table/access_log.yaml +7 -0
- package/hedhog/table/file.yaml +8 -0
- package/hedhog/table/mail_delivery_event.yaml +76 -0
- package/hedhog/table/mail_sent.yaml +23 -0
- package/hedhog/table/user_activity.yaml +9 -0
- package/hedhog/table/user_device.yaml +52 -0
- package/hedhog/table/user_session.yaml +20 -1
- package/package.json +6 -5
- package/src/access-log/access-log.controller.ts +1 -0
- package/src/access-log/access-log.interceptor.ts +5 -1
- package/src/access-log/access-log.service.spec.ts +33 -2
- package/src/access-log/access-log.service.ts +38 -0
- package/src/access-log/dto/query-access-log.dto.ts +5 -0
- package/src/ai/ai.controller.ts +9 -0
- package/src/ai/ai.module.ts +3 -2
- package/src/ai/ai.service.ts +150 -13
- package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
- package/src/ai/richtext-ai.prompts.ts +57 -0
- package/src/ai/richtext-ai.service.ts +109 -0
- package/src/auth/auth.controller.ts +47 -8
- package/src/auth/auth.module.ts +2 -0
- package/src/auth/auth.service.spec.ts +383 -6
- package/src/auth/auth.service.ts +345 -56
- package/src/auth/dto/confirm-email.dto.ts +7 -0
- package/src/auth/dto/resend-confirmation.dto.ts +20 -0
- package/src/authorize/authorize.controller.ts +2 -0
- package/src/authorize/authorize.service.spec.ts +23 -0
- package/src/authorize/authorize.service.ts +8 -0
- package/src/challenge/challenge.service.spec.ts +73 -0
- package/src/challenge/challenge.service.ts +62 -3
- package/src/core.module.ts +19 -0
- package/src/file/file.controller.ts +54 -4
- package/src/file/file.service.spec.ts +275 -105
- package/src/file/file.service.ts +409 -14
- package/src/file/image-optimization.service.spec.ts +92 -0
- package/src/file/image-optimization.service.ts +202 -0
- package/src/file/provider/abstract.provider.ts +23 -0
- package/src/file/provider/gcs.provider.ts +17 -0
- package/src/file/provider/local.provider.ts +21 -0
- package/src/file/provider/s3.provider.ts +25 -0
- package/src/file/provider/spaces.provider.ts +26 -0
- package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
- package/src/impersonation/impersonation-restrictions.ts +84 -0
- package/src/impersonation/impersonation.controller.ts +109 -0
- package/src/impersonation/impersonation.module.ts +31 -0
- package/src/impersonation/impersonation.service.spec.ts +427 -0
- package/src/impersonation/impersonation.service.ts +577 -0
- package/src/index.ts +21 -0
- package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
- package/src/integration/services/outbox-polling.coordinator.ts +62 -40
- package/src/integration/services/outbox.service.spec.ts +8 -0
- package/src/integration/services/outbox.service.ts +19 -13
- package/src/integration-profile/integration-profile.secrets.ts +3 -0
- package/src/integration-profile/integration-profile.utils.ts +38 -0
- package/src/integration-profile/testers/email.testers.ts +34 -1
- package/src/language/en.json +11 -0
- package/src/language/pt.json +11 -0
- package/src/mail/dto/send.dto.ts +46 -2
- package/src/mail/mail-template.spec.ts +79 -2
- package/src/mail/mail.module.ts +2 -0
- package/src/mail/mail.service.spec.ts +307 -6
- package/src/mail/mail.service.ts +227 -30
- package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
- package/src/mail-delivery/mail-delivery.constants.ts +31 -0
- package/src/mail-delivery/mail-delivery.controller.ts +38 -0
- package/src/mail-delivery/mail-delivery.module.ts +23 -0
- package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
- package/src/mail-delivery/mail-delivery.service.ts +152 -0
- package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
- package/src/mail-delivery/ses-event.parser.ts +191 -0
- package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
- package/src/mail-delivery/ses-webhook.service.ts +240 -0
- package/src/mail-delivery/sns-message.util.spec.ts +163 -0
- package/src/mail-delivery/sns-message.util.ts +125 -0
- package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
- package/src/mail-sent/mail-sent.service.ts +46 -2
- package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
- package/src/mailbox/mailbox.module.ts +14 -0
- package/src/meeting/meeting-provider.registry.ts +193 -0
- package/src/meeting/meeting.constants.ts +53 -0
- package/src/meeting/meeting.module.ts +13 -0
- package/src/middlewares/locale-injection.middleware.ts +25 -6
- package/src/oauth/providers/google.provider.ts +49 -15
- package/src/observability/monitored-cron.spec.ts +102 -0
- package/src/observability/monitored-cron.ts +110 -0
- package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
- package/src/pairing/dto/claim-pairing.dto.ts +19 -0
- package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
- package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
- package/src/pairing/dto/start-pairing.dto.ts +19 -0
- package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
- package/src/pairing/pairing.controller.ts +246 -0
- package/src/pairing/pairing.module.ts +27 -0
- package/src/pairing/pairing.service.spec.ts +462 -0
- package/src/pairing/pairing.service.ts +614 -0
- package/src/pdf/pdf.service.ts +6 -24
- package/src/profile/profile.service.ts +26 -8
- package/src/redis/redis-pubsub.ts +11 -0
- package/src/role/guards/role.guard.spec.ts +75 -0
- package/src/role/guards/role.guard.ts +64 -46
- package/src/session/session.service.spec.ts +81 -0
- package/src/session/session.service.ts +93 -6
- package/src/setting/brand-asset.service.ts +137 -0
- package/src/setting/setting.module.ts +3 -2
- package/src/setting/setting.service.spec.ts +79 -1
- package/src/setting/setting.service.ts +109 -1
- package/src/token/token.service.spec.ts +62 -0
- package/src/token/token.service.ts +57 -3
- package/src/user/user.service.spec.ts +33 -2
- package/src/user/user.service.ts +108 -6
- package/src/user-device/user-device.controller.ts +77 -0
- package/src/user-device/user-device.module.ts +13 -0
- package/src/user-device/user-device.service.spec.ts +234 -0
- package/src/user-device/user-device.service.ts +168 -0
- package/src/utils/device-key.spec.ts +57 -0
- package/src/utils/device-key.ts +32 -0
- package/src/utils/geo-ip.spec.ts +134 -0
- package/src/utils/geo-ip.ts +93 -0
- package/src/utils/locale-context.spec.ts +27 -1
- package/src/utils/locale-context.ts +15 -12
- package/src/utils/security-event-vars.spec.ts +161 -0
- package/src/utils/security-event-vars.ts +153 -0
- package/src/utils/user-agent.spec.ts +37 -0
- package/src/utils/user-agent.ts +46 -0
- package/src/webhook-integration/webhook-integration.service.ts +57 -3
- package/src/webhook-integration/webhook-protocol.registry.ts +6 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var MeetingProviderRegistry_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MeetingProviderRegistry = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
/**
|
|
13
|
+
* Registro dos provedores de reunião, no mesmo padrão do WebhookProtocolRegistry:
|
|
14
|
+
* o módulo dono do provedor se registra no boot.
|
|
15
|
+
*/
|
|
16
|
+
let MeetingProviderRegistry = MeetingProviderRegistry_1 = class MeetingProviderRegistry {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.logger = new common_1.Logger(MeetingProviderRegistry_1.name);
|
|
19
|
+
this.providers = new Map();
|
|
20
|
+
}
|
|
21
|
+
register(provider, implementation) {
|
|
22
|
+
const key = normalizeProvider(provider);
|
|
23
|
+
if (!key)
|
|
24
|
+
throw new Error('Meeting provider key is required.');
|
|
25
|
+
if (this.providers.has(key)) {
|
|
26
|
+
this.logger.warn(`Meeting provider "${key}" was overwritten.`);
|
|
27
|
+
}
|
|
28
|
+
this.providers.set(key, implementation);
|
|
29
|
+
this.logger.log(`Registered meeting provider "${key}"`);
|
|
30
|
+
}
|
|
31
|
+
get(provider) {
|
|
32
|
+
var _a;
|
|
33
|
+
const key = normalizeProvider(provider);
|
|
34
|
+
return key ? ((_a = this.providers.get(key)) !== null && _a !== void 0 ? _a : null) : null;
|
|
35
|
+
}
|
|
36
|
+
has(provider) {
|
|
37
|
+
return this.get(provider) !== null;
|
|
38
|
+
}
|
|
39
|
+
/** Provedores registrados (para a UI listar o que existe). */
|
|
40
|
+
list() {
|
|
41
|
+
return [...this.providers.keys()].sort();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.MeetingProviderRegistry = MeetingProviderRegistry;
|
|
45
|
+
exports.MeetingProviderRegistry = MeetingProviderRegistry = MeetingProviderRegistry_1 = __decorate([
|
|
46
|
+
(0, common_1.Injectable)()
|
|
47
|
+
], MeetingProviderRegistry);
|
|
48
|
+
function normalizeProvider(provider) {
|
|
49
|
+
return String(provider !== null && provider !== void 0 ? provider : '')
|
|
50
|
+
.trim()
|
|
51
|
+
.toLowerCase();
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=meeting-provider.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-provider.registry.js","sourceRoot":"","sources":["../../src/meeting/meeting-provider.registry.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AAwJpD;;;GAGG;AAEI,IAAM,uBAAuB,+BAA7B,MAAM,uBAAuB;IAA7B;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,yBAAuB,CAAC,IAAI,CAAC,CAAC;QAClD,cAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IA2BnE,CAAC;IAzBC,QAAQ,CAAC,QAAgB,EAAE,cAAgC;QACzD,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,GAAG,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,GAAG,CAAC,QAAmC;;QACrC,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,GAAG,CAAC,QAAmC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,8DAA8D;IAC9D,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF,CAAA;AA7BY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CA6BnC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,OAAO,MAAM,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,CAAC;SAC1B,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Chave do provedor Microsoft Teams no {@link MeetingProviderRegistry}. */
|
|
2
|
+
export declare const TEAMS_MEETING_PROVIDER = "teams";
|
|
3
|
+
/**
|
|
4
|
+
* Evento de domínio publicado quando a gravação de uma reunião foi baixada e já
|
|
5
|
+
* existe como registro em `file`. Fica no core porque é o contrato entre quem
|
|
6
|
+
* publica (provedor da reunião) e quem consome (módulo dono da origem) — assim
|
|
7
|
+
* nenhum dos dois precisa importar o pacote do outro.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MEETING_RECORDING_AVAILABLE_EVENT = "microsoft.meeting.recording.available";
|
|
10
|
+
export interface MeetingRecordingAvailablePayload {
|
|
11
|
+
/** `file.id` do vídeo já enviado ao storage. */
|
|
12
|
+
fileId: number;
|
|
13
|
+
sourceModule: string;
|
|
14
|
+
sourceEntity: string;
|
|
15
|
+
sourceEntityId: string;
|
|
16
|
+
providerMeetingId?: string | null;
|
|
17
|
+
providerRecordingId?: string | null;
|
|
18
|
+
durationSeconds?: number | null;
|
|
19
|
+
joinUrl?: string | null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Evento publicado quando o relatório de presença de uma reunião foi importado.
|
|
23
|
+
*
|
|
24
|
+
* Mesma razão de existir do evento de gravação: o provedor sabe quem entrou na
|
|
25
|
+
* reunião, mas não sabe o que é um aluno; o módulo de origem sabe quem está
|
|
26
|
+
* matriculado, mas não conhece o Graph. O encontro é aqui.
|
|
27
|
+
*/
|
|
28
|
+
export declare const MEETING_ATTENDANCE_AVAILABLE_EVENT = "microsoft.meeting.attendance.available";
|
|
29
|
+
/** Um participante do relatório, na forma em que a origem precisa ver. */
|
|
30
|
+
export interface MeetingAttendanceRecord {
|
|
31
|
+
/**
|
|
32
|
+
* Nulo quando o provedor não identificou quem entrou (link aberto por
|
|
33
|
+
* convidado externo ou anônimo). A origem trata esse caso como "participante
|
|
34
|
+
* não identificado" em vez de descartar.
|
|
35
|
+
*/
|
|
36
|
+
email: string | null;
|
|
37
|
+
displayName: string;
|
|
38
|
+
totalAttendanceSeconds: number;
|
|
39
|
+
}
|
|
40
|
+
export interface MeetingAttendanceAvailablePayload {
|
|
41
|
+
sourceModule: string;
|
|
42
|
+
sourceEntity: string;
|
|
43
|
+
sourceEntityId: string;
|
|
44
|
+
providerMeetingId?: string | null;
|
|
45
|
+
records: MeetingAttendanceRecord[];
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=meeting.constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting.constants.d.ts","sourceRoot":"","sources":["../../src/meeting/meeting.constants.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,0CACL,CAAC;AAE1C,MAAM,WAAW,gCAAgC;IAC/C,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,2CACL,CAAC;AAE3C,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iCAAiC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,uBAAuB,EAAE,CAAC;CACpC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MEETING_ATTENDANCE_AVAILABLE_EVENT = exports.MEETING_RECORDING_AVAILABLE_EVENT = exports.TEAMS_MEETING_PROVIDER = void 0;
|
|
4
|
+
/** Chave do provedor Microsoft Teams no {@link MeetingProviderRegistry}. */
|
|
5
|
+
exports.TEAMS_MEETING_PROVIDER = 'teams';
|
|
6
|
+
/**
|
|
7
|
+
* Evento de domínio publicado quando a gravação de uma reunião foi baixada e já
|
|
8
|
+
* existe como registro em `file`. Fica no core porque é o contrato entre quem
|
|
9
|
+
* publica (provedor da reunião) e quem consome (módulo dono da origem) — assim
|
|
10
|
+
* nenhum dos dois precisa importar o pacote do outro.
|
|
11
|
+
*/
|
|
12
|
+
exports.MEETING_RECORDING_AVAILABLE_EVENT = 'microsoft.meeting.recording.available';
|
|
13
|
+
/**
|
|
14
|
+
* Evento publicado quando o relatório de presença de uma reunião foi importado.
|
|
15
|
+
*
|
|
16
|
+
* Mesma razão de existir do evento de gravação: o provedor sabe quem entrou na
|
|
17
|
+
* reunião, mas não sabe o que é um aluno; o módulo de origem sabe quem está
|
|
18
|
+
* matriculado, mas não conhece o Graph. O encontro é aqui.
|
|
19
|
+
*/
|
|
20
|
+
exports.MEETING_ATTENDANCE_AVAILABLE_EVENT = 'microsoft.meeting.attendance.available';
|
|
21
|
+
//# sourceMappingURL=meeting.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting.constants.js","sourceRoot":"","sources":["../../src/meeting/meeting.constants.ts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC/D,QAAA,sBAAsB,GAAG,OAAO,CAAC;AAE9C;;;;;GAKG;AACU,QAAA,iCAAiC,GAC5C,uCAAuC,CAAC;AAc1C;;;;;;GAMG;AACU,QAAA,kCAAkC,GAC7C,wCAAwC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting.module.d.ts","sourceRoot":"","sources":["../../src/meeting/meeting.module.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAKa,aAAa;CAAG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MeetingModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const meeting_provider_registry_1 = require("./meeting-provider.registry");
|
|
12
|
+
/**
|
|
13
|
+
* Porta genérica de reuniões online. Só carrega o registro — a implementação vem
|
|
14
|
+
* de quem se registrar no boot (hoje a library `microsoft`, com a chave `teams`).
|
|
15
|
+
*/
|
|
16
|
+
let MeetingModule = class MeetingModule {
|
|
17
|
+
};
|
|
18
|
+
exports.MeetingModule = MeetingModule;
|
|
19
|
+
exports.MeetingModule = MeetingModule = __decorate([
|
|
20
|
+
(0, common_1.Global)(),
|
|
21
|
+
(0, common_1.Module)({
|
|
22
|
+
providers: [meeting_provider_registry_1.MeetingProviderRegistry],
|
|
23
|
+
exports: [meeting_provider_registry_1.MeetingProviderRegistry],
|
|
24
|
+
})
|
|
25
|
+
], MeetingModule);
|
|
26
|
+
//# sourceMappingURL=meeting.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting.module.js","sourceRoot":"","sources":["../../src/meeting/meeting.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,2EAAsE;AAEtE;;;GAGG;AAMI,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IALzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,mDAAuB,CAAC;QACpC,OAAO,EAAE,CAAC,mDAAuB,CAAC;KACnC,CAAC;GACW,aAAa,CAAG"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { NestMiddleware } from '@nestjs/common';
|
|
2
2
|
import { NextFunction, Request, Response } from 'express';
|
|
3
|
+
/**
|
|
4
|
+
* Rede de seguranca do contexto de locale.
|
|
5
|
+
*
|
|
6
|
+
* Quem resolve o idioma e o `LocaleMiddleware` do `api-locale`, que ja abre o
|
|
7
|
+
* `AsyncLocalStorage` para o resto da cadeia. Este middleware so entra em acao
|
|
8
|
+
* quando aquele nao rodou (app que nao registrou o `LocaleModule`, ou uma
|
|
9
|
+
* ordem de middleware que o coloque depois), para que
|
|
10
|
+
* `getLocaleFromContext()` nunca leia um store vazio.
|
|
11
|
+
*
|
|
12
|
+
* Nao reinterpreta o header: sem a tabela `locale` a mao, validar aqui de novo
|
|
13
|
+
* era justamente como as duas camadas divergiam.
|
|
14
|
+
*/
|
|
3
15
|
export declare class LocaleInjectionMiddleware implements NestMiddleware {
|
|
4
16
|
use(req: Request, res: Response, next: NextFunction): void;
|
|
5
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale-injection.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/locale-injection.middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"locale-injection.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/locale-injection.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,qBACa,yBAA0B,YAAW,cAAc;IAC9D,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;CAepD"}
|
|
@@ -7,13 +7,29 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.LocaleInjectionMiddleware = void 0;
|
|
10
|
+
const api_locale_1 = require("@hed-hog/api-locale");
|
|
10
11
|
const common_1 = require("@nestjs/common");
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Rede de seguranca do contexto de locale.
|
|
14
|
+
*
|
|
15
|
+
* Quem resolve o idioma e o `LocaleMiddleware` do `api-locale`, que ja abre o
|
|
16
|
+
* `AsyncLocalStorage` para o resto da cadeia. Este middleware so entra em acao
|
|
17
|
+
* quando aquele nao rodou (app que nao registrou o `LocaleModule`, ou uma
|
|
18
|
+
* ordem de middleware que o coloque depois), para que
|
|
19
|
+
* `getLocaleFromContext()` nunca leia um store vazio.
|
|
20
|
+
*
|
|
21
|
+
* Nao reinterpreta o header: sem a tabela `locale` a mao, validar aqui de novo
|
|
22
|
+
* era justamente como as duas camadas divergiam.
|
|
23
|
+
*/
|
|
12
24
|
let LocaleInjectionMiddleware = class LocaleInjectionMiddleware {
|
|
13
25
|
use(req, res, next) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
26
|
+
if (api_locale_1.localeStorage.getStore()) {
|
|
27
|
+
return next();
|
|
28
|
+
}
|
|
29
|
+
api_locale_1.localeStorage.run({
|
|
30
|
+
locale: req['locale'] || 'en',
|
|
31
|
+
detected: Boolean(req['localeDetected']),
|
|
32
|
+
}, () => {
|
|
17
33
|
next();
|
|
18
34
|
});
|
|
19
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale-injection.middleware.js","sourceRoot":"","sources":["../../src/middlewares/locale-injection.middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"locale-injection.middleware.js","sourceRoot":"","sources":["../../src/middlewares/locale-injection.middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAoD;AACpD,2CAA4D;AAG5D;;;;;;;;;;;GAWG;AAEI,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QACjD,IAAI,0BAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,0BAAa,CAAC,GAAG,CACf;YACE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;YAC7B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;SACzC,EACD,GAAG,EAAE;YACH,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAgBrC"}
|
|
@@ -5,6 +5,13 @@ import { BaseOAuthProvider } from './abstract.provider';
|
|
|
5
5
|
export declare class GoogleProvider extends BaseOAuthProvider {
|
|
6
6
|
private readonly setting;
|
|
7
7
|
private readonly prisma;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
/**
|
|
10
|
+
* personFields da People API e o escopo sensível que cada um exige. Escopo sensível
|
|
11
|
+
* só entra na conta se estiver marcado em `oauth-google-scopes` e aprovado na
|
|
12
|
+
* verificação do Google; sem ele a People API responde 403.
|
|
13
|
+
*/
|
|
14
|
+
private static readonly PEOPLE_FIELD_SCOPES;
|
|
8
15
|
constructor(http: HttpService, setting: SettingService, prisma: PrismaService);
|
|
9
16
|
getProviderType(): string;
|
|
10
17
|
private loadConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBACa,cAAe,SAAQ,iBAAiB;
|
|
1
|
+
{"version":3,"file":"google.provider.d.ts","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBACa,cAAe,SAAQ,iBAAiB;IAgBjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhBzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAE1D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAGzC;gBAGA,IAAI,EAAE,WAAW,EAEA,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa;IAKxC,eAAe;YAID,UAAU;IAqBlB,UAAU,CAAC,YAAY,EAAE,MAAM;IAkB/B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;YAsCrD,+BAA+B;CAqD9C"}
|
|
@@ -11,6 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
|
+
var GoogleProvider_1;
|
|
14
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
16
|
exports.GoogleProvider = void 0;
|
|
16
17
|
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
@@ -19,11 +20,12 @@ const common_1 = require("@nestjs/common");
|
|
|
19
20
|
const integration_profile_utils_1 = require("../../integration-profile/integration-profile.utils");
|
|
20
21
|
const setting_service_1 = require("../../setting/setting.service");
|
|
21
22
|
const abstract_provider_1 = require("./abstract.provider");
|
|
22
|
-
let GoogleProvider = class GoogleProvider extends abstract_provider_1.BaseOAuthProvider {
|
|
23
|
+
let GoogleProvider = GoogleProvider_1 = class GoogleProvider extends abstract_provider_1.BaseOAuthProvider {
|
|
23
24
|
constructor(http, setting, prisma) {
|
|
24
25
|
super(http);
|
|
25
26
|
this.setting = setting;
|
|
26
27
|
this.prisma = prisma;
|
|
28
|
+
this.logger = new common_1.Logger(GoogleProvider_1.name);
|
|
27
29
|
}
|
|
28
30
|
getProviderType() {
|
|
29
31
|
return 'GOOGLE';
|
|
@@ -63,6 +65,7 @@ let GoogleProvider = class GoogleProvider extends abstract_provider_1.BaseOAuthP
|
|
|
63
65
|
return `https://accounts.google.com/o/oauth2/v2/auth?${params}`;
|
|
64
66
|
}
|
|
65
67
|
async getProfile(code, _type, redirectUri) {
|
|
68
|
+
var _a;
|
|
66
69
|
const { clientId, clientSecret, baseUrl } = await this.loadConfig();
|
|
67
70
|
// Single, flow-less callback per provider (the flow travels in the OAuth state).
|
|
68
71
|
const resolvedRedirectUri = (redirectUri === null || redirectUri === void 0 ? void 0 : redirectUri.trim()) || `${baseUrl}/callback/google`;
|
|
@@ -74,7 +77,7 @@ let GoogleProvider = class GoogleProvider extends abstract_provider_1.BaseOAuthP
|
|
|
74
77
|
redirectUri: resolvedRedirectUri,
|
|
75
78
|
});
|
|
76
79
|
const basicProfile = await this.fetchProfile(token.access_token, 'https://www.googleapis.com/oauth2/v2/userinfo');
|
|
77
|
-
const peopleProfile = await this.getGoogleProfileFromAccessToken(token.access_token);
|
|
80
|
+
const peopleProfile = await this.getGoogleProfileFromAccessToken(token.access_token, String((_a = token.scope) !== null && _a !== void 0 ? _a : ''));
|
|
78
81
|
return Object.assign(Object.assign({}, basicProfile), { gender: peopleProfile.gender, birthday: peopleProfile.birthday, oauth_tokens: {
|
|
79
82
|
access_token: token.access_token,
|
|
80
83
|
refresh_token: token.refresh_token,
|
|
@@ -82,18 +85,36 @@ let GoogleProvider = class GoogleProvider extends abstract_provider_1.BaseOAuthP
|
|
|
82
85
|
token_type: token.token_type,
|
|
83
86
|
} });
|
|
84
87
|
}
|
|
85
|
-
async getGoogleProfileFromAccessToken(accessToken) {
|
|
88
|
+
async getGoogleProfileFromAccessToken(accessToken, grantedScopes) {
|
|
86
89
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
const empty = { gender: null, birthday: null, raw: null };
|
|
91
|
+
const granted = new Set(grantedScopes.split(/\s+/).filter(Boolean));
|
|
92
|
+
const personFields = Object.entries(GoogleProvider_1.PEOPLE_FIELD_SCOPES)
|
|
93
|
+
.filter(([, scope]) => granted.has(scope))
|
|
94
|
+
.map(([field]) => field);
|
|
95
|
+
// Login com os escopos básicos (openid/email/profile) não passa pela People API:
|
|
96
|
+
// ela responderia 403 e derrubaria a autenticação inteira por um dado opcional.
|
|
97
|
+
if (!personFields.length)
|
|
98
|
+
return empty;
|
|
99
|
+
const url = `https://people.googleapis.com/v1/people/me?personFields=${personFields.join(',')}`;
|
|
100
|
+
let data;
|
|
101
|
+
try {
|
|
102
|
+
const res = await fetch(url, {
|
|
103
|
+
headers: {
|
|
104
|
+
Authorization: `Bearer ${accessToken}`,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
if (!res.ok) {
|
|
108
|
+
throw new Error(`Google People API error: ${res.statusText}`);
|
|
109
|
+
}
|
|
110
|
+
data = await res.json();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// People API desabilitada no projeto ou consentimento revogado não podem
|
|
114
|
+
// impedir o usuário de entrar.
|
|
115
|
+
this.logger.warn(`Google People API indisponível, seguindo sem gênero/aniversário: ${error.message}`);
|
|
116
|
+
return empty;
|
|
95
117
|
}
|
|
96
|
-
const data = await res.json();
|
|
97
118
|
const gender = (_f = (_c = (_b = (_a = data.genders) === null || _a === void 0 ? void 0 : _a.find((g) => { var _a; return (_a = g.metadata) === null || _a === void 0 ? void 0 : _a.primary; })) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : (_e = (_d = data.genders) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : null;
|
|
98
119
|
const b = (_h = (_g = data.birthdays) === null || _g === void 0 ? void 0 : _g.find((x) => { var _a; return (_a = x.metadata) === null || _a === void 0 ? void 0 : _a.primary; })) !== null && _h !== void 0 ? _h : (_j = data.birthdays) === null || _j === void 0 ? void 0 : _j[0];
|
|
99
120
|
const date = (b === null || b === void 0 ? void 0 : b.date)
|
|
@@ -103,7 +124,16 @@ let GoogleProvider = class GoogleProvider extends abstract_provider_1.BaseOAuthP
|
|
|
103
124
|
}
|
|
104
125
|
};
|
|
105
126
|
exports.GoogleProvider = GoogleProvider;
|
|
106
|
-
|
|
127
|
+
/**
|
|
128
|
+
* personFields da People API e o escopo sensível que cada um exige. Escopo sensível
|
|
129
|
+
* só entra na conta se estiver marcado em `oauth-google-scopes` e aprovado na
|
|
130
|
+
* verificação do Google; sem ele a People API responde 403.
|
|
131
|
+
*/
|
|
132
|
+
GoogleProvider.PEOPLE_FIELD_SCOPES = {
|
|
133
|
+
genders: 'https://www.googleapis.com/auth/user.gender.read',
|
|
134
|
+
birthdays: 'https://www.googleapis.com/auth/user.birthday.read',
|
|
135
|
+
};
|
|
136
|
+
exports.GoogleProvider = GoogleProvider = GoogleProvider_1 = __decorate([
|
|
107
137
|
(0, common_1.Injectable)(),
|
|
108
138
|
__param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => setting_service_1.SettingService))),
|
|
109
139
|
__metadata("design:paramtypes", [axios_1.HttpService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"google.provider.js","sourceRoot":"","sources":["../../../src/oauth/providers/google.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type MonitoredCronOptions = {
|
|
2
|
+
/** Slug do monitor no Sentry (Crons). */
|
|
3
|
+
slug: string;
|
|
4
|
+
/** Idêntico ao valor passado ao @Cron do método chamador. */
|
|
5
|
+
schedule: string;
|
|
6
|
+
maxRuntimeMinutes?: number;
|
|
7
|
+
checkinMarginMinutes?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Envolve o corpo de um método @Cron com Sentry Cron Monitoring (check-in
|
|
11
|
+
* in_progress/ok/error), garantindo que só o pod que ganhou o tick executa
|
|
12
|
+
* `work` e emite o check-in — sem isso, com N pods rodando o mesmo @Cron
|
|
13
|
+
* simultaneamente, o Sentry recebe 2×N check-ins por execução e estoura o
|
|
14
|
+
* rate limit de 6/min por monitor (ver docs/sentry.md).
|
|
15
|
+
*
|
|
16
|
+
* A eleição e `work()` rodam na MESMA transação interativa — é o que faz o
|
|
17
|
+
* `pg_try_advisory_xact_lock` valer como exclusão mútua de verdade. Uma
|
|
18
|
+
* versão anterior comitava a eleição sozinha (fora de transação): o Postgres
|
|
19
|
+
* liberava o lock no instante em que a query retornava, antes do trabalho
|
|
20
|
+
* real começar, e pods suficientemente próximos no tempo (o que é comum,
|
|
21
|
+
* já que o @Cron dispara no mesmo segundo em todos) "ganhavam" o mesmo tick
|
|
22
|
+
* e mandavam check-ins duplicados — foi o que gerou o incidente do
|
|
23
|
+
* sac-sla-sweep. `work()` deliberadamente NÃO recebe `tx` (continua fechando
|
|
24
|
+
* sobre `this.prisma`/outros serviços do chamador): a conexão que segura o
|
|
25
|
+
* lock fica ociosa (idle in transaction) durante o trabalho real, em vez de
|
|
26
|
+
* segurar locks de linha por uma chamada HTTP potencialmente longa (ex.:
|
|
27
|
+
* renovação de assinatura do Graph, até 10 min).
|
|
28
|
+
*
|
|
29
|
+
* Quando outro pod já ganhou o tick, resolve para `undefined` sem chamar
|
|
30
|
+
* `work` — não é uma falha, é a mesma semântica de "outro worker já pegou o
|
|
31
|
+
* job" que a fila customizada já usa.
|
|
32
|
+
*/
|
|
33
|
+
export declare function runMonitoredCron<T>(prisma: any, options: MonitoredCronOptions, work: () => Promise<T>): Promise<T | undefined>;
|
|
34
|
+
//# sourceMappingURL=monitored-cron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitored-cron.d.ts","sourceRoot":"","sources":["../../src/observability/monitored-cron.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG;IACjC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAgCF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAwCxB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runMonitoredCron = runMonitoredCron;
|
|
37
|
+
const Sentry = __importStar(require("@sentry/nestjs"));
|
|
38
|
+
/** Fallback só para dimensionar o timeout da transação (ver abaixo) quando um
|
|
39
|
+
* chamador futuro omitir `maxRuntimeMinutes` — os 5 crons atuais sempre informam. */
|
|
40
|
+
const DEFAULT_MAX_RUNTIME_MINUTES = 5;
|
|
41
|
+
/** Folga sobre `maxRuntimeMinutes` para o `timeout` da transação: cobre a
|
|
42
|
+
* diferença entre o que o Sentry tolera (`maxRuntime`/`checkinMargin`, que só
|
|
43
|
+
* marcam o check-in como perdido) e o que o Prisma de fato aborta. */
|
|
44
|
+
const TRANSACTION_TIMEOUT_SLACK_MS = 30000;
|
|
45
|
+
/** Tempo esperando conexão do pool para abrir a transação — alinhado ao
|
|
46
|
+
* `pool_timeout=20s` que packages/api-prisma/src/datasource-url.ts já aplica
|
|
47
|
+
* quando PRISMA_CONNECTION_LIMIT está setado; o default do Prisma (2s) seria
|
|
48
|
+
* mais apertado que esse teto que o projeto já escolheu deliberadamente. */
|
|
49
|
+
const TRANSACTION_MAX_WAIT_MS = 20000;
|
|
50
|
+
/**
|
|
51
|
+
* Tenta ganhar o tick. Roda DENTRO da transação de `runMonitoredCron` —
|
|
52
|
+
* reaproveita o MESMO padrão de `pg_try_advisory_xact_lock` já usado em
|
|
53
|
+
* cms-scheduled-publisher.service.ts e class-session-reminder.service.ts, mas
|
|
54
|
+
* aqui generalizado: a variante `xact` só é liberada no commit/rollback DESSA
|
|
55
|
+
* transação, então segurá-la aberta pelo tempo de `work()` é o que de fato
|
|
56
|
+
* garante a exclusão mútua entre pods.
|
|
57
|
+
*/
|
|
58
|
+
async function claimCronTick(tx, slug) {
|
|
59
|
+
var _a;
|
|
60
|
+
const rows = await tx.$queryRaw `
|
|
61
|
+
SELECT pg_try_advisory_xact_lock(hashtext(${slug})) AS locked
|
|
62
|
+
`;
|
|
63
|
+
return ((_a = rows[0]) === null || _a === void 0 ? void 0 : _a.locked) === true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Envolve o corpo de um método @Cron com Sentry Cron Monitoring (check-in
|
|
67
|
+
* in_progress/ok/error), garantindo que só o pod que ganhou o tick executa
|
|
68
|
+
* `work` e emite o check-in — sem isso, com N pods rodando o mesmo @Cron
|
|
69
|
+
* simultaneamente, o Sentry recebe 2×N check-ins por execução e estoura o
|
|
70
|
+
* rate limit de 6/min por monitor (ver docs/sentry.md).
|
|
71
|
+
*
|
|
72
|
+
* A eleição e `work()` rodam na MESMA transação interativa — é o que faz o
|
|
73
|
+
* `pg_try_advisory_xact_lock` valer como exclusão mútua de verdade. Uma
|
|
74
|
+
* versão anterior comitava a eleição sozinha (fora de transação): o Postgres
|
|
75
|
+
* liberava o lock no instante em que a query retornava, antes do trabalho
|
|
76
|
+
* real começar, e pods suficientemente próximos no tempo (o que é comum,
|
|
77
|
+
* já que o @Cron dispara no mesmo segundo em todos) "ganhavam" o mesmo tick
|
|
78
|
+
* e mandavam check-ins duplicados — foi o que gerou o incidente do
|
|
79
|
+
* sac-sla-sweep. `work()` deliberadamente NÃO recebe `tx` (continua fechando
|
|
80
|
+
* sobre `this.prisma`/outros serviços do chamador): a conexão que segura o
|
|
81
|
+
* lock fica ociosa (idle in transaction) durante o trabalho real, em vez de
|
|
82
|
+
* segurar locks de linha por uma chamada HTTP potencialmente longa (ex.:
|
|
83
|
+
* renovação de assinatura do Graph, até 10 min).
|
|
84
|
+
*
|
|
85
|
+
* Quando outro pod já ganhou o tick, resolve para `undefined` sem chamar
|
|
86
|
+
* `work` — não é uma falha, é a mesma semântica de "outro worker já pegou o
|
|
87
|
+
* job" que a fila customizada já usa.
|
|
88
|
+
*/
|
|
89
|
+
async function runMonitoredCron(prisma, options, work) {
|
|
90
|
+
var _a;
|
|
91
|
+
const timeoutMs = ((_a = options.maxRuntimeMinutes) !== null && _a !== void 0 ? _a : DEFAULT_MAX_RUNTIME_MINUTES) * 60000 +
|
|
92
|
+
TRANSACTION_TIMEOUT_SLACK_MS;
|
|
93
|
+
try {
|
|
94
|
+
return await prisma.$transaction(async (tx) => {
|
|
95
|
+
if (!(await claimCronTick(tx, options.slug)))
|
|
96
|
+
return undefined;
|
|
97
|
+
return Sentry.withMonitor(options.slug, () => Sentry.startSpan({ name: options.slug, op: 'cron.hedhog' }, work), Object.assign(Object.assign(Object.assign({ schedule: { type: 'crontab', value: options.schedule }, timezone: 'America/Sao_Paulo' }, (options.maxRuntimeMinutes ? { maxRuntime: options.maxRuntimeMinutes } : {})), (options.checkinMarginMinutes ? { checkinMargin: options.checkinMarginMinutes } : {})), {
|
|
98
|
+
// Distingue cada execução do cron como um trace próprio, em vez de
|
|
99
|
+
// herdar/continuar um trace pendurado do ciclo de poll anterior.
|
|
100
|
+
isolateTrace: true }));
|
|
101
|
+
}, { timeout: timeoutMs, maxWait: TRANSACTION_MAX_WAIT_MS });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// withMonitor já registrou o check-in como 'error' antes de relançar (e um
|
|
105
|
+
// erro de work() também derruba a transação por rollback — inofensivo,
|
|
106
|
+
// já que nada é escrito via `tx`, só o lock é liberado). O @Cron do
|
|
107
|
+
// chamador NUNCA deve rejeitar a partir daqui: a lib `cron` por baixo do
|
|
108
|
+
// @nestjs/schedule não garante tratamento de uma rejeição vinda do
|
|
109
|
+
// onTick, e o onUnhandledRejectionIntegration({mode:'strict'}) do
|
|
110
|
+
// instrument.ts derrubaria o processo por um erro que já está capturado.
|
|
111
|
+
Sentry.withScope((scope) => {
|
|
112
|
+
scope.setTag('cron', options.slug);
|
|
113
|
+
Sentry.captureException(error, { mechanism: { handled: true, type: 'hedhog.cron' } });
|
|
114
|
+
});
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=monitored-cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitored-cron.js","sourceRoot":"","sources":["../../src/observability/monitored-cron.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,4CA4CC;AA7GD,uDAAyC;AAWzC;qFACqF;AACrF,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC;;sEAEsE;AACtE,MAAM,4BAA4B,GAAG,KAAM,CAAC;AAE5C;;;4EAG4E;AAC5E,MAAM,uBAAuB,GAAG,KAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAAC,EAAO,EAAE,IAAY;;IAChD,MAAM,IAAI,GAA0B,MAAM,EAAE,CAAC,SAAS,CAAA;gDACR,IAAI;GACjD,CAAC;IACF,OAAO,CAAA,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,MAAM,MAAK,IAAI,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAAW,EACX,OAA6B,EAC7B,IAAsB;;IAEtB,MAAM,SAAS,GACb,CAAC,MAAA,OAAO,CAAC,iBAAiB,mCAAI,2BAA2B,CAAC,GAAG,KAAM;QACnE,4BAA4B,CAAC;IAE/B,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,YAAY,CAC9B,KAAK,EAAE,EAAO,EAAE,EAAE;YAChB,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC;YAE/D,OAAO,MAAM,CAAC,WAAW,CACvB,OAAO,CAAC,IAAI,EACZ,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,8CAErE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,EACtD,QAAQ,EAAE,mBAAmB,IAC1B,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC5E,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,mEAAmE;gBACnE,iEAAiE;gBACjE,YAAY,EAAE,IAAI,IAErB,CAAC;QACJ,CAAC,EACD,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,CACzD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2EAA2E;QAC3E,uEAAuE;QACvE,oEAAoE;QACpE,yEAAyE;QACzE,mEAAmE;QACnE,kEAAkE;QAClE,yEAAyE;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Direção B: o aparelho autenticado aprova o navegador que pediu. */
|
|
2
|
+
export declare class ApproveReversePairingDTO {
|
|
3
|
+
/**
|
|
4
|
+
* Prova de que quem aprova leu mesmo o QR: a pública efêmera precisa bater com
|
|
5
|
+
* a guardada. Sem isso, o `id` sequencial permitiria aprovar (ou espiar) o
|
|
6
|
+
* pareamento de um desconhecido por enumeração.
|
|
7
|
+
*/
|
|
8
|
+
eph_public_key: string;
|
|
9
|
+
/** Blob OPACO cifrado para a pública efêmera acima. */
|
|
10
|
+
payload_enc: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=approve-reverse-pairing.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve-reverse-pairing.dto.d.ts","sourceRoot":"","sources":["../../../src/pairing/dto/approve-reverse-pairing.dto.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,qBAAa,wBAAwB;IACnC;;;;OAIG;IAIH,cAAc,EAAE,MAAM,CAAC;IAEvB,uDAAuD;IAIvD,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ApproveReversePairingDTO = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/** Direção B: o aparelho autenticado aprova o navegador que pediu. */
|
|
15
|
+
class ApproveReversePairingDTO {
|
|
16
|
+
}
|
|
17
|
+
exports.ApproveReversePairingDTO = ApproveReversePairingDTO;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_validator_1.IsString)(),
|
|
20
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
21
|
+
(0, class_validator_1.MaxLength)(255),
|
|
22
|
+
__metadata("design:type", String)
|
|
23
|
+
], ApproveReversePairingDTO.prototype, "eph_public_key", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, class_validator_1.IsString)(),
|
|
26
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
27
|
+
(0, class_validator_1.MaxLength)(8192),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], ApproveReversePairingDTO.prototype, "payload_enc", void 0);
|
|
30
|
+
//# sourceMappingURL=approve-reverse-pairing.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve-reverse-pairing.dto.js","sourceRoot":"","sources":["../../../src/pairing/dto/approve-reverse-pairing.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkE;AAElE,sEAAsE;AACtE,MAAa,wBAAwB;CAgBpC;AAhBD,4DAgBC;AAPC;IAHC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,EAAC,GAAG,CAAC;;gEACQ;AAMvB;IAHC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,EAAC,IAAI,CAAC;;6DACI"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direção A: o aparelho que leu o QR reivindica e, depois, resgata.
|
|
3
|
+
*
|
|
4
|
+
* Serve aos dois passos porque a prova é a mesma nos dois: a posse do token que
|
|
5
|
+
* saiu do fragmento do QR. O que muda é só o estado exigido do registro.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ClaimPairingDTO {
|
|
8
|
+
auth_token: string;
|
|
9
|
+
client_id: string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=claim-pairing.dto.d.ts.map
|