@carlonicora/nestjs-neo4jsonapi 6.7.0 → 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 (210) 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/tokenusage/enums/tokenusage.type.d.ts +3 -1
  207. package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
  208. package/dist/foundations/tokenusage/enums/tokenusage.type.js +2 -0
  209. package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
  210. package/package.json +1 -1
@@ -0,0 +1,88 @@
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 { BlogPostTranslation, BlogPostTranslationDescriptor } from "../entities/blog-post-translation";
8
+ export declare class BlogPostTranslationRepository extends AbstractRepository<BlogPostTranslation, typeof BlogPostTranslationDescriptor.relationships> {
9
+ protected readonly descriptor: import("../../..").EntityDescriptor<BlogPostTranslation, {
10
+ post: {
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 post.
21
+ */
22
+ findOriginal(params: {
23
+ postId: string;
24
+ }): Promise<BlogPostTranslation | null>;
25
+ /**
26
+ * The translation of a post in one language (original, AI, manual or placeholder).
27
+ */
28
+ findByPostAndLanguage(params: {
29
+ postId: string;
30
+ language: string;
31
+ }): Promise<BlogPostTranslation | null>;
32
+ /**
33
+ * Every slug in one language (across all posts) starting with `prefix`, for the `-2`, `-3`
34
+ * collision suffix. `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, so the
43
+ * admin sees "Translating..." at once. Existing records keep their text until the job writes.
44
+ */
45
+ ensurePending(params: {
46
+ postId: string;
47
+ languages: string[];
48
+ }): Promise<void>;
49
+ /**
50
+ * Sets the AI status of the given non-original languages of a post.
51
+ */
52
+ setAiStatus(params: {
53
+ postId: string;
54
+ languages: string[];
55
+ aiStatus: AiStatus;
56
+ }): Promise<void>;
57
+ /**
58
+ * Rewrites the text of one translation and bumps the post's updatedAt. A `manual` source also
59
+ * marks the record completed, so a hand-edited language is served even if its job had failed.
60
+ */
61
+ updateText(params: {
62
+ id: string;
63
+ title: string;
64
+ slug: string;
65
+ summary?: string;
66
+ body: string;
67
+ bodyText: string;
68
+ coverImageAlt?: string;
69
+ readingMinutes: number;
70
+ source?: BlogTranslationSource;
71
+ }): Promise<void>;
72
+ /**
73
+ * Upserts the AI translation of a post in one non-original language: source "ai", status
74
+ * completed, translatedAt now. Overwrites any manual edit, by design.
75
+ */
76
+ writeAiTranslation(params: {
77
+ postId: string;
78
+ language: string;
79
+ title: string;
80
+ slug: string;
81
+ summary?: string;
82
+ body: string;
83
+ bodyText: string;
84
+ coverImageAlt?: string;
85
+ readingMinutes: number;
86
+ }): Promise<void>;
87
+ }
88
+ //# sourceMappingURL=blog-post-translation.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-translation.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post-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,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAOvG,qBACa,6BAA8B,SAAQ,kBAAkB,CACnE,mBAAmB,EACnB,OAAO,6BAA6B,CAAC,aAAa,CACnD;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;OAAiC;gBAElD,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAiBnF;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAiB9G;;;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;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrG;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjB;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuClB"}
@@ -0,0 +1,220 @@
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.BlogPostTranslationRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const ai_status_1 = require("../../../common/enums/ai.status");
16
+ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
17
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
18
+ const security_service_1 = require("../../../core/security/services/security.service");
19
+ const blog_post_meta_1 = require("../entities/blog-post.meta");
20
+ const blog_post_translation_1 = require("../entities/blog-post-translation");
21
+ const blog_post_translation_meta_1 = require("../entities/blog-post-translation.meta");
22
+ const translation = blog_post_translation_meta_1.blogPostTranslationMeta.nodeName;
23
+ const translationLabel = blog_post_translation_meta_1.blogPostTranslationMeta.labelName;
24
+ const postLabel = blog_post_meta_1.blogPostMeta.labelName;
25
+ let BlogPostTranslationRepository = class BlogPostTranslationRepository extends abstract_repository_1.AbstractRepository {
26
+ constructor(neo4j, securityService, clsService) {
27
+ super(neo4j, securityService, clsService);
28
+ this.descriptor = blog_post_translation_1.BlogPostTranslationDescriptor;
29
+ }
30
+ /**
31
+ * The original-language translation of a post.
32
+ */
33
+ async findOriginal(params) {
34
+ const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
35
+ query.queryParams = { ...query.queryParams, postId: params.postId };
36
+ query.query += `
37
+ ${this.buildDefaultMatch()}
38
+ WHERE ${translation}.isOriginal = true
39
+ AND EXISTS {
40
+ MATCH (${translation})<-[:HAS_TRANSLATION]-(:${postLabel} {id: $postId})
41
+ }
42
+ ${this.buildReturnStatement()}
43
+ `;
44
+ return this.neo4j.readOne(query);
45
+ }
46
+ /**
47
+ * The translation of a post in one language (original, AI, manual or placeholder).
48
+ */
49
+ async findByPostAndLanguage(params) {
50
+ const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
51
+ query.queryParams = { ...query.queryParams, postId: params.postId, language: params.language };
52
+ query.query += `
53
+ ${this.buildDefaultMatch()}
54
+ WHERE ${translation}.language = $language
55
+ AND EXISTS {
56
+ MATCH (${translation})<-[:HAS_TRANSLATION]-(:${postLabel} {id: $postId})
57
+ }
58
+ ${this.buildReturnStatement()}
59
+ `;
60
+ return this.neo4j.readOne(query);
61
+ }
62
+ /**
63
+ * Every slug in one language (across all posts) starting with `prefix`, for the `-2`, `-3`
64
+ * collision suffix. `excludeTranslationId` leaves out the record being re-slugged.
65
+ */
66
+ async findSlugsWithPrefix(params) {
67
+ const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
68
+ query.queryParams = {
69
+ ...query.queryParams,
70
+ language: params.language,
71
+ prefix: params.prefix,
72
+ excludeTranslationId: params.excludeTranslationId ?? null,
73
+ };
74
+ query.query += `
75
+ ${this.buildDefaultMatch()}
76
+ WHERE ${translation}.language = $language
77
+ AND ${translation}.slug STARTS WITH $prefix
78
+ AND ($excludeTranslationId IS NULL OR ${translation}.id <> $excludeTranslationId)
79
+ RETURN ${translation}
80
+ `;
81
+ const translations = await this.neo4j.readMany(query);
82
+ return translations.map((item) => item.slug).filter((slug) => !!slug);
83
+ }
84
+ /**
85
+ * Creates (or keeps) one placeholder per non-original language and marks it pending, so the
86
+ * admin sees "Translating..." at once. Existing records keep their text until the job writes.
87
+ */
88
+ async ensurePending(params) {
89
+ if (params.languages.length === 0)
90
+ return;
91
+ await this.neo4j.executeInTransaction([
92
+ {
93
+ query: `
94
+ MATCH (post:${postLabel} {id: $postId})
95
+ UNWIND $languages AS language
96
+ WITH post, language
97
+ WHERE language <> post.originalLanguage
98
+ MERGE (post)-[:HAS_TRANSLATION]->(${translation}:${translationLabel} {language: language})
99
+ ON CREATE SET
100
+ ${translation}.id = randomUUID(),
101
+ ${translation}.isOriginal = false,
102
+ ${translation}.source = $source,
103
+ ${translation}.createdAt = datetime()
104
+ SET ${translation}.aiStatus = $aiStatus, ${translation}.updatedAt = datetime()
105
+ `,
106
+ params: {
107
+ postId: params.postId,
108
+ languages: params.languages,
109
+ source: "ai",
110
+ aiStatus: ai_status_1.AiStatus.Pending,
111
+ },
112
+ },
113
+ ]);
114
+ }
115
+ /**
116
+ * Sets the AI status of the given non-original languages of a post.
117
+ */
118
+ async setAiStatus(params) {
119
+ if (params.languages.length === 0)
120
+ return;
121
+ await this.neo4j.executeInTransaction([
122
+ {
123
+ query: `
124
+ MATCH (:${postLabel} {id: $postId})-[:HAS_TRANSLATION]->(${translation}:${translationLabel})
125
+ WHERE ${translation}.language IN $languages
126
+ AND ${translation}.isOriginal = false
127
+ SET ${translation}.aiStatus = $aiStatus, ${translation}.updatedAt = datetime()
128
+ `,
129
+ params: { postId: params.postId, languages: params.languages, aiStatus: params.aiStatus },
130
+ },
131
+ ]);
132
+ }
133
+ /**
134
+ * Rewrites the text of one translation and bumps the post's updatedAt. A `manual` source also
135
+ * marks the record completed, so a hand-edited language is served even if its job had failed.
136
+ */
137
+ async updateText(params) {
138
+ await this.neo4j.executeInTransaction([
139
+ {
140
+ query: `
141
+ MATCH (${translation}:${translationLabel} {id: $id})
142
+ SET ${translation}.title = $title,
143
+ ${translation}.slug = $slug,
144
+ ${translation}.summary = $summary,
145
+ ${translation}.body = $body,
146
+ ${translation}.bodyText = $bodyText,
147
+ ${translation}.coverImageAlt = $coverImageAlt,
148
+ ${translation}.readingMinutes = $readingMinutes,
149
+ ${translation}.updatedAt = datetime()
150
+ ${params.source ? `SET ${translation}.source = $source` : ""}
151
+ ${params.source === "manual" ? `SET ${translation}.aiStatus = $completedStatus` : ""}
152
+ WITH ${translation}
153
+ OPTIONAL MATCH (post:${postLabel})-[:HAS_TRANSLATION]->(${translation})
154
+ FOREACH (item IN CASE WHEN post IS NULL THEN [] ELSE [post] END | SET item.updatedAt = datetime())
155
+ `,
156
+ params: {
157
+ id: params.id,
158
+ title: params.title,
159
+ slug: params.slug,
160
+ summary: params.summary ?? null,
161
+ body: params.body,
162
+ bodyText: params.bodyText,
163
+ coverImageAlt: params.coverImageAlt ?? null,
164
+ readingMinutes: params.readingMinutes,
165
+ source: params.source ?? null,
166
+ completedStatus: ai_status_1.AiStatus.Completed,
167
+ },
168
+ },
169
+ ]);
170
+ }
171
+ /**
172
+ * Upserts the AI translation of a post in one non-original language: source "ai", status
173
+ * completed, translatedAt now. Overwrites any manual edit, by design.
174
+ */
175
+ async writeAiTranslation(params) {
176
+ await this.neo4j.executeInTransaction([
177
+ {
178
+ query: `
179
+ MATCH (post:${postLabel} {id: $postId})
180
+ WHERE post.originalLanguage <> $language
181
+ MERGE (post)-[:HAS_TRANSLATION]->(${translation}:${translationLabel} {language: $language})
182
+ ON CREATE SET
183
+ ${translation}.id = randomUUID(),
184
+ ${translation}.isOriginal = false,
185
+ ${translation}.createdAt = datetime()
186
+ SET ${translation}.source = $source,
187
+ ${translation}.aiStatus = $aiStatus,
188
+ ${translation}.title = $title,
189
+ ${translation}.slug = $slug,
190
+ ${translation}.summary = $summary,
191
+ ${translation}.body = $body,
192
+ ${translation}.bodyText = $bodyText,
193
+ ${translation}.coverImageAlt = $coverImageAlt,
194
+ ${translation}.readingMinutes = $readingMinutes,
195
+ ${translation}.translatedAt = datetime(),
196
+ ${translation}.updatedAt = datetime()
197
+ `,
198
+ params: {
199
+ postId: params.postId,
200
+ language: params.language,
201
+ source: "ai",
202
+ aiStatus: ai_status_1.AiStatus.Completed,
203
+ title: params.title,
204
+ slug: params.slug,
205
+ summary: params.summary ?? null,
206
+ body: params.body,
207
+ bodyText: params.bodyText,
208
+ coverImageAlt: params.coverImageAlt ?? null,
209
+ readingMinutes: params.readingMinutes,
210
+ },
211
+ },
212
+ ]);
213
+ }
214
+ };
215
+ exports.BlogPostTranslationRepository = BlogPostTranslationRepository;
216
+ exports.BlogPostTranslationRepository = BlogPostTranslationRepository = __decorate([
217
+ (0, common_1.Injectable)(),
218
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
219
+ ], BlogPostTranslationRepository);
220
+ //# sourceMappingURL=blog-post-translation.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post-translation.repository.js","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post-translation.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { JsonApiCursorInterface } from "../../../core/jsonapi/interfaces/jsonapi.cursor.interface";
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 { BlogPostStatus } from "../blog.constants";
7
+ import { BlogPost, BlogPostDescriptor } from "../entities/blog-post";
8
+ export declare class BlogPostRepository extends AbstractRepository<BlogPost, typeof BlogPostDescriptor.relationships> {
9
+ protected readonly descriptor: import("../../..").EntityDescriptor<BlogPost, {
10
+ author: {
11
+ model: import("../../..").DataMeta;
12
+ direction: "in";
13
+ relationship: string;
14
+ cardinality: "one";
15
+ description: string;
16
+ };
17
+ categories: {
18
+ model: import("../../..").DataMeta;
19
+ direction: "out";
20
+ relationship: string;
21
+ cardinality: "many";
22
+ required: false;
23
+ dtoKey: string;
24
+ description: string;
25
+ };
26
+ translations: {
27
+ model: import("../../..").DataMeta;
28
+ direction: "out";
29
+ relationship: string;
30
+ cardinality: "many";
31
+ required: false;
32
+ description: string;
33
+ };
34
+ }>;
35
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
36
+ /**
37
+ * Admin list. A post has no text of its own (every string lives on its
38
+ * translations), so the inherited find would ignore `term`: a search matches
39
+ * any language version through the translation full-text index instead.
40
+ */
41
+ find(params: Parameters<AbstractRepository<BlogPost, typeof BlogPostDescriptor.relationships>["find"]>[0]): Promise<any[]>;
42
+ /**
43
+ * Resolves the translation a visitor reads into `t`: the translation in $language when its
44
+ * AI status is completed, otherwise the original. Pattern comprehensions, so the row count
45
+ * (and the ORDER BY applied later) never changes.
46
+ */
47
+ private buildResolvedTranslation;
48
+ /**
49
+ * Public RETURN: the post node plus the resolved-language columns read by the descriptor's
50
+ * computed fields. Never returns the author User node (no email leak) nor translation nodes.
51
+ */
52
+ private buildPublicReturn;
53
+ createWithOriginal(params: {
54
+ id: string;
55
+ authorId: string;
56
+ originalLanguage: string;
57
+ coverImage?: string;
58
+ categoryIds: string[];
59
+ translation: {
60
+ id: string;
61
+ title: string;
62
+ slug: string;
63
+ summary?: string;
64
+ body: string;
65
+ bodyText: string;
66
+ coverImageAlt?: string;
67
+ readingMinutes: number;
68
+ };
69
+ }): Promise<void>;
70
+ /**
71
+ * Full update of the language-independent fields: a missing coverImage clears it, and the
72
+ * category edges become exactly `categoryIds`.
73
+ */
74
+ updateShared(params: {
75
+ id: string;
76
+ coverImage?: string;
77
+ categoryIds: string[];
78
+ }): Promise<void>;
79
+ /**
80
+ * Sets the status. Publishing stamps publishedAt only the first time, so unpublish and
81
+ * republish keep the original date.
82
+ */
83
+ setStatus(params: {
84
+ id: string;
85
+ status: BlogPostStatus;
86
+ }): Promise<void>;
87
+ deleteWithTranslations(params: {
88
+ id: string;
89
+ }): Promise<void>;
90
+ /**
91
+ * Published posts in the visitor's language (original as fallback), newest first, optionally
92
+ * filtered by a category slug in any language and searched through the translation full-text
93
+ * index (only the resolved translation of each post can match).
94
+ */
95
+ findPublished(params: {
96
+ language: string;
97
+ categorySlug?: string;
98
+ term?: string;
99
+ cursor: JsonApiCursorInterface;
100
+ }): Promise<BlogPost[]>;
101
+ /**
102
+ * One published post by a slug of ANY of its languages, with the text resolved in $language.
103
+ * When two posts share the slug in different languages, the one owning it in $language wins.
104
+ */
105
+ findPublishedBySlug(params: {
106
+ slug: string;
107
+ language: string;
108
+ }): Promise<BlogPost | null>;
109
+ /**
110
+ * Up to `limit` other published posts sharing a category with the given post, newest first.
111
+ */
112
+ findPublishedRelated(params: {
113
+ postId: string;
114
+ language: string;
115
+ limit: number;
116
+ }): Promise<BlogPost[]>;
117
+ }
118
+ //# sourceMappingURL=blog-post.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAWrE,qBACa,kBAAmB,SAAQ,kBAAkB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,CAAC,aAAa,CAAC;IAC3G,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;OAAsB;gBAEvC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IA2B/G;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAenB,kBAAkB,CAAC,MAAM,EAAE;QAC/B,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE;YACX,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,GAAG,OAAO,CAAC,IAAI,CAAC;IAuEjB;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrG;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE,sBAAsB,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,sBAAsB,CAAC;KAChC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAyDvB;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6B/F;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CA0B7G"}