@hed-hog/core 0.0.390 → 0.0.394

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
@@ -5,27 +5,27 @@
5
5
  body:
6
6
  en: |
7
7
  Hello {{name}},<br>
8
- Thank you for signing up for a {{brandName}} account!
9
- To complete your registration, please confirm your email address
10
- by using the code below:<br>
11
- Confirmation Code: {{code}}<br>
8
+ Thank you for signing up for a {{brandName}} account!
9
+ Your account is ready — just confirm your email address
10
+ using the link below:<br>
11
+ Confirmation Link: <a href="{{link}}">{{link}}</a><br>
12
12
  If you did not sign up for a {{brandName}} account, please ignore this email.<br>
13
13
  Best regards,<br>
14
14
  The {{brandName}} Team
15
15
  pt: |
16
16
  Olá {{name}},<br>
17
- Obrigado por se inscrever para uma conta {{brandName}}!
18
- Para completar seu registro, por favor confirme seu endereço de e-mail
19
- usando o código abaixo:<br>
20
- Código de Confirmação: {{code}}<br>
21
- Se você não se inscreveu para uma conta {{brandName}},
17
+ Obrigado por se inscrever para uma conta {{brandName}}!
18
+ Sua conta já está pronta — só falta confirmar seu endereço de e-mail
19
+ usando o link abaixo:<br>
20
+ Link de Confirmação: <a href="{{link}}">{{link}}</a><br>
21
+ Se você não se inscreveu para uma conta {{brandName}},
22
22
  por favor ignore este e-mail.<br>
23
23
  Atenciosamente,<br>
24
24
  A equipe {{brandName}}
25
25
  relations:
26
26
  mail_var:
27
27
  - name: name
28
- - name: code
28
+ - name: link
29
29
  - slug: auth-email-verification-code
30
30
  subject:
31
31
  en: Your verification code
@@ -49,41 +49,54 @@
49
49
  mail_var:
50
50
  - name: name
51
51
  - name: code
52
+ # O corpo abaixo usa escalar dobrado (>-) de proposito: MailService.interpolateTemplate
53
+ # troca toda quebra de linha por <br/> antes de compilar o Handlebars, entao um corpo
54
+ # em bloco literal (|) espalharia <br/> soltos no meio da tabela. Sob >- o YAML dobra
55
+ # tudo numa linha so — o que exige indentacao identica em TODAS as linhas: um espaco a
56
+ # mais transforma o resto em bloco literal e as quebras voltam.
52
57
  - slug: auth-login-new-device
53
58
  subject:
54
- en: New login from a new device
55
- pt: Novo login de um novo dispositivo
59
+ en: New sign-in from an unrecognized device
60
+ pt: Novo acesso de um dispositivo desconhecido
56
61
  body:
57
- en: |
58
- Hello {{name}},<br>
59
- We noticed a login to your {{brandName}} account from a new device.<br>
60
- Here are the details of the login:<br>
61
- • User Agent: {{userAgent}}<br>
62
- • IP Address: {{ipAddress}}<br>
63
- • Location: {{location}}<br>
64
- If this was you, no further action is needed.
65
- If you did not recognize this activity,
66
- please secure your account immediately.<br>
67
- Best regards,<br>
68
- The {{brandName}} Team
69
- pt: |
70
- Olá {{name}},<br>
71
- Notamos um login na sua conta {{brandName}} a partir de um novo dispositivo.<br>
72
- Aqui estão os detalhes do login:<br>
73
- • Agente do Usuário: {{userAgent}}<br>
74
- • Endereço IP: {{ipAddress}}<br>
75
- • Localização: {{location}}<br>
76
- Se foi você, nenhuma ação adicional é necessária.
77
- Se você não reconheceu esta atividade,
78
- por favor, proteja sua conta imediatamente.<br>
79
- Atenciosamente,<br>
80
- A equipe {{brandName}}
62
+ en: >-
63
+ <p style="margin:0 0 16px;">Hello {{name}},</p>
64
+ <p style="margin:0 0 20px;">We detected a sign-in to your {{brandName}} account from a device we have not seen before.</p>
65
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;margin:0 0 20px;"><tr><td style="padding:12px 20px;"><table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;">
66
+ {{#if datetime}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Date and time</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{datetime}}</td></tr>{{/if}}
67
+ {{#if browser}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Browser</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{browser}}</td></tr>{{/if}}
68
+ {{#if os}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">System</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{os}}</td></tr>{{/if}}
69
+ {{#unless browser}}{{#unless os}}{{#if userAgent}}<tr><td colspan="2" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Device<br /><span style="font-size:13px;line-height:1.5;color:#334155;word-break:break-all;">{{userAgent}}</span></td></tr>{{/if}}{{/unless}}{{/unless}}
70
+ {{#if location}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Location</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{countryFlag}} {{location}}</td></tr>{{/if}}
71
+ {{#if ipAddress}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">IP address</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{ipAddress}}</td></tr>{{/if}}
72
+ </table></td></tr></table>
73
+ <p style="margin:0 0 16px;">If this was you, there is nothing else to do.</p>
74
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;margin:0 0 20px;"><tr><td style="padding:12px 16px;background:#fef2f2;border-left:4px solid #dc2626;font-size:15px;line-height:1.6;color:#7f1d1d;"><strong style="color:#7f1d1d;">If you do not recognize this sign-in</strong>, change your password right away and review the active sessions on your account.</td></tr></table>
75
+ <p style="margin:0;">Best regards,<br />The {{brandName}} Team</p>
76
+ pt: >-
77
+ <p style="margin:0 0 16px;">Olá {{name}},</p>
78
+ <p style="margin:0 0 20px;">Detectamos um acesso à sua conta {{brandName}} a partir de um dispositivo que ainda não conhecíamos.</p>
79
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;margin:0 0 20px;"><tr><td style="padding:12px 20px;"><table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;">
80
+ {{#if datetime}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Data e hora</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{datetime}}</td></tr>{{/if}}
81
+ {{#if browser}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Navegador</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{browser}}</td></tr>{{/if}}
82
+ {{#if os}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Sistema</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{os}}</td></tr>{{/if}}
83
+ {{#unless browser}}{{#unless os}}{{#if userAgent}}<tr><td colspan="2" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Dispositivo<br /><span style="font-size:13px;line-height:1.5;color:#334155;word-break:break-all;">{{userAgent}}</span></td></tr>{{/if}}{{/unless}}{{/unless}}
84
+ {{#if location}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Localização</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{countryFlag}} {{location}}</td></tr>{{/if}}
85
+ {{#if ipAddress}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Endereço IP</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{ipAddress}}</td></tr>{{/if}}
86
+ </table></td></tr></table>
87
+ <p style="margin:0 0 16px;">Se foi você, não é preciso fazer nada.</p>
88
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;margin:0 0 20px;"><tr><td style="padding:12px 16px;background:#fef2f2;border-left:4px solid #dc2626;font-size:15px;line-height:1.6;color:#7f1d1d;"><strong style="color:#7f1d1d;">Se você não reconhece este acesso</strong>, altere sua senha imediatamente e revise as sessões ativas da sua conta.</td></tr></table>
89
+ <p style="margin:0;">Atenciosamente,<br />A equipe {{brandName}}</p>
81
90
  relations:
82
91
  mail_var:
92
+ - name: name
93
+ - name: datetime
94
+ - name: browser
95
+ - name: os
83
96
  - name: userAgent
84
- - name: ipAddress
85
97
  - name: location
86
- - name: name
98
+ - name: countryFlag
99
+ - name: ipAddress
87
100
  - slug: auth-forget-password
88
101
  subject:
89
102
  en: Reset your {{brandName}} password
@@ -132,39 +145,50 @@
132
145
  relations:
133
146
  mail_var:
134
147
  - name: name
148
+ # Mesmo cartao de detalhes do auth-login-new-device — ver a nota sobre >- la em cima.
135
149
  - slug: auth-change-password-notification
136
150
  subject:
137
151
  en: Your {{brandName}} password has been changed
138
152
  pt: Sua senha do {{brandName}} foi alterada
139
153
  body:
140
- en: |
141
- Hello {{name}},<br>
142
- We wanted to inform you that the password for your {{brandName}} account
143
- has been changed. If you did not make this change,
144
- please secure your account immediately.<br>
145
- Here are the details of the login:<br>
146
- • User Agent: {{userAgent}}<br>
147
- • IP Address: {{ipAddress}}<br>
148
- • Location: {{location}}<br>
149
- Best regards,<br>
150
- The {{brandName}} Team
151
- pt: |
152
- Olá {{name}},<br>
153
- Queríamos informar que a senha da sua conta {{brandName}} foi alterada.
154
- Se você não fez essa alteração,
155
- por favor proteja sua conta imediatamente.<br>
156
- Aqui estão os detalhes do login:<br>
157
- • Agente do Usuário: {{userAgent}}<br>
158
- • Endereço IP: {{ipAddress}}<br>
159
- • Localização: {{location}}<br>
160
- Atenciosamente,<br>
161
- A equipe {{brandName}}
154
+ en: >-
155
+ <p style="margin:0 0 16px;">Hello {{name}},</p>
156
+ <p style="margin:0 0 20px;">The password for your {{brandName}} account has just been changed.</p>
157
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;margin:0 0 20px;"><tr><td style="padding:12px 20px;"><table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;">
158
+ {{#if datetime}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Date and time</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{datetime}}</td></tr>{{/if}}
159
+ {{#if browser}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Browser</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{browser}}</td></tr>{{/if}}
160
+ {{#if os}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">System</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{os}}</td></tr>{{/if}}
161
+ {{#unless browser}}{{#unless os}}{{#if userAgent}}<tr><td colspan="2" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Device<br /><span style="font-size:13px;line-height:1.5;color:#334155;word-break:break-all;">{{userAgent}}</span></td></tr>{{/if}}{{/unless}}{{/unless}}
162
+ {{#if location}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Location</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{countryFlag}} {{location}}</td></tr>{{/if}}
163
+ {{#if ipAddress}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">IP address</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{ipAddress}}</td></tr>{{/if}}
164
+ </table></td></tr></table>
165
+ <p style="margin:0 0 16px;">If this was you, there is nothing else to do.</p>
166
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;margin:0 0 20px;"><tr><td style="padding:12px 16px;background:#fef2f2;border-left:4px solid #dc2626;font-size:15px;line-height:1.6;color:#7f1d1d;"><strong style="color:#7f1d1d;">If you did not make this change</strong>, reset your password immediately and contact support.</td></tr></table>
167
+ <p style="margin:0;">Best regards,<br />The {{brandName}} Team</p>
168
+ pt: >-
169
+ <p style="margin:0 0 16px;">Olá {{name}},</p>
170
+ <p style="margin:0 0 20px;">A senha da sua conta {{brandName}} acabou de ser alterada.</p>
171
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;margin:0 0 20px;"><tr><td style="padding:12px 20px;"><table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;">
172
+ {{#if datetime}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Data e hora</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{datetime}}</td></tr>{{/if}}
173
+ {{#if browser}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Navegador</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{browser}}</td></tr>{{/if}}
174
+ {{#if os}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Sistema</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{os}}</td></tr>{{/if}}
175
+ {{#unless browser}}{{#unless os}}{{#if userAgent}}<tr><td colspan="2" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Dispositivo<br /><span style="font-size:13px;line-height:1.5;color:#334155;word-break:break-all;">{{userAgent}}</span></td></tr>{{/if}}{{/unless}}{{/unless}}
176
+ {{#if location}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Localização</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{countryFlag}} {{location}}</td></tr>{{/if}}
177
+ {{#if ipAddress}}<tr><td width="40%" valign="top" style="padding:7px 0;font-size:13px;line-height:1.5;color:#64748b;">Endereço IP</td><td valign="top" align="right" style="padding:7px 0 7px 16px;font-size:15px;line-height:1.5;color:#0f172a;font-weight:600;">{{ipAddress}}</td></tr>{{/if}}
178
+ </table></td></tr></table>
179
+ <p style="margin:0 0 16px;">Se foi você, não é preciso fazer nada.</p>
180
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="width:100%;border-collapse:collapse;margin:0 0 20px;"><tr><td style="padding:12px 16px;background:#fef2f2;border-left:4px solid #dc2626;font-size:15px;line-height:1.6;color:#7f1d1d;"><strong style="color:#7f1d1d;">Se você não fez esta alteração</strong>, redefina sua senha imediatamente e entre em contato com o suporte.</td></tr></table>
181
+ <p style="margin:0;">Atenciosamente,<br />A equipe {{brandName}}</p>
162
182
  relations:
163
183
  mail_var:
184
+ - name: name
185
+ - name: datetime
186
+ - name: browser
187
+ - name: os
164
188
  - name: userAgent
165
- - name: ipAddress
166
189
  - name: location
167
- - name: name
190
+ - name: countryFlag
191
+ - name: ipAddress
168
192
  - slug: auth-mfa-code
169
193
  subject:
170
194
  en: Your {{brandName}} MFA Code
@@ -537,3 +561,115 @@
537
561
  mail_var:
538
562
  - name: name
539
563
  - name: company
564
+
565
+ - slug: brclick-inscricao-confirmacao
566
+ subject:
567
+ en: BRClick registration confirmed — protocol {{protocolo}}
568
+ pt: Inscrição confirmada no BRClick — protocolo {{protocolo}}
569
+ body:
570
+ en: |
571
+ Hello {{name}},<br>
572
+ Your <strong>BRClick</strong> registration has been recorded.<br>
573
+ Protocol: <strong>{{protocolo}}</strong><br>
574
+ <br>
575
+ You are enrolled in:<br>
576
+ {{{turmas}}}
577
+ {{#if hasWaitlist}}
578
+ <br>
579
+ <strong style="color:#9c7a00;">Waiting list:</strong> these classes are full, so you are on the waiting list for:<br>
580
+ {{{turmasEspera}}}
581
+ If someone drops out, we will email you about the open spot.<br>
582
+ {{/if}}
583
+ {{#if hasUnavailable}}
584
+ <br>
585
+ <strong style="color:#b3261e;">Heads up:</strong> we could not confirm your spot in:<br>
586
+ {{{turmasIndisponiveis}}}
587
+ Our team will reach out to sort this out.<br>
588
+ {{/if}}
589
+ {{#if hasAccount}}
590
+ {{#if emailLinkSent}}
591
+ You already had an account on the training platform, but no password yet. We sent you a separate email with the link to set one.<br>
592
+ {{else}}
593
+ You already have an account on the training platform — sign in with your usual password to see your classes.<br>
594
+ Sign in: <a href="{{link}}">{{link}}</a><br>
595
+ {{/if}}
596
+ {{else}}
597
+ Your training platform account was created with the password you chose in the form.<br>
598
+ Sign in: <a href="{{link}}">{{link}}</a><br>
599
+ {{/if}}
600
+ <br>
601
+ <strong>Meanwhile, you can already get started:</strong><br>
602
+ 1. Sign in to Hcode Training with the email and password from the form.<br>
603
+ 2. {{#if logicCourseEnrolled}}You are already enrolled in the <strong>Programming Logic</strong> course — it's the prerequisite for the live classes, and the best place to start.{{else}}We are granting your access to the <strong>Programming Logic</strong> course, the prerequisite for the live classes; if it doesn't show up on your dashboard within a few hours, just reply to this email.{{/if}}<br>
604
+ 3. Click the button below to start right now.<br>
605
+ <br>
606
+ <table role="presentation" cellspacing="0" cellpadding="0" border="0" style="width:100%;max-width:320px;">
607
+ <tr>
608
+ <td align="center" bgcolor="#1465b8" style="border-radius:10px;">
609
+ <a href="{{logicCourseUrl}}" target="_blank" style="display:block; padding:14px 20px; font-size:16px; line-height:1.1; font-weight:700; color:#ffffff; text-decoration:none;">🎓 &nbsp; Go to the Logic course</a>
610
+ </td>
611
+ </tr>
612
+ </table>
613
+ <br>
614
+ Best regards,<br>
615
+ The Hcode Team
616
+ pt: |
617
+ Olá {{name}},<br>
618
+ Sua inscrição no <strong>BRClick</strong> foi registrada.<br>
619
+ Protocolo: <strong>{{protocolo}}</strong><br>
620
+ <br>
621
+ Você está matriculado em:<br>
622
+ {{{turmas}}}
623
+ {{#if hasWaitlist}}
624
+ <br>
625
+ <strong style="color:#9c7a00;">Lista de espera:</strong> estas turmas já estão cheias, então você entrou na lista de espera de:<br>
626
+ {{{turmasEspera}}}
627
+ Se alguém desistir, avisamos você por e-mail sobre a vaga.<br>
628
+ {{/if}}
629
+ {{#if hasUnavailable}}
630
+ <br>
631
+ <strong style="color:#b3261e;">Atenção:</strong> não conseguimos confirmar sua vaga em:<br>
632
+ {{{turmasIndisponiveis}}}
633
+ Nossa equipe vai entrar em contato para resolver isso.<br>
634
+ {{/if}}
635
+ {{#if hasAccount}}
636
+ {{#if emailLinkSent}}
637
+ Você já tinha uma conta na plataforma de treinamentos, mas ainda sem senha. Enviamos um e-mail separado com o link para você defini-la.<br>
638
+ {{else}}
639
+ Você já tem conta na plataforma de treinamentos — entre com a sua senha de sempre para ver as aulas.<br>
640
+ Acessar: <a href="{{link}}">{{link}}</a><br>
641
+ {{/if}}
642
+ {{else}}
643
+ Sua conta na plataforma de treinamentos foi criada com a senha que você definiu no formulário.<br>
644
+ Acessar: <a href="{{link}}">{{link}}</a><br>
645
+ {{/if}}
646
+ <br>
647
+ <strong>Enquanto isso, já dá pra começar:</strong><br>
648
+ 1. Entre no Hcode Training com o e-mail e a senha do cadastro.<br>
649
+ 2. {{#if logicCourseEnrolled}}Você já está matriculado no curso <strong>Lógica de Programação</strong> — é o pré-requisito das turmas, e é por aí que vale começar.{{else}}Estamos liberando seu acesso ao curso <strong>Lógica de Programação</strong>, o pré-requisito das turmas; se não aparecer no seu painel em algumas horas, responda este e-mail.{{/if}}<br>
650
+ 3. Clique no botão abaixo para começar agora mesmo.<br>
651
+ <br>
652
+ <table role="presentation" cellspacing="0" cellpadding="0" border="0" style="width:100%;max-width:320px;">
653
+ <tr>
654
+ <td align="center" bgcolor="#1465b8" style="border-radius:10px;">
655
+ <a href="{{logicCourseUrl}}" target="_blank" style="display:block; padding:14px 20px; font-size:16px; line-height:1.1; font-weight:700; color:#ffffff; text-decoration:none;">🎓 &nbsp; Acessar o curso de Lógica</a>
656
+ </td>
657
+ </tr>
658
+ </table>
659
+ <br>
660
+ Atenciosamente,<br>
661
+ A equipe Hcode
662
+ relations:
663
+ mail_var:
664
+ - name: name
665
+ - name: protocolo
666
+ - name: turmas
667
+ - name: link
668
+ - name: hasAccount
669
+ - name: emailLinkSent
670
+ - name: hasWaitlist
671
+ - name: turmasEspera
672
+ - name: hasUnavailable
673
+ - name: turmasIndisponiveis
674
+ - name: logicCourseUrl
675
+ - name: logicCourseEnrolled
@@ -1,7 +1,10 @@
1
1
  - slug: default
2
2
  is_default: true
3
3
  # Shell que estava hardcoded em packages/api-mail/src/mail-template.ts.
4
- # Tokens: {{{header}}} {{{content}}} {{{footer}}} {{subject}} {{brandName}} {{year}} {{lang}}
4
+ # Tokens: {{{header}}} {{{content}}} {{{footer}}} {{subject}} {{brandName}} {{{brandMark}}}
5
+ # {{primaryColor}} {{primaryForeground}} {{year}} {{lang}}
6
+ # brandMark/primaryColor/primaryForeground vem das settings image-url, theme-primary-light
7
+ # e theme-primary-foreground-light (ver MailService.resolveLayout em packages/api-mail).
5
8
  wrapper: |
6
9
  <!DOCTYPE html>
7
10
  <html lang="{{lang}}">
@@ -15,7 +18,7 @@
15
18
  body {
16
19
  margin: 0;
17
20
  padding: 0;
18
- background: #eef2f7;
21
+ background: #ffffff;
19
22
  color: #1f2937;
20
23
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
21
24
  }
@@ -24,9 +27,7 @@
24
27
  }
25
28
  .page {
26
29
  width: 100%;
27
- background:
28
- radial-gradient(circle at top, rgba(245, 158, 11, 0.14), transparent 32%),
29
- linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);
30
+ background: #ffffff;
30
31
  padding: 32px 16px;
31
32
  }
32
33
  .shell {
@@ -37,12 +38,21 @@
37
38
  .hero {
38
39
  padding: 0 0 18px;
39
40
  }
41
+ .brand-mark {
42
+ margin: 0 0 16px;
43
+ }
44
+ .brand-mark img {
45
+ display: block;
46
+ height: 32px;
47
+ max-height: 32px;
48
+ width: auto;
49
+ }
40
50
  .brand {
41
51
  display: inline-block;
42
52
  padding: 8px 14px;
43
53
  border-radius: 999px;
44
- background: #111827;
45
- color: #ffffff;
54
+ background: {{primaryColor}};
55
+ color: {{primaryForeground}};
46
56
  font-size: 12px;
47
57
  font-weight: 700;
48
58
  letter-spacing: 0.08em;
@@ -50,24 +60,23 @@
50
60
  }
51
61
  .subject {
52
62
  margin: 18px 0 0;
53
- font-size: 28px;
54
- line-height: 1.2;
55
- font-weight: 800;
63
+ font-size: 24px;
64
+ line-height: 1.3;
65
+ font-weight: 700;
56
66
  color: #0f172a;
57
67
  }
58
68
  .panel {
59
69
  background: #ffffff;
60
- border: 1px solid rgba(148, 163, 184, 0.22);
61
- border-radius: 24px;
70
+ border: 1px solid #e2e8f0;
71
+ border-radius: 12px;
62
72
  overflow: hidden;
63
- box-shadow: 0 24px 60px rgba(15, 23, 42, 0.08);
64
73
  }
65
74
  .panel-accent {
66
- height: 6px;
67
- background: linear-gradient(90deg, #f59e0b 0%, #f97316 45%, #ea580c 100%);
75
+ height: 4px;
76
+ background: {{primaryColor}};
68
77
  }
69
78
  .content {
70
- padding: 36px 34px 28px;
79
+ padding: 32px 34px 28px;
71
80
  font-size: 16px;
72
81
  line-height: 1.7;
73
82
  color: #334155;
@@ -76,12 +85,13 @@
76
85
  .content h2,
77
86
  .content h3 {
78
87
  margin: 0 0 16px;
79
- line-height: 1.25;
88
+ line-height: 1.3;
89
+ font-weight: 700;
80
90
  color: #0f172a;
81
91
  }
82
- .content h1 { font-size: 28px; }
83
- .content h2 { font-size: 22px; }
84
- .content h3 { font-size: 18px; }
92
+ .content h1 { font-size: 24px; }
93
+ .content h2 { font-size: 20px; }
94
+ .content h3 { font-size: 17px; }
85
95
  .content p,
86
96
  .content ul,
87
97
  .content ol,
@@ -96,7 +106,7 @@
96
106
  margin-top: 8px;
97
107
  }
98
108
  .content a {
99
- color: #c2410c;
109
+ color: {{primaryColor}};
100
110
  font-weight: 600;
101
111
  text-decoration: none;
102
112
  }
@@ -105,10 +115,10 @@
105
115
  }
106
116
  .content blockquote {
107
117
  padding: 14px 16px;
108
- border-left: 4px solid #f59e0b;
109
- border-radius: 0 14px 14px 0;
110
- background: #fff7ed;
111
- color: #7c2d12;
118
+ border-left: 3px solid {{primaryColor}};
119
+ border-radius: 0 8px 8px 0;
120
+ background: #f8fafc;
121
+ color: #334155;
112
122
  }
113
123
  .content hr {
114
124
  margin: 24px 0;
@@ -117,24 +127,24 @@
117
127
  }
118
128
  .content img {
119
129
  max-width: 100%;
120
- border-radius: 16px;
130
+ border-radius: 8px;
121
131
  }
122
132
  .footer {
123
- padding: 18px 12px 0;
133
+ padding: 24px 12px 0;
124
134
  font-size: 12px;
125
135
  line-height: 1.6;
126
136
  text-align: center;
127
- color: #64748b;
137
+ color: #94a3b8;
128
138
  }
129
139
  @media only screen and (max-width: 640px) {
130
140
  .page {
131
141
  padding: 20px 12px;
132
142
  }
133
143
  .subject {
134
- font-size: 24px;
144
+ font-size: 21px;
135
145
  }
136
146
  .content {
137
- padding: 26px 20px 22px;
147
+ padding: 24px 20px 22px;
138
148
  font-size: 15px;
139
149
  }
140
150
  }
@@ -153,7 +163,7 @@
153
163
  <tr>
154
164
  <td>
155
165
  <div class="panel">
156
- <div class="panel-accent"></div>
166
+ <div class="panel-accent" style="background:{{primaryColor}};"></div>
157
167
  <div class="content">
158
168
  {{{content}}}
159
169
  </div>
@@ -176,10 +186,10 @@
176
186
  pt: Layout padrão
177
187
  header:
178
188
  en: |
179
- <div class="brand">{{brandName}}</div>
189
+ <div class="brand-mark">{{{brandMark}}}</div>
180
190
  <div class="subject">{{subject}}</div>
181
191
  pt: |
182
- <div class="brand">{{brandName}}</div>
192
+ <div class="brand-mark">{{{brandMark}}}</div>
183
193
  <div class="subject">{{subject}}</div>
184
194
  footer:
185
195
  en: |
@@ -294,6 +294,8 @@
294
294
  slug: admin
295
295
  - where:
296
296
  slug: admin-user
297
+ - where:
298
+ slug: admin-impersonation
297
299
 
298
300
  - url: /core/mcp_chat
299
301
  order: 8
@@ -19,6 +19,13 @@
19
19
  description:
20
20
  en: Access to administrative privileges related to users.
21
21
  pt: Acesso a privilégios administrativos relacionados á usuários.
22
+ - slug: admin-user-permission
23
+ name:
24
+ en: User Permission Administrator
25
+ pt: Administrador de Permissões de Usuário
26
+ description:
27
+ en: Can assign and remove roles from users.
28
+ pt: Pode atribuir e remover papéis de usuários.
22
29
  - slug: admin-mail
23
30
  name:
24
31
  en: Admin Mail
@@ -47,4 +54,13 @@
47
54
  description:
48
55
  en: Access to manage integration profiles and their credentials.
49
56
  pt: Acesso para gerenciar perfis de integração e suas credenciais.
57
+ # O slug precisa começar com "admin": o GuardPage do painel só deixa entrar quem
58
+ # tem algum papel com esse prefixo.
59
+ - slug: admin-impersonation
60
+ name:
61
+ en: Access Simulation
62
+ pt: Simulação de Acesso
63
+ description:
64
+ en: Can open a short, audited session as another user. Cannot target administrators.
65
+ pt: Pode abrir uma sessão curta e auditada como outro usuário. Não pode simular administradores.
50
66