@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.
Files changed (528) hide show
  1. package/README.md +39 -0
  2. package/dist/access-log/access-log.controller.d.ts.map +1 -1
  3. package/dist/access-log/access-log.controller.js +1 -1
  4. package/dist/access-log/access-log.controller.js.map +1 -1
  5. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  6. package/dist/access-log/access-log.interceptor.js +8 -5
  7. package/dist/access-log/access-log.interceptor.js.map +1 -1
  8. package/dist/access-log/access-log.service.d.ts +4 -0
  9. package/dist/access-log/access-log.service.d.ts.map +1 -1
  10. package/dist/access-log/access-log.service.js +31 -4
  11. package/dist/access-log/access-log.service.js.map +1 -1
  12. package/dist/access-log/dto/query-access-log.dto.d.ts +2 -0
  13. package/dist/access-log/dto/query-access-log.dto.d.ts.map +1 -1
  14. package/dist/access-log/dto/query-access-log.dto.js +5 -0
  15. package/dist/access-log/dto/query-access-log.dto.js.map +1 -1
  16. package/dist/ai/ai.controller.d.ts +12 -8
  17. package/dist/ai/ai.controller.d.ts.map +1 -1
  18. package/dist/ai/ai.controller.js +17 -2
  19. package/dist/ai/ai.controller.js.map +1 -1
  20. package/dist/ai/ai.module.d.ts.map +1 -1
  21. package/dist/ai/ai.module.js +3 -2
  22. package/dist/ai/ai.module.js.map +1 -1
  23. package/dist/ai/ai.service.d.ts +30 -1
  24. package/dist/ai/ai.service.d.ts.map +1 -1
  25. package/dist/ai/ai.service.js +97 -3
  26. package/dist/ai/ai.service.js.map +1 -1
  27. package/dist/ai/dto/richtext-edit-html.dto.d.ts +5 -0
  28. package/dist/ai/dto/richtext-edit-html.dto.d.ts.map +1 -0
  29. package/dist/ai/dto/richtext-edit-html.dto.js +27 -0
  30. package/dist/ai/dto/richtext-edit-html.dto.js.map +1 -0
  31. package/dist/ai/richtext-ai.prompts.d.ts +5 -0
  32. package/dist/ai/richtext-ai.prompts.d.ts.map +1 -0
  33. package/dist/ai/richtext-ai.prompts.js +57 -0
  34. package/dist/ai/richtext-ai.prompts.js.map +1 -0
  35. package/dist/ai/richtext-ai.service.d.ts +34 -0
  36. package/dist/ai/richtext-ai.service.d.ts.map +1 -0
  37. package/dist/ai/richtext-ai.service.js +95 -0
  38. package/dist/ai/richtext-ai.service.js.map +1 -0
  39. package/dist/ai-instruction/ai-instruction.controller.d.ts +5 -5
  40. package/dist/auth/auth.controller.d.ts +66 -7
  41. package/dist/auth/auth.controller.d.ts.map +1 -1
  42. package/dist/auth/auth.controller.js +67 -23
  43. package/dist/auth/auth.controller.js.map +1 -1
  44. package/dist/auth/auth.module.d.ts.map +1 -1
  45. package/dist/auth/auth.module.js +2 -0
  46. package/dist/auth/auth.module.js.map +1 -1
  47. package/dist/auth/auth.service.d.ts +136 -4
  48. package/dist/auth/auth.service.d.ts.map +1 -1
  49. package/dist/auth/auth.service.js +246 -48
  50. package/dist/auth/auth.service.js.map +1 -1
  51. package/dist/auth/dto/confirm-email.dto.d.ts +4 -0
  52. package/dist/auth/dto/confirm-email.dto.d.ts.map +1 -0
  53. package/dist/auth/dto/confirm-email.dto.js +22 -0
  54. package/dist/auth/dto/confirm-email.dto.js.map +1 -0
  55. package/dist/auth/dto/resend-confirmation.dto.d.ts +8 -0
  56. package/dist/auth/dto/resend-confirmation.dto.d.ts.map +1 -0
  57. package/dist/auth/dto/resend-confirmation.dto.js +36 -0
  58. package/dist/auth/dto/resend-confirmation.dto.js.map +1 -0
  59. package/dist/authorize/authorize.controller.d.ts +1 -1
  60. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  61. package/dist/authorize/authorize.controller.js +4 -2
  62. package/dist/authorize/authorize.controller.js.map +1 -1
  63. package/dist/authorize/authorize.service.d.ts +7 -0
  64. package/dist/authorize/authorize.service.d.ts.map +1 -1
  65. package/dist/authorize/authorize.service.js +1 -1
  66. package/dist/authorize/authorize.service.js.map +1 -1
  67. package/dist/challenge/challenge.service.d.ts +18 -5
  68. package/dist/challenge/challenge.service.d.ts.map +1 -1
  69. package/dist/challenge/challenge.service.js +50 -3
  70. package/dist/challenge/challenge.service.js.map +1 -1
  71. package/dist/core.module.d.ts.map +1 -1
  72. package/dist/core.module.js +17 -0
  73. package/dist/core.module.js.map +1 -1
  74. package/dist/dashboard/dashboard/dashboard.controller.d.ts +6 -6
  75. package/dist/dashboard/dashboard/dashboard.service.d.ts +6 -6
  76. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +4 -4
  77. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +4 -4
  78. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +1 -1
  79. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +1 -1
  80. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +2 -2
  81. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +2 -2
  82. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +2 -2
  83. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +2 -2
  84. package/dist/file/file.controller.d.ts +8 -1
  85. package/dist/file/file.controller.d.ts.map +1 -1
  86. package/dist/file/file.controller.js +45 -7
  87. package/dist/file/file.controller.js.map +1 -1
  88. package/dist/file/file.service.d.ts +128 -1
  89. package/dist/file/file.service.d.ts.map +1 -1
  90. package/dist/file/file.service.js +319 -8
  91. package/dist/file/file.service.js.map +1 -1
  92. package/dist/file/image-optimization.service.d.ts +43 -0
  93. package/dist/file/image-optimization.service.d.ts.map +1 -1
  94. package/dist/file/image-optimization.service.js +154 -0
  95. package/dist/file/image-optimization.service.js.map +1 -1
  96. package/dist/file/provider/abstract.provider.d.ts +16 -0
  97. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  98. package/dist/file/provider/abstract.provider.js +4 -0
  99. package/dist/file/provider/abstract.provider.js.map +1 -1
  100. package/dist/file/provider/gcs.provider.d.ts +2 -0
  101. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  102. package/dist/file/provider/gcs.provider.js +10 -0
  103. package/dist/file/provider/gcs.provider.js.map +1 -1
  104. package/dist/file/provider/local.provider.d.ts +1 -0
  105. package/dist/file/provider/local.provider.d.ts.map +1 -1
  106. package/dist/file/provider/local.provider.js +13 -0
  107. package/dist/file/provider/local.provider.js.map +1 -1
  108. package/dist/file/provider/s3.provider.d.ts +5 -0
  109. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  110. package/dist/file/provider/s3.provider.js +15 -0
  111. package/dist/file/provider/s3.provider.js.map +1 -1
  112. package/dist/file/provider/spaces.provider.d.ts +5 -0
  113. package/dist/file/provider/spaces.provider.d.ts.map +1 -1
  114. package/dist/file/provider/spaces.provider.js +16 -0
  115. package/dist/file/provider/spaces.provider.js.map +1 -1
  116. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts +4 -0
  117. package/dist/impersonation/dto/redeem-impersonation.dto.d.ts.map +1 -0
  118. package/dist/impersonation/dto/redeem-impersonation.dto.js +23 -0
  119. package/dist/impersonation/dto/redeem-impersonation.dto.js.map +1 -0
  120. package/dist/impersonation/dto/start-impersonation.dto.d.ts +7 -0
  121. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -0
  122. package/dist/impersonation/dto/start-impersonation.dto.js +27 -0
  123. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -0
  124. package/dist/impersonation/impersonation-restrictions.d.ts +26 -0
  125. package/dist/impersonation/impersonation-restrictions.d.ts.map +1 -0
  126. package/dist/impersonation/impersonation-restrictions.js +76 -0
  127. package/dist/impersonation/impersonation-restrictions.js.map +1 -0
  128. package/dist/impersonation/impersonation.controller.d.ts +90 -0
  129. package/dist/impersonation/impersonation.controller.d.ts.map +1 -0
  130. package/dist/impersonation/impersonation.controller.js +135 -0
  131. package/dist/impersonation/impersonation.controller.js.map +1 -0
  132. package/dist/impersonation/impersonation.module.d.ts +8 -0
  133. package/dist/impersonation/impersonation.module.d.ts.map +1 -0
  134. package/dist/impersonation/impersonation.module.js +44 -0
  135. package/dist/impersonation/impersonation.module.js.map +1 -0
  136. package/dist/impersonation/impersonation.service.d.ts +164 -0
  137. package/dist/impersonation/impersonation.service.d.ts.map +1 -0
  138. package/dist/impersonation/impersonation.service.js +408 -0
  139. package/dist/impersonation/impersonation.service.js.map +1 -0
  140. package/dist/index.d.ts +17 -0
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +19 -0
  143. package/dist/index.js.map +1 -1
  144. package/dist/integration/services/outbox-polling.coordinator.d.ts +2 -0
  145. package/dist/integration/services/outbox-polling.coordinator.d.ts.map +1 -1
  146. package/dist/integration/services/outbox-polling.coordinator.js +50 -30
  147. package/dist/integration/services/outbox-polling.coordinator.js.map +1 -1
  148. package/dist/integration/services/outbox.service.d.ts.map +1 -1
  149. package/dist/integration/services/outbox.service.js +5 -1
  150. package/dist/integration/services/outbox.service.js.map +1 -1
  151. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  152. package/dist/integration-profile/integration-profile.secrets.js +3 -0
  153. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  154. package/dist/integration-profile/integration-profile.utils.d.ts +14 -0
  155. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -1
  156. package/dist/integration-profile/integration-profile.utils.js +26 -0
  157. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  158. package/dist/integration-profile/testers/email.testers.d.ts.map +1 -1
  159. package/dist/integration-profile/testers/email.testers.js +28 -0
  160. package/dist/integration-profile/testers/email.testers.js.map +1 -1
  161. package/dist/language/en.json +11 -0
  162. package/dist/language/pt.json +11 -0
  163. package/dist/mail/dto/send.dto.d.ts +38 -1
  164. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  165. package/dist/mail/dto/send.dto.js +10 -0
  166. package/dist/mail/dto/send.dto.js.map +1 -1
  167. package/dist/mail/mail.controller.d.ts +1 -0
  168. package/dist/mail/mail.controller.d.ts.map +1 -1
  169. package/dist/mail/mail.module.d.ts.map +1 -1
  170. package/dist/mail/mail.module.js +2 -0
  171. package/dist/mail/mail.module.js.map +1 -1
  172. package/dist/mail/mail.service.d.ts +48 -4
  173. package/dist/mail/mail.service.d.ts.map +1 -1
  174. package/dist/mail/mail.service.js +187 -35
  175. package/dist/mail/mail.service.js.map +1 -1
  176. package/dist/mail-delivery/mail-delivery-provision.service.d.ts +21 -0
  177. package/dist/mail-delivery/mail-delivery-provision.service.d.ts.map +1 -0
  178. package/dist/mail-delivery/mail-delivery-provision.service.js +64 -0
  179. package/dist/mail-delivery/mail-delivery-provision.service.js.map +1 -0
  180. package/dist/mail-delivery/mail-delivery.constants.d.ts +17 -0
  181. package/dist/mail-delivery/mail-delivery.constants.d.ts.map +1 -0
  182. package/dist/mail-delivery/mail-delivery.constants.js +31 -0
  183. package/dist/mail-delivery/mail-delivery.constants.js.map +1 -0
  184. package/dist/mail-delivery/mail-delivery.controller.d.ts +19 -0
  185. package/dist/mail-delivery/mail-delivery.controller.d.ts.map +1 -0
  186. package/dist/mail-delivery/mail-delivery.controller.js +53 -0
  187. package/dist/mail-delivery/mail-delivery.controller.js.map +1 -0
  188. package/dist/mail-delivery/mail-delivery.module.d.ts +7 -0
  189. package/dist/mail-delivery/mail-delivery.module.d.ts.map +1 -0
  190. package/dist/mail-delivery/mail-delivery.module.js +36 -0
  191. package/dist/mail-delivery/mail-delivery.module.js.map +1 -0
  192. package/dist/mail-delivery/mail-delivery.service.d.ts +38 -0
  193. package/dist/mail-delivery/mail-delivery.service.d.ts.map +1 -0
  194. package/dist/mail-delivery/mail-delivery.service.js +140 -0
  195. package/dist/mail-delivery/mail-delivery.service.js.map +1 -0
  196. package/dist/mail-delivery/ses-event.parser.d.ts +27 -0
  197. package/dist/mail-delivery/ses-event.parser.d.ts.map +1 -0
  198. package/dist/mail-delivery/ses-event.parser.js +131 -0
  199. package/dist/mail-delivery/ses-event.parser.js.map +1 -0
  200. package/dist/mail-delivery/ses-webhook.service.d.ts +58 -0
  201. package/dist/mail-delivery/ses-webhook.service.d.ts.map +1 -0
  202. package/dist/mail-delivery/ses-webhook.service.js +214 -0
  203. package/dist/mail-delivery/ses-webhook.service.js.map +1 -0
  204. package/dist/mail-delivery/sns-message.util.d.ts +38 -0
  205. package/dist/mail-delivery/sns-message.util.d.ts.map +1 -0
  206. package/dist/mail-delivery/sns-message.util.js +109 -0
  207. package/dist/mail-delivery/sns-message.util.js.map +1 -0
  208. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts +5 -0
  209. package/dist/mail-sent/dto/query-mail-sent-list.dto.d.ts.map +1 -1
  210. package/dist/mail-sent/dto/query-mail-sent-list.dto.js +6 -0
  211. package/dist/mail-sent/dto/query-mail-sent-list.dto.js.map +1 -1
  212. package/dist/mail-sent/mail-sent.controller.d.ts +39 -0
  213. package/dist/mail-sent/mail-sent.controller.d.ts.map +1 -1
  214. package/dist/mail-sent/mail-sent.service.d.ts +39 -0
  215. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  216. package/dist/mail-sent/mail-sent.service.js +45 -4
  217. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  218. package/dist/mailbox/mailbox-fetcher.registry.d.ts +100 -0
  219. package/dist/mailbox/mailbox-fetcher.registry.d.ts.map +1 -0
  220. package/dist/mailbox/mailbox-fetcher.registry.js +59 -0
  221. package/dist/mailbox/mailbox-fetcher.registry.js.map +1 -0
  222. package/dist/mailbox/mailbox.module.d.ts +8 -0
  223. package/dist/mailbox/mailbox.module.d.ts.map +1 -0
  224. package/dist/mailbox/mailbox.module.js +27 -0
  225. package/dist/mailbox/mailbox.module.js.map +1 -0
  226. package/dist/meeting/meeting-provider.registry.d.ts +155 -0
  227. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -0
  228. package/dist/meeting/meeting-provider.registry.js +53 -0
  229. package/dist/meeting/meeting-provider.registry.js.map +1 -0
  230. package/dist/meeting/meeting.constants.d.ts +47 -0
  231. package/dist/meeting/meeting.constants.d.ts.map +1 -0
  232. package/dist/meeting/meeting.constants.js +21 -0
  233. package/dist/meeting/meeting.constants.js.map +1 -0
  234. package/dist/meeting/meeting.module.d.ts +7 -0
  235. package/dist/meeting/meeting.module.d.ts.map +1 -0
  236. package/dist/meeting/meeting.module.js +26 -0
  237. package/dist/meeting/meeting.module.js.map +1 -0
  238. package/dist/middlewares/locale-injection.middleware.d.ts +12 -0
  239. package/dist/middlewares/locale-injection.middleware.d.ts.map +1 -1
  240. package/dist/middlewares/locale-injection.middleware.js +20 -4
  241. package/dist/middlewares/locale-injection.middleware.js.map +1 -1
  242. package/dist/oauth/providers/google.provider.d.ts +7 -0
  243. package/dist/oauth/providers/google.provider.d.ts.map +1 -1
  244. package/dist/oauth/providers/google.provider.js +43 -13
  245. package/dist/oauth/providers/google.provider.js.map +1 -1
  246. package/dist/observability/monitored-cron.d.ts +34 -0
  247. package/dist/observability/monitored-cron.d.ts.map +1 -0
  248. package/dist/observability/monitored-cron.js +118 -0
  249. package/dist/observability/monitored-cron.js.map +1 -0
  250. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts +12 -0
  251. package/dist/pairing/dto/approve-reverse-pairing.dto.d.ts.map +1 -0
  252. package/dist/pairing/dto/approve-reverse-pairing.dto.js +30 -0
  253. package/dist/pairing/dto/approve-reverse-pairing.dto.js.map +1 -0
  254. package/dist/pairing/dto/claim-pairing.dto.d.ts +11 -0
  255. package/dist/pairing/dto/claim-pairing.dto.d.ts.map +1 -0
  256. package/dist/pairing/dto/claim-pairing.dto.js +35 -0
  257. package/dist/pairing/dto/claim-pairing.dto.js.map +1 -0
  258. package/dist/pairing/dto/confirm-pairing.dto.d.ts +10 -0
  259. package/dist/pairing/dto/confirm-pairing.dto.d.ts.map +1 -0
  260. package/dist/pairing/dto/confirm-pairing.dto.js +24 -0
  261. package/dist/pairing/dto/confirm-pairing.dto.js.map +1 -0
  262. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts +5 -0
  263. package/dist/pairing/dto/poll-reverse-pairing.dto.d.ts.map +1 -0
  264. package/dist/pairing/dto/poll-reverse-pairing.dto.js +24 -0
  265. package/dist/pairing/dto/poll-reverse-pairing.dto.js.map +1 -0
  266. package/dist/pairing/dto/start-pairing.dto.d.ts +11 -0
  267. package/dist/pairing/dto/start-pairing.dto.d.ts.map +1 -0
  268. package/dist/pairing/dto/start-pairing.dto.js +30 -0
  269. package/dist/pairing/dto/start-pairing.dto.js.map +1 -0
  270. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts +24 -0
  271. package/dist/pairing/dto/start-reverse-pairing.dto.d.ts.map +1 -0
  272. package/dist/pairing/dto/start-reverse-pairing.dto.js +47 -0
  273. package/dist/pairing/dto/start-reverse-pairing.dto.js.map +1 -0
  274. package/dist/pairing/pairing.controller.d.ts +118 -0
  275. package/dist/pairing/pairing.controller.d.ts.map +1 -0
  276. package/dist/pairing/pairing.controller.js +296 -0
  277. package/dist/pairing/pairing.controller.js.map +1 -0
  278. package/dist/pairing/pairing.module.d.ts +10 -0
  279. package/dist/pairing/pairing.module.d.ts.map +1 -0
  280. package/dist/pairing/pairing.module.js +40 -0
  281. package/dist/pairing/pairing.module.js.map +1 -0
  282. package/dist/pairing/pairing.service.d.ts +238 -0
  283. package/dist/pairing/pairing.service.d.ts.map +1 -0
  284. package/dist/pairing/pairing.service.js +495 -0
  285. package/dist/pairing/pairing.service.js.map +1 -0
  286. package/dist/pdf/pdf.service.d.ts +3 -6
  287. package/dist/pdf/pdf.service.d.ts.map +1 -1
  288. package/dist/pdf/pdf.service.js +8 -20
  289. package/dist/pdf/pdf.service.js.map +1 -1
  290. package/dist/profile/profile.controller.d.ts +11 -0
  291. package/dist/profile/profile.controller.d.ts.map +1 -1
  292. package/dist/profile/profile.service.d.ts +11 -0
  293. package/dist/profile/profile.service.d.ts.map +1 -1
  294. package/dist/profile/profile.service.js +20 -11
  295. package/dist/profile/profile.service.js.map +1 -1
  296. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  297. package/dist/redis/redis-pubsub.js +44 -0
  298. package/dist/redis/redis-pubsub.js.map +1 -1
  299. package/dist/role/guards/role.guard.d.ts +5 -0
  300. package/dist/role/guards/role.guard.d.ts.map +1 -1
  301. package/dist/role/guards/role.guard.js +41 -39
  302. package/dist/role/guards/role.guard.js.map +1 -1
  303. package/dist/session/session.controller.d.ts +2 -0
  304. package/dist/session/session.controller.d.ts.map +1 -1
  305. package/dist/session/session.service.d.ts +39 -0
  306. package/dist/session/session.service.d.ts.map +1 -1
  307. package/dist/session/session.service.js +91 -8
  308. package/dist/session/session.service.js.map +1 -1
  309. package/dist/setting/brand-asset.service.d.ts +48 -0
  310. package/dist/setting/brand-asset.service.d.ts.map +1 -0
  311. package/dist/setting/brand-asset.service.js +130 -0
  312. package/dist/setting/brand-asset.service.js.map +1 -0
  313. package/dist/setting/setting.module.d.ts.map +1 -1
  314. package/dist/setting/setting.module.js +3 -2
  315. package/dist/setting/setting.module.js.map +1 -1
  316. package/dist/setting/setting.service.d.ts +33 -0
  317. package/dist/setting/setting.service.d.ts.map +1 -1
  318. package/dist/setting/setting.service.js +88 -0
  319. package/dist/setting/setting.service.js.map +1 -1
  320. package/dist/token/token.service.d.ts +23 -2
  321. package/dist/token/token.service.d.ts.map +1 -1
  322. package/dist/token/token.service.js +39 -4
  323. package/dist/token/token.service.js.map +1 -1
  324. package/dist/user/user.controller.d.ts +8 -22
  325. package/dist/user/user.controller.d.ts.map +1 -1
  326. package/dist/user/user.service.d.ts +44 -24
  327. package/dist/user/user.service.d.ts.map +1 -1
  328. package/dist/user/user.service.js +89 -6
  329. package/dist/user/user.service.js.map +1 -1
  330. package/dist/user-device/user-device.controller.d.ts +54 -0
  331. package/dist/user-device/user-device.controller.d.ts.map +1 -0
  332. package/dist/user-device/user-device.controller.js +103 -0
  333. package/dist/user-device/user-device.controller.js.map +1 -0
  334. package/dist/user-device/user-device.module.d.ts +3 -0
  335. package/dist/user-device/user-device.module.d.ts.map +1 -0
  336. package/dist/user-device/user-device.module.js +26 -0
  337. package/dist/user-device/user-device.module.js.map +1 -0
  338. package/dist/user-device/user-device.service.d.ts +71 -0
  339. package/dist/user-device/user-device.service.d.ts.map +1 -0
  340. package/dist/user-device/user-device.service.js +158 -0
  341. package/dist/user-device/user-device.service.js.map +1 -0
  342. package/dist/utils/device-key.d.ts +23 -0
  343. package/dist/utils/device-key.d.ts.map +1 -0
  344. package/dist/utils/device-key.js +31 -0
  345. package/dist/utils/device-key.js.map +1 -0
  346. package/dist/utils/geo-ip.d.ts +38 -0
  347. package/dist/utils/geo-ip.d.ts.map +1 -0
  348. package/dist/utils/geo-ip.js +122 -0
  349. package/dist/utils/geo-ip.js.map +1 -0
  350. package/dist/utils/locale-context.d.ts +10 -7
  351. package/dist/utils/locale-context.d.ts.map +1 -1
  352. package/dist/utils/locale-context.js +14 -8
  353. package/dist/utils/locale-context.js.map +1 -1
  354. package/dist/utils/security-event-vars.d.ts +56 -0
  355. package/dist/utils/security-event-vars.d.ts.map +1 -0
  356. package/dist/utils/security-event-vars.js +109 -0
  357. package/dist/utils/security-event-vars.js.map +1 -0
  358. package/dist/utils/user-agent.d.ts +19 -0
  359. package/dist/utils/user-agent.d.ts.map +1 -0
  360. package/dist/utils/user-agent.js +36 -0
  361. package/dist/utils/user-agent.js.map +1 -0
  362. package/dist/webhook-integration/webhook-integration.service.d.ts +5 -0
  363. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  364. package/dist/webhook-integration/webhook-integration.service.js +50 -4
  365. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  366. package/dist/webhook-integration/webhook-protocol.registry.d.ts +6 -0
  367. package/dist/webhook-integration/webhook-protocol.registry.d.ts.map +1 -1
  368. package/dist/webhook-integration/webhook-protocol.registry.js.map +1 -1
  369. package/hedhog/data/integration_provider.yaml +9 -0
  370. package/hedhog/data/mail.yaml +198 -62
  371. package/hedhog/data/mail_layout.yaml +43 -33
  372. package/hedhog/data/menu.yaml +2 -0
  373. package/hedhog/data/role.yaml +16 -0
  374. package/hedhog/data/route.yaml +172 -3
  375. package/hedhog/data/setting_group.yaml +178 -2
  376. package/hedhog/data/setting_subgroup.yaml +8 -0
  377. package/hedhog/frontend/app/_lib/hooks/use-core-access.test.tsx.ejs +125 -0
  378. package/hedhog/frontend/app/_lib/hooks/use-core-access.ts.ejs +29 -0
  379. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.test.ts.ejs +71 -0
  380. package/hedhog/frontend/app/_lib/hooks/use-impersonation-access.ts.ejs +32 -0
  381. package/hedhog/frontend/app/access-log/page.tsx.ejs +96 -22
  382. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +17 -1
  383. package/hedhog/frontend/app/account/components/known-devices.tsx.ejs +89 -0
  384. package/hedhog/frontend/app/account/components/profile-form.tsx.ejs +2 -1
  385. package/hedhog/frontend/app/account/components/user-devices-list.tsx.ejs +186 -0
  386. package/hedhog/frontend/app/account/devices/page.tsx.ejs +5 -0
  387. package/hedhog/frontend/app/account/layout.tsx.ejs +2 -0
  388. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +298 -0
  389. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +376 -1236
  390. package/hedhog/frontend/app/mail/log/page.tsx.ejs +210 -3
  391. package/hedhog/frontend/app/mail/template/page.tsx.ejs +190 -132
  392. package/hedhog/frontend/app/users/active-session.tsx.ejs +58 -11
  393. package/hedhog/frontend/app/users/page.tsx.ejs +69 -10
  394. package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +202 -0
  395. package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +170 -0
  396. package/hedhog/frontend/app/users/user-activity-timeline.tsx.ejs +19 -0
  397. package/hedhog/frontend/app/users/user-devices.tsx.ejs +89 -0
  398. package/hedhog/frontend/app/users/user-logs.tsx.ejs +13 -1
  399. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +46 -24
  400. package/hedhog/frontend/messages/en.json +146 -48
  401. package/hedhog/frontend/messages/pt.json +146 -48
  402. package/hedhog/table/access_log.yaml +7 -0
  403. package/hedhog/table/file.yaml +8 -0
  404. package/hedhog/table/mail_delivery_event.yaml +76 -0
  405. package/hedhog/table/mail_sent.yaml +23 -0
  406. package/hedhog/table/user_activity.yaml +9 -0
  407. package/hedhog/table/user_device.yaml +52 -0
  408. package/hedhog/table/user_session.yaml +20 -1
  409. package/package.json +6 -5
  410. package/src/access-log/access-log.controller.ts +1 -0
  411. package/src/access-log/access-log.interceptor.ts +5 -1
  412. package/src/access-log/access-log.service.spec.ts +33 -2
  413. package/src/access-log/access-log.service.ts +38 -0
  414. package/src/access-log/dto/query-access-log.dto.ts +5 -0
  415. package/src/ai/ai.controller.ts +9 -0
  416. package/src/ai/ai.module.ts +3 -2
  417. package/src/ai/ai.service.ts +150 -13
  418. package/src/ai/dto/richtext-edit-html.dto.ts +11 -0
  419. package/src/ai/richtext-ai.prompts.ts +57 -0
  420. package/src/ai/richtext-ai.service.ts +109 -0
  421. package/src/auth/auth.controller.ts +47 -8
  422. package/src/auth/auth.module.ts +2 -0
  423. package/src/auth/auth.service.spec.ts +383 -6
  424. package/src/auth/auth.service.ts +345 -56
  425. package/src/auth/dto/confirm-email.dto.ts +7 -0
  426. package/src/auth/dto/resend-confirmation.dto.ts +20 -0
  427. package/src/authorize/authorize.controller.ts +2 -0
  428. package/src/authorize/authorize.service.spec.ts +23 -0
  429. package/src/authorize/authorize.service.ts +8 -0
  430. package/src/challenge/challenge.service.spec.ts +73 -0
  431. package/src/challenge/challenge.service.ts +62 -3
  432. package/src/core.module.ts +19 -0
  433. package/src/file/file.controller.ts +54 -4
  434. package/src/file/file.service.spec.ts +275 -105
  435. package/src/file/file.service.ts +409 -14
  436. package/src/file/image-optimization.service.spec.ts +92 -0
  437. package/src/file/image-optimization.service.ts +202 -0
  438. package/src/file/provider/abstract.provider.ts +23 -0
  439. package/src/file/provider/gcs.provider.ts +17 -0
  440. package/src/file/provider/local.provider.ts +21 -0
  441. package/src/file/provider/s3.provider.ts +25 -0
  442. package/src/file/provider/spaces.provider.ts +26 -0
  443. package/src/impersonation/dto/redeem-impersonation.dto.ts +8 -0
  444. package/src/impersonation/dto/start-impersonation.dto.ts +13 -0
  445. package/src/impersonation/impersonation-restrictions.ts +84 -0
  446. package/src/impersonation/impersonation.controller.ts +109 -0
  447. package/src/impersonation/impersonation.module.ts +31 -0
  448. package/src/impersonation/impersonation.service.spec.ts +427 -0
  449. package/src/impersonation/impersonation.service.ts +577 -0
  450. package/src/index.ts +21 -0
  451. package/src/integration/services/outbox-polling.coordinator.spec.ts +90 -0
  452. package/src/integration/services/outbox-polling.coordinator.ts +62 -40
  453. package/src/integration/services/outbox.service.spec.ts +8 -0
  454. package/src/integration/services/outbox.service.ts +19 -13
  455. package/src/integration-profile/integration-profile.secrets.ts +3 -0
  456. package/src/integration-profile/integration-profile.utils.ts +38 -0
  457. package/src/integration-profile/testers/email.testers.ts +34 -1
  458. package/src/language/en.json +11 -0
  459. package/src/language/pt.json +11 -0
  460. package/src/mail/dto/send.dto.ts +46 -2
  461. package/src/mail/mail-template.spec.ts +79 -2
  462. package/src/mail/mail.module.ts +2 -0
  463. package/src/mail/mail.service.spec.ts +307 -6
  464. package/src/mail/mail.service.ts +227 -30
  465. package/src/mail-delivery/mail-delivery-provision.service.ts +66 -0
  466. package/src/mail-delivery/mail-delivery.constants.ts +31 -0
  467. package/src/mail-delivery/mail-delivery.controller.ts +38 -0
  468. package/src/mail-delivery/mail-delivery.module.ts +23 -0
  469. package/src/mail-delivery/mail-delivery.service.spec.ts +136 -0
  470. package/src/mail-delivery/mail-delivery.service.ts +152 -0
  471. package/src/mail-delivery/ses-event.parser.spec.ts +140 -0
  472. package/src/mail-delivery/ses-event.parser.ts +191 -0
  473. package/src/mail-delivery/ses-webhook.service.spec.ts +170 -0
  474. package/src/mail-delivery/ses-webhook.service.ts +240 -0
  475. package/src/mail-delivery/sns-message.util.spec.ts +163 -0
  476. package/src/mail-delivery/sns-message.util.ts +125 -0
  477. package/src/mail-sent/dto/query-mail-sent-list.dto.ts +15 -0
  478. package/src/mail-sent/mail-sent.service.ts +46 -2
  479. package/src/mailbox/mailbox-fetcher.registry.ts +132 -0
  480. package/src/mailbox/mailbox.module.ts +14 -0
  481. package/src/meeting/meeting-provider.registry.ts +193 -0
  482. package/src/meeting/meeting.constants.ts +53 -0
  483. package/src/meeting/meeting.module.ts +13 -0
  484. package/src/middlewares/locale-injection.middleware.ts +25 -6
  485. package/src/oauth/providers/google.provider.ts +49 -15
  486. package/src/observability/monitored-cron.spec.ts +102 -0
  487. package/src/observability/monitored-cron.ts +110 -0
  488. package/src/pairing/dto/approve-reverse-pairing.dto.ts +20 -0
  489. package/src/pairing/dto/claim-pairing.dto.ts +19 -0
  490. package/src/pairing/dto/confirm-pairing.dto.ts +14 -0
  491. package/src/pairing/dto/poll-reverse-pairing.dto.ts +9 -0
  492. package/src/pairing/dto/start-pairing.dto.ts +19 -0
  493. package/src/pairing/dto/start-reverse-pairing.dto.ts +45 -0
  494. package/src/pairing/pairing.controller.ts +246 -0
  495. package/src/pairing/pairing.module.ts +27 -0
  496. package/src/pairing/pairing.service.spec.ts +462 -0
  497. package/src/pairing/pairing.service.ts +614 -0
  498. package/src/pdf/pdf.service.ts +6 -24
  499. package/src/profile/profile.service.ts +26 -8
  500. package/src/redis/redis-pubsub.ts +11 -0
  501. package/src/role/guards/role.guard.spec.ts +75 -0
  502. package/src/role/guards/role.guard.ts +64 -46
  503. package/src/session/session.service.spec.ts +81 -0
  504. package/src/session/session.service.ts +93 -6
  505. package/src/setting/brand-asset.service.ts +137 -0
  506. package/src/setting/setting.module.ts +3 -2
  507. package/src/setting/setting.service.spec.ts +79 -1
  508. package/src/setting/setting.service.ts +109 -1
  509. package/src/token/token.service.spec.ts +62 -0
  510. package/src/token/token.service.ts +57 -3
  511. package/src/user/user.service.spec.ts +33 -2
  512. package/src/user/user.service.ts +108 -6
  513. package/src/user-device/user-device.controller.ts +77 -0
  514. package/src/user-device/user-device.module.ts +13 -0
  515. package/src/user-device/user-device.service.spec.ts +234 -0
  516. package/src/user-device/user-device.service.ts +168 -0
  517. package/src/utils/device-key.spec.ts +57 -0
  518. package/src/utils/device-key.ts +32 -0
  519. package/src/utils/geo-ip.spec.ts +134 -0
  520. package/src/utils/geo-ip.ts +93 -0
  521. package/src/utils/locale-context.spec.ts +27 -1
  522. package/src/utils/locale-context.ts +15 -12
  523. package/src/utils/security-event-vars.spec.ts +161 -0
  524. package/src/utils/security-event-vars.ts +153 -0
  525. package/src/utils/user-agent.spec.ts +37 -0
  526. package/src/utils/user-agent.ts +46 -0
  527. package/src/webhook-integration/webhook-integration.service.ts +57 -3
  528. 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,7 @@
1
+ /**
2
+ * Porta genérica de reuniões online. Só carrega o registro — a implementação vem
3
+ * de quem se registrar no boot (hoje a library `microsoft`, com a chave `teams`).
4
+ */
5
+ export declare class MeetingModule {
6
+ }
7
+ //# sourceMappingURL=meeting.module.d.ts.map
@@ -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":"AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG1D,qBACa,yBAA0B,YAAW,cAAc;IAC9D,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;CAQpD"}
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
- const locale_context_1 = require("../utils/locale-context");
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
- const acceptLanguage = req.headers['accept-language'] || 'en';
15
- const locale = acceptLanguage.split(',')[0].split('-')[0];
16
- locale_context_1.localeStorage.run({ locale }, () => {
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,2CAA4D;AAE5D,4DAAwD;AAGjD,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QACjD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;QAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1D,8BAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE;YACjC,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AATY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CASrC"}
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;IAKjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHvB,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;YAqCrD,+BAA+B;CA+B9C"}
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 url = 'https://people.googleapis.com/v1/people/me?personFields=genders,birthdays';
88
- const res = await fetch(url, {
89
- headers: {
90
- Authorization: `Bearer ${accessToken}`,
91
- },
92
- });
93
- if (!res.ok) {
94
- throw new Error(`Google People API error: ${res.statusText}`);
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
- exports.GoogleProvider = GoogleProvider = __decorate([
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":"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"}
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