@zlooks.cn/blog-server 1.0.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 (265) hide show
  1. package/dist/blog/blog-application.d.ts +153 -0
  2. package/dist/blog/blog-application.d.ts.map +1 -0
  3. package/dist/blog/blog-application.js +115 -0
  4. package/dist/blog/blog-application.js.map +1 -0
  5. package/dist/blog/comment-client-metadata.d.ts +19 -0
  6. package/dist/blog/comment-client-metadata.d.ts.map +1 -0
  7. package/dist/blog/comment-client-metadata.js +78 -0
  8. package/dist/blog/comment-client-metadata.js.map +1 -0
  9. package/dist/blog/errors.d.ts +12 -0
  10. package/dist/blog/errors.d.ts.map +1 -0
  11. package/dist/blog/errors.js +21 -0
  12. package/dist/blog/errors.js.map +1 -0
  13. package/dist/blog/micro-user-directory.d.ts +11 -0
  14. package/dist/blog/micro-user-directory.d.ts.map +1 -0
  15. package/dist/blog/micro-user-directory.js +18 -0
  16. package/dist/blog/micro-user-directory.js.map +1 -0
  17. package/dist/blog/post-content-audit.d.ts +34 -0
  18. package/dist/blog/post-content-audit.d.ts.map +1 -0
  19. package/dist/blog/post-content-audit.js +190 -0
  20. package/dist/blog/post-content-audit.js.map +1 -0
  21. package/dist/blog/post-view-cache.d.ts +15 -0
  22. package/dist/blog/post-view-cache.d.ts.map +1 -0
  23. package/dist/blog/post-view-cache.js +23 -0
  24. package/dist/blog/post-view-cache.js.map +1 -0
  25. package/dist/blog/public-blog-micro.d.ts +291 -0
  26. package/dist/blog/public-blog-micro.d.ts.map +1 -0
  27. package/dist/blog/public-blog-micro.js +71 -0
  28. package/dist/blog/public-blog-micro.js.map +1 -0
  29. package/dist/blog/public-blog-service.d.ts +104 -0
  30. package/dist/blog/public-blog-service.d.ts.map +1 -0
  31. package/dist/blog/public-blog-service.js +341 -0
  32. package/dist/blog/public-blog-service.js.map +1 -0
  33. package/dist/browser-api/dispatch-stream.d.ts +5 -0
  34. package/dist/browser-api/dispatch-stream.d.ts.map +1 -0
  35. package/dist/browser-api/dispatch-stream.js +4 -0
  36. package/dist/browser-api/dispatch-stream.js.map +1 -0
  37. package/dist/browser-api/dispatcher.d.ts +15 -0
  38. package/dist/browser-api/dispatcher.d.ts.map +1 -0
  39. package/dist/browser-api/dispatcher.js +145 -0
  40. package/dist/browser-api/dispatcher.js.map +1 -0
  41. package/dist/browser-api/provider-publisher.d.ts +24 -0
  42. package/dist/browser-api/provider-publisher.d.ts.map +1 -0
  43. package/dist/browser-api/provider-publisher.js +107 -0
  44. package/dist/browser-api/provider-publisher.js.map +1 -0
  45. package/dist/command/index.d.ts +3 -0
  46. package/dist/command/index.d.ts.map +1 -0
  47. package/dist/command/index.js +24 -0
  48. package/dist/command/index.js.map +1 -0
  49. package/dist/config/schema.d.ts +25 -0
  50. package/dist/config/schema.d.ts.map +1 -0
  51. package/dist/config/schema.js +19 -0
  52. package/dist/config/schema.js.map +1 -0
  53. package/dist/contracts/identity.d.ts +2 -0
  54. package/dist/contracts/identity.d.ts.map +1 -0
  55. package/dist/contracts/identity.js +2 -0
  56. package/dist/contracts/identity.js.map +1 -0
  57. package/dist/contracts/mcp.d.ts +69 -0
  58. package/dist/contracts/mcp.d.ts.map +1 -0
  59. package/dist/contracts/mcp.js +41 -0
  60. package/dist/contracts/mcp.js.map +1 -0
  61. package/dist/contracts/public-api.d.ts +3 -0
  62. package/dist/contracts/public-api.d.ts.map +1 -0
  63. package/dist/contracts/public-api.js +2 -0
  64. package/dist/contracts/public-api.js.map +1 -0
  65. package/dist/mcp/blog-prompts.d.ts +135 -0
  66. package/dist/mcp/blog-prompts.d.ts.map +1 -0
  67. package/dist/mcp/blog-prompts.js +107 -0
  68. package/dist/mcp/blog-prompts.js.map +1 -0
  69. package/dist/mcp/blog-provider.d.ts +4 -0
  70. package/dist/mcp/blog-provider.d.ts.map +1 -0
  71. package/dist/mcp/blog-provider.js +27 -0
  72. package/dist/mcp/blog-provider.js.map +1 -0
  73. package/dist/mcp/blog-theme-authoring-prompt.d.ts +19 -0
  74. package/dist/mcp/blog-theme-authoring-prompt.d.ts.map +1 -0
  75. package/dist/mcp/blog-theme-authoring-prompt.js +171 -0
  76. package/dist/mcp/blog-theme-authoring-prompt.js.map +1 -0
  77. package/dist/mcp/category-tools.d.ts +45 -0
  78. package/dist/mcp/category-tools.d.ts.map +1 -0
  79. package/dist/mcp/category-tools.js +14 -0
  80. package/dist/mcp/category-tools.js.map +1 -0
  81. package/dist/mcp/comment-tools.d.ts +44 -0
  82. package/dist/mcp/comment-tools.d.ts.map +1 -0
  83. package/dist/mcp/comment-tools.js +15 -0
  84. package/dist/mcp/comment-tools.js.map +1 -0
  85. package/dist/mcp/friend-link-tools.d.ts +63 -0
  86. package/dist/mcp/friend-link-tools.d.ts.map +1 -0
  87. package/dist/mcp/friend-link-tools.js +16 -0
  88. package/dist/mcp/friend-link-tools.js.map +1 -0
  89. package/dist/mcp/page-tools.d.ts +67 -0
  90. package/dist/mcp/page-tools.d.ts.map +1 -0
  91. package/dist/mcp/page-tools.js +36 -0
  92. package/dist/mcp/page-tools.js.map +1 -0
  93. package/dist/mcp/post-tools.d.ts +114 -0
  94. package/dist/mcp/post-tools.d.ts.map +1 -0
  95. package/dist/mcp/post-tools.js +122 -0
  96. package/dist/mcp/post-tools.js.map +1 -0
  97. package/dist/mcp/tag-tools.d.ts +37 -0
  98. package/dist/mcp/tag-tools.d.ts.map +1 -0
  99. package/dist/mcp/tag-tools.js +14 -0
  100. package/dist/mcp/tag-tools.js.map +1 -0
  101. package/dist/mcp/theme-tools.d.ts +16 -0
  102. package/dist/mcp/theme-tools.d.ts.map +1 -0
  103. package/dist/mcp/theme-tools.js +71 -0
  104. package/dist/mcp/theme-tools.js.map +1 -0
  105. package/dist/mcp/tool-descriptions.d.ts +5 -0
  106. package/dist/mcp/tool-descriptions.d.ts.map +1 -0
  107. package/dist/mcp/tool-descriptions.js +51 -0
  108. package/dist/mcp/tool-descriptions.js.map +1 -0
  109. package/dist/mcp/tool-support.d.ts +242 -0
  110. package/dist/mcp/tool-support.d.ts.map +1 -0
  111. package/dist/mcp/tool-support.js +127 -0
  112. package/dist/mcp/tool-support.js.map +1 -0
  113. package/dist/messages/browser/dispatch.msg.d.ts +3 -0
  114. package/dist/messages/browser/dispatch.msg.d.ts.map +1 -0
  115. package/dist/messages/browser/dispatch.msg.js +9 -0
  116. package/dist/messages/browser/dispatch.msg.js.map +1 -0
  117. package/dist/messages/public/categories/list.msg.d.ts +3 -0
  118. package/dist/messages/public/categories/list.msg.d.ts.map +1 -0
  119. package/dist/messages/public/categories/list.msg.js +8 -0
  120. package/dist/messages/public/categories/list.msg.js.map +1 -0
  121. package/dist/messages/public/comments/list.msg.d.ts +3 -0
  122. package/dist/messages/public/comments/list.msg.d.ts.map +1 -0
  123. package/dist/messages/public/comments/list.msg.js +8 -0
  124. package/dist/messages/public/comments/list.msg.js.map +1 -0
  125. package/dist/messages/public/comments/recent.msg.d.ts +3 -0
  126. package/dist/messages/public/comments/recent.msg.d.ts.map +1 -0
  127. package/dist/messages/public/comments/recent.msg.js +8 -0
  128. package/dist/messages/public/comments/recent.msg.js.map +1 -0
  129. package/dist/messages/public/friend-links/list.msg.d.ts +3 -0
  130. package/dist/messages/public/friend-links/list.msg.d.ts.map +1 -0
  131. package/dist/messages/public/friend-links/list.msg.js +8 -0
  132. package/dist/messages/public/friend-links/list.msg.js.map +1 -0
  133. package/dist/messages/public/pages/list.msg.d.ts +3 -0
  134. package/dist/messages/public/pages/list.msg.d.ts.map +1 -0
  135. package/dist/messages/public/pages/list.msg.js +8 -0
  136. package/dist/messages/public/pages/list.msg.js.map +1 -0
  137. package/dist/messages/public/pages/read.msg.d.ts +3 -0
  138. package/dist/messages/public/pages/read.msg.d.ts.map +1 -0
  139. package/dist/messages/public/pages/read.msg.js +8 -0
  140. package/dist/messages/public/pages/read.msg.js.map +1 -0
  141. package/dist/messages/public/posts/archive.msg.d.ts +3 -0
  142. package/dist/messages/public/posts/archive.msg.d.ts.map +1 -0
  143. package/dist/messages/public/posts/archive.msg.js +8 -0
  144. package/dist/messages/public/posts/archive.msg.js.map +1 -0
  145. package/dist/messages/public/posts/connections.msg.d.ts +3 -0
  146. package/dist/messages/public/posts/connections.msg.d.ts.map +1 -0
  147. package/dist/messages/public/posts/connections.msg.js +8 -0
  148. package/dist/messages/public/posts/connections.msg.js.map +1 -0
  149. package/dist/messages/public/posts/list.msg.d.ts +3 -0
  150. package/dist/messages/public/posts/list.msg.d.ts.map +1 -0
  151. package/dist/messages/public/posts/list.msg.js +8 -0
  152. package/dist/messages/public/posts/list.msg.js.map +1 -0
  153. package/dist/messages/public/posts/open.msg.d.ts +3 -0
  154. package/dist/messages/public/posts/open.msg.d.ts.map +1 -0
  155. package/dist/messages/public/posts/open.msg.js +8 -0
  156. package/dist/messages/public/posts/open.msg.js.map +1 -0
  157. package/dist/messages/public/posts/read.msg.d.ts +3 -0
  158. package/dist/messages/public/posts/read.msg.d.ts.map +1 -0
  159. package/dist/messages/public/posts/read.msg.js +8 -0
  160. package/dist/messages/public/posts/read.msg.js.map +1 -0
  161. package/dist/messages/public/tags/list.msg.d.ts +3 -0
  162. package/dist/messages/public/tags/list.msg.d.ts.map +1 -0
  163. package/dist/messages/public/tags/list.msg.js +8 -0
  164. package/dist/messages/public/tags/list.msg.js.map +1 -0
  165. package/dist/migrations/index.d.ts +3 -0
  166. package/dist/migrations/index.d.ts.map +1 -0
  167. package/dist/migrations/index.js +2 -0
  168. package/dist/migrations/index.js.map +1 -0
  169. package/dist/persistence/category-store.d.ts +23 -0
  170. package/dist/persistence/category-store.d.ts.map +1 -0
  171. package/dist/persistence/category-store.js +86 -0
  172. package/dist/persistence/category-store.js.map +1 -0
  173. package/dist/persistence/comment-store.d.ts +41 -0
  174. package/dist/persistence/comment-store.d.ts.map +1 -0
  175. package/dist/persistence/comment-store.js +146 -0
  176. package/dist/persistence/comment-store.js.map +1 -0
  177. package/dist/persistence/entities.d.ts +103 -0
  178. package/dist/persistence/entities.d.ts.map +1 -0
  179. package/dist/persistence/entities.js +188 -0
  180. package/dist/persistence/entities.js.map +1 -0
  181. package/dist/persistence/friend-link-store.d.ts +26 -0
  182. package/dist/persistence/friend-link-store.d.ts.map +1 -0
  183. package/dist/persistence/friend-link-store.js +80 -0
  184. package/dist/persistence/friend-link-store.js.map +1 -0
  185. package/dist/persistence/page-store.d.ts +35 -0
  186. package/dist/persistence/page-store.d.ts.map +1 -0
  187. package/dist/persistence/page-store.js +125 -0
  188. package/dist/persistence/page-store.js.map +1 -0
  189. package/dist/persistence/post-engagement-store.d.ts +23 -0
  190. package/dist/persistence/post-engagement-store.d.ts.map +1 -0
  191. package/dist/persistence/post-engagement-store.js +85 -0
  192. package/dist/persistence/post-engagement-store.js.map +1 -0
  193. package/dist/persistence/post-store.d.ts +87 -0
  194. package/dist/persistence/post-store.d.ts.map +1 -0
  195. package/dist/persistence/post-store.js +465 -0
  196. package/dist/persistence/post-store.js.map +1 -0
  197. package/dist/persistence/tag-store.d.ts +21 -0
  198. package/dist/persistence/tag-store.d.ts.map +1 -0
  199. package/dist/persistence/tag-store.js +82 -0
  200. package/dist/persistence/tag-store.js.map +1 -0
  201. package/dist/services/application.service.d.ts +4 -0
  202. package/dist/services/application.service.d.ts.map +1 -0
  203. package/dist/services/application.service.js +22 -0
  204. package/dist/services/application.service.js.map +1 -0
  205. package/dist/services/blog-runtime.service.d.ts +10 -0
  206. package/dist/services/blog-runtime.service.d.ts.map +1 -0
  207. package/dist/services/blog-runtime.service.js +32 -0
  208. package/dist/services/blog-runtime.service.js.map +1 -0
  209. package/dist/services/blog.boot.d.ts +6 -0
  210. package/dist/services/blog.boot.d.ts.map +1 -0
  211. package/dist/services/blog.boot.js +13 -0
  212. package/dist/services/blog.boot.js.map +1 -0
  213. package/dist/services/browser-api-provider.service.d.ts +4 -0
  214. package/dist/services/browser-api-provider.service.d.ts.map +1 -0
  215. package/dist/services/browser-api-provider.service.js +25 -0
  216. package/dist/services/browser-api-provider.service.js.map +1 -0
  217. package/dist/services/config.service.d.ts +3 -0
  218. package/dist/services/config.service.d.ts.map +1 -0
  219. package/dist/services/config.service.js +22 -0
  220. package/dist/services/config.service.js.map +1 -0
  221. package/dist/services/database.service.d.ts +3 -0
  222. package/dist/services/database.service.d.ts.map +1 -0
  223. package/dist/services/database.service.js +16 -0
  224. package/dist/services/database.service.js.map +1 -0
  225. package/dist/services/logger.service.d.ts +4 -0
  226. package/dist/services/logger.service.d.ts.map +1 -0
  227. package/dist/services/logger.service.js +8 -0
  228. package/dist/services/logger.service.js.map +1 -0
  229. package/dist/services/mcp-provider.service.d.ts +3 -0
  230. package/dist/services/mcp-provider.service.d.ts.map +1 -0
  231. package/dist/services/mcp-provider.service.js +17 -0
  232. package/dist/services/mcp-provider.service.js.map +1 -0
  233. package/dist/services/redis.service.d.ts +4 -0
  234. package/dist/services/redis.service.d.ts.map +1 -0
  235. package/dist/services/redis.service.js +18 -0
  236. package/dist/services/redis.service.js.map +1 -0
  237. package/dist/services/theme-control.service.d.ts +4 -0
  238. package/dist/services/theme-control.service.d.ts.map +1 -0
  239. package/dist/services/theme-control.service.js +53 -0
  240. package/dist/services/theme-control.service.js.map +1 -0
  241. package/dist/themes/theme-catalog.d.ts +40 -0
  242. package/dist/themes/theme-catalog.d.ts.map +1 -0
  243. package/dist/themes/theme-catalog.js +164 -0
  244. package/dist/themes/theme-catalog.js.map +1 -0
  245. package/dist/themes/theme-control.d.ts +16 -0
  246. package/dist/themes/theme-control.d.ts.map +1 -0
  247. package/dist/themes/theme-control.js +57 -0
  248. package/dist/themes/theme-control.js.map +1 -0
  249. package/dist/themes/theme-discovery-runtime.d.ts +41 -0
  250. package/dist/themes/theme-discovery-runtime.d.ts.map +1 -0
  251. package/dist/themes/theme-discovery-runtime.js +109 -0
  252. package/dist/themes/theme-discovery-runtime.js.map +1 -0
  253. package/dist/themes/theme-generation-store.d.ts +14 -0
  254. package/dist/themes/theme-generation-store.d.ts.map +1 -0
  255. package/dist/themes/theme-generation-store.js +49 -0
  256. package/dist/themes/theme-generation-store.js.map +1 -0
  257. package/dist/themes/theme-selection-publisher.d.ts +28 -0
  258. package/dist/themes/theme-selection-publisher.d.ts.map +1 -0
  259. package/dist/themes/theme-selection-publisher.js +92 -0
  260. package/dist/themes/theme-selection-publisher.js.map +1 -0
  261. package/dist/themes/theme-selection-store.d.ts +22 -0
  262. package/dist/themes/theme-selection-store.d.ts.map +1 -0
  263. package/dist/themes/theme-selection-store.js +84 -0
  264. package/dist/themes/theme-selection-store.js.map +1 -0
  265. package/package.json +74 -0
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listComments(data, invocation);
7
+ });
8
+ //# sourceMappingURL=list.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/comments/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=recent.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/comments/recent.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listRecentComments(data, invocation);
7
+ });
8
+ //# sourceMappingURL=recent.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/comments/recent.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=list.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/friend-links/list.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listFriendLinks(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=list.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/friend-links/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=list.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/pages/list.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listPages(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=list.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/pages/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=read.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/pages/read.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.readPage(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=read.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/pages/read.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=archive.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/posts/archive.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listPostArchive(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=archive.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/posts/archive.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=connections.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/posts/connections.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.readPostConnections(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=connections.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/posts/connections.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=list.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/posts/list.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listPosts(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=list.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/posts/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=open.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/posts/open.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.openPost(data, invocation);
7
+ });
8
+ //# sourceMappingURL=open.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/posts/open.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=read.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/posts/read.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.readPost(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=read.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/posts/read.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/message-loader").MessageRegisterProps<unknown, import("@hile/micro").MicroMessageHandlerExtras>;
2
+ export default _default;
3
+ //# sourceMappingURL=list.msg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.d.ts","sourceRoot":"","sources":["../../../../src/messages/public/tags/list.msg.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { loadService } from '@hile/core';
2
+ import { defineMicroMessage } from '@hile/micro';
3
+ import blogRuntimeService from '../../../services/blog-runtime.service.js';
4
+ export default defineMicroMessage(async ({ data, invocation }) => {
5
+ const runtime = await loadService(blogRuntimeService);
6
+ return runtime.publicMicro.listTags(data, invocation.signal);
7
+ });
8
+ //# sourceMappingURL=list.msg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.msg.js","sourceRoot":"","sources":["../../../../src/messages/public/tags/list.msg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,eAAe,kBAAkB,CAAU,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseMigration } from '@zlooks.cn/database-command';
2
+ export declare const blogMigrations: readonly DatabaseMigration[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,cAAc,EAAE,SAAS,iBAAiB,EAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const blogMigrations = [];
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAiC,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type DataSource } from 'typeorm';
2
+ import { type BlogCategoryRow } from './entities.js';
3
+ export interface CategoryInput {
4
+ readonly name: string;
5
+ readonly slug: string;
6
+ readonly description: string | null;
7
+ readonly sortOrder: number;
8
+ }
9
+ export declare class CategoryStore {
10
+ private readonly dataSource;
11
+ constructor(dataSource: DataSource);
12
+ list(limit?: number, signal?: AbortSignal): Promise<BlogCategoryRow[]>;
13
+ listPage(limit: number, cursorId?: string, signal?: AbortSignal): Promise<{
14
+ items: BlogCategoryRow[];
15
+ nextCursor: string | null;
16
+ }>;
17
+ readMany(ids: readonly string[], signal?: AbortSignal): Promise<BlogCategoryRow[]>;
18
+ read(id: string, signal?: AbortSignal): Promise<BlogCategoryRow>;
19
+ create(input: CategoryInput, signal?: AbortSignal): Promise<BlogCategoryRow>;
20
+ update(id: string, input: CategoryInput, signal?: AbortSignal): Promise<BlogCategoryRow>;
21
+ delete(id: string, signal?: AbortSignal): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=category-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-store.d.ts","sourceRoot":"","sources":["../../src/persistence/category-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,UAAU,EAAyB,MAAM,SAAS,CAAC;AAEtF,OAAO,EAAsC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzF,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAEhJ,qBAAa,aAAa;IACL,OAAO,CAAC,QAAQ,CAAC,UAAU;IAA9C,YAAoC,UAAU,EAAE,UAAU,EAAI;IACjD,IAAI,CAAC,KAAK,SAAM,EAAE,MAAM,CAAC,EAAE,WAAW,8BAKlD;IACY,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;;;OAW3E;IACY,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,8BAMjE;IACY,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,4BAMjD;IACM,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAIlF;IACM,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,WAAW,4BAanE;IACM,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,iBAc7C;CACF"}
@@ -0,0 +1,86 @@
1
+ import { Equal, In, MoreThan } from 'typeorm';
2
+ import { BlogConflictError, BlogCursorError, BlogNotFoundError } from '../blog/errors.js';
3
+ import { BlogCategoryEntity, BlogPostEntity } from './entities.js';
4
+ export class CategoryStore {
5
+ dataSource;
6
+ constructor(dataSource) {
7
+ this.dataSource = dataSource;
8
+ }
9
+ async list(limit = 500, signal) {
10
+ signal?.throwIfAborted();
11
+ const rows = await this.dataSource.getRepository(BlogCategoryEntity).find({ order: { sortOrder: 'ASC', id: 'ASC' }, take: limit });
12
+ signal?.throwIfAborted();
13
+ return rows;
14
+ }
15
+ async listPage(limit, cursorId, signal) {
16
+ signal?.throwIfAborted();
17
+ const cursor = cursorId ? await this.dataSource.getRepository(BlogCategoryEntity).findOneBy({ id: cursorId }) : undefined;
18
+ signal?.throwIfAborted();
19
+ if (cursorId && !cursor)
20
+ throw new BlogCursorError('Category cursor not found');
21
+ const where = cursor
22
+ ? [{ sortOrder: MoreThan(cursor.sortOrder) }, { sortOrder: Equal(cursor.sortOrder), id: MoreThan(cursor.id) }]
23
+ : {};
24
+ const rows = await this.dataSource.getRepository(BlogCategoryEntity).find({ where, order: { sortOrder: 'ASC', id: 'ASC' }, take: limit + 1 });
25
+ signal?.throwIfAborted();
26
+ return page(rows, limit);
27
+ }
28
+ async readMany(ids, signal) {
29
+ signal?.throwIfAborted();
30
+ if (!ids.length)
31
+ return Promise.resolve([]);
32
+ const rows = await this.dataSource.getRepository(BlogCategoryEntity).findBy({ id: In([...ids]) });
33
+ signal?.throwIfAborted();
34
+ return rows;
35
+ }
36
+ async read(id, signal) {
37
+ signal?.throwIfAborted();
38
+ const row = await this.dataSource.getRepository(BlogCategoryEntity).findOneBy({ id });
39
+ signal?.throwIfAborted();
40
+ if (!row)
41
+ throw new BlogNotFoundError('Category not found');
42
+ return row;
43
+ }
44
+ create(input, signal) {
45
+ signal?.throwIfAborted();
46
+ const repository = this.dataSource.getRepository(BlogCategoryEntity);
47
+ return repository.save(repository.create(input));
48
+ }
49
+ update(id, input, signal) {
50
+ signal?.throwIfAborted();
51
+ return this.dataSource.transaction(async (manager) => {
52
+ const repository = manager.getRepository(BlogCategoryEntity);
53
+ const current = await repository.findOneBy({ id });
54
+ signal?.throwIfAborted();
55
+ if (!current)
56
+ throw new BlogNotFoundError('Category not found');
57
+ await repository.update({ id }, input);
58
+ signal?.throwIfAborted();
59
+ const updated = await repository.findOneByOrFail({ id });
60
+ signal?.throwIfAborted();
61
+ return updated;
62
+ });
63
+ }
64
+ delete(id, signal) {
65
+ signal?.throwIfAborted();
66
+ return this.dataSource.transaction(async (manager) => {
67
+ const current = await manager.getRepository(BlogCategoryEntity).findOneBy({ id });
68
+ signal?.throwIfAborted();
69
+ if (!current)
70
+ throw new BlogNotFoundError('Category not found');
71
+ if (await manager.getRepository(BlogPostEntity).countBy({ categoryId: id })) {
72
+ signal?.throwIfAborted();
73
+ throw new BlogConflictError('Category contains posts');
74
+ }
75
+ signal?.throwIfAborted();
76
+ await manager.getRepository(BlogCategoryEntity).delete({ id });
77
+ signal?.throwIfAborted();
78
+ });
79
+ }
80
+ }
81
+ function page(rows, limit) {
82
+ const hasMore = rows.length > limit;
83
+ const items = hasMore ? rows.slice(0, limit) : rows;
84
+ return { items, nextCursor: hasMore ? items.at(-1)?.id ?? null : null };
85
+ }
86
+ //# sourceMappingURL=category-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-store.js","sourceRoot":"","sources":["../../src/persistence/category-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type DataSource } from 'typeorm';
2
+ import { type BlogCommentRow, type BlogCommentStatus } from './entities.js';
3
+ export declare class CommentStore {
4
+ private readonly dataSource;
5
+ private readonly clock;
6
+ constructor(dataSource: DataSource, clock?: () => Date);
7
+ list(input: {
8
+ limit: number;
9
+ cursor?: string | undefined;
10
+ status?: BlogCommentStatus | undefined;
11
+ postId?: string | undefined;
12
+ order?: 'desc' | 'asc';
13
+ }, signal?: AbortSignal): Promise<{
14
+ items: BlogCommentRow[];
15
+ nextCursor: string | null;
16
+ }>;
17
+ listApprovedPage(postId: string, limit: number, cursorId?: string, signal?: AbortSignal): Promise<{
18
+ items: BlogCommentRow[];
19
+ nextCursor: string | null;
20
+ }>;
21
+ listRecentApprovedForPublishedPosts(limit: number, signal?: AbortSignal): Promise<BlogCommentRow[]>;
22
+ listVisiblePage(postId: string, limit: number, cursorId?: string, viewerUserId?: string, order?: 'desc' | 'asc', signal?: AbortSignal): Promise<{
23
+ items: BlogCommentRow[];
24
+ nextCursor: string | null;
25
+ }>;
26
+ read(id: string, signal?: AbortSignal): Promise<BlogCommentRow>;
27
+ createForPublishedPost(input: {
28
+ postId: string;
29
+ userId: string;
30
+ content: string;
31
+ ipAddress?: string | null;
32
+ userAgent?: string | null;
33
+ ipLocation?: string | null;
34
+ clientLabel?: string | null;
35
+ }, signal?: AbortSignal): Promise<BlogCommentRow>;
36
+ setStatus(id: string, status: BlogCommentStatus, signal?: AbortSignal): Promise<BlogCommentRow>;
37
+ reply(id: string, replyContent: string | null, signal?: AbortSignal): Promise<BlogCommentRow>;
38
+ delete(id: string, signal?: AbortSignal): Promise<void>;
39
+ private mutate;
40
+ }
41
+ //# sourceMappingURL=comment-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-store.d.ts","sourceRoot":"","sources":["../../src/persistence/comment-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,UAAU,EAAyB,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAqC,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE/G,qBAAa,YAAY;IACJ,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAc,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAlF,YAAoC,UAAU,EAAE,UAAU,EAAmB,KAAK,aAAmB,EAAI;IAC5F,IAAI,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW;;;OAiBzL;IACY,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;;;OAEnG;IACY,mCAAmC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,6BAanF;IACY,eAAe,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,GAAE,MAAM,GAAG,KAAc,EAC9B,MAAM,CAAC,EAAE,WAAW;;;OA8BrB;IACY,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,2BAMjD;IACM,sBAAsB,CAAC,KAAK,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAuBhD;IACM,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,2BAE3E;IACM,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,WAAW,2BAEzE;IACM,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,iBAU7C;IACD,OAAO,CAAC,MAAM;CAcf"}
@@ -0,0 +1,146 @@
1
+ import { Equal, LessThan, MoreThan } from 'typeorm';
2
+ import { BlogConflictError, BlogCursorError, BlogNotFoundError } from '../blog/errors.js';
3
+ import { BlogCommentEntity, BlogPostEntity } from './entities.js';
4
+ export class CommentStore {
5
+ dataSource;
6
+ clock;
7
+ constructor(dataSource, clock = () => new Date()) {
8
+ this.dataSource = dataSource;
9
+ this.clock = clock;
10
+ }
11
+ async list(input, signal) {
12
+ signal?.throwIfAborted();
13
+ const base = { ...(input.status ? { status: input.status } : {}), ...(input.postId ? { postId: input.postId } : {}) };
14
+ const cursor = input.cursor ? await this.dataSource.getRepository(BlogCommentEntity).findOne({ where: { id: input.cursor, ...base } }) : undefined;
15
+ signal?.throwIfAborted();
16
+ if (input.cursor && !cursor)
17
+ throw new BlogCursorError('Comment cursor not found in current filter');
18
+ const descending = (input.order ?? 'desc') === 'desc';
19
+ const compare = descending ? LessThan : MoreThan;
20
+ const where = cursor
21
+ ? [{ ...base, createdAt: compare(cursor.createdAt) }, { ...base, createdAt: Equal(cursor.createdAt), id: compare(cursor.id) }]
22
+ : base;
23
+ const direction = descending ? 'DESC' : 'ASC';
24
+ const rows = await this.dataSource.getRepository(BlogCommentEntity).find({ where, order: { createdAt: direction, id: direction }, take: input.limit + 1 });
25
+ signal?.throwIfAborted();
26
+ const hasMore = rows.length > input.limit;
27
+ const items = hasMore ? rows.slice(0, input.limit) : rows;
28
+ return { items, nextCursor: hasMore ? items.at(-1)?.id ?? null : null };
29
+ }
30
+ async listApprovedPage(postId, limit, cursorId, signal) {
31
+ return this.listVisiblePage(postId, limit, cursorId, undefined, 'desc', signal);
32
+ }
33
+ async listRecentApprovedForPublishedPosts(limit, signal) {
34
+ signal?.throwIfAborted();
35
+ const rows = await this.dataSource.getRepository(BlogCommentEntity)
36
+ .createQueryBuilder('comment')
37
+ .innerJoin('BlogPost', 'post', 'post.id = comment.postId')
38
+ .where('comment.status = :commentStatus', { commentStatus: 'approved' })
39
+ .andWhere('post.status = :postStatus', { postStatus: 'published' })
40
+ .orderBy('comment.createdAt', 'DESC')
41
+ .addOrderBy('comment.id', 'DESC')
42
+ .take(limit)
43
+ .getMany();
44
+ signal?.throwIfAborted();
45
+ return rows;
46
+ }
47
+ async listVisiblePage(postId, limit, cursorId, viewerUserId, order = 'desc', signal) {
48
+ signal?.throwIfAborted();
49
+ const visible = [
50
+ { postId, status: 'approved' },
51
+ ...(viewerUserId ? [{ postId, status: 'pending', userId: viewerUserId }] : []),
52
+ ];
53
+ const cursor = cursorId
54
+ ? await this.dataSource.getRepository(BlogCommentEntity).findOne({
55
+ where: visible.map((entry) => ({ ...entry, id: cursorId })),
56
+ })
57
+ : undefined;
58
+ signal?.throwIfAborted();
59
+ if (cursorId && !cursor)
60
+ throw new BlogCursorError('Comment cursor not found');
61
+ const descending = order === 'desc';
62
+ const compare = descending ? LessThan : MoreThan;
63
+ const where = cursor
64
+ ? visible.flatMap((entry) => [
65
+ { ...entry, createdAt: compare(cursor.createdAt) },
66
+ { ...entry, createdAt: Equal(cursor.createdAt), id: compare(cursor.id) },
67
+ ])
68
+ : visible;
69
+ const direction = descending ? 'DESC' : 'ASC';
70
+ const rows = await this.dataSource.getRepository(BlogCommentEntity).find({
71
+ where, order: { createdAt: direction, id: direction }, take: limit + 1,
72
+ });
73
+ signal?.throwIfAborted();
74
+ const hasMore = rows.length > limit;
75
+ const items = hasMore ? rows.slice(0, limit) : rows;
76
+ return { items, nextCursor: hasMore ? items.at(-1)?.id ?? null : null };
77
+ }
78
+ async read(id, signal) {
79
+ signal?.throwIfAborted();
80
+ const row = await this.dataSource.getRepository(BlogCommentEntity).findOneBy({ id });
81
+ signal?.throwIfAborted();
82
+ if (!row)
83
+ throw new BlogNotFoundError('Comment not found');
84
+ return row;
85
+ }
86
+ createForPublishedPost(input, signal) {
87
+ signal?.throwIfAborted();
88
+ return this.dataSource.transaction(async (manager) => {
89
+ const post = await manager.getRepository(BlogPostEntity).findOne({
90
+ where: { id: input.postId }, lock: { mode: 'pessimistic_write' },
91
+ });
92
+ signal?.throwIfAborted();
93
+ if (!post)
94
+ throw new BlogNotFoundError('Post not found');
95
+ if (post.status !== 'published')
96
+ throw new BlogConflictError('Only published posts accept comments');
97
+ const repository = manager.getRepository(BlogCommentEntity);
98
+ const comment = await repository.save(repository.create({
99
+ ...input,
100
+ ipAddress: input.ipAddress ?? null,
101
+ userAgent: input.userAgent ?? null,
102
+ ipLocation: input.ipLocation ?? null,
103
+ clientLabel: input.clientLabel ?? null,
104
+ status: 'pending',
105
+ replyContent: null,
106
+ repliedAt: null,
107
+ }));
108
+ signal?.throwIfAborted();
109
+ return comment;
110
+ });
111
+ }
112
+ setStatus(id, status, signal) {
113
+ return this.mutate(id, { status }, signal);
114
+ }
115
+ reply(id, replyContent, signal) {
116
+ return this.mutate(id, { replyContent, repliedAt: replyContent ? this.clock() : null }, signal);
117
+ }
118
+ delete(id, signal) {
119
+ signal?.throwIfAborted();
120
+ return this.dataSource.transaction(async (manager) => {
121
+ const repository = manager.getRepository(BlogCommentEntity);
122
+ const current = await repository.findOneBy({ id });
123
+ signal?.throwIfAborted();
124
+ if (!current)
125
+ throw new BlogNotFoundError('Comment not found');
126
+ await repository.delete({ id });
127
+ signal?.throwIfAborted();
128
+ });
129
+ }
130
+ mutate(id, input, signal) {
131
+ signal?.throwIfAborted();
132
+ return this.dataSource.transaction(async (manager) => {
133
+ const repository = manager.getRepository(BlogCommentEntity);
134
+ const current = await repository.findOneBy({ id });
135
+ signal?.throwIfAborted();
136
+ if (!current)
137
+ throw new BlogNotFoundError('Comment not found');
138
+ await repository.update({ id }, input);
139
+ signal?.throwIfAborted();
140
+ const updated = await repository.findOneByOrFail({ id });
141
+ signal?.throwIfAborted();
142
+ return updated;
143
+ });
144
+ }
145
+ }
146
+ //# sourceMappingURL=comment-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-store.js","sourceRoot":"","sources":["../../src/persistence/comment-store.ts"],"names":[],"mappings":"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"}