@carlonicora/nestjs-neo4jsonapi 4.4.0 → 4.6.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 (215) hide show
  1. package/dist/agents/responder/factories/responder.context.factory.d.ts +2 -1
  2. package/dist/agents/responder/factories/responder.context.factory.d.ts.map +1 -1
  3. package/dist/agents/responder/factories/responder.context.factory.js.map +1 -1
  4. package/dist/agents/responder/services/responder.service.d.ts +16 -1
  5. package/dist/agents/responder/services/responder.service.d.ts.map +1 -1
  6. package/dist/agents/responder/services/responder.service.js +14 -2
  7. package/dist/agents/responder/services/responder.service.js.map +1 -1
  8. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  9. package/dist/bootstrap/app.module.factory.js +2 -0
  10. package/dist/bootstrap/app.module.factory.js.map +1 -1
  11. package/dist/bootstrap/bootstrap.options.d.ts +35 -0
  12. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  13. package/dist/common/index.d.ts +1 -0
  14. package/dist/common/index.d.ts.map +1 -1
  15. package/dist/common/index.js +4 -0
  16. package/dist/common/index.js.map +1 -1
  17. package/dist/common/repositories/handbook.ai-source-query.provider.d.ts +34 -0
  18. package/dist/common/repositories/handbook.ai-source-query.provider.d.ts.map +1 -0
  19. package/dist/common/repositories/handbook.ai-source-query.provider.js +58 -0
  20. package/dist/common/repositories/handbook.ai-source-query.provider.js.map +1 -0
  21. package/dist/common/repositories/index.d.ts +1 -0
  22. package/dist/common/repositories/index.d.ts.map +1 -1
  23. package/dist/common/repositories/index.js +1 -0
  24. package/dist/common/repositories/index.js.map +1 -1
  25. package/dist/common/types/data.limits.d.ts +4 -0
  26. package/dist/common/types/data.limits.d.ts.map +1 -1
  27. package/dist/common/utils/chunk-content.util.d.ts +28 -0
  28. package/dist/common/utils/chunk-content.util.d.ts.map +1 -0
  29. package/dist/common/utils/chunk-content.util.js +32 -0
  30. package/dist/common/utils/chunk-content.util.js.map +1 -0
  31. package/dist/config/base.config.d.ts.map +1 -1
  32. package/dist/config/base.config.js +1 -0
  33. package/dist/config/base.config.js.map +1 -1
  34. package/dist/config/enums/queue.id.d.ts +1 -0
  35. package/dist/config/enums/queue.id.d.ts.map +1 -1
  36. package/dist/config/enums/queue.id.js +1 -0
  37. package/dist/config/enums/queue.id.js.map +1 -1
  38. package/dist/config/interfaces/config.two.factor.interface.d.ts +10 -3
  39. package/dist/config/interfaces/config.two.factor.interface.d.ts.map +1 -1
  40. package/dist/core/core.module.d.ts.map +1 -1
  41. package/dist/core/core.module.js +8 -1
  42. package/dist/core/core.module.js.map +1 -1
  43. package/dist/core/llm/services/model.service.d.ts +13 -0
  44. package/dist/core/llm/services/model.service.d.ts.map +1 -1
  45. package/dist/core/llm/services/model.service.js +22 -0
  46. package/dist/core/llm/services/model.service.js.map +1 -1
  47. package/dist/core/neo4j/abstracts/abstract.service.d.ts.map +1 -1
  48. package/dist/core/neo4j/abstracts/abstract.service.js +8 -1
  49. package/dist/core/neo4j/abstracts/abstract.service.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 +6 -2
  52. package/dist/foundations/assistant/controllers/assistant.controller.js.map +1 -1
  53. package/dist/foundations/assistant/dtos/assistant-append.dto.d.ts +2 -0
  54. package/dist/foundations/assistant/dtos/assistant-append.dto.d.ts.map +1 -1
  55. package/dist/foundations/assistant/dtos/assistant-append.dto.js +10 -0
  56. package/dist/foundations/assistant/dtos/assistant-append.dto.js.map +1 -1
  57. package/dist/foundations/assistant/dtos/assistant-post.dto.d.ts +2 -0
  58. package/dist/foundations/assistant/dtos/assistant-post.dto.d.ts.map +1 -1
  59. package/dist/foundations/assistant/dtos/assistant-post.dto.js +10 -0
  60. package/dist/foundations/assistant/dtos/assistant-post.dto.js.map +1 -1
  61. package/dist/foundations/assistant/services/assistant.service.d.ts +8 -1
  62. package/dist/foundations/assistant/services/assistant.service.d.ts.map +1 -1
  63. package/dist/foundations/assistant/services/assistant.service.js +14 -1
  64. package/dist/foundations/assistant/services/assistant.service.js.map +1 -1
  65. package/dist/foundations/foundations.modules.d.ts +6 -0
  66. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  67. package/dist/foundations/foundations.modules.js +10 -2
  68. package/dist/foundations/foundations.modules.js.map +1 -1
  69. package/dist/foundations/handbook/controllers/handbook-thread.controller.d.ts +61 -0
  70. package/dist/foundations/handbook/controllers/handbook-thread.controller.d.ts.map +1 -0
  71. package/dist/foundations/handbook/controllers/handbook-thread.controller.js +170 -0
  72. package/dist/foundations/handbook/controllers/handbook-thread.controller.js.map +1 -0
  73. package/dist/foundations/handbook/controllers/handbook.controller.d.ts +29 -0
  74. package/dist/foundations/handbook/controllers/handbook.controller.d.ts.map +1 -0
  75. package/dist/foundations/handbook/controllers/handbook.controller.js +123 -0
  76. package/dist/foundations/handbook/controllers/handbook.controller.js.map +1 -0
  77. package/dist/foundations/handbook/dtos/handbook-page.dto.d.ts +11 -0
  78. package/dist/foundations/handbook/dtos/handbook-page.dto.d.ts.map +1 -0
  79. package/dist/foundations/handbook/dtos/handbook-page.dto.js +45 -0
  80. package/dist/foundations/handbook/dtos/handbook-page.dto.js.map +1 -0
  81. package/dist/foundations/handbook/dtos/handbook-thread-message-post.dto.d.ts +24 -0
  82. package/dist/foundations/handbook/dtos/handbook-thread-message-post.dto.d.ts.map +1 -0
  83. package/dist/foundations/handbook/dtos/handbook-thread-message-post.dto.js +60 -0
  84. package/dist/foundations/handbook/dtos/handbook-thread-message-post.dto.js.map +1 -0
  85. package/dist/foundations/handbook/dtos/handbook-thread-patch.dto.d.ts +19 -0
  86. package/dist/foundations/handbook/dtos/handbook-thread-patch.dto.d.ts.map +1 -0
  87. package/dist/foundations/handbook/dtos/handbook-thread-patch.dto.js +59 -0
  88. package/dist/foundations/handbook/dtos/handbook-thread-patch.dto.js.map +1 -0
  89. package/dist/foundations/handbook/dtos/handbook-thread-post.dto.d.ts +24 -0
  90. package/dist/foundations/handbook/dtos/handbook-thread-post.dto.d.ts.map +1 -0
  91. package/dist/foundations/handbook/dtos/handbook-thread-post.dto.js +60 -0
  92. package/dist/foundations/handbook/dtos/handbook-thread-post.dto.js.map +1 -0
  93. package/dist/foundations/handbook/entities/handbook-page.d.ts +25 -0
  94. package/dist/foundations/handbook/entities/handbook-page.d.ts.map +1 -0
  95. package/dist/foundations/handbook/entities/handbook-page.js +45 -0
  96. package/dist/foundations/handbook/entities/handbook-page.js.map +1 -0
  97. package/dist/foundations/handbook/entities/handbook-page.meta.d.ts +3 -0
  98. package/dist/foundations/handbook/entities/handbook-page.meta.d.ts.map +1 -0
  99. package/dist/foundations/handbook/entities/handbook-page.meta.js +10 -0
  100. package/dist/foundations/handbook/entities/handbook-page.meta.js.map +1 -0
  101. package/dist/foundations/handbook/entities/handbook-section.d.ts +22 -0
  102. package/dist/foundations/handbook/entities/handbook-section.d.ts.map +1 -0
  103. package/dist/foundations/handbook/entities/handbook-section.js +24 -0
  104. package/dist/foundations/handbook/entities/handbook-section.js.map +1 -0
  105. package/dist/foundations/handbook/entities/handbook-section.meta.d.ts +3 -0
  106. package/dist/foundations/handbook/entities/handbook-section.meta.d.ts.map +1 -0
  107. package/dist/foundations/handbook/entities/handbook-section.meta.js +10 -0
  108. package/dist/foundations/handbook/entities/handbook-section.meta.js.map +1 -0
  109. package/dist/foundations/handbook/entities/handbook-thread-message.d.ts +36 -0
  110. package/dist/foundations/handbook/entities/handbook-thread-message.d.ts.map +1 -0
  111. package/dist/foundations/handbook/entities/handbook-thread-message.js +28 -0
  112. package/dist/foundations/handbook/entities/handbook-thread-message.js.map +1 -0
  113. package/dist/foundations/handbook/entities/handbook-thread-message.meta.d.ts +3 -0
  114. package/dist/foundations/handbook/entities/handbook-thread-message.meta.d.ts.map +1 -0
  115. package/dist/foundations/handbook/entities/handbook-thread-message.meta.js +10 -0
  116. package/dist/foundations/handbook/entities/handbook-thread-message.meta.js.map +1 -0
  117. package/dist/foundations/handbook/entities/handbook-thread.d.ts +47 -0
  118. package/dist/foundations/handbook/entities/handbook-thread.d.ts.map +1 -0
  119. package/dist/foundations/handbook/entities/handbook-thread.js +35 -0
  120. package/dist/foundations/handbook/entities/handbook-thread.js.map +1 -0
  121. package/dist/foundations/handbook/entities/handbook-thread.meta.d.ts +3 -0
  122. package/dist/foundations/handbook/entities/handbook-thread.meta.d.ts.map +1 -0
  123. package/dist/foundations/handbook/entities/handbook-thread.meta.js +10 -0
  124. package/dist/foundations/handbook/entities/handbook-thread.meta.js.map +1 -0
  125. package/dist/foundations/handbook/handbook.module.d.ts +21 -0
  126. package/dist/foundations/handbook/handbook.module.d.ts.map +1 -0
  127. package/dist/foundations/handbook/handbook.module.js +135 -0
  128. package/dist/foundations/handbook/handbook.module.js.map +1 -0
  129. package/dist/foundations/handbook/index.d.ts +23 -0
  130. package/dist/foundations/handbook/index.d.ts.map +1 -0
  131. package/dist/foundations/handbook/index.js +39 -0
  132. package/dist/foundations/handbook/index.js.map +1 -0
  133. package/dist/foundations/handbook/interfaces/handbook.config.interface.d.ts +26 -0
  134. package/dist/foundations/handbook/interfaces/handbook.config.interface.d.ts.map +1 -0
  135. package/dist/foundations/handbook/interfaces/handbook.config.interface.js +10 -0
  136. package/dist/foundations/handbook/interfaces/handbook.config.interface.js.map +1 -0
  137. package/dist/foundations/handbook/processors/handbook.processor.d.ts +22 -0
  138. package/dist/foundations/handbook/processors/handbook.processor.d.ts.map +1 -0
  139. package/dist/foundations/handbook/processors/handbook.processor.js +108 -0
  140. package/dist/foundations/handbook/processors/handbook.processor.js.map +1 -0
  141. package/dist/foundations/handbook/repositories/handbook-page.repository.d.ts +135 -0
  142. package/dist/foundations/handbook/repositories/handbook-page.repository.d.ts.map +1 -0
  143. package/dist/foundations/handbook/repositories/handbook-page.repository.js +245 -0
  144. package/dist/foundations/handbook/repositories/handbook-page.repository.js.map +1 -0
  145. package/dist/foundations/handbook/repositories/handbook-section.repository.d.ts +36 -0
  146. package/dist/foundations/handbook/repositories/handbook-section.repository.d.ts.map +1 -0
  147. package/dist/foundations/handbook/repositories/handbook-section.repository.js +91 -0
  148. package/dist/foundations/handbook/repositories/handbook-section.repository.js.map +1 -0
  149. package/dist/foundations/handbook/repositories/handbook-thread-message.repository.d.ts +36 -0
  150. package/dist/foundations/handbook/repositories/handbook-thread-message.repository.d.ts.map +1 -0
  151. package/dist/foundations/handbook/repositories/handbook-thread-message.repository.js +63 -0
  152. package/dist/foundations/handbook/repositories/handbook-thread-message.repository.js.map +1 -0
  153. package/dist/foundations/handbook/repositories/handbook-thread.repository.d.ts +63 -0
  154. package/dist/foundations/handbook/repositories/handbook-thread.repository.d.ts.map +1 -0
  155. package/dist/foundations/handbook/repositories/handbook-thread.repository.js +86 -0
  156. package/dist/foundations/handbook/repositories/handbook-thread.repository.js.map +1 -0
  157. package/dist/foundations/handbook/services/handbook-ingest.service.d.ts +121 -0
  158. package/dist/foundations/handbook/services/handbook-ingest.service.d.ts.map +1 -0
  159. package/dist/foundations/handbook/services/handbook-ingest.service.js +434 -0
  160. package/dist/foundations/handbook/services/handbook-ingest.service.js.map +1 -0
  161. package/dist/foundations/handbook/services/handbook-page.service.d.ts +57 -0
  162. package/dist/foundations/handbook/services/handbook-page.service.d.ts.map +1 -0
  163. package/dist/foundations/handbook/services/handbook-page.service.js +116 -0
  164. package/dist/foundations/handbook/services/handbook-page.service.js.map +1 -0
  165. package/dist/foundations/handbook/services/handbook-section.service.d.ts +15 -0
  166. package/dist/foundations/handbook/services/handbook-section.service.d.ts.map +1 -0
  167. package/dist/foundations/handbook/services/handbook-section.service.js +37 -0
  168. package/dist/foundations/handbook/services/handbook-section.service.js.map +1 -0
  169. package/dist/foundations/handbook/services/handbook-thread-message.service.d.ts +27 -0
  170. package/dist/foundations/handbook/services/handbook-thread-message.service.d.ts.map +1 -0
  171. package/dist/foundations/handbook/services/handbook-thread-message.service.js +39 -0
  172. package/dist/foundations/handbook/services/handbook-thread-message.service.js.map +1 -0
  173. package/dist/foundations/handbook/services/handbook-thread.service.d.ts +164 -0
  174. package/dist/foundations/handbook/services/handbook-thread.service.d.ts.map +1 -0
  175. package/dist/foundations/handbook/services/handbook-thread.service.js +297 -0
  176. package/dist/foundations/handbook/services/handbook-thread.service.js.map +1 -0
  177. package/dist/foundations/how-to/controllers/how-to.controller.d.ts +7 -1
  178. package/dist/foundations/how-to/controllers/how-to.controller.d.ts.map +1 -1
  179. package/dist/foundations/how-to/controllers/how-to.controller.js +18 -12
  180. package/dist/foundations/how-to/controllers/how-to.controller.js.map +1 -1
  181. package/dist/foundations/how-to/controllers/how-to.public.controller.d.ts +7 -0
  182. package/dist/foundations/how-to/controllers/how-to.public.controller.d.ts.map +1 -1
  183. package/dist/foundations/how-to/controllers/how-to.public.controller.js +7 -0
  184. package/dist/foundations/how-to/controllers/how-to.public.controller.js.map +1 -1
  185. package/dist/foundations/how-to/entities/how-to.d.ts.map +1 -1
  186. package/dist/foundations/how-to/entities/how-to.js +60 -13
  187. package/dist/foundations/how-to/entities/how-to.js.map +1 -1
  188. package/dist/foundations/how-to/how-to.module.d.ts +36 -1
  189. package/dist/foundations/how-to/how-to.module.d.ts.map +1 -1
  190. package/dist/foundations/how-to/how-to.module.js +80 -4
  191. package/dist/foundations/how-to/how-to.module.js.map +1 -1
  192. package/dist/foundations/how-to/index.d.ts +1 -0
  193. package/dist/foundations/how-to/index.d.ts.map +1 -1
  194. package/dist/foundations/how-to/index.js +1 -0
  195. package/dist/foundations/how-to/index.js.map +1 -1
  196. package/dist/foundations/how-to/interfaces/how-to.config.interface.d.ts +30 -0
  197. package/dist/foundations/how-to/interfaces/how-to.config.interface.d.ts.map +1 -0
  198. package/dist/foundations/how-to/interfaces/how-to.config.interface.js +10 -0
  199. package/dist/foundations/how-to/interfaces/how-to.config.interface.js.map +1 -0
  200. package/dist/foundations/how-to/processors/how-to.processor.d.ts +3 -1
  201. package/dist/foundations/how-to/processors/how-to.processor.d.ts.map +1 -1
  202. package/dist/foundations/how-to/processors/how-to.processor.js +8 -1
  203. package/dist/foundations/how-to/processors/how-to.processor.js.map +1 -1
  204. package/dist/foundations/how-to/services/how-to.service.d.ts +4 -0
  205. package/dist/foundations/how-to/services/how-to.service.d.ts.map +1 -1
  206. package/dist/foundations/how-to/services/how-to.service.js +47 -24
  207. package/dist/foundations/how-to/services/how-to.service.js.map +1 -1
  208. package/dist/foundations/index.d.ts +1 -0
  209. package/dist/foundations/index.d.ts.map +1 -1
  210. package/dist/foundations/index.js +1 -0
  211. package/dist/foundations/index.js.map +1 -1
  212. package/dist/foundations/two-factor/services/totp.service.d.ts.map +1 -1
  213. package/dist/foundations/two-factor/services/totp.service.js +2 -1
  214. package/dist/foundations/two-factor/services/totp.service.js.map +1 -1
  215. package/package.json +1 -1
@@ -0,0 +1,245 @@
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.HandbookPageRepository = 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 chunk_meta_1 = require("../../chunk/entities/chunk.meta");
20
+ const handbook_page_1 = require("../entities/handbook-page");
21
+ const handbook_page_meta_1 = require("../entities/handbook-page.meta");
22
+ let HandbookPageRepository = class HandbookPageRepository extends abstract_repository_1.AbstractRepository {
23
+ constructor(neo4j, securityService, clsService) {
24
+ super(neo4j, securityService, clsService);
25
+ this.descriptor = handbook_page_1.HandbookPageDescriptor;
26
+ }
27
+ /**
28
+ * `path` is the natural key of the ingest: the walk looks a page up by the
29
+ * file it came from. The descriptor only auto-creates the `id` constraint
30
+ * (common/helpers/define-entity.ts:387), so this one is declared here — the
31
+ * same place ChunkRepository declares its own indexes.
32
+ *
33
+ * `super.onModuleInit()` runs FIRST and is not optional: the base
34
+ * implementation is what turns the descriptor's `constraints` and `indexes`
35
+ * into real Neo4j objects. Overriding it without delegating would silently
36
+ * drop the `id` uniqueness constraint and the descriptor's FULLTEXT index —
37
+ * the bug NotificationRepository avoids by re-declaring its `id` constraint
38
+ * by hand. Delegating keeps the database config derived from the descriptor.
39
+ */
40
+ async onModuleInit() {
41
+ await super.onModuleInit();
42
+ await this.neo4j.writeOne({
43
+ query: `CREATE CONSTRAINT handbookpage_path IF NOT EXISTS FOR (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName}) REQUIRE ${handbook_page_meta_1.handbookPageMeta.nodeName}.path IS UNIQUE`,
44
+ });
45
+ }
46
+ /**
47
+ * The list is a manual's table of contents, not an audit log.
48
+ *
49
+ * `AbstractRepository.find` orders by `descriptor.defaultOrderBy`, which
50
+ * `defineEntity` hardcodes to `updatedAt DESC` and exposes no way to override
51
+ * — so without this the rows arrive in reverse ingest order and `09-workflow`
52
+ * renders before `00-start-here`. The one ordering hook `find` does offer a
53
+ * caller is `orderByFields`, a multi-key `SortCriterion[]`; supplying a
54
+ * default for it puts `ORDER BY handbookPage.section ASC, handbookPage.order
55
+ * ASC` ahead of `{CURSOR}` in the inherited query and leaves the fulltext
56
+ * branch, the structured filters, the security snippet and the pagination
57
+ * exactly as the framework builds them.
58
+ *
59
+ * `order` is the repo-relative path, so sorting on it inside a section
60
+ * reproduces the filesystem, which is already meaningful. An explicit
61
+ * `orderBy` or `orderByFields` from the request still wins.
62
+ */
63
+ async find(params) {
64
+ const ordered = params.orderByFields?.length || params.orderBy;
65
+ return super.find({
66
+ ...params,
67
+ orderByFields: ordered
68
+ ? params.orderByFields
69
+ : [
70
+ { field: "section", direction: "asc" },
71
+ { field: "order", direction: "asc" },
72
+ ],
73
+ });
74
+ }
75
+ /** Every page, unpaginated — the ingest diffs the whole tree in one pass. */
76
+ async findAllPages() {
77
+ const query = this.neo4j.initQuery({ serialiser: handbook_page_1.HandbookPageDescriptor.model });
78
+ query.query = `
79
+ ${this.buildDefaultMatch()}
80
+ ORDER BY ${handbook_page_meta_1.handbookPageMeta.nodeName}.path ASC
81
+ ${this.buildReturnStatement()}
82
+ `;
83
+ return this.neo4j.readMany(query);
84
+ }
85
+ async findByPath(params) {
86
+ const query = this.neo4j.initQuery({ serialiser: handbook_page_1.HandbookPageDescriptor.model });
87
+ query.queryParams = { ...query.queryParams, path: params.path };
88
+ query.query = `
89
+ ${this.buildDefaultMatch()}
90
+ WHERE ${handbook_page_meta_1.handbookPageMeta.nodeName}.path = $path
91
+ ${this.buildReturnStatement()}
92
+ `;
93
+ return this.neo4j.readOne(query);
94
+ }
95
+ /**
96
+ * Provenance for one answer: the repo-relative path of the page each cited
97
+ * chunk belongs to, in the order the chunks were cited.
98
+ *
99
+ * This does NOT go through `readMany`, because the result is not a
100
+ * `HandbookPage` — it is one scalar column. Raw records never leave this
101
+ * method: the mapping to `string[]` happens here, and a row whose `path` is
102
+ * missing is dropped rather than returned as an empty string. A chunk whose
103
+ * page no longer exists simply does not match, so it disappears from the
104
+ * provenance list instead of appearing as a blank source.
105
+ */
106
+ async findPathsByChunkIds(params) {
107
+ if (params.chunkIds.length === 0)
108
+ return [];
109
+ const result = await this.neo4j.read(`
110
+ UNWIND $chunkIds AS chunkId
111
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName})-[:HAS_CHUNK]->(${chunk_meta_1.chunkMeta.nodeName}:${chunk_meta_1.chunkMeta.labelName} {id: chunkId})
112
+ RETURN ${handbook_page_meta_1.handbookPageMeta.nodeName}.path AS path
113
+ `, { chunkIds: params.chunkIds });
114
+ return (result?.records ?? [])
115
+ .map((record) => record.get("path"))
116
+ .filter((path) => typeof path === "string" && path.length > 0);
117
+ }
118
+ async createPage(params) {
119
+ const query = this.neo4j.initQuery();
120
+ query.queryParams = {
121
+ ...query.queryParams,
122
+ ...params,
123
+ // A page the index does not list has no summary. `null` clears the
124
+ // property in Cypher; `undefined` is not a legal driver parameter.
125
+ summary: params.summary ?? null,
126
+ aiStatus: ai_status_1.AiStatus.Pending,
127
+ };
128
+ query.query = `
129
+ CREATE (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {
130
+ id: $id,
131
+ path: $path,
132
+ title: $title,
133
+ content: $content,
134
+ contentHash: $contentHash,
135
+ wordCount: $wordCount,
136
+ aiStatus: $aiStatus,
137
+ section: $section,
138
+ order: $order,
139
+ summary: $summary,
140
+ createdAt: datetime(),
141
+ updatedAt: datetime()
142
+ })
143
+ `;
144
+ await this.neo4j.writeOne(query);
145
+ }
146
+ async updatePage(params) {
147
+ const query = this.neo4j.initQuery();
148
+ query.queryParams = {
149
+ ...query.queryParams,
150
+ ...params,
151
+ summary: params.summary ?? null,
152
+ aiStatus: ai_status_1.AiStatus.Pending,
153
+ };
154
+ query.query = `
155
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {id: $id})
156
+ SET ${handbook_page_meta_1.handbookPageMeta.nodeName}.title = $title,
157
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.content = $content,
158
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.contentHash = $contentHash,
159
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.wordCount = $wordCount,
160
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.aiStatus = $aiStatus,
161
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.section = $section,
162
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.order = $order,
163
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.summary = $summary,
164
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.updatedAt = datetime()
165
+ `;
166
+ await this.neo4j.writeOne(query);
167
+ }
168
+ /**
169
+ * Index fields only — no content, no hash, no chunk work.
170
+ *
171
+ * The walk calls this for a page whose bytes did not change, so that a sync
172
+ * which only adds new index data (a README summary, a frontmatter `section`)
173
+ * costs nothing in embeddings. Bumping INGEST_FORMAT_VERSION instead would
174
+ * change every contentHash and re-embed the whole tree.
175
+ */
176
+ async updateMetadata(params) {
177
+ const query = this.neo4j.initQuery();
178
+ query.queryParams = { ...query.queryParams, ...params, summary: params.summary ?? null };
179
+ query.query = `
180
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {id: $id})
181
+ SET ${handbook_page_meta_1.handbookPageMeta.nodeName}.title = $title,
182
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.section = $section,
183
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.order = $order,
184
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.summary = $summary,
185
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.updatedAt = datetime()
186
+ `;
187
+ await this.neo4j.writeOne(query);
188
+ }
189
+ /**
190
+ * The display translation of one page — title, summary and body.
191
+ *
192
+ * Display fields ONLY. No content, no contentHash, no aiStatus, no chunk
193
+ * work: the page is indexed in English and shown in the display language, so
194
+ * a translation that arrives, changes or disappears must leave the retrieval
195
+ * store byte-for-byte as it was. Writing `content` here, or bumping the hash,
196
+ * would re-chunk and re-embed the page in the translated language and poison
197
+ * the index the handbook answers from.
198
+ *
199
+ * Every value is bound, and an absent one is bound as `null` rather than
200
+ * omitted: `null` CLEARS the property, which is what a page whose translation
201
+ * was deleted needs, and `undefined` is not a legal driver parameter.
202
+ */
203
+ async updateDisplay(params) {
204
+ const query = this.neo4j.initQuery();
205
+ query.queryParams = {
206
+ ...query.queryParams,
207
+ id: params.id,
208
+ displayTitle: params.displayTitle ?? null,
209
+ displaySummary: params.displaySummary ?? null,
210
+ displayContent: params.displayContent ?? null,
211
+ };
212
+ query.query = `
213
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {id: $id})
214
+ SET ${handbook_page_meta_1.handbookPageMeta.nodeName}.displayTitle = $displayTitle,
215
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.displaySummary = $displaySummary,
216
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.displayContent = $displayContent,
217
+ ${handbook_page_meta_1.handbookPageMeta.nodeName}.updatedAt = datetime()
218
+ `;
219
+ await this.neo4j.writeOne(query);
220
+ }
221
+ async updateStatus(params) {
222
+ const query = this.neo4j.initQuery();
223
+ query.queryParams = { ...query.queryParams, id: params.id, aiStatus: params.aiStatus };
224
+ query.query = `
225
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {id: $id})
226
+ SET ${handbook_page_meta_1.handbookPageMeta.nodeName}.aiStatus = $aiStatus, ${handbook_page_meta_1.handbookPageMeta.nodeName}.updatedAt = datetime()
227
+ `;
228
+ await this.neo4j.writeOne(query);
229
+ }
230
+ async deletePage(params) {
231
+ const query = this.neo4j.initQuery();
232
+ query.queryParams = { ...query.queryParams, id: params.id };
233
+ query.query = `
234
+ MATCH (${handbook_page_meta_1.handbookPageMeta.nodeName}:${handbook_page_meta_1.handbookPageMeta.labelName} {id: $id})
235
+ DETACH DELETE ${handbook_page_meta_1.handbookPageMeta.nodeName}
236
+ `;
237
+ await this.neo4j.writeOne(query);
238
+ }
239
+ };
240
+ exports.HandbookPageRepository = HandbookPageRepository;
241
+ exports.HandbookPageRepository = HandbookPageRepository = __decorate([
242
+ (0, common_1.Injectable)(),
243
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
244
+ ], HandbookPageRepository);
245
+ //# sourceMappingURL=handbook-page.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-page.repository.js","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-page.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { OnModuleInit } from "@nestjs/common";
2
+ import { ClsService } from "nestjs-cls";
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 { HandbookSection, HandbookSectionDescriptor } from "../entities/handbook-section";
7
+ export declare class HandbookSectionRepository extends AbstractRepository<HandbookSection, typeof HandbookSectionDescriptor.relationships> implements OnModuleInit {
8
+ protected readonly descriptor: import("../../..").EntityDescriptor<HandbookSection, {}>;
9
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
10
+ /**
11
+ * `key` is the natural key of the ingest. `super.onModuleInit()` runs FIRST
12
+ * and is not optional: the base implementation turns the descriptor's own
13
+ * constraints and indexes into real Neo4j objects, exactly as
14
+ * HandbookPageRepository documents.
15
+ */
16
+ onModuleInit(): Promise<void>;
17
+ /** Every section, unpaginated — there are ten of them. */
18
+ findAllSections(): Promise<HandbookSection[]>;
19
+ /**
20
+ * Sections are replaced wholesale on every sync: there are ten of them and
21
+ * diffing buys nothing. One statement, so a failed sync cannot leave the
22
+ * tree half-described.
23
+ */
24
+ replaceAll(params: {
25
+ sections: {
26
+ id: string;
27
+ key: string;
28
+ title: string;
29
+ summary?: string;
30
+ order: string;
31
+ displayTitle?: string;
32
+ displaySummary?: string;
33
+ }[];
34
+ }): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=handbook-section.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-section.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-section.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,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,eAAe,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAG1F,qBACa,yBACX,SAAQ,kBAAkB,CAAC,eAAe,EAAE,OAAO,yBAAyB,CAAC,aAAa,CAC1F,YAAW,YAAY;IAEvB,SAAS,CAAC,QAAQ,CAAC,UAAU,2DAA6B;gBAE9C,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC,0DAA0D;IACpD,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUnD;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE;YACR,EAAE,EAAE,MAAM,CAAC;YACX,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB,EAAE,CAAC;KACL,GAAG,OAAO,CAAC,IAAI,CAAC;CAiClB"}
@@ -0,0 +1,91 @@
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.HandbookSectionRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
16
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
17
+ const security_service_1 = require("../../../core/security/services/security.service");
18
+ const handbook_section_1 = require("../entities/handbook-section");
19
+ const handbook_section_meta_1 = require("../entities/handbook-section.meta");
20
+ let HandbookSectionRepository = class HandbookSectionRepository extends abstract_repository_1.AbstractRepository {
21
+ constructor(neo4j, securityService, clsService) {
22
+ super(neo4j, securityService, clsService);
23
+ this.descriptor = handbook_section_1.HandbookSectionDescriptor;
24
+ }
25
+ /**
26
+ * `key` is the natural key of the ingest. `super.onModuleInit()` runs FIRST
27
+ * and is not optional: the base implementation turns the descriptor's own
28
+ * constraints and indexes into real Neo4j objects, exactly as
29
+ * HandbookPageRepository documents.
30
+ */
31
+ async onModuleInit() {
32
+ await super.onModuleInit();
33
+ await this.neo4j.writeOne({
34
+ query: `CREATE CONSTRAINT handbooksection_key IF NOT EXISTS FOR (${handbook_section_meta_1.handbookSectionMeta.nodeName}:${handbook_section_meta_1.handbookSectionMeta.labelName}) REQUIRE ${handbook_section_meta_1.handbookSectionMeta.nodeName}.key IS UNIQUE`,
35
+ });
36
+ }
37
+ /** Every section, unpaginated — there are ten of them. */
38
+ async findAllSections() {
39
+ const query = this.neo4j.initQuery({ serialiser: handbook_section_1.HandbookSectionDescriptor.model });
40
+ query.query = `
41
+ ${this.buildDefaultMatch()}
42
+ ORDER BY ${handbook_section_meta_1.handbookSectionMeta.nodeName}.order ASC
43
+ ${this.buildReturnStatement()}
44
+ `;
45
+ return this.neo4j.readMany(query);
46
+ }
47
+ /**
48
+ * Sections are replaced wholesale on every sync: there are ten of them and
49
+ * diffing buys nothing. One statement, so a failed sync cannot leave the
50
+ * tree half-described.
51
+ */
52
+ async replaceAll(params) {
53
+ const query = this.neo4j.initQuery();
54
+ query.queryParams = {
55
+ ...query.queryParams,
56
+ // An absent optional is bound as `null`, never left `undefined`: the
57
+ // driver takes no `undefined`, and `null` is what writes "this section
58
+ // has no blurb / no translation" rather than a stale value.
59
+ sections: params.sections.map((section) => ({
60
+ ...section,
61
+ summary: section.summary ?? null,
62
+ displayTitle: section.displayTitle ?? null,
63
+ displaySummary: section.displaySummary ?? null,
64
+ })),
65
+ };
66
+ query.query = `
67
+ OPTIONAL MATCH (existing:${handbook_section_meta_1.handbookSectionMeta.labelName})
68
+ DETACH DELETE existing
69
+ WITH count(*) AS ignored
70
+ UNWIND $sections AS section
71
+ CREATE (${handbook_section_meta_1.handbookSectionMeta.nodeName}:${handbook_section_meta_1.handbookSectionMeta.labelName} {
72
+ id: section.id,
73
+ key: section.key,
74
+ title: section.title,
75
+ summary: section.summary,
76
+ order: section.order,
77
+ displayTitle: section.displayTitle,
78
+ displaySummary: section.displaySummary,
79
+ createdAt: datetime(),
80
+ updatedAt: datetime()
81
+ })
82
+ `;
83
+ await this.neo4j.writeOne(query);
84
+ }
85
+ };
86
+ exports.HandbookSectionRepository = HandbookSectionRepository;
87
+ exports.HandbookSectionRepository = HandbookSectionRepository = __decorate([
88
+ (0, common_1.Injectable)(),
89
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
90
+ ], HandbookSectionRepository);
91
+ //# sourceMappingURL=handbook-section.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-section.repository.js","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-section.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,2CAAwC;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AACnF,mEAA0F;AAC1F,6EAAwE;AAGjE,IAAM,yBAAyB,GAA/B,MAAM,yBACX,SAAQ,wCAAmF;IAK3F,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,4CAAyB,CAAC;IAI1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;QAE3B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE,4DAA4D,2CAAmB,CAAC,QAAQ,IAAI,2CAAmB,CAAC,SAAS,aAAa,2CAAmB,CAAC,QAAQ,gBAAgB;SAC1L,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,eAAe;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,4CAAyB,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,KAAK,CAAC,KAAK,GAAG;QACV,IAAI,CAAC,iBAAiB,EAAE;iBACf,2CAAmB,CAAC,QAAQ;QACrC,IAAI,CAAC,oBAAoB,EAAE;KAC9B,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,MAUhB;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,qEAAqE;YACrE,uEAAuE;YACvE,4DAA4D;YAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC1C,GAAG,OAAO;gBACV,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;gBAChC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;gBAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;aAC/C,CAAC,CAAC;SACJ,CAAC;QACF,KAAK,CAAC,KAAK,GAAG;iCACe,2CAAmB,CAAC,SAAS;;;;gBAI9C,2CAAmB,CAAC,QAAQ,IAAI,2CAAmB,CAAC,SAAS;;;;;;;;;;;KAWxE,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAnFY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAOQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAN9E,yBAAyB,CAmFrC"}
@@ -0,0 +1,36 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
3
+ import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
4
+ import { SecurityService } from "../../../core/security/services/security.service";
5
+ import { HandbookThreadMessage, HandbookThreadMessageDescriptor } from "../entities/handbook-thread-message";
6
+ /**
7
+ * HandbookThreadMessageRepository
8
+ *
9
+ * A message carries no owner of its own: access is inherited from the parent
10
+ * thread's `CREATED_BY` edge. As with the thread there is no company filter to
11
+ * fall back on, so this override is the only thing standing between one
12
+ * administrator and another's conversation.
13
+ */
14
+ export declare class HandbookThreadMessageRepository extends AbstractRepository<HandbookThreadMessage, typeof HandbookThreadMessageDescriptor.relationships> {
15
+ protected readonly descriptor: import("../../..").EntityDescriptor<HandbookThreadMessage, {
16
+ thread: {
17
+ model: import("../../..").DataMeta;
18
+ direction: "in";
19
+ relationship: string;
20
+ cardinality: "one";
21
+ required: true;
22
+ dtoKey: string;
23
+ immutable: true;
24
+ };
25
+ }>;
26
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
27
+ protected buildUserHasAccess(): string;
28
+ /**
29
+ * Next free position under a thread: 0 for an empty thread, otherwise
30
+ * max(position) + 1. Mirrors `AssistantMessageRepository.getNextPosition`.
31
+ */
32
+ getNextPosition(params: {
33
+ threadId: string;
34
+ }): Promise<number>;
35
+ }
36
+ //# sourceMappingURL=handbook-thread-message.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-thread-message.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-thread-message.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,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,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAG7G;;;;;;;GAOG;AACH,qBACa,+BAAgC,SAAQ,kBAAkB,CACrE,qBAAqB,EACrB,OAAO,+BAA+B,CAAC,aAAa,CACrD;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;OAAmC;gBAEpD,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAStC;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAcrE"}
@@ -0,0 +1,63 @@
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.HandbookThreadMessageRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
16
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
17
+ const security_service_1 = require("../../../core/security/services/security.service");
18
+ const handbook_thread_meta_1 = require("../entities/handbook-thread.meta");
19
+ const handbook_thread_message_1 = require("../entities/handbook-thread-message");
20
+ const handbook_thread_message_meta_1 = require("../entities/handbook-thread-message.meta");
21
+ /**
22
+ * HandbookThreadMessageRepository
23
+ *
24
+ * A message carries no owner of its own: access is inherited from the parent
25
+ * thread's `CREATED_BY` edge. As with the thread there is no company filter to
26
+ * fall back on, so this override is the only thing standing between one
27
+ * administrator and another's conversation.
28
+ */
29
+ let HandbookThreadMessageRepository = class HandbookThreadMessageRepository extends abstract_repository_1.AbstractRepository {
30
+ constructor(neo4j, securityService, clsService) {
31
+ super(neo4j, securityService, clsService);
32
+ this.descriptor = handbook_thread_message_1.HandbookThreadMessageDescriptor;
33
+ }
34
+ buildUserHasAccess() {
35
+ const { nodeName } = this.descriptor.model;
36
+ return `WITH ${nodeName}
37
+ WHERE EXISTS {
38
+ MATCH (${nodeName})<-[:HAS_MESSAGE]-(:${handbook_thread_meta_1.handbookThreadMeta.labelName})-[:CREATED_BY]->(:User {id: $currentUserId})
39
+ }
40
+ WITH ${nodeName}`;
41
+ }
42
+ /**
43
+ * Next free position under a thread: 0 for an empty thread, otherwise
44
+ * max(position) + 1. Mirrors `AssistantMessageRepository.getNextPosition`.
45
+ */
46
+ async getNextPosition(params) {
47
+ const result = await this.neo4j.read(`
48
+ MATCH (:${handbook_thread_meta_1.handbookThreadMeta.labelName} {id: $threadId})-[:HAS_MESSAGE]->(${handbook_thread_message_meta_1.handbookThreadMessageMeta.nodeName}:${handbook_thread_message_meta_1.handbookThreadMessageMeta.labelName})
49
+ RETURN coalesce(max(${handbook_thread_message_meta_1.handbookThreadMessageMeta.nodeName}.position), -1) + 1 AS next
50
+ `, { threadId: params.threadId });
51
+ const record = result.records[0];
52
+ if (!record)
53
+ return 0;
54
+ const value = record.get("next");
55
+ return typeof value?.toNumber === "function" ? value.toNumber() : Number(value ?? 0);
56
+ }
57
+ };
58
+ exports.HandbookThreadMessageRepository = HandbookThreadMessageRepository;
59
+ exports.HandbookThreadMessageRepository = HandbookThreadMessageRepository = __decorate([
60
+ (0, common_1.Injectable)(),
61
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
62
+ ], HandbookThreadMessageRepository);
63
+ //# sourceMappingURL=handbook-thread-message.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-thread-message.repository.js","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-thread-message.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAwC;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AACnF,2EAAsE;AACtE,iFAA6G;AAC7G,2FAAqF;AAErF;;;;;;;GAOG;AAEI,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,wCAGpD;IAGC,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,yDAA+B,CAAC;IAIhE,CAAC;IAES,kBAAkB;QAC1B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC3C,OAAO,QAAQ,QAAQ;;uBAEJ,QAAQ,uBAAuB,yCAAkB,CAAC,SAAS;;mBAE/D,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,MAA4B;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAClC;kBACY,yCAAkB,CAAC,SAAS,sCAAsC,wDAAyB,CAAC,QAAQ,IAAI,wDAAyB,CAAC,SAAS;8BAC/H,wDAAyB,CAAC,QAAQ;OACzD,EACD,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAC9B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,OAAO,KAAK,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;CACF,CAAA;AArCY,0EAA+B;0CAA/B,+BAA+B;IAD3C,IAAA,mBAAU,GAAE;qCAOQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAN9E,+BAA+B,CAqC3C"}
@@ -0,0 +1,63 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
3
+ import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
4
+ import { SecurityService } from "../../../core/security/services/security.service";
5
+ import { HandbookThread, HandbookThreadDescriptor } from "../entities/handbook-thread";
6
+ /**
7
+ * HandbookThreadRepository
8
+ *
9
+ * `HandbookThread` is `isCompanyScoped: false`, so `buildDefaultMatch()` emits
10
+ * no company filter at all — the `CREATED_BY` owner edge asserted here is the
11
+ * ENTIRE security boundary. Without this override every administrator would
12
+ * read and mutate every other administrator's threads.
13
+ *
14
+ * `$currentUserId` is auto-injected into queryParams by
15
+ * `Neo4jService.initQuery()` (it reads `clsService.get("userId")`), exactly as
16
+ * `AssistantRepository` relies on.
17
+ */
18
+ export declare class HandbookThreadRepository extends AbstractRepository<HandbookThread, typeof HandbookThreadDescriptor.relationships> {
19
+ protected readonly descriptor: import("../../..").EntityDescriptor<HandbookThread, {
20
+ owner: {
21
+ model: import("../../..").DataMeta;
22
+ direction: "out";
23
+ relationship: string;
24
+ cardinality: "one";
25
+ required: false;
26
+ dtoKey: string;
27
+ contextKey: string;
28
+ immutable: true;
29
+ };
30
+ messages: {
31
+ model: import("../../..").DataMeta;
32
+ direction: "out";
33
+ relationship: string;
34
+ cardinality: "many";
35
+ required: false;
36
+ dtoKey: string;
37
+ };
38
+ }>;
39
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
40
+ protected buildUserHasAccess(): string;
41
+ /**
42
+ * Bump `updatedAt` so the thread list — ordered by the descriptor default
43
+ * `updatedAt DESC` — surfaces the conversation a user just spoke in. Neither
44
+ * creating a child message nor writing the `HAS_MESSAGE` edge touches the
45
+ * parent node, so without this an active thread would sink below a thread
46
+ * that was merely renamed.
47
+ */
48
+ touch(params: {
49
+ id: string;
50
+ }): Promise<void>;
51
+ /**
52
+ * Delete the thread AND its messages. `DETACH DELETE` on the thread alone
53
+ * would drop the `HAS_MESSAGE` edges and orphan every message node, which
54
+ * — because the messages are only ever reachable through their thread —
55
+ * means they could never be read or deleted again.
56
+ *
57
+ * Mirrors `AssistantRepository.delete`.
58
+ */
59
+ delete(params: {
60
+ id: string;
61
+ }): Promise<void>;
62
+ }
63
+ //# sourceMappingURL=handbook-thread.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handbook-thread.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/handbook/repositories/handbook-thread.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,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,cAAc,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAIvF;;;;;;;;;;;GAWG;AACH,qBACa,wBAAyB,SAAQ,kBAAkB,CAC9D,cAAc,EACd,OAAO,wBAAwB,CAAC,aAAa,CAC9C;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;OAA4B;gBAE7C,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAStC;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD;;;;;;;OAOG;IACG,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAUpD"}