@carlonicora/nestjs-neo4jsonapi 6.7.0 → 6.9.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 (218) hide show
  1. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  2. package/dist/bootstrap/app.module.factory.js +1 -0
  3. package/dist/bootstrap/app.module.factory.js.map +1 -1
  4. package/dist/bootstrap/bootstrap.options.d.ts +15 -0
  5. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  6. package/dist/common/constants/core-module.ids.d.ts +1 -0
  7. package/dist/common/constants/core-module.ids.d.ts.map +1 -1
  8. package/dist/common/constants/core-module.ids.js +1 -0
  9. package/dist/common/constants/core-module.ids.js.map +1 -1
  10. package/dist/config/enums/queue.id.d.ts +1 -0
  11. package/dist/config/enums/queue.id.d.ts.map +1 -1
  12. package/dist/config/enums/queue.id.js +1 -0
  13. package/dist/config/enums/queue.id.js.map +1 -1
  14. package/dist/core/blocknote/services/blocknote.service.d.ts +25 -0
  15. package/dist/core/blocknote/services/blocknote.service.d.ts.map +1 -1
  16. package/dist/core/blocknote/services/blocknote.service.js +84 -0
  17. package/dist/core/blocknote/services/blocknote.service.js.map +1 -1
  18. package/dist/foundations/blog/blog.constants.d.ts +17 -0
  19. package/dist/foundations/blog/blog.constants.d.ts.map +1 -0
  20. package/dist/foundations/blog/blog.constants.js +17 -0
  21. package/dist/foundations/blog/blog.constants.js.map +1 -0
  22. package/dist/foundations/blog/blog.module.d.ts +28 -0
  23. package/dist/foundations/blog/blog.module.d.ts.map +1 -0
  24. package/dist/foundations/blog/blog.module.js +143 -0
  25. package/dist/foundations/blog/blog.module.js.map +1 -0
  26. package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts +17 -0
  27. package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts.map +1 -0
  28. package/dist/foundations/blog/controllers/blog-category-translation.controller.js +81 -0
  29. package/dist/foundations/blog/controllers/blog-category-translation.controller.js.map +1 -0
  30. package/dist/foundations/blog/controllers/blog-category.controller.d.ts +24 -0
  31. package/dist/foundations/blog/controllers/blog-category.controller.d.ts.map +1 -0
  32. package/dist/foundations/blog/controllers/blog-category.controller.js +125 -0
  33. package/dist/foundations/blog/controllers/blog-category.controller.js.map +1 -0
  34. package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts +17 -0
  35. package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts.map +1 -0
  36. package/dist/foundations/blog/controllers/blog-post-translation.controller.js +81 -0
  37. package/dist/foundations/blog/controllers/blog-post-translation.controller.js.map +1 -0
  38. package/dist/foundations/blog/controllers/blog-post.controller.d.ts +28 -0
  39. package/dist/foundations/blog/controllers/blog-post.controller.d.ts.map +1 -0
  40. package/dist/foundations/blog/controllers/blog-post.controller.js +157 -0
  41. package/dist/foundations/blog/controllers/blog-post.controller.js.map +1 -0
  42. package/dist/foundations/blog/controllers/blog-settings.controller.d.ts +16 -0
  43. package/dist/foundations/blog/controllers/blog-settings.controller.d.ts.map +1 -0
  44. package/dist/foundations/blog/controllers/blog-settings.controller.js +73 -0
  45. package/dist/foundations/blog/controllers/blog-settings.controller.js.map +1 -0
  46. package/dist/foundations/blog/controllers/blog.public.controller.d.ts +26 -0
  47. package/dist/foundations/blog/controllers/blog.public.controller.d.ts.map +1 -0
  48. package/dist/foundations/blog/controllers/blog.public.controller.js +117 -0
  49. package/dist/foundations/blog/controllers/blog.public.controller.js.map +1 -0
  50. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts +16 -0
  51. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts.map +1 -0
  52. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js +62 -0
  53. package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js.map +1 -0
  54. package/dist/foundations/blog/dtos/blog-category.dto.d.ts +11 -0
  55. package/dist/foundations/blog/dtos/blog-category.dto.d.ts.map +1 -0
  56. package/dist/foundations/blog/dtos/blog-category.dto.js +45 -0
  57. package/dist/foundations/blog/dtos/blog-category.dto.js.map +1 -0
  58. package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts +16 -0
  59. package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts.map +1 -0
  60. package/dist/foundations/blog/dtos/blog-category.post.dto.js +68 -0
  61. package/dist/foundations/blog/dtos/blog-category.post.dto.js.map +1 -0
  62. package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts +21 -0
  63. package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts.map +1 -0
  64. package/dist/foundations/blog/dtos/blog-category.put.dto.js +76 -0
  65. package/dist/foundations/blog/dtos/blog-category.put.dto.js.map +1 -0
  66. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts +19 -0
  67. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts.map +1 -0
  68. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js +73 -0
  69. package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js.map +1 -0
  70. package/dist/foundations/blog/dtos/blog-post.dto.d.ts +11 -0
  71. package/dist/foundations/blog/dtos/blog-post.dto.d.ts.map +1 -0
  72. package/dist/foundations/blog/dtos/blog-post.dto.js +45 -0
  73. package/dist/foundations/blog/dtos/blog-post.dto.js.map +1 -0
  74. package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts +27 -0
  75. package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts.map +1 -0
  76. package/dist/foundations/blog/dtos/blog-post.post.dto.js +98 -0
  77. package/dist/foundations/blog/dtos/blog-post.post.dto.js.map +1 -0
  78. package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts +30 -0
  79. package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts.map +1 -0
  80. package/dist/foundations/blog/dtos/blog-post.put.dto.js +104 -0
  81. package/dist/foundations/blog/dtos/blog-post.put.dto.js.map +1 -0
  82. package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts +14 -0
  83. package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts.map +1 -0
  84. package/dist/foundations/blog/dtos/blog-settings.put.dto.js +52 -0
  85. package/dist/foundations/blog/dtos/blog-settings.put.dto.js.map +1 -0
  86. package/dist/foundations/blog/entities/blog-category-translation.d.ts +36 -0
  87. package/dist/foundations/blog/entities/blog-category-translation.d.ts.map +1 -0
  88. package/dist/foundations/blog/entities/blog-category-translation.js +70 -0
  89. package/dist/foundations/blog/entities/blog-category-translation.js.map +1 -0
  90. package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts +3 -0
  91. package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts.map +1 -0
  92. package/dist/foundations/blog/entities/blog-category-translation.meta.js +10 -0
  93. package/dist/foundations/blog/entities/blog-category-translation.meta.js.map +1 -0
  94. package/dist/foundations/blog/entities/blog-category.d.ts +35 -0
  95. package/dist/foundations/blog/entities/blog-category.d.ts.map +1 -0
  96. package/dist/foundations/blog/entities/blog-category.js +78 -0
  97. package/dist/foundations/blog/entities/blog-category.js.map +1 -0
  98. package/dist/foundations/blog/entities/blog-category.meta.d.ts +3 -0
  99. package/dist/foundations/blog/entities/blog-category.meta.d.ts.map +1 -0
  100. package/dist/foundations/blog/entities/blog-category.meta.js +10 -0
  101. package/dist/foundations/blog/entities/blog-category.meta.js.map +1 -0
  102. package/dist/foundations/blog/entities/blog-post-translation.d.ts +43 -0
  103. package/dist/foundations/blog/entities/blog-post-translation.d.ts.map +1 -0
  104. package/dist/foundations/blog/entities/blog-post-translation.js +91 -0
  105. package/dist/foundations/blog/entities/blog-post-translation.js.map +1 -0
  106. package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts +3 -0
  107. package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts.map +1 -0
  108. package/dist/foundations/blog/entities/blog-post-translation.meta.js +10 -0
  109. package/dist/foundations/blog/entities/blog-post-translation.meta.js.map +1 -0
  110. package/dist/foundations/blog/entities/blog-post.d.ts +63 -0
  111. package/dist/foundations/blog/entities/blog-post.d.ts.map +1 -0
  112. package/dist/foundations/blog/entities/blog-post.js +149 -0
  113. package/dist/foundations/blog/entities/blog-post.js.map +1 -0
  114. package/dist/foundations/blog/entities/blog-post.meta.d.ts +3 -0
  115. package/dist/foundations/blog/entities/blog-post.meta.d.ts.map +1 -0
  116. package/dist/foundations/blog/entities/blog-post.meta.js +10 -0
  117. package/dist/foundations/blog/entities/blog-post.meta.js.map +1 -0
  118. package/dist/foundations/blog/entities/blog-settings.d.ts +18 -0
  119. package/dist/foundations/blog/entities/blog-settings.d.ts.map +1 -0
  120. package/dist/foundations/blog/entities/blog-settings.js +26 -0
  121. package/dist/foundations/blog/entities/blog-settings.js.map +1 -0
  122. package/dist/foundations/blog/entities/blog-settings.meta.d.ts +3 -0
  123. package/dist/foundations/blog/entities/blog-settings.meta.d.ts.map +1 -0
  124. package/dist/foundations/blog/entities/blog-settings.meta.js +10 -0
  125. package/dist/foundations/blog/entities/blog-settings.meta.js.map +1 -0
  126. package/dist/foundations/blog/index.d.ts +34 -0
  127. package/dist/foundations/blog/index.d.ts.map +1 -0
  128. package/dist/foundations/blog/index.js +50 -0
  129. package/dist/foundations/blog/index.js.map +1 -0
  130. package/dist/foundations/blog/interfaces/blog.config.interface.d.ts +22 -0
  131. package/dist/foundations/blog/interfaces/blog.config.interface.d.ts.map +1 -0
  132. package/dist/foundations/blog/interfaces/blog.config.interface.js +10 -0
  133. package/dist/foundations/blog/interfaces/blog.config.interface.js.map +1 -0
  134. package/dist/foundations/blog/processors/blog.processor.d.ts +77 -0
  135. package/dist/foundations/blog/processors/blog.processor.d.ts.map +1 -0
  136. package/dist/foundations/blog/processors/blog.processor.js +404 -0
  137. package/dist/foundations/blog/processors/blog.processor.js.map +1 -0
  138. package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts +6 -0
  139. package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts.map +1 -0
  140. package/dist/foundations/blog/prompts/blog-summary.prompt.js +19 -0
  141. package/dist/foundations/blog/prompts/blog-summary.prompt.js.map +1 -0
  142. package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts +7 -0
  143. package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts.map +1 -0
  144. package/dist/foundations/blog/prompts/blog-translate.prompt.js +24 -0
  145. package/dist/foundations/blog/prompts/blog-translate.prompt.js.map +1 -0
  146. package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts +78 -0
  147. package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts.map +1 -0
  148. package/dist/foundations/blog/repositories/blog-category-translation.repository.js +199 -0
  149. package/dist/foundations/blog/repositories/blog-category-translation.repository.js.map +1 -0
  150. package/dist/foundations/blog/repositories/blog-category.repository.d.ts +56 -0
  151. package/dist/foundations/blog/repositories/blog-category.repository.d.ts.map +1 -0
  152. package/dist/foundations/blog/repositories/blog-category.repository.js +166 -0
  153. package/dist/foundations/blog/repositories/blog-category.repository.js.map +1 -0
  154. package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts +88 -0
  155. package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts.map +1 -0
  156. package/dist/foundations/blog/repositories/blog-post-translation.repository.js +220 -0
  157. package/dist/foundations/blog/repositories/blog-post-translation.repository.js.map +1 -0
  158. package/dist/foundations/blog/repositories/blog-post.repository.d.ts +118 -0
  159. package/dist/foundations/blog/repositories/blog-post.repository.d.ts.map +1 -0
  160. package/dist/foundations/blog/repositories/blog-post.repository.js +350 -0
  161. package/dist/foundations/blog/repositories/blog-post.repository.js.map +1 -0
  162. package/dist/foundations/blog/repositories/blog-settings.repository.d.ts +21 -0
  163. package/dist/foundations/blog/repositories/blog-settings.repository.d.ts.map +1 -0
  164. package/dist/foundations/blog/repositories/blog-settings.repository.js +60 -0
  165. package/dist/foundations/blog/repositories/blog-settings.repository.js.map +1 -0
  166. package/dist/foundations/blog/services/blog-category-translation.service.d.ts +37 -0
  167. package/dist/foundations/blog/services/blog-category-translation.service.d.ts.map +1 -0
  168. package/dist/foundations/blog/services/blog-category-translation.service.js +97 -0
  169. package/dist/foundations/blog/services/blog-category-translation.service.js.map +1 -0
  170. package/dist/foundations/blog/services/blog-category.service.d.ts +56 -0
  171. package/dist/foundations/blog/services/blog-category.service.d.ts.map +1 -0
  172. package/dist/foundations/blog/services/blog-category.service.js +164 -0
  173. package/dist/foundations/blog/services/blog-category.service.js.map +1 -0
  174. package/dist/foundations/blog/services/blog-post-translation.service.d.ts +44 -0
  175. package/dist/foundations/blog/services/blog-post-translation.service.d.ts.map +1 -0
  176. package/dist/foundations/blog/services/blog-post-translation.service.js +115 -0
  177. package/dist/foundations/blog/services/blog-post-translation.service.js.map +1 -0
  178. package/dist/foundations/blog/services/blog-post.service.d.ts +109 -0
  179. package/dist/foundations/blog/services/blog-post.service.d.ts.map +1 -0
  180. package/dist/foundations/blog/services/blog-post.service.js +276 -0
  181. package/dist/foundations/blog/services/blog-post.service.js.map +1 -0
  182. package/dist/foundations/blog/services/blog-queue.service.d.ts +36 -0
  183. package/dist/foundations/blog/services/blog-queue.service.d.ts.map +1 -0
  184. package/dist/foundations/blog/services/blog-queue.service.js +79 -0
  185. package/dist/foundations/blog/services/blog-queue.service.js.map +1 -0
  186. package/dist/foundations/blog/services/blog-settings.service.d.ts +21 -0
  187. package/dist/foundations/blog/services/blog-settings.service.d.ts.map +1 -0
  188. package/dist/foundations/blog/services/blog-settings.service.js +49 -0
  189. package/dist/foundations/blog/services/blog-settings.service.js.map +1 -0
  190. package/dist/foundations/blog/utils/reading-time.d.ts +5 -0
  191. package/dist/foundations/blog/utils/reading-time.d.ts.map +1 -0
  192. package/dist/foundations/blog/utils/reading-time.js +12 -0
  193. package/dist/foundations/blog/utils/reading-time.js.map +1 -0
  194. package/dist/foundations/blog/utils/slug.d.ts +12 -0
  195. package/dist/foundations/blog/utils/slug.d.ts.map +1 -0
  196. package/dist/foundations/blog/utils/slug.js +36 -0
  197. package/dist/foundations/blog/utils/slug.js.map +1 -0
  198. package/dist/foundations/foundations.modules.d.ts +8 -0
  199. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  200. package/dist/foundations/foundations.modules.js +4 -1
  201. package/dist/foundations/foundations.modules.js.map +1 -1
  202. package/dist/foundations/index.d.ts +1 -0
  203. package/dist/foundations/index.d.ts.map +1 -1
  204. package/dist/foundations/index.js +1 -0
  205. package/dist/foundations/index.js.map +1 -1
  206. package/dist/foundations/stripe/services/stripe.payment.service.d.ts +33 -0
  207. package/dist/foundations/stripe/services/stripe.payment.service.d.ts.map +1 -1
  208. package/dist/foundations/stripe/services/stripe.payment.service.js +68 -0
  209. package/dist/foundations/stripe/services/stripe.payment.service.js.map +1 -1
  210. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.d.ts +2 -2
  211. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.d.ts.map +1 -1
  212. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js +9 -9
  213. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js.map +1 -1
  214. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts +3 -1
  215. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
  216. package/dist/foundations/tokenusage/enums/tokenusage.type.js +2 -0
  217. package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
  218. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.blogSettingsMeta = void 0;
4
+ exports.blogSettingsMeta = {
5
+ type: "blog-settings",
6
+ endpoint: "blog-settings",
7
+ nodeName: "blogSettings",
8
+ labelName: "BlogSettings",
9
+ };
10
+ //# sourceMappingURL=blog-settings.meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-settings.meta.js","sourceRoot":"","sources":["../../../../src/foundations/blog/entities/blog-settings.meta.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAa;IACxC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,cAAc;IACxB,SAAS,EAAE,cAAc;CAC1B,CAAC"}
@@ -0,0 +1,34 @@
1
+ export * from "./blog.module";
2
+ export * from "./blog.constants";
3
+ export * from "./interfaces/blog.config.interface";
4
+ export * from "./entities/blog-post";
5
+ export * from "./entities/blog-post.meta";
6
+ export * from "./entities/blog-post-translation";
7
+ export * from "./entities/blog-post-translation.meta";
8
+ export * from "./entities/blog-category";
9
+ export * from "./entities/blog-category.meta";
10
+ export * from "./entities/blog-category-translation";
11
+ export * from "./entities/blog-category-translation.meta";
12
+ export * from "./entities/blog-settings";
13
+ export * from "./entities/blog-settings.meta";
14
+ export * from "./dtos/blog-post.dto";
15
+ export * from "./dtos/blog-post.post.dto";
16
+ export * from "./dtos/blog-post.put.dto";
17
+ export * from "./dtos/blog-post-translation.put.dto";
18
+ export * from "./dtos/blog-category.dto";
19
+ export * from "./dtos/blog-category.post.dto";
20
+ export * from "./dtos/blog-category.put.dto";
21
+ export * from "./dtos/blog-category-translation.put.dto";
22
+ export * from "./dtos/blog-settings.put.dto";
23
+ export * from "./repositories/blog-post.repository";
24
+ export * from "./repositories/blog-post-translation.repository";
25
+ export * from "./repositories/blog-category.repository";
26
+ export * from "./repositories/blog-category-translation.repository";
27
+ export * from "./repositories/blog-settings.repository";
28
+ export * from "./services/blog-queue.service";
29
+ export * from "./services/blog-post.service";
30
+ export * from "./services/blog-post-translation.service";
31
+ export * from "./services/blog-category.service";
32
+ export * from "./services/blog-category-translation.service";
33
+ export * from "./services/blog-settings.service";
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundations/blog/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sCAAsC,CAAC;AACrD,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iDAAiD,CAAC;AAChE,cAAc,yCAAyC,CAAC;AACxD,cAAc,qDAAqD,CAAC;AACpE,cAAc,yCAAyC,CAAC;AACxD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./blog.module"), exports);
18
+ __exportStar(require("./blog.constants"), exports);
19
+ __exportStar(require("./interfaces/blog.config.interface"), exports);
20
+ __exportStar(require("./entities/blog-post"), exports);
21
+ __exportStar(require("./entities/blog-post.meta"), exports);
22
+ __exportStar(require("./entities/blog-post-translation"), exports);
23
+ __exportStar(require("./entities/blog-post-translation.meta"), exports);
24
+ __exportStar(require("./entities/blog-category"), exports);
25
+ __exportStar(require("./entities/blog-category.meta"), exports);
26
+ __exportStar(require("./entities/blog-category-translation"), exports);
27
+ __exportStar(require("./entities/blog-category-translation.meta"), exports);
28
+ __exportStar(require("./entities/blog-settings"), exports);
29
+ __exportStar(require("./entities/blog-settings.meta"), exports);
30
+ __exportStar(require("./dtos/blog-post.dto"), exports);
31
+ __exportStar(require("./dtos/blog-post.post.dto"), exports);
32
+ __exportStar(require("./dtos/blog-post.put.dto"), exports);
33
+ __exportStar(require("./dtos/blog-post-translation.put.dto"), exports);
34
+ __exportStar(require("./dtos/blog-category.dto"), exports);
35
+ __exportStar(require("./dtos/blog-category.post.dto"), exports);
36
+ __exportStar(require("./dtos/blog-category.put.dto"), exports);
37
+ __exportStar(require("./dtos/blog-category-translation.put.dto"), exports);
38
+ __exportStar(require("./dtos/blog-settings.put.dto"), exports);
39
+ __exportStar(require("./repositories/blog-post.repository"), exports);
40
+ __exportStar(require("./repositories/blog-post-translation.repository"), exports);
41
+ __exportStar(require("./repositories/blog-category.repository"), exports);
42
+ __exportStar(require("./repositories/blog-category-translation.repository"), exports);
43
+ __exportStar(require("./repositories/blog-settings.repository"), exports);
44
+ __exportStar(require("./services/blog-queue.service"), exports);
45
+ __exportStar(require("./services/blog-post.service"), exports);
46
+ __exportStar(require("./services/blog-post-translation.service"), exports);
47
+ __exportStar(require("./services/blog-category.service"), exports);
48
+ __exportStar(require("./services/blog-category-translation.service"), exports);
49
+ __exportStar(require("./services/blog-settings.service"), exports);
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundations/blog/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,mDAAiC;AACjC,qEAAmD;AACnD,uDAAqC;AACrC,4DAA0C;AAC1C,mEAAiD;AACjD,wEAAsD;AACtD,2DAAyC;AACzC,gEAA8C;AAC9C,uEAAqD;AACrD,4EAA0D;AAC1D,2DAAyC;AACzC,gEAA8C;AAC9C,uDAAqC;AACrC,4DAA0C;AAC1C,2DAAyC;AACzC,uEAAqD;AACrD,2DAAyC;AACzC,gEAA8C;AAC9C,+DAA6C;AAC7C,2EAAyD;AACzD,+DAA6C;AAC7C,sEAAoD;AACpD,kFAAgE;AAChE,0EAAwD;AACxD,sFAAoE;AACpE,0EAAwD;AACxD,gEAA8C;AAC9C,+DAA6C;AAC7C,2EAAyD;AACzD,mEAAiD;AACjD,+EAA6D;AAC7D,mEAAiD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Configuration interface for the BlogModule.
3
+ *
4
+ * Every option is optional and defaults to the inert value, so
5
+ * `BlogModule.forRoot()` with no arguments mounts the authenticated admin
6
+ * controllers and nothing else.
7
+ */
8
+ export interface BlogModuleConfig {
9
+ /**
10
+ * When true, the module additionally mounts `BlogPublicController`, which
11
+ * serves DELIBERATELY UNAUTHENTICATED read routes under `public/blog-*`.
12
+ * They return published posts only, and never the author's User node.
13
+ *
14
+ * @default false
15
+ */
16
+ publicRoutes?: boolean;
17
+ }
18
+ /**
19
+ * Default configuration values.
20
+ */
21
+ export declare const DEFAULT_BLOG_CONFIG: Required<BlogModuleConfig>;
22
+ //# sourceMappingURL=blog.config.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.config.interface.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/interfaces/blog.config.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,gBAAgB,CAE1D,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_BLOG_CONFIG = void 0;
4
+ /**
5
+ * Default configuration values.
6
+ */
7
+ exports.DEFAULT_BLOG_CONFIG = {
8
+ publicRoutes: false,
9
+ };
10
+ //# sourceMappingURL=blog.config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.config.interface.js","sourceRoot":"","sources":["../../../../src/foundations/blog/interfaces/blog.config.interface.ts"],"names":[],"mappings":";;;AAkBA;;GAEG;AACU,QAAA,mBAAmB,GAA+B;IAC7D,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { WorkerHost } from "@nestjs/bullmq";
2
+ import { Job } from "bullmq";
3
+ import { ClsService } from "nestjs-cls";
4
+ import { z } from "zod";
5
+ import { BlockNoteService } from "../../../core/blocknote/services/blocknote.service";
6
+ import { LLMService } from "../../../core/llm/services/llm.service";
7
+ import { AppLoggingService } from "../../../core/logging/services/logging.service";
8
+ import { BlogCategoryTranslationRepository } from "../repositories/blog-category-translation.repository";
9
+ import { BlogPostTranslationRepository } from "../repositories/blog-post-translation.repository";
10
+ import { BlogPostRepository } from "../repositories/blog-post.repository";
11
+ import { BlogQueueService } from "../services/blog-queue.service";
12
+ export declare const blogSummaryInputSchema: z.ZodObject<{
13
+ language: z.ZodString;
14
+ title: z.ZodString;
15
+ body_markdown: z.ZodString;
16
+ }, z.core.$strip>;
17
+ export declare const blogSummaryOutputSchema: z.ZodObject<{
18
+ summary: z.ZodString;
19
+ }, z.core.$strip>;
20
+ export declare const blogPostTranslateInputSchema: z.ZodObject<{
21
+ source_language: z.ZodString;
22
+ target_language: z.ZodString;
23
+ title: z.ZodString;
24
+ summary: z.ZodString;
25
+ cover_image_alt: z.ZodString;
26
+ segments: z.ZodArray<z.ZodString>;
27
+ previous_rejection: z.ZodString;
28
+ }, z.core.$strip>;
29
+ export declare const blogPostTranslateOutputSchema: z.ZodObject<{
30
+ title: z.ZodString;
31
+ summary: z.ZodString;
32
+ coverImageAlt: z.ZodString;
33
+ segments: z.ZodArray<z.ZodString>;
34
+ }, z.core.$strip>;
35
+ export declare const blogCategoryTranslateInputSchema: z.ZodObject<{
36
+ source_language: z.ZodString;
37
+ target_language: z.ZodString;
38
+ name: z.ZodString;
39
+ description: z.ZodString;
40
+ }, z.core.$strip>;
41
+ export declare const blogCategoryTranslateOutputSchema: z.ZodObject<{
42
+ name: z.ZodString;
43
+ description: z.ZodString;
44
+ }, z.core.$strip>;
45
+ /**
46
+ * Worker for the blog AI jobs: summary generation and per-language translation of posts and
47
+ * categories.
48
+ *
49
+ * Blog content is platform content: jobs carry no companyId and none is ever set in CLS, so token
50
+ * usage is recorded against the post or category and no company is charged.
51
+ */
52
+ export declare class BlogProcessor extends WorkerHost {
53
+ private readonly logger;
54
+ private readonly cls;
55
+ private readonly llmService;
56
+ private readonly blockNoteService;
57
+ private readonly blogPostRepository;
58
+ private readonly blogPostTranslationRepository;
59
+ private readonly blogCategoryTranslationRepository;
60
+ private readonly blogQueueService;
61
+ constructor(logger: AppLoggingService, cls: ClsService, llmService: LLMService, blockNoteService: BlockNoteService, blogPostRepository: BlogPostRepository, blogPostTranslationRepository: BlogPostTranslationRepository, blogCategoryTranslationRepository: BlogCategoryTranslationRepository, blogQueueService: BlogQueueService);
62
+ onActive(job: Job): void;
63
+ onCompleted(job: Job): void;
64
+ /**
65
+ * Runs on every failed attempt. Only after the last attempt does it mark the affected
66
+ * languages `failed`, so the admin sees the mark and the "Translate again" button.
67
+ */
68
+ onFailed(job: Job, err: Error): Promise<void>;
69
+ process(job: Job): Promise<void>;
70
+ private _processPost;
71
+ private _translatePost;
72
+ private _uniquePostSlug;
73
+ private _processCategory;
74
+ private _translateCategory;
75
+ private _parseBlocks;
76
+ }
77
+ //# sourceMappingURL=blog.processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.processor.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/processors/blog.processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAOnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,sDAAsD,CAAC;AACzG,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAalE,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;iBAMlC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;iBAkBvC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;iBAaxC,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;;;iBAK3C,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;iBAK5C,CAAC;AAEH;;;;;;GAMG;AACH,qBACa,aAAc,SAAQ,UAAU;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,6BAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAC,iCAAiC;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAPhB,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,gBAAgB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,6BAA6B,EAAE,6BAA6B,EAC5D,iCAAiC,EAAE,iCAAiC,EACpE,gBAAgB,EAAE,gBAAgB;IAMrD,QAAQ,CAAC,GAAG,EAAE,GAAG;IAKjB,WAAW,CAAC,GAAG,EAAE,GAAG;IAIpB;;;OAGG;IAEG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7C,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAuBxB,YAAY;YA6CZ,cAAc;YAqFd,eAAe;YAkBf,gBAAgB;YAMhB,kBAAkB;IAkEhC,OAAO,CAAC,YAAY;CAIrB"}
@@ -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