@carlonicora/nestjs-neo4jsonapi 6.6.2 → 6.8.0

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 (401) hide show
  1. package/dist/agents/operator/controllers/operator.controller.d.ts.map +1 -1
  2. package/dist/agents/operator/controllers/operator.controller.js +3 -0
  3. package/dist/agents/operator/controllers/operator.controller.js.map +1 -1
  4. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  5. package/dist/bootstrap/app.module.factory.js +10 -0
  6. package/dist/bootstrap/app.module.factory.js.map +1 -1
  7. package/dist/bootstrap/bootstrap.options.d.ts +34 -0
  8. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  9. package/dist/common/constants/core-module.ids.d.ts +40 -0
  10. package/dist/common/constants/core-module.ids.d.ts.map +1 -0
  11. package/dist/common/constants/core-module.ids.js +42 -0
  12. package/dist/common/constants/core-module.ids.js.map +1 -0
  13. package/dist/common/decorators/module.decorator.d.ts +19 -0
  14. package/dist/common/decorators/module.decorator.d.ts.map +1 -1
  15. package/dist/common/decorators/module.decorator.js +8 -2
  16. package/dist/common/decorators/module.decorator.js.map +1 -1
  17. package/dist/common/guards/jwt.auth.admin.guard.d.ts +3 -1
  18. package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
  19. package/dist/common/guards/jwt.auth.admin.guard.js +8 -2
  20. package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
  21. package/dist/common/guards/jwt.auth.guard.d.ts +3 -1
  22. package/dist/common/guards/jwt.auth.guard.d.ts.map +1 -1
  23. package/dist/common/guards/jwt.auth.guard.js +8 -2
  24. package/dist/common/guards/jwt.auth.guard.js.map +1 -1
  25. package/dist/common/guards/jwt.auth.optional.guard.d.ts +3 -1
  26. package/dist/common/guards/jwt.auth.optional.guard.d.ts.map +1 -1
  27. package/dist/common/guards/jwt.auth.optional.guard.js +12 -3
  28. package/dist/common/guards/jwt.auth.optional.guard.js.map +1 -1
  29. package/dist/common/index.d.ts +1 -0
  30. package/dist/common/index.d.ts.map +1 -1
  31. package/dist/common/index.js +1 -0
  32. package/dist/common/index.js.map +1 -1
  33. package/dist/config/enums/queue.id.d.ts +1 -0
  34. package/dist/config/enums/queue.id.d.ts.map +1 -1
  35. package/dist/config/enums/queue.id.js +1 -0
  36. package/dist/config/enums/queue.id.js.map +1 -1
  37. package/dist/core/blocknote/services/blocknote.service.d.ts +25 -0
  38. package/dist/core/blocknote/services/blocknote.service.d.ts.map +1 -1
  39. package/dist/core/blocknote/services/blocknote.service.js +84 -0
  40. package/dist/core/blocknote/services/blocknote.service.js.map +1 -1
  41. package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts.map +1 -1
  42. package/dist/foundations/ai-connection/controllers/ai-connection.controller.js +4 -0
  43. package/dist/foundations/ai-connection/controllers/ai-connection.controller.js.map +1 -1
  44. package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -1
  45. package/dist/foundations/analytics/controllers/analytics.admin.controller.js +3 -0
  46. package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -1
  47. package/dist/foundations/analytics/controllers/analytics.controller.d.ts.map +1 -1
  48. package/dist/foundations/analytics/controllers/analytics.controller.js +3 -0
  49. package/dist/foundations/analytics/controllers/analytics.controller.js.map +1 -1
  50. package/dist/foundations/assistant/controllers/assistant.controller.d.ts.map +1 -1
  51. package/dist/foundations/assistant/controllers/assistant.controller.js +3 -0
  52. package/dist/foundations/assistant/controllers/assistant.controller.js.map +1 -1
  53. package/dist/foundations/assistant-action/controllers/assistant-action.controller.d.ts.map +1 -1
  54. package/dist/foundations/assistant-action/controllers/assistant-action.controller.js +3 -0
  55. package/dist/foundations/assistant-action/controllers/assistant-action.controller.js.map +1 -1
  56. package/dist/foundations/assistant-message/controllers/assistant-message.controller.d.ts.map +1 -1
  57. package/dist/foundations/assistant-message/controllers/assistant-message.controller.js +3 -0
  58. package/dist/foundations/assistant-message/controllers/assistant-message.controller.js.map +1 -1
  59. package/dist/foundations/audit/controllers/audit.controller.d.ts.map +1 -1
  60. package/dist/foundations/audit/controllers/audit.controller.js +3 -0
  61. package/dist/foundations/audit/controllers/audit.controller.js.map +1 -1
  62. package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
  63. package/dist/foundations/auth/controllers/auth.controller.js +3 -0
  64. package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
  65. package/dist/foundations/blog/blog.constants.d.ts +17 -0
  66. package/dist/foundations/blog/blog.constants.d.ts.map +1 -0
  67. package/dist/foundations/blog/blog.constants.js +17 -0
  68. package/dist/foundations/blog/blog.constants.js.map +1 -0
  69. package/dist/foundations/blog/blog.module.d.ts +28 -0
  70. package/dist/foundations/blog/blog.module.d.ts.map +1 -0
  71. package/dist/foundations/blog/blog.module.js +143 -0
  72. package/dist/foundations/blog/blog.module.js.map +1 -0
  73. package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts +17 -0
  74. package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts.map +1 -0
  75. package/dist/foundations/blog/controllers/blog-category-translation.controller.js +81 -0
  76. package/dist/foundations/blog/controllers/blog-category-translation.controller.js.map +1 -0
  77. package/dist/foundations/blog/controllers/blog-category.controller.d.ts +24 -0
  78. package/dist/foundations/blog/controllers/blog-category.controller.d.ts.map +1 -0
  79. package/dist/foundations/blog/controllers/blog-category.controller.js +125 -0
  80. package/dist/foundations/blog/controllers/blog-category.controller.js.map +1 -0
  81. package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts +17 -0
  82. package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts.map +1 -0
  83. package/dist/foundations/blog/controllers/blog-post-translation.controller.js +81 -0
  84. package/dist/foundations/blog/controllers/blog-post-translation.controller.js.map +1 -0
  85. package/dist/foundations/blog/controllers/blog-post.controller.d.ts +28 -0
  86. package/dist/foundations/blog/controllers/blog-post.controller.d.ts.map +1 -0
  87. package/dist/foundations/blog/controllers/blog-post.controller.js +157 -0
  88. package/dist/foundations/blog/controllers/blog-post.controller.js.map +1 -0
  89. package/dist/foundations/blog/controllers/blog-settings.controller.d.ts +16 -0
  90. package/dist/foundations/blog/controllers/blog-settings.controller.d.ts.map +1 -0
  91. package/dist/foundations/blog/controllers/blog-settings.controller.js +73 -0
  92. package/dist/foundations/blog/controllers/blog-settings.controller.js.map +1 -0
  93. package/dist/foundations/blog/controllers/blog.public.controller.d.ts +26 -0
  94. package/dist/foundations/blog/controllers/blog.public.controller.d.ts.map +1 -0
  95. package/dist/foundations/blog/controllers/blog.public.controller.js +117 -0
  96. package/dist/foundations/blog/controllers/blog.public.controller.js.map +1 -0
  97. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts +16 -0
  98. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts.map +1 -0
  99. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js +62 -0
  100. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js.map +1 -0
  101. package/dist/foundations/blog/dtos/blog-category.dto.d.ts +11 -0
  102. package/dist/foundations/blog/dtos/blog-category.dto.d.ts.map +1 -0
  103. package/dist/foundations/blog/dtos/blog-category.dto.js +45 -0
  104. package/dist/foundations/blog/dtos/blog-category.dto.js.map +1 -0
  105. package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts +16 -0
  106. package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts.map +1 -0
  107. package/dist/foundations/blog/dtos/blog-category.post.dto.js +68 -0
  108. package/dist/foundations/blog/dtos/blog-category.post.dto.js.map +1 -0
  109. package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts +21 -0
  110. package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts.map +1 -0
  111. package/dist/foundations/blog/dtos/blog-category.put.dto.js +76 -0
  112. package/dist/foundations/blog/dtos/blog-category.put.dto.js.map +1 -0
  113. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts +19 -0
  114. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts.map +1 -0
  115. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js +73 -0
  116. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js.map +1 -0
  117. package/dist/foundations/blog/dtos/blog-post.dto.d.ts +11 -0
  118. package/dist/foundations/blog/dtos/blog-post.dto.d.ts.map +1 -0
  119. package/dist/foundations/blog/dtos/blog-post.dto.js +45 -0
  120. package/dist/foundations/blog/dtos/blog-post.dto.js.map +1 -0
  121. package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts +27 -0
  122. package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts.map +1 -0
  123. package/dist/foundations/blog/dtos/blog-post.post.dto.js +98 -0
  124. package/dist/foundations/blog/dtos/blog-post.post.dto.js.map +1 -0
  125. package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts +30 -0
  126. package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts.map +1 -0
  127. package/dist/foundations/blog/dtos/blog-post.put.dto.js +104 -0
  128. package/dist/foundations/blog/dtos/blog-post.put.dto.js.map +1 -0
  129. package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts +14 -0
  130. package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts.map +1 -0
  131. package/dist/foundations/blog/dtos/blog-settings.put.dto.js +52 -0
  132. package/dist/foundations/blog/dtos/blog-settings.put.dto.js.map +1 -0
  133. package/dist/foundations/blog/entities/blog-category-translation.d.ts +36 -0
  134. package/dist/foundations/blog/entities/blog-category-translation.d.ts.map +1 -0
  135. package/dist/foundations/blog/entities/blog-category-translation.js +70 -0
  136. package/dist/foundations/blog/entities/blog-category-translation.js.map +1 -0
  137. package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts +3 -0
  138. package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts.map +1 -0
  139. package/dist/foundations/blog/entities/blog-category-translation.meta.js +10 -0
  140. package/dist/foundations/blog/entities/blog-category-translation.meta.js.map +1 -0
  141. package/dist/foundations/blog/entities/blog-category.d.ts +35 -0
  142. package/dist/foundations/blog/entities/blog-category.d.ts.map +1 -0
  143. package/dist/foundations/blog/entities/blog-category.js +78 -0
  144. package/dist/foundations/blog/entities/blog-category.js.map +1 -0
  145. package/dist/foundations/blog/entities/blog-category.meta.d.ts +3 -0
  146. package/dist/foundations/blog/entities/blog-category.meta.d.ts.map +1 -0
  147. package/dist/foundations/blog/entities/blog-category.meta.js +10 -0
  148. package/dist/foundations/blog/entities/blog-category.meta.js.map +1 -0
  149. package/dist/foundations/blog/entities/blog-post-translation.d.ts +43 -0
  150. package/dist/foundations/blog/entities/blog-post-translation.d.ts.map +1 -0
  151. package/dist/foundations/blog/entities/blog-post-translation.js +91 -0
  152. package/dist/foundations/blog/entities/blog-post-translation.js.map +1 -0
  153. package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts +3 -0
  154. package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts.map +1 -0
  155. package/dist/foundations/blog/entities/blog-post-translation.meta.js +10 -0
  156. package/dist/foundations/blog/entities/blog-post-translation.meta.js.map +1 -0
  157. package/dist/foundations/blog/entities/blog-post.d.ts +63 -0
  158. package/dist/foundations/blog/entities/blog-post.d.ts.map +1 -0
  159. package/dist/foundations/blog/entities/blog-post.js +149 -0
  160. package/dist/foundations/blog/entities/blog-post.js.map +1 -0
  161. package/dist/foundations/blog/entities/blog-post.meta.d.ts +3 -0
  162. package/dist/foundations/blog/entities/blog-post.meta.d.ts.map +1 -0
  163. package/dist/foundations/blog/entities/blog-post.meta.js +10 -0
  164. package/dist/foundations/blog/entities/blog-post.meta.js.map +1 -0
  165. package/dist/foundations/blog/entities/blog-settings.d.ts +18 -0
  166. package/dist/foundations/blog/entities/blog-settings.d.ts.map +1 -0
  167. package/dist/foundations/blog/entities/blog-settings.js +26 -0
  168. package/dist/foundations/blog/entities/blog-settings.js.map +1 -0
  169. package/dist/foundations/blog/entities/blog-settings.meta.d.ts +3 -0
  170. package/dist/foundations/blog/entities/blog-settings.meta.d.ts.map +1 -0
  171. package/dist/foundations/blog/entities/blog-settings.meta.js +10 -0
  172. package/dist/foundations/blog/entities/blog-settings.meta.js.map +1 -0
  173. package/dist/foundations/blog/index.d.ts +34 -0
  174. package/dist/foundations/blog/index.d.ts.map +1 -0
  175. package/dist/foundations/blog/index.js +50 -0
  176. package/dist/foundations/blog/index.js.map +1 -0
  177. package/dist/foundations/blog/interfaces/blog.config.interface.d.ts +22 -0
  178. package/dist/foundations/blog/interfaces/blog.config.interface.d.ts.map +1 -0
  179. package/dist/foundations/blog/interfaces/blog.config.interface.js +10 -0
  180. package/dist/foundations/blog/interfaces/blog.config.interface.js.map +1 -0
  181. package/dist/foundations/blog/processors/blog.processor.d.ts +77 -0
  182. package/dist/foundations/blog/processors/blog.processor.d.ts.map +1 -0
  183. package/dist/foundations/blog/processors/blog.processor.js +404 -0
  184. package/dist/foundations/blog/processors/blog.processor.js.map +1 -0
  185. package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts +6 -0
  186. package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts.map +1 -0
  187. package/dist/foundations/blog/prompts/blog-summary.prompt.js +19 -0
  188. package/dist/foundations/blog/prompts/blog-summary.prompt.js.map +1 -0
  189. package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts +7 -0
  190. package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts.map +1 -0
  191. package/dist/foundations/blog/prompts/blog-translate.prompt.js +24 -0
  192. package/dist/foundations/blog/prompts/blog-translate.prompt.js.map +1 -0
  193. package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts +78 -0
  194. package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts.map +1 -0
  195. package/dist/foundations/blog/repositories/blog-category-translation.repository.js +199 -0
  196. package/dist/foundations/blog/repositories/blog-category-translation.repository.js.map +1 -0
  197. package/dist/foundations/blog/repositories/blog-category.repository.d.ts +56 -0
  198. package/dist/foundations/blog/repositories/blog-category.repository.d.ts.map +1 -0
  199. package/dist/foundations/blog/repositories/blog-category.repository.js +166 -0
  200. package/dist/foundations/blog/repositories/blog-category.repository.js.map +1 -0
  201. package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts +88 -0
  202. package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts.map +1 -0
  203. package/dist/foundations/blog/repositories/blog-post-translation.repository.js +220 -0
  204. package/dist/foundations/blog/repositories/blog-post-translation.repository.js.map +1 -0
  205. package/dist/foundations/blog/repositories/blog-post.repository.d.ts +118 -0
  206. package/dist/foundations/blog/repositories/blog-post.repository.d.ts.map +1 -0
  207. package/dist/foundations/blog/repositories/blog-post.repository.js +350 -0
  208. package/dist/foundations/blog/repositories/blog-post.repository.js.map +1 -0
  209. package/dist/foundations/blog/repositories/blog-settings.repository.d.ts +21 -0
  210. package/dist/foundations/blog/repositories/blog-settings.repository.d.ts.map +1 -0
  211. package/dist/foundations/blog/repositories/blog-settings.repository.js +60 -0
  212. package/dist/foundations/blog/repositories/blog-settings.repository.js.map +1 -0
  213. package/dist/foundations/blog/services/blog-category-translation.service.d.ts +37 -0
  214. package/dist/foundations/blog/services/blog-category-translation.service.d.ts.map +1 -0
  215. package/dist/foundations/blog/services/blog-category-translation.service.js +97 -0
  216. package/dist/foundations/blog/services/blog-category-translation.service.js.map +1 -0
  217. package/dist/foundations/blog/services/blog-category.service.d.ts +56 -0
  218. package/dist/foundations/blog/services/blog-category.service.d.ts.map +1 -0
  219. package/dist/foundations/blog/services/blog-category.service.js +164 -0
  220. package/dist/foundations/blog/services/blog-category.service.js.map +1 -0
  221. package/dist/foundations/blog/services/blog-post-translation.service.d.ts +44 -0
  222. package/dist/foundations/blog/services/blog-post-translation.service.d.ts.map +1 -0
  223. package/dist/foundations/blog/services/blog-post-translation.service.js +115 -0
  224. package/dist/foundations/blog/services/blog-post-translation.service.js.map +1 -0
  225. package/dist/foundations/blog/services/blog-post.service.d.ts +109 -0
  226. package/dist/foundations/blog/services/blog-post.service.d.ts.map +1 -0
  227. package/dist/foundations/blog/services/blog-post.service.js +276 -0
  228. package/dist/foundations/blog/services/blog-post.service.js.map +1 -0
  229. package/dist/foundations/blog/services/blog-queue.service.d.ts +36 -0
  230. package/dist/foundations/blog/services/blog-queue.service.d.ts.map +1 -0
  231. package/dist/foundations/blog/services/blog-queue.service.js +79 -0
  232. package/dist/foundations/blog/services/blog-queue.service.js.map +1 -0
  233. package/dist/foundations/blog/services/blog-settings.service.d.ts +21 -0
  234. package/dist/foundations/blog/services/blog-settings.service.d.ts.map +1 -0
  235. package/dist/foundations/blog/services/blog-settings.service.js +49 -0
  236. package/dist/foundations/blog/services/blog-settings.service.js.map +1 -0
  237. package/dist/foundations/blog/utils/reading-time.d.ts +5 -0
  238. package/dist/foundations/blog/utils/reading-time.d.ts.map +1 -0
  239. package/dist/foundations/blog/utils/reading-time.js +12 -0
  240. package/dist/foundations/blog/utils/reading-time.js.map +1 -0
  241. package/dist/foundations/blog/utils/slug.d.ts +12 -0
  242. package/dist/foundations/blog/utils/slug.d.ts.map +1 -0
  243. package/dist/foundations/blog/utils/slug.js +36 -0
  244. package/dist/foundations/blog/utils/slug.js.map +1 -0
  245. package/dist/foundations/chunk/controllers/chunk.controller.d.ts.map +1 -1
  246. package/dist/foundations/chunk/controllers/chunk.controller.js +3 -0
  247. package/dist/foundations/chunk/controllers/chunk.controller.js.map +1 -1
  248. package/dist/foundations/company/controllers/company.controller.d.ts.map +1 -1
  249. package/dist/foundations/company/controllers/company.controller.js +3 -0
  250. package/dist/foundations/company/controllers/company.controller.js.map +1 -1
  251. package/dist/foundations/content/controllers/content.controller.d.ts.map +1 -1
  252. package/dist/foundations/content/controllers/content.controller.js +3 -0
  253. package/dist/foundations/content/controllers/content.controller.js.map +1 -1
  254. package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts.map +1 -1
  255. package/dist/foundations/email-automation/controllers/email-automation-step.controller.js +3 -0
  256. package/dist/foundations/email-automation/controllers/email-automation-step.controller.js.map +1 -1
  257. package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts.map +1 -1
  258. package/dist/foundations/email-automation/controllers/email-automation.controller.js +3 -0
  259. package/dist/foundations/email-automation/controllers/email-automation.controller.js.map +1 -1
  260. package/dist/foundations/feature/controllers/feature.controller.d.ts.map +1 -1
  261. package/dist/foundations/feature/controllers/feature.controller.js +3 -0
  262. package/dist/foundations/feature/controllers/feature.controller.js.map +1 -1
  263. package/dist/foundations/foundations.modules.d.ts +8 -0
  264. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  265. package/dist/foundations/foundations.modules.js +4 -1
  266. package/dist/foundations/foundations.modules.js.map +1 -1
  267. package/dist/foundations/handbook/controllers/handbook-thread.controller.d.ts.map +1 -1
  268. package/dist/foundations/handbook/controllers/handbook-thread.controller.js +3 -0
  269. package/dist/foundations/handbook/controllers/handbook-thread.controller.js.map +1 -1
  270. package/dist/foundations/handbook/controllers/handbook.controller.d.ts.map +1 -1
  271. package/dist/foundations/handbook/controllers/handbook.controller.js +3 -0
  272. package/dist/foundations/handbook/controllers/handbook.controller.js.map +1 -1
  273. package/dist/foundations/how-to/controllers/how-to.controller.d.ts.map +1 -1
  274. package/dist/foundations/how-to/controllers/how-to.controller.js +3 -0
  275. package/dist/foundations/how-to/controllers/how-to.controller.js.map +1 -1
  276. package/dist/foundations/index.d.ts +1 -0
  277. package/dist/foundations/index.d.ts.map +1 -1
  278. package/dist/foundations/index.js +1 -0
  279. package/dist/foundations/index.js.map +1 -1
  280. package/dist/foundations/keyconcept/controllers/keyconcept.controller.d.ts.map +1 -1
  281. package/dist/foundations/keyconcept/controllers/keyconcept.controller.js +3 -0
  282. package/dist/foundations/keyconcept/controllers/keyconcept.controller.js.map +1 -1
  283. package/dist/foundations/notification/controllers/notification.controller.d.ts.map +1 -1
  284. package/dist/foundations/notification/controllers/notification.controller.js +4 -0
  285. package/dist/foundations/notification/controllers/notification.controller.js.map +1 -1
  286. package/dist/foundations/oauth/controllers/oauth.authorize.controller.d.ts.map +1 -1
  287. package/dist/foundations/oauth/controllers/oauth.authorize.controller.js +4 -0
  288. package/dist/foundations/oauth/controllers/oauth.authorize.controller.js.map +1 -1
  289. package/dist/foundations/oauth/controllers/oauth.management.controller.d.ts.map +1 -1
  290. package/dist/foundations/oauth/controllers/oauth.management.controller.js +3 -0
  291. package/dist/foundations/oauth/controllers/oauth.management.controller.js.map +1 -1
  292. package/dist/foundations/push/controllers/push.controller.d.ts.map +1 -1
  293. package/dist/foundations/push/controllers/push.controller.js +3 -0
  294. package/dist/foundations/push/controllers/push.controller.js.map +1 -1
  295. package/dist/foundations/rbac/controllers/rbac-dev.controller.d.ts.map +1 -1
  296. package/dist/foundations/rbac/controllers/rbac-dev.controller.js +3 -0
  297. package/dist/foundations/rbac/controllers/rbac-dev.controller.js.map +1 -1
  298. package/dist/foundations/rbac/controllers/rbac-module-paths.controller.d.ts.map +1 -1
  299. package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js +3 -0
  300. package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js.map +1 -1
  301. package/dist/foundations/rbac/controllers/rbac.controller.d.ts.map +1 -1
  302. package/dist/foundations/rbac/controllers/rbac.controller.js +3 -0
  303. package/dist/foundations/rbac/controllers/rbac.controller.js.map +1 -1
  304. package/dist/foundations/rbac/index.d.ts +5 -0
  305. package/dist/foundations/rbac/index.d.ts.map +1 -1
  306. package/dist/foundations/rbac/index.js +12 -1
  307. package/dist/foundations/rbac/index.js.map +1 -1
  308. package/dist/foundations/rbac/rbac-permission.module.d.ts +4 -0
  309. package/dist/foundations/rbac/rbac-permission.module.d.ts.map +1 -1
  310. package/dist/foundations/rbac/rbac-permission.module.js +18 -2
  311. package/dist/foundations/rbac/rbac-permission.module.js.map +1 -1
  312. package/dist/foundations/rbac/rbac.tokens.d.ts +8 -0
  313. package/dist/foundations/rbac/rbac.tokens.d.ts.map +1 -1
  314. package/dist/foundations/rbac/rbac.tokens.js +9 -1
  315. package/dist/foundations/rbac/rbac.tokens.js.map +1 -1
  316. package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts +29 -1
  317. package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts.map +1 -1
  318. package/dist/foundations/rbac/repositories/rbac-permission.repository.js +73 -1
  319. package/dist/foundations/rbac/repositories/rbac-permission.repository.js.map +1 -1
  320. package/dist/foundations/rbac/services/module-permission-audit.service.d.ts +34 -0
  321. package/dist/foundations/rbac/services/module-permission-audit.service.d.ts.map +1 -0
  322. package/dist/foundations/rbac/services/module-permission-audit.service.js +137 -0
  323. package/dist/foundations/rbac/services/module-permission-audit.service.js.map +1 -0
  324. package/dist/foundations/rbac/services/module-permission.gate.d.ts +51 -0
  325. package/dist/foundations/rbac/services/module-permission.gate.d.ts.map +1 -0
  326. package/dist/foundations/rbac/services/module-permission.gate.js +108 -0
  327. package/dist/foundations/rbac/services/module-permission.gate.js.map +1 -0
  328. package/dist/foundations/rbac/services/module-permission.service.d.ts +34 -0
  329. package/dist/foundations/rbac/services/module-permission.service.d.ts.map +1 -0
  330. package/dist/foundations/rbac/services/module-permission.service.js +64 -0
  331. package/dist/foundations/rbac/services/module-permission.service.js.map +1 -0
  332. package/dist/foundations/rbac/services/rbac-permission.service.d.ts +10 -1
  333. package/dist/foundations/rbac/services/rbac-permission.service.d.ts.map +1 -1
  334. package/dist/foundations/rbac/services/rbac-permission.service.js +32 -2
  335. package/dist/foundations/rbac/services/rbac-permission.service.js.map +1 -1
  336. package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts +11 -2
  337. package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts.map +1 -1
  338. package/dist/foundations/rbac/services/rbac-reconciler.service.js +19 -6
  339. package/dist/foundations/rbac/services/rbac-reconciler.service.js.map +1 -1
  340. package/dist/foundations/referral/controllers/referral.controller.d.ts.map +1 -1
  341. package/dist/foundations/referral/controllers/referral.controller.js +3 -0
  342. package/dist/foundations/referral/controllers/referral.controller.js.map +1 -1
  343. package/dist/foundations/role/controllers/role.controller.d.ts.map +1 -1
  344. package/dist/foundations/role/controllers/role.controller.js +3 -0
  345. package/dist/foundations/role/controllers/role.controller.js.map +1 -1
  346. package/dist/foundations/role/controllers/role.user.controller.d.ts.map +1 -1
  347. package/dist/foundations/role/controllers/role.user.controller.js +3 -0
  348. package/dist/foundations/role/controllers/role.user.controller.js.map +1 -1
  349. package/dist/foundations/s3/controllers/s3.controller.d.ts.map +1 -1
  350. package/dist/foundations/s3/controllers/s3.controller.js +3 -0
  351. package/dist/foundations/s3/controllers/s3.controller.js.map +1 -1
  352. package/dist/foundations/stripe/controllers/billing.controller.d.ts.map +1 -1
  353. package/dist/foundations/stripe/controllers/billing.controller.js +4 -0
  354. package/dist/foundations/stripe/controllers/billing.controller.js.map +1 -1
  355. package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.d.ts.map +1 -1
  356. package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js +3 -0
  357. package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js.map +1 -1
  358. package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.d.ts.map +1 -1
  359. package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js +3 -0
  360. package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js.map +1 -1
  361. package/dist/foundations/stripe-price/controllers/stripe-price.controller.d.ts.map +1 -1
  362. package/dist/foundations/stripe-price/controllers/stripe-price.controller.js +3 -0
  363. package/dist/foundations/stripe-price/controllers/stripe-price.controller.js.map +1 -1
  364. package/dist/foundations/stripe-product/controllers/stripe-product.controller.d.ts.map +1 -1
  365. package/dist/foundations/stripe-product/controllers/stripe-product.controller.js +3 -0
  366. package/dist/foundations/stripe-product/controllers/stripe-product.controller.js.map +1 -1
  367. package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.d.ts.map +1 -1
  368. package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js +4 -0
  369. package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js.map +1 -1
  370. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.d.ts.map +1 -1
  371. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js +3 -0
  372. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js.map +1 -1
  373. package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.d.ts.map +1 -1
  374. package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js +3 -0
  375. package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js.map +1 -1
  376. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.d.ts.map +1 -1
  377. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js +3 -0
  378. package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js.map +1 -1
  379. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.d.ts.map +1 -1
  380. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js +3 -0
  381. package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js.map +1 -1
  382. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts +3 -1
  383. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
  384. package/dist/foundations/tokenusage/enums/tokenusage.type.js +2 -0
  385. package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
  386. package/dist/foundations/two-factor/controllers/passkey.controller.d.ts.map +1 -1
  387. package/dist/foundations/two-factor/controllers/passkey.controller.js +7 -0
  388. package/dist/foundations/two-factor/controllers/passkey.controller.js.map +1 -1
  389. package/dist/foundations/two-factor/controllers/totp.controller.d.ts.map +1 -1
  390. package/dist/foundations/two-factor/controllers/totp.controller.js +6 -0
  391. package/dist/foundations/two-factor/controllers/totp.controller.js.map +1 -1
  392. package/dist/foundations/two-factor/controllers/two-factor.controller.d.ts.map +1 -1
  393. package/dist/foundations/two-factor/controllers/two-factor.controller.js +7 -0
  394. package/dist/foundations/two-factor/controllers/two-factor.controller.js.map +1 -1
  395. package/dist/foundations/user/controllers/user.controller.d.ts.map +1 -1
  396. package/dist/foundations/user/controllers/user.controller.js +3 -0
  397. package/dist/foundations/user/controllers/user.controller.js.map +1 -1
  398. package/dist/foundations/waitlist/controllers/waitlist.controller.d.ts.map +1 -1
  399. package/dist/foundations/waitlist/controllers/waitlist.controller.js +3 -0
  400. package/dist/foundations/waitlist/controllers/waitlist.controller.js.map +1 -1
  401. package/package.json +1 -1
@@ -0,0 +1,404 @@
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.BlogProcessor = exports.blogCategoryTranslateOutputSchema = exports.blogCategoryTranslateInputSchema = exports.blogPostTranslateOutputSchema = exports.blogPostTranslateInputSchema = exports.blogSummaryOutputSchema = exports.blogSummaryInputSchema = void 0;
13
+ const bullmq_1 = require("@nestjs/bullmq");
14
+ const bullmq_2 = require("bullmq");
15
+ const nestjs_cls_1 = require("nestjs-cls");
16
+ const zod_1 = require("zod");
17
+ const ai_status_1 = require("../../../common/enums/ai.status");
18
+ const queue_id_1 = require("../../../config/enums/queue.id");
19
+ const blocknote_service_1 = require("../../../core/blocknote/services/blocknote.service");
20
+ const model_weight_1 = require("../../../core/llm/enums/model.weight");
21
+ const llm_service_1 = require("../../../core/llm/services/llm.service");
22
+ const logging_service_1 = require("../../../core/logging/services/logging.service");
23
+ const tokenusage_type_1 = require("../../tokenusage/enums/tokenusage.type");
24
+ const blog_constants_1 = require("../blog.constants");
25
+ const blog_category_meta_1 = require("../entities/blog-category.meta");
26
+ const blog_post_meta_1 = require("../entities/blog-post.meta");
27
+ const blog_summary_prompt_1 = require("../prompts/blog-summary.prompt");
28
+ const blog_translate_prompt_1 = require("../prompts/blog-translate.prompt");
29
+ const blog_category_translation_repository_1 = require("../repositories/blog-category-translation.repository");
30
+ const blog_post_translation_repository_1 = require("../repositories/blog-post-translation.repository");
31
+ const blog_post_repository_1 = require("../repositories/blog-post.repository");
32
+ const blog_queue_service_1 = require("../services/blog-queue.service");
33
+ const reading_time_1 = require("../utils/reading-time");
34
+ const slug_1 = require("../utils/slug");
35
+ // ---------------------------------------------------------------------------
36
+ // LLM contracts
37
+ // ---------------------------------------------------------------------------
38
+ exports.blogSummaryInputSchema = zod_1.z.object({
39
+ language: zod_1.z.string().describe("ISO 639-1 code of the language the summary MUST be written in."),
40
+ title: zod_1.z.string().describe("The article title. Context only: the summary must not repeat it."),
41
+ body_markdown: zod_1.z.string().describe("The full article body as markdown. The ONLY source of facts for the summary."),
42
+ });
43
+ exports.blogSummaryOutputSchema = zod_1.z.object({
44
+ summary: zod_1.z
45
+ .string()
46
+ .describe("One or two sentences, at most 160 characters, in the given language, stating what the reader will learn. No quotes, no title repetition."),
47
+ });
48
+ exports.blogPostTranslateInputSchema = zod_1.z.object({
49
+ source_language: zod_1.z.string().describe("ISO 639-1 code of the language every text field below is written in."),
50
+ target_language: zod_1.z.string().describe("ISO 639-1 code of the language every output field MUST be written in."),
51
+ title: zod_1.z.string().describe("The article title, to translate."),
52
+ summary: zod_1.z.string().describe("The one or two sentence article summary, to translate. Empty when there is none."),
53
+ cover_image_alt: zod_1.z
54
+ .string()
55
+ .describe("The description of the cover image for screen readers, to translate. Empty when there is none."),
56
+ segments: zod_1.z
57
+ .array(zod_1.z.string())
58
+ .describe("Ordered text fragments of one article; translate each in place, keep the count and order, keep inline whitespace at the edges."),
59
+ previous_rejection: zod_1.z
60
+ .string()
61
+ .describe("Empty on the first attempt. Otherwise the reason the previous answer was rejected (it returned the wrong number of fragments); return exactly one translated fragment per input fragment this time."),
62
+ });
63
+ exports.blogPostTranslateOutputSchema = zod_1.z.object({
64
+ title: zod_1.z.string().describe("The title translated into the target language."),
65
+ summary: zod_1.z
66
+ .string()
67
+ .describe("The summary translated into the target language. Empty when the input summary is empty."),
68
+ coverImageAlt: zod_1.z
69
+ .string()
70
+ .describe("The cover image description translated into the target language. Empty when the input one is empty."),
71
+ segments: zod_1.z
72
+ .array(zod_1.z.string())
73
+ .describe("The translated fragments: exactly one per input fragment, in the same order, each keeping the leading and trailing spaces of its source fragment."),
74
+ });
75
+ exports.blogCategoryTranslateInputSchema = zod_1.z.object({
76
+ source_language: zod_1.z.string().describe("ISO 639-1 code of the language every text field below is written in."),
77
+ target_language: zod_1.z.string().describe("ISO 639-1 code of the language every output field MUST be written in."),
78
+ name: zod_1.z.string().describe("The blog category name, a short label, to translate."),
79
+ description: zod_1.z.string().describe("The blog category description, to translate. Empty when there is none."),
80
+ });
81
+ exports.blogCategoryTranslateOutputSchema = zod_1.z.object({
82
+ name: zod_1.z.string().describe("The category name translated into the target language, still a short label."),
83
+ description: zod_1.z
84
+ .string()
85
+ .describe("The category description translated into the target language. Empty when the input one is empty."),
86
+ });
87
+ /**
88
+ * Worker for the blog AI jobs: summary generation and per-language translation of posts and
89
+ * categories.
90
+ *
91
+ * Blog content is platform content: jobs carry no companyId and none is ever set in CLS, so token
92
+ * usage is recorded against the post or category and no company is charged.
93
+ */
94
+ let BlogProcessor = class BlogProcessor extends bullmq_1.WorkerHost {
95
+ constructor(logger, cls, llmService, blockNoteService, blogPostRepository, blogPostTranslationRepository, blogCategoryTranslationRepository, blogQueueService) {
96
+ super();
97
+ this.logger = logger;
98
+ this.cls = cls;
99
+ this.llmService = llmService;
100
+ this.blockNoteService = blockNoteService;
101
+ this.blogPostRepository = blogPostRepository;
102
+ this.blogPostTranslationRepository = blogPostTranslationRepository;
103
+ this.blogCategoryTranslationRepository = blogCategoryTranslationRepository;
104
+ this.blogQueueService = blogQueueService;
105
+ }
106
+ onActive(job) {
107
+ this.logger.debug(`Processing ${job.name} job (ID: ${job.id})`);
108
+ }
109
+ onCompleted(job) {
110
+ this.logger.debug(`Completed ${job.name} job (ID: ${job.id})`);
111
+ }
112
+ /**
113
+ * Runs on every failed attempt. Only after the last attempt does it mark the affected
114
+ * languages `failed`, so the admin sees the mark and the "Translate again" button.
115
+ */
116
+ async onFailed(job, err) {
117
+ const attemptsUsed = job.attemptsMade ?? 0;
118
+ const maxAttempts = job.opts?.attempts ?? 1;
119
+ this.logger.error(`Error processing ${job.name} job (ID: ${job.id}, attempt ${attemptsUsed}/${maxAttempts}). Reason: ${err?.message}`);
120
+ if (attemptsUsed < maxAttempts)
121
+ return;
122
+ await this.cls.run(async () => {
123
+ this.cls.set("isAutomatedJob", true);
124
+ switch (job.name) {
125
+ case blog_constants_1.BlogJobName.ProcessPost:
126
+ await this.blogPostTranslationRepository.setAiStatus({
127
+ postId: job.data.postId,
128
+ languages: job.data.languages ?? [],
129
+ aiStatus: ai_status_1.AiStatus.Failed,
130
+ });
131
+ break;
132
+ case blog_constants_1.BlogJobName.TranslatePost:
133
+ await this.blogPostTranslationRepository.setAiStatus({
134
+ postId: job.data.postId,
135
+ languages: [job.data.language],
136
+ aiStatus: ai_status_1.AiStatus.Failed,
137
+ });
138
+ break;
139
+ case blog_constants_1.BlogJobName.ProcessCategory:
140
+ await this.blogCategoryTranslationRepository.setAiStatus({
141
+ categoryId: job.data.categoryId,
142
+ languages: job.data.languages ?? [],
143
+ aiStatus: ai_status_1.AiStatus.Failed,
144
+ });
145
+ break;
146
+ case blog_constants_1.BlogJobName.TranslateCategory:
147
+ await this.blogCategoryTranslationRepository.setAiStatus({
148
+ categoryId: job.data.categoryId,
149
+ languages: [job.data.language],
150
+ aiStatus: ai_status_1.AiStatus.Failed,
151
+ });
152
+ break;
153
+ }
154
+ });
155
+ }
156
+ async process(job) {
157
+ await this.cls.run(async () => {
158
+ this.cls.set("isAutomatedJob", true);
159
+ switch (job.name) {
160
+ case blog_constants_1.BlogJobName.ProcessPost:
161
+ return this._processPost(job.data);
162
+ case blog_constants_1.BlogJobName.TranslatePost:
163
+ return this._translatePost(job.data);
164
+ case blog_constants_1.BlogJobName.ProcessCategory:
165
+ return this._processCategory(job.data);
166
+ case blog_constants_1.BlogJobName.TranslateCategory:
167
+ return this._translateCategory(job.data);
168
+ default:
169
+ throw new Error(`Job ${job.name} not handled by BlogProcessor`);
170
+ }
171
+ });
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // Posts
175
+ // ---------------------------------------------------------------------------
176
+ async _processPost(params) {
177
+ if (params.generateSummary) {
178
+ const original = await this.blogPostTranslationRepository.findOriginal({ postId: params.postId });
179
+ if (!original) {
180
+ this.logger.warn(`Blog post ${params.postId} has no original translation; skipping summary`);
181
+ }
182
+ else {
183
+ const body = original.body ?? "[]";
184
+ const result = await this.llmService.call({
185
+ inputSchema: exports.blogSummaryInputSchema,
186
+ inputParams: {
187
+ language: original.language,
188
+ title: original.title ?? "",
189
+ body_markdown: this.blockNoteService.convertToMarkdown({ nodes: this._parseBlocks(body) }),
190
+ },
191
+ outputSchema: exports.blogSummaryOutputSchema,
192
+ systemPrompts: [blog_summary_prompt_1.BLOG_SUMMARY_SYSTEM_PROMPT],
193
+ modelWeight: model_weight_1.ModelWeight.Normal,
194
+ temperature: 0.4,
195
+ reasoningEffort: "low",
196
+ timeout: 60_000,
197
+ skipResponseLanguage: true,
198
+ tokenUsageType: tokenusage_type_1.TokenUsageType.BlogSummary,
199
+ relationshipId: params.postId,
200
+ relationshipType: blog_post_meta_1.blogPostMeta.labelName,
201
+ metadata: { agentName: "blog", nodeName: "summary" },
202
+ });
203
+ await this.blogPostTranslationRepository.updateText({
204
+ id: original.id,
205
+ title: original.title ?? "",
206
+ slug: original.slug ?? "",
207
+ summary: result.summary.trim(),
208
+ body,
209
+ bodyText: original.bodyText ?? "",
210
+ coverImageAlt: original.coverImageAlt,
211
+ readingMinutes: original.readingMinutes ?? (0, reading_time_1.readingMinutes)(original.bodyText ?? ""),
212
+ });
213
+ }
214
+ }
215
+ for (const language of params.languages) {
216
+ await this.blogQueueService.enqueuePostLanguage({ postId: params.postId, language });
217
+ }
218
+ }
219
+ async _translatePost(params) {
220
+ const original = await this.blogPostTranslationRepository.findOriginal({ postId: params.postId });
221
+ if (!original) {
222
+ this.logger.warn(`Blog post ${params.postId} has no original translation; skipping ${params.language}`);
223
+ return;
224
+ }
225
+ if (original.language === params.language)
226
+ return;
227
+ await this.blogPostTranslationRepository.setAiStatus({
228
+ postId: params.postId,
229
+ languages: [params.language],
230
+ aiStatus: ai_status_1.AiStatus.InProgress,
231
+ });
232
+ const post = await this.blogPostRepository.findById({ id: params.postId });
233
+ const existing = await this.blogPostTranslationRepository.findByPostAndLanguage({
234
+ postId: params.postId,
235
+ language: params.language,
236
+ });
237
+ const blocks = this._parseBlocks(original.body ?? "[]");
238
+ const segments = this.blockNoteService.extractTextSegments(blocks);
239
+ const callTranslate = (previousRejection) => this.llmService.call({
240
+ inputSchema: exports.blogPostTranslateInputSchema,
241
+ inputParams: {
242
+ source_language: original.language,
243
+ target_language: params.language,
244
+ title: original.title ?? "",
245
+ summary: original.summary ?? "",
246
+ cover_image_alt: original.coverImageAlt ?? "",
247
+ segments,
248
+ previous_rejection: previousRejection,
249
+ },
250
+ outputSchema: exports.blogPostTranslateOutputSchema,
251
+ systemPrompts: [blog_translate_prompt_1.BLOG_TRANSLATE_SYSTEM_PROMPT],
252
+ modelWeight: model_weight_1.ModelWeight.Normal,
253
+ temperature: 0.2,
254
+ reasoningEffort: "low",
255
+ timeout: 180_000,
256
+ skipResponseLanguage: true,
257
+ tokenUsageType: tokenusage_type_1.TokenUsageType.BlogTranslation,
258
+ relationshipId: params.postId,
259
+ relationshipType: blog_post_meta_1.blogPostMeta.labelName,
260
+ metadata: { agentName: "blog", nodeName: "translate" },
261
+ });
262
+ // A different fragment count is a structurally unusable output (a failure, not a quality
263
+ // judgement). Re-ask once with the rejection named in the input; if that answer is also
264
+ // unusable, applyTextSegments throws, nothing is written and BullMQ retries the job.
265
+ let result = await callTranslate("");
266
+ if ((result.segments ?? []).length !== segments.length) {
267
+ this.logger.warn(`Blog translation ${params.postId}/${params.language}: ${result.segments?.length ?? 0} fragments for ${segments.length}; re-asking`);
268
+ result = await callTranslate(`The previous answer returned ${result.segments?.length ?? 0} fragments for ${segments.length} input fragments.`);
269
+ }
270
+ const translatedBlocks = this.blockNoteService.applyTextSegments(blocks, result.segments ?? []);
271
+ const bodyText = this.blockNoteService.convertToPlainText({ nodes: translatedBlocks });
272
+ const keepSlug = !!existing?.slug && post?.status === "published";
273
+ const slug = keepSlug
274
+ ? existing.slug
275
+ : await this._uniquePostSlug({
276
+ title: result.title,
277
+ language: params.language,
278
+ excludeTranslationId: existing?.id,
279
+ });
280
+ await this.blogPostTranslationRepository.writeAiTranslation({
281
+ postId: params.postId,
282
+ language: params.language,
283
+ title: result.title,
284
+ slug,
285
+ summary: result.summary || undefined,
286
+ body: JSON.stringify(translatedBlocks),
287
+ bodyText,
288
+ coverImageAlt: result.coverImageAlt || undefined,
289
+ readingMinutes: (0, reading_time_1.readingMinutes)(bodyText),
290
+ });
291
+ }
292
+ async _uniquePostSlug(params) {
293
+ const base = (0, slug_1.slugify)(params.title);
294
+ const taken = await this.blogPostTranslationRepository.findSlugsWithPrefix({
295
+ language: params.language,
296
+ prefix: base,
297
+ excludeTranslationId: params.excludeTranslationId,
298
+ });
299
+ return (0, slug_1.uniqueSlug)(base, taken);
300
+ }
301
+ // ---------------------------------------------------------------------------
302
+ // Categories
303
+ // ---------------------------------------------------------------------------
304
+ async _processCategory(params) {
305
+ for (const language of params.languages) {
306
+ await this.blogQueueService.enqueueCategoryLanguage({ categoryId: params.categoryId, language });
307
+ }
308
+ }
309
+ async _translateCategory(params) {
310
+ const original = await this.blogCategoryTranslationRepository.findOriginal({ categoryId: params.categoryId });
311
+ if (!original) {
312
+ this.logger.warn(`Blog category ${params.categoryId} has no original translation; skipping ${params.language}`);
313
+ return;
314
+ }
315
+ if (original.language === params.language)
316
+ return;
317
+ await this.blogCategoryTranslationRepository.setAiStatus({
318
+ categoryId: params.categoryId,
319
+ languages: [params.language],
320
+ aiStatus: ai_status_1.AiStatus.InProgress,
321
+ });
322
+ const existing = await this.blogCategoryTranslationRepository.findByCategoryAndLanguage({
323
+ categoryId: params.categoryId,
324
+ language: params.language,
325
+ });
326
+ const result = await this.llmService.call({
327
+ inputSchema: exports.blogCategoryTranslateInputSchema,
328
+ inputParams: {
329
+ source_language: original.language,
330
+ target_language: params.language,
331
+ name: original.name ?? "",
332
+ description: original.description ?? "",
333
+ },
334
+ outputSchema: exports.blogCategoryTranslateOutputSchema,
335
+ systemPrompts: [blog_translate_prompt_1.BLOG_TRANSLATE_SYSTEM_PROMPT],
336
+ modelWeight: model_weight_1.ModelWeight.Normal,
337
+ temperature: 0.2,
338
+ reasoningEffort: "low",
339
+ timeout: 60_000,
340
+ skipResponseLanguage: true,
341
+ tokenUsageType: tokenusage_type_1.TokenUsageType.BlogTranslation,
342
+ relationshipId: params.categoryId,
343
+ relationshipType: blog_category_meta_1.blogCategoryMeta.labelName,
344
+ metadata: { agentName: "blog", nodeName: "translate" },
345
+ });
346
+ // Categories are always public (the filter link carries the slug), so an existing slug is
347
+ // kept, exactly like a published post's.
348
+ let slug = existing?.slug;
349
+ if (!slug) {
350
+ const base = (0, slug_1.slugify)(result.name);
351
+ const taken = await this.blogCategoryTranslationRepository.findSlugsWithPrefix({
352
+ language: params.language,
353
+ prefix: base,
354
+ excludeTranslationId: existing?.id,
355
+ });
356
+ slug = (0, slug_1.uniqueSlug)(base, taken);
357
+ }
358
+ await this.blogCategoryTranslationRepository.writeAiTranslation({
359
+ categoryId: params.categoryId,
360
+ language: params.language,
361
+ name: result.name,
362
+ slug,
363
+ description: result.description || undefined,
364
+ });
365
+ }
366
+ // ---------------------------------------------------------------------------
367
+ // Helpers
368
+ // ---------------------------------------------------------------------------
369
+ _parseBlocks(body) {
370
+ const parsed = JSON.parse(body);
371
+ return Array.isArray(parsed) ? parsed : [];
372
+ }
373
+ };
374
+ exports.BlogProcessor = BlogProcessor;
375
+ __decorate([
376
+ (0, bullmq_1.OnWorkerEvent)("active"),
377
+ __metadata("design:type", Function),
378
+ __metadata("design:paramtypes", [bullmq_2.Job]),
379
+ __metadata("design:returntype", void 0)
380
+ ], BlogProcessor.prototype, "onActive", null);
381
+ __decorate([
382
+ (0, bullmq_1.OnWorkerEvent)("completed"),
383
+ __metadata("design:type", Function),
384
+ __metadata("design:paramtypes", [bullmq_2.Job]),
385
+ __metadata("design:returntype", void 0)
386
+ ], BlogProcessor.prototype, "onCompleted", null);
387
+ __decorate([
388
+ (0, bullmq_1.OnWorkerEvent)("failed"),
389
+ __metadata("design:type", Function),
390
+ __metadata("design:paramtypes", [bullmq_2.Job, Error]),
391
+ __metadata("design:returntype", Promise)
392
+ ], BlogProcessor.prototype, "onFailed", null);
393
+ exports.BlogProcessor = BlogProcessor = __decorate([
394
+ (0, bullmq_1.Processor)(queue_id_1.QueueId.BLOG, { concurrency: 4, lockDuration: 1000 * 60 * 5 }),
395
+ __metadata("design:paramtypes", [logging_service_1.AppLoggingService,
396
+ nestjs_cls_1.ClsService,
397
+ llm_service_1.LLMService,
398
+ blocknote_service_1.BlockNoteService,
399
+ blog_post_repository_1.BlogPostRepository,
400
+ blog_post_translation_repository_1.BlogPostTranslationRepository,
401
+ blog_category_translation_repository_1.BlogCategoryTranslationRepository,
402
+ blog_queue_service_1.BlogQueueService])
403
+ ], BlogProcessor);
404
+ //# sourceMappingURL=blog.processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.processor.js","sourceRoot":"","sources":["../../../../src/foundations/blog/processors/blog.processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * System prompt for the blog post summary call. Static doctrine only: every dynamic value travels
3
+ * through inputParams. No backticks and no dollar-brace placeholders anywhere in this file.
4
+ */
5
+ export declare const BLOG_SUMMARY_SYSTEM_PROMPT: string;
6
+ //# sourceMappingURL=blog-summary.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-summary.prompt.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/prompts/blog-summary.prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAU/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BLOG_SUMMARY_SYSTEM_PROMPT = void 0;
4
+ /**
5
+ * System prompt for the blog post summary call. Static doctrine only: every dynamic value travels
6
+ * through inputParams. No backticks and no dollar-brace placeholders anywhere in this file.
7
+ */
8
+ exports.BLOG_SUMMARY_SYSTEM_PROMPT = `
9
+ You write the summary line of a blog article. The summary appears under the title on the blog list and on the article page, and is used as the page description for search engines.
10
+
11
+ Rules:
12
+ - Write in the language given in the input. Never switch language.
13
+ - One or two sentences, at most 160 characters.
14
+ - State what the reader will learn or get from the article, using its own subject matter.
15
+ - Do not repeat the title, do not start with phrases such as "This article" or "In this post".
16
+ - No quotes, no emoji, no hashtags, no markdown.
17
+ - Use only what the article body says. Never invent facts, names or numbers.
18
+ `.trim();
19
+ //# sourceMappingURL=blog-summary.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-summary.prompt.js","sourceRoot":"","sources":["../../../../src/foundations/blog/prompts/blog-summary.prompt.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,0BAA0B,GAAG;;;;;;;;;;CAUzC,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * System prompt for the blog translation calls (posts and categories). Static doctrine only: every
3
+ * dynamic value travels through inputParams. No backticks and no dollar-brace placeholders anywhere
4
+ * in this file.
5
+ */
6
+ export declare const BLOG_TRANSLATE_SYSTEM_PROMPT: string;
7
+ //# sourceMappingURL=blog-translate.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-translate.prompt.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/prompts/blog-translate.prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QAcjC,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BLOG_TRANSLATE_SYSTEM_PROMPT = void 0;
4
+ /**
5
+ * System prompt for the blog translation calls (posts and categories). Static doctrine only: every
6
+ * dynamic value travels through inputParams. No backticks and no dollar-brace placeholders anywhere
7
+ * in this file.
8
+ */
9
+ exports.BLOG_TRANSLATE_SYSTEM_PROMPT = `
10
+ You are a professional translator for a product blog. You translate published editorial content from the source language into the target language given in the input.
11
+
12
+ Rules:
13
+ - Translate meaning and tone, not word by word. The result must read as if it was written natively in the target language.
14
+ - Keep the author's register: if the source is informal, stay informal; if it is direct, stay direct.
15
+ - Never add, remove, summarise or explain content. Never add notes about the translation.
16
+ - Keep product names, brand names, proper nouns, code, URLs and numbers exactly as they are.
17
+ - When a field is empty in the input, return it empty.
18
+
19
+ Text fragments:
20
+ - An article body arrives as an ordered list of text fragments cut from one rich-text document. A sentence can be split across several fragments because part of it is bold, italic or a link.
21
+ - Return exactly one translated fragment for each input fragment, in the same order. Never merge, split, drop or reorder fragments, even when the target language would order the words differently: move words between neighbouring fragments only as far as the grammar requires, and keep every fragment non-empty.
22
+ - Keep the leading and trailing spaces of each fragment, so the fragments still join into correct sentences.
23
+ `.trim();
24
+ //# sourceMappingURL=blog-translate.prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-translate.prompt.js","sourceRoot":"","sources":["../../../../src/foundations/blog/prompts/blog-translate.prompt.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,4BAA4B,GAAG;;;;;;;;;;;;;;CAc3C,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { AiStatus } from "../../../common/enums/ai.status";
3
+ import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
4
+ import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
5
+ import { SecurityService } from "../../../core/security/services/security.service";
6
+ import { BlogTranslationSource } from "../blog.constants";
7
+ import { BlogCategoryTranslation, BlogCategoryTranslationDescriptor } from "../entities/blog-category-translation";
8
+ export declare class BlogCategoryTranslationRepository extends AbstractRepository<BlogCategoryTranslation, typeof BlogCategoryTranslationDescriptor.relationships> {
9
+ protected readonly descriptor: import("../../..").EntityDescriptor<BlogCategoryTranslation, {
10
+ category: {
11
+ model: import("../../..").DataMeta;
12
+ direction: "in";
13
+ relationship: string;
14
+ cardinality: "one";
15
+ description: string;
16
+ };
17
+ }>;
18
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
19
+ /**
20
+ * The original-language translation of a category.
21
+ */
22
+ findOriginal(params: {
23
+ categoryId: string;
24
+ }): Promise<BlogCategoryTranslation | null>;
25
+ /**
26
+ * The translation of a category in one language (original, AI, manual or placeholder).
27
+ */
28
+ findByCategoryAndLanguage(params: {
29
+ categoryId: string;
30
+ language: string;
31
+ }): Promise<BlogCategoryTranslation | null>;
32
+ /**
33
+ * Every category slug in one language starting with `prefix`, for the collision suffix.
34
+ * `excludeTranslationId` leaves out the record being re-slugged.
35
+ */
36
+ findSlugsWithPrefix(params: {
37
+ language: string;
38
+ prefix: string;
39
+ excludeTranslationId?: string;
40
+ }): Promise<string[]>;
41
+ /**
42
+ * Creates (or keeps) one placeholder per non-original language and marks it pending.
43
+ */
44
+ ensurePending(params: {
45
+ categoryId: string;
46
+ languages: string[];
47
+ }): Promise<void>;
48
+ /**
49
+ * Sets the AI status of the given non-original languages of a category.
50
+ */
51
+ setAiStatus(params: {
52
+ categoryId: string;
53
+ languages: string[];
54
+ aiStatus: AiStatus;
55
+ }): Promise<void>;
56
+ /**
57
+ * Rewrites the text of one category translation. A `manual` source also marks the record
58
+ * completed, so a hand-edited language is served even if its job had failed.
59
+ */
60
+ updateText(params: {
61
+ id: string;
62
+ name: string;
63
+ slug: string;
64
+ description?: string;
65
+ source?: BlogTranslationSource;
66
+ }): Promise<void>;
67
+ /**
68
+ * Upserts the AI translation of a category in one non-original language.
69
+ */
70
+ writeAiTranslation(params: {
71
+ categoryId: string;
72
+ language: string;
73
+ name: string;
74
+ slug: string;
75
+ description?: string;
76
+ }): Promise<void>;
77
+ }
78
+ //# sourceMappingURL=blog-category-translation.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-category-translation.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-category-translation.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAOnH,qBACa,iCAAkC,SAAQ,kBAAkB,CACvE,uBAAuB,EACvB,OAAO,iCAAiC,CAAC,aAAa,CACvD;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;OAAqC;gBAEtD,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAiB3F;;OAEG;IACG,yBAAyB,CAAC,MAAM,EAAE;QACtC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAiB3C;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBrB;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BvF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzG;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjB;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE;QAC/B,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BlB"}