@headless-lms/core 0.2.0 → 0.4.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 (307) hide show
  1. package/dist/assets/events.d.ts +42 -24
  2. package/dist/assets/events.js +1 -1
  3. package/dist/assets/events.js.map +1 -1
  4. package/dist/assets/file-urls.d.ts +20 -0
  5. package/dist/assets/file-urls.js +25 -0
  6. package/dist/assets/file-urls.js.map +1 -0
  7. package/dist/assets/index.d.ts +6 -4
  8. package/dist/assets/index.js +4 -2
  9. package/dist/assets/jobs.d.ts +15 -0
  10. package/dist/assets/jobs.js +30 -0
  11. package/dist/assets/jobs.js.map +1 -0
  12. package/dist/assets/model.d.ts +2 -2
  13. package/dist/assets/ports.d.ts +46 -15
  14. package/dist/assets/service.d.ts +38 -7
  15. package/dist/assets/service.js +287 -38
  16. package/dist/assets/service.js.map +1 -1
  17. package/dist/automations/actions.d.ts +13 -24
  18. package/dist/automations/actions.js +106 -42
  19. package/dist/automations/actions.js.map +1 -1
  20. package/dist/automations/catalog.js +226 -3
  21. package/dist/automations/catalog.js.map +1 -1
  22. package/dist/automations/community-derivations.d.ts +14 -0
  23. package/dist/automations/community-derivations.js +439 -0
  24. package/dist/automations/community-derivations.js.map +1 -0
  25. package/dist/automations/community-mail.d.ts +98 -0
  26. package/dist/automations/community-mail.js +70 -0
  27. package/dist/automations/community-mail.js.map +1 -0
  28. package/dist/automations/events.d.ts +18 -0
  29. package/dist/automations/index.d.ts +13 -4
  30. package/dist/automations/index.js +10 -2
  31. package/dist/automations/model.d.ts +10 -3
  32. package/dist/automations/model.js +15 -2
  33. package/dist/automations/model.js.map +1 -1
  34. package/dist/automations/notifications/debounce.d.ts +25 -0
  35. package/dist/automations/notifications/debounce.js +93 -0
  36. package/dist/automations/notifications/debounce.js.map +1 -0
  37. package/dist/automations/notifications/defaults.d.ts +8 -0
  38. package/dist/automations/notifications/defaults.js +316 -0
  39. package/dist/automations/notifications/defaults.js.map +1 -0
  40. package/dist/automations/notifications/delivery.d.ts +28 -0
  41. package/dist/automations/notifications/delivery.js +88 -0
  42. package/dist/automations/notifications/delivery.js.map +1 -0
  43. package/dist/automations/notifications/processor.d.ts +64 -0
  44. package/dist/automations/notifications/processor.js +270 -0
  45. package/dist/automations/notifications/processor.js.map +1 -0
  46. package/dist/automations/notifications/rules/content.d.ts +6 -0
  47. package/dist/automations/notifications/rules/content.js +39 -0
  48. package/dist/automations/notifications/rules/content.js.map +1 -0
  49. package/dist/automations/notifications/rules/discussion.d.ts +7 -0
  50. package/dist/automations/notifications/rules/discussion.js +678 -0
  51. package/dist/automations/notifications/rules/discussion.js.map +1 -0
  52. package/dist/automations/notifications/rules/entitlements.d.ts +6 -0
  53. package/dist/automations/notifications/rules/entitlements.js +249 -0
  54. package/dist/automations/notifications/rules/entitlements.js.map +1 -0
  55. package/dist/automations/notifications/rules/index.d.ts +6 -0
  56. package/dist/automations/notifications/rules/index.js +15 -0
  57. package/dist/automations/notifications/rules/index.js.map +1 -0
  58. package/dist/automations/notifications/rules/organizations.d.ts +6 -0
  59. package/dist/automations/notifications/rules/organizations.js +28 -0
  60. package/dist/automations/notifications/rules/organizations.js.map +1 -0
  61. package/dist/automations/notifications/rules/recipients.d.ts +32 -0
  62. package/dist/automations/notifications/rules/recipients.js +99 -0
  63. package/dist/automations/notifications/rules/recipients.js.map +1 -0
  64. package/dist/automations/notifications/service.d.ts +27 -0
  65. package/dist/automations/notifications/service.js +45 -0
  66. package/dist/automations/notifications/service.js.map +1 -0
  67. package/dist/automations/notifications/types.d.ts +7 -0
  68. package/dist/automations/notifications/types.js +473 -0
  69. package/dist/automations/notifications/types.js.map +1 -0
  70. package/dist/automations/ports.d.ts +121 -3
  71. package/dist/automations/schedule.d.ts +6 -0
  72. package/dist/automations/schedule.js +41 -0
  73. package/dist/automations/schedule.js.map +1 -0
  74. package/dist/automations/service.d.ts +20 -4
  75. package/dist/automations/service.js +246 -45
  76. package/dist/automations/service.js.map +1 -1
  77. package/dist/content/events.d.ts +712 -50
  78. package/dist/content/events.js +55 -1
  79. package/dist/content/events.js.map +1 -1
  80. package/dist/content/index.d.ts +6 -4
  81. package/dist/content/index.js +3 -1
  82. package/dist/content/model.d.ts +2 -2
  83. package/dist/content/notification-categories.d.ts +36 -0
  84. package/dist/content/notification-categories.js +64 -0
  85. package/dist/content/notification-categories.js.map +1 -0
  86. package/dist/content/ports.d.ts +90 -18
  87. package/dist/content/service.d.ts +57 -18
  88. package/dist/content/service.js +520 -25
  89. package/dist/content/service.js.map +1 -1
  90. package/dist/content/titles.d.ts +22 -0
  91. package/dist/content/titles.js +69 -0
  92. package/dist/content/titles.js.map +1 -0
  93. package/dist/content/types.d.ts +2 -2
  94. package/dist/discussion/authors.d.ts +10 -0
  95. package/dist/discussion/authors.js +23 -0
  96. package/dist/discussion/authors.js.map +1 -0
  97. package/dist/discussion/chats.d.ts +109 -0
  98. package/dist/discussion/chats.js +831 -0
  99. package/dist/discussion/chats.js.map +1 -0
  100. package/dist/discussion/digests.d.ts +24 -0
  101. package/dist/discussion/digests.js +104 -0
  102. package/dist/discussion/digests.js.map +1 -0
  103. package/dist/discussion/events.d.ts +785 -56
  104. package/dist/discussion/events.js +165 -5
  105. package/dist/discussion/events.js.map +1 -1
  106. package/dist/discussion/index.d.ts +12 -3
  107. package/dist/discussion/index.js +9 -1
  108. package/dist/discussion/jobs.d.ts +16 -0
  109. package/dist/discussion/jobs.js +40 -0
  110. package/dist/discussion/jobs.js.map +1 -0
  111. package/dist/discussion/mentions.d.ts +11 -0
  112. package/dist/discussion/mentions.js +35 -0
  113. package/dist/discussion/mentions.js.map +1 -0
  114. package/dist/discussion/ports.d.ts +372 -28
  115. package/dist/discussion/ports.js +6 -1
  116. package/dist/discussion/ports.js.map +1 -0
  117. package/dist/discussion/posts.d.ts +113 -0
  118. package/dist/discussion/posts.js +775 -0
  119. package/dist/discussion/posts.js.map +1 -0
  120. package/dist/discussion/service.d.ts +42 -11
  121. package/dist/discussion/service.js +364 -85
  122. package/dist/discussion/service.js.map +1 -1
  123. package/dist/discussion/subscriptions.d.ts +37 -0
  124. package/dist/discussion/subscriptions.js +99 -0
  125. package/dist/discussion/subscriptions.js.map +1 -0
  126. package/dist/discussion/titles.d.ts +26 -0
  127. package/dist/discussion/titles.js +84 -0
  128. package/dist/discussion/titles.js.map +1 -0
  129. package/dist/entitlements/events.d.ts +178 -11
  130. package/dist/entitlements/events.js +28 -1
  131. package/dist/entitlements/events.js.map +1 -1
  132. package/dist/entitlements/index.d.ts +6 -4
  133. package/dist/entitlements/index.js +3 -1
  134. package/dist/entitlements/jobs.d.ts +12 -0
  135. package/dist/entitlements/jobs.js +18 -0
  136. package/dist/entitlements/jobs.js.map +1 -0
  137. package/dist/entitlements/model.d.ts +3 -2
  138. package/dist/entitlements/ports.d.ts +128 -11
  139. package/dist/entitlements/rules.d.ts +12 -0
  140. package/dist/entitlements/rules.js +17 -0
  141. package/dist/entitlements/rules.js.map +1 -0
  142. package/dist/entitlements/service.d.ts +57 -3
  143. package/dist/entitlements/service.js +492 -2
  144. package/dist/entitlements/service.js.map +1 -1
  145. package/dist/identity/access.d.ts +6 -0
  146. package/dist/identity/access.js +7 -0
  147. package/dist/identity/access.js.map +1 -0
  148. package/dist/identity/devices.d.ts +30 -0
  149. package/dist/identity/devices.js +107 -0
  150. package/dist/identity/devices.js.map +1 -0
  151. package/dist/identity/events.d.ts +2 -2
  152. package/dist/identity/index.d.ts +7 -4
  153. package/dist/identity/index.js +4 -1
  154. package/dist/identity/model.d.ts +2 -1
  155. package/dist/identity/notification-settings.d.ts +28 -0
  156. package/dist/identity/notification-settings.js +113 -0
  157. package/dist/identity/notification-settings.js.map +1 -0
  158. package/dist/identity/ports.d.ts +97 -3
  159. package/dist/identity/service.d.ts +14 -3
  160. package/dist/identity/service.js +62 -5
  161. package/dist/identity/service.js.map +1 -1
  162. package/dist/integrations/events.d.ts +3 -3
  163. package/dist/integrations/model.js +1 -1
  164. package/dist/integrations/model.js.map +1 -1
  165. package/dist/integrations/service.js +2 -2
  166. package/dist/integrations/service.js.map +1 -1
  167. package/dist/organizations/access-scopes.d.ts +19 -0
  168. package/dist/organizations/access-scopes.js +89 -0
  169. package/dist/organizations/access-scopes.js.map +1 -0
  170. package/dist/organizations/events.d.ts +75 -33
  171. package/dist/organizations/events.js +6 -0
  172. package/dist/organizations/events.js.map +1 -1
  173. package/dist/organizations/index.d.ts +8 -6
  174. package/dist/organizations/index.js +5 -3
  175. package/dist/organizations/members.d.ts +8 -5
  176. package/dist/organizations/members.js.map +1 -1
  177. package/dist/organizations/notification-categories.d.ts +32 -0
  178. package/dist/organizations/notification-categories.js +51 -0
  179. package/dist/organizations/notification-categories.js.map +1 -0
  180. package/dist/organizations/ports.d.ts +17 -11
  181. package/dist/organizations/roles.d.ts +6 -10
  182. package/dist/organizations/roles.js +19 -7
  183. package/dist/organizations/roles.js.map +1 -1
  184. package/dist/organizations/service.d.ts +22 -11
  185. package/dist/organizations/service.js +164 -47
  186. package/dist/organizations/service.js.map +1 -1
  187. package/dist/organizations/types.d.ts +1 -10
  188. package/dist/progress/events.d.ts +14 -14
  189. package/dist/progress/index.d.ts +2 -2
  190. package/dist/progress/ports.d.ts +6 -1
  191. package/dist/progress/service.d.ts +3 -1
  192. package/dist/progress/service.js +6 -2
  193. package/dist/progress/service.js.map +1 -1
  194. package/dist/reporting/admin/index.d.ts +4 -0
  195. package/dist/reporting/admin/index.js +2 -0
  196. package/dist/reporting/admin/model.d.ts +108 -0
  197. package/dist/reporting/admin/ports.d.ts +27 -0
  198. package/dist/reporting/admin/service.d.ts +22 -0
  199. package/dist/reporting/admin/service.js +38 -0
  200. package/dist/reporting/admin/service.js.map +1 -0
  201. package/dist/reporting/member/index.d.ts +5 -0
  202. package/dist/reporting/member/index.js +2 -0
  203. package/dist/reporting/member/model.d.ts +157 -0
  204. package/dist/reporting/member/ports.d.ts +48 -0
  205. package/dist/reporting/member/service.d.ts +92 -0
  206. package/dist/reporting/member/service.js +364 -0
  207. package/dist/reporting/member/service.js.map +1 -0
  208. package/dist/shared/actor.d.ts +9 -0
  209. package/dist/shared/errors.d.ts +19 -1
  210. package/dist/shared/errors.js +27 -1
  211. package/dist/shared/errors.js.map +1 -1
  212. package/dist/shared/id.d.ts +14 -0
  213. package/dist/shared/id.js +15 -1
  214. package/dist/shared/id.js.map +1 -1
  215. package/dist/shared/mailer.d.ts +15 -2
  216. package/dist/shared/mailer.js +32 -5
  217. package/dist/shared/mailer.js.map +1 -1
  218. package/dist/shared/network.d.ts +10 -0
  219. package/dist/shared/network.js +211 -0
  220. package/dist/shared/network.js.map +1 -0
  221. package/dist/shared/notification-categories.d.ts +16 -0
  222. package/dist/shared/notification-categories.js +94 -0
  223. package/dist/shared/notification-categories.js.map +1 -0
  224. package/dist/shared/notification-settings.d.ts +14 -0
  225. package/dist/shared/notification-settings.js +61 -0
  226. package/dist/shared/notification-settings.js.map +1 -0
  227. package/dist/shared/ports.d.ts +48 -2
  228. package/dist/shared/settings.d.ts +2 -1
  229. package/dist/shared/settings.js +1 -0
  230. package/dist/shared/settings.js.map +1 -1
  231. package/dist/types/assets.d.ts +2 -2
  232. package/dist/types/automations.d.ts +15 -1
  233. package/dist/types/content.d.ts +2 -2
  234. package/dist/types/discussion.d.ts +11 -3
  235. package/dist/types/email-templates.d.ts +216 -1
  236. package/dist/types/entitlements.d.ts +2 -2
  237. package/dist/types/identity.d.ts +48 -2
  238. package/dist/types/index.d.ts +9 -8
  239. package/dist/types/notifications.d.ts +157 -0
  240. package/dist/types/ports.d.ts +6 -0
  241. package/dist/types/schemas/assets.d.ts +65 -37
  242. package/dist/types/schemas/assets.js +17 -12
  243. package/dist/types/schemas/assets.js.map +1 -1
  244. package/dist/types/schemas/automations.d.ts +9 -1
  245. package/dist/types/schemas/automations.js +13 -6
  246. package/dist/types/schemas/automations.js.map +1 -1
  247. package/dist/types/schemas/content.d.ts +396 -3
  248. package/dist/types/schemas/content.js +161 -3
  249. package/dist/types/schemas/content.js.map +1 -1
  250. package/dist/types/schemas/discussion.d.ts +443 -3
  251. package/dist/types/schemas/discussion.js +233 -4
  252. package/dist/types/schemas/discussion.js.map +1 -1
  253. package/dist/types/schemas/entitlements.d.ts +36 -2
  254. package/dist/types/schemas/entitlements.js +23 -1
  255. package/dist/types/schemas/entitlements.js.map +1 -1
  256. package/dist/types/schemas/identity.d.ts +27 -1
  257. package/dist/types/schemas/identity.js +14 -2
  258. package/dist/types/schemas/identity.js.map +1 -1
  259. package/dist/types/schemas/index.d.ts +9 -8
  260. package/dist/types/schemas/index.js +9 -8
  261. package/dist/types/schemas/notifications.d.ts +95 -0
  262. package/dist/types/schemas/notifications.js +56 -0
  263. package/dist/types/schemas/notifications.js.map +1 -0
  264. package/dist/types/schemas/organizations.d.ts +8 -0
  265. package/dist/types/schemas/organizations.js +2 -0
  266. package/dist/types/schemas/organizations.js.map +1 -1
  267. package/dist/types/schemas/progress.d.ts +3 -3
  268. package/dist/types/schemas/shared.d.ts +3 -1
  269. package/dist/types/schemas/shared.js +5 -1
  270. package/dist/types/schemas/shared.js.map +1 -1
  271. package/package.json +2 -2
  272. package/dist/reporting/courses/index.d.ts +0 -4
  273. package/dist/reporting/courses/index.js +0 -2
  274. package/dist/reporting/courses/model.d.ts +0 -24
  275. package/dist/reporting/courses/ports.d.ts +0 -13
  276. package/dist/reporting/courses/service.d.ts +0 -19
  277. package/dist/reporting/courses/service.js +0 -20
  278. package/dist/reporting/courses/service.js.map +0 -1
  279. package/dist/reporting/dashboard/index.d.ts +0 -4
  280. package/dist/reporting/dashboard/index.js +0 -2
  281. package/dist/reporting/dashboard/model.d.ts +0 -14
  282. package/dist/reporting/dashboard/ports.d.ts +0 -13
  283. package/dist/reporting/dashboard/service.d.ts +0 -19
  284. package/dist/reporting/dashboard/service.js +0 -20
  285. package/dist/reporting/dashboard/service.js.map +0 -1
  286. package/dist/reporting/learn/index.d.ts +0 -5
  287. package/dist/reporting/learn/index.js +0 -2
  288. package/dist/reporting/learn/model.d.ts +0 -23
  289. package/dist/reporting/learn/ports.d.ts +0 -43
  290. package/dist/reporting/learn/service.d.ts +0 -49
  291. package/dist/reporting/learn/service.js +0 -116
  292. package/dist/reporting/learn/service.js.map +0 -1
  293. package/dist/reporting/students/index.d.ts +0 -4
  294. package/dist/reporting/students/index.js +0 -2
  295. package/dist/reporting/students/model.d.ts +0 -51
  296. package/dist/reporting/students/model.js +0 -1
  297. package/dist/reporting/students/ports.d.ts +0 -15
  298. package/dist/reporting/students/ports.js +0 -1
  299. package/dist/reporting/students/service.d.ts +0 -20
  300. package/dist/reporting/students/service.js +0 -23
  301. package/dist/reporting/students/service.js.map +0 -1
  302. /package/dist/reporting/{courses → admin}/model.js +0 -0
  303. /package/dist/reporting/{courses → admin}/ports.js +0 -0
  304. /package/dist/reporting/{dashboard → member}/model.js +0 -0
  305. /package/dist/reporting/{dashboard → member}/ports.js +0 -0
  306. /package/dist/{reporting/learn/model.js → shared/actor.js} +0 -0
  307. /package/dist/{reporting/learn/ports.js → types/notifications.js} +0 -0
@@ -1,10 +1,19 @@
1
- import { commentReportSchema, commentSchema } from "../types/schemas/discussion.js";
1
+ import { idSchema } from "../types/schemas/shared.js";
2
+ import { chatSchema, commentReportSchema, commentSchema, messageFlagSchema, messageSchema, postFlagSchema, postSchema, reactionEmojiSchema } from "../types/schemas/discussion.js";
2
3
  import { defineEvent } from "../shared/events.js";
4
+ import { z } from "zod";
3
5
  //#region src/discussion/events.ts
6
+ const mentioned = { mentionedOrgUserIds: z.array(idSchema) };
7
+ const commentEventSchema = commentSchema.extend(mentioned);
8
+ const postEventSchema = postSchema.extend(mentioned);
9
+ const publicPost = postSchema.strip();
10
+ const messageEventSchema = messageSchema.extend(mentioned);
4
11
  const publicComment = commentSchema.pick({
5
12
  id: true,
6
13
  orgId: true,
7
14
  activityId: true,
15
+ postId: true,
16
+ communityId: true,
8
17
  parentId: true,
9
18
  orgUserId: true,
10
19
  body: true,
@@ -13,9 +22,11 @@ const publicComment = commentSchema.pick({
13
22
  createdAt: true,
14
23
  updatedAt: true
15
24
  }).strip();
16
- const publicCommentReport = commentReportSchema.pick({
25
+ const reportedComment = commentReportSchema.extend({ communityId: idSchema.nullable() });
26
+ const publicCommentReport = reportedComment.pick({
17
27
  id: true,
18
28
  orgId: true,
29
+ communityId: true,
19
30
  commentId: true,
20
31
  orgUserId: true,
21
32
  reason: true,
@@ -23,19 +34,78 @@ const publicCommentReport = commentReportSchema.pick({
23
34
  createdAt: true,
24
35
  updatedAt: true
25
36
  }).strip();
37
+ const reportedPost = postFlagSchema.extend({ communityId: idSchema });
38
+ const chatEventSchema = chatSchema.extend({ participantIds: z.array(idSchema) });
39
+ const publicChat = chatEventSchema.pick({
40
+ id: true,
41
+ orgId: true,
42
+ communityId: true,
43
+ kind: true,
44
+ status: true,
45
+ createdBy: true,
46
+ participantIds: true
47
+ }).strip();
48
+ const participantAddedSchema = z.object({
49
+ chatId: idSchema,
50
+ communityId: idSchema,
51
+ orgUserId: idSchema,
52
+ addedBy: idSchema
53
+ }).strict();
54
+ const publicMessage = messageSchema.omit({ body: true }).strip();
55
+ const postReactionAddedSchema = z.object({
56
+ postId: idSchema,
57
+ spaceId: idSchema,
58
+ communityId: idSchema,
59
+ orgUserId: idSchema,
60
+ reaction: reactionEmojiSchema
61
+ }).strict();
62
+ const commentReactionAddedSchema = z.object({
63
+ commentId: idSchema,
64
+ postId: idSchema.nullable(),
65
+ activityId: idSchema.nullable(),
66
+ spaceId: idSchema.nullable(),
67
+ communityId: idSchema.nullable(),
68
+ orgUserId: idSchema,
69
+ reaction: reactionEmojiSchema
70
+ }).strict();
71
+ const messageReactionAddedSchema = z.object({
72
+ messageId: idSchema,
73
+ chatId: idSchema,
74
+ communityId: idSchema,
75
+ orgUserId: idSchema,
76
+ reaction: reactionEmojiSchema
77
+ }).strict();
78
+ const digestDueSchema = z.object({
79
+ communityId: idSchema,
80
+ from: z.coerce.date(),
81
+ to: z.coerce.date()
82
+ }).strict();
83
+ const publicMessageFlag = messageFlagSchema.omit({ reason: true }).strip();
26
84
  const discussionEvents = {
27
85
  commentCreated: defineEvent({
28
86
  type: "discussion.comment.created",
29
87
  version: 1,
30
- data: commentSchema,
88
+ data: commentEventSchema,
31
89
  publicData: publicComment
32
90
  }),
33
91
  commentPublished: defineEvent({
34
92
  type: "discussion.comment.published",
35
93
  version: 1,
36
- data: commentSchema,
94
+ data: commentEventSchema,
37
95
  publicData: publicComment
38
96
  }),
97
+ commentUpdated: defineEvent({
98
+ type: "discussion.comment.updated",
99
+ version: 1,
100
+ data: commentEventSchema,
101
+ publicData: publicComment
102
+ }),
103
+ commentReactionAdded: defineEvent({
104
+ type: "discussion.comment.reaction.added",
105
+ version: 1,
106
+ data: commentReactionAddedSchema,
107
+ publicData: commentReactionAddedSchema
108
+ }),
39
109
  commentRemoved: defineEvent({
40
110
  type: "discussion.comment.removed",
41
111
  version: 1,
@@ -45,8 +115,98 @@ const discussionEvents = {
45
115
  commentReported: defineEvent({
46
116
  type: "discussion.comment.reported",
47
117
  version: 1,
48
- data: commentReportSchema,
118
+ data: reportedComment,
49
119
  publicData: publicCommentReport
120
+ }),
121
+ postCreated: defineEvent({
122
+ type: "discussion.post.created",
123
+ version: 1,
124
+ data: postSchema,
125
+ publicData: postSchema
126
+ }),
127
+ postUpdated: defineEvent({
128
+ type: "discussion.post.updated",
129
+ version: 1,
130
+ data: postEventSchema,
131
+ publicData: publicPost
132
+ }),
133
+ postPublished: defineEvent({
134
+ type: "discussion.post.published",
135
+ version: 1,
136
+ data: postEventSchema,
137
+ publicData: publicPost
138
+ }),
139
+ postReactionAdded: defineEvent({
140
+ type: "discussion.post.reaction.added",
141
+ version: 1,
142
+ data: postReactionAddedSchema,
143
+ publicData: postReactionAddedSchema
144
+ }),
145
+ postRemoved: defineEvent({
146
+ type: "discussion.post.removed",
147
+ version: 1,
148
+ data: postSchema,
149
+ publicData: postSchema
150
+ }),
151
+ postReported: defineEvent({
152
+ type: "discussion.post.reported",
153
+ version: 1,
154
+ data: reportedPost,
155
+ publicData: reportedPost
156
+ }),
157
+ chatCreated: defineEvent({
158
+ type: "discussion.chat.created",
159
+ version: 1,
160
+ data: chatEventSchema,
161
+ publicData: publicChat
162
+ }),
163
+ chatUpdated: defineEvent({
164
+ type: "discussion.chat.updated",
165
+ version: 1,
166
+ data: chatEventSchema,
167
+ publicData: publicChat
168
+ }),
169
+ chatParticipantAdded: defineEvent({
170
+ type: "discussion.chat.participant.added",
171
+ version: 1,
172
+ data: participantAddedSchema,
173
+ publicData: participantAddedSchema
174
+ }),
175
+ messageSent: defineEvent({
176
+ type: "discussion.message.sent",
177
+ version: 1,
178
+ data: messageEventSchema,
179
+ publicData: publicMessage
180
+ }),
181
+ messageUpdated: defineEvent({
182
+ type: "discussion.message.updated",
183
+ version: 1,
184
+ data: messageEventSchema,
185
+ publicData: publicMessage
186
+ }),
187
+ messageReactionAdded: defineEvent({
188
+ type: "discussion.message.reaction.added",
189
+ version: 1,
190
+ data: messageReactionAddedSchema,
191
+ publicData: messageReactionAddedSchema
192
+ }),
193
+ messageDeleted: defineEvent({
194
+ type: "discussion.message.deleted",
195
+ version: 1,
196
+ data: messageSchema,
197
+ publicData: publicMessage
198
+ }),
199
+ messageReported: defineEvent({
200
+ type: "discussion.message.reported",
201
+ version: 1,
202
+ data: messageFlagSchema,
203
+ publicData: publicMessageFlag
204
+ }),
205
+ digestDue: defineEvent({
206
+ type: "discussion.digest.due",
207
+ version: 2,
208
+ data: digestDueSchema,
209
+ publicData: digestDueSchema
50
210
  })
51
211
  };
52
212
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../src/discussion/events.ts"],"sourcesContent":["import { commentReportSchema, commentSchema } from '../types/schemas/index.js';\nimport {\n defineEvent,\n type EventOf,\n type EventOfValues,\n type NewDomainEvent,\n} from '../shared/ports.js';\n\nconst publicComment = commentSchema\n .pick({\n id: true,\n orgId: true,\n activityId: true,\n parentId: true,\n orgUserId: true,\n body: true,\n status: true,\n removedBy: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\n\nconst publicCommentReport = commentReportSchema\n .pick({\n id: true,\n orgId: true,\n commentId: true,\n orgUserId: true,\n reason: true,\n resolvedAt: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\n\nexport const discussionEvents = {\n commentCreated: defineEvent({\n type: 'discussion.comment.created',\n version: 1,\n data: commentSchema,\n publicData: publicComment,\n }),\n commentPublished: defineEvent({\n type: 'discussion.comment.published',\n version: 1,\n data: commentSchema,\n publicData: publicComment,\n }),\n commentRemoved: defineEvent({\n type: 'discussion.comment.removed',\n version: 1,\n data: commentSchema,\n publicData: publicComment,\n }),\n commentReported: defineEvent({\n type: 'discussion.comment.reported',\n version: 1,\n data: commentReportSchema,\n publicData: publicCommentReport,\n }),\n};\n\nexport type CommentCreated = EventOf<typeof discussionEvents.commentCreated>;\nexport type CommentPublished = EventOf<typeof discussionEvents.commentPublished>;\nexport type CommentRemoved = EventOf<typeof discussionEvents.commentRemoved>;\nexport type CommentReported = EventOf<typeof discussionEvents.commentReported>;\nexport type CommentEvent = EventOfValues<typeof discussionEvents>;\nexport type NewDiscussionEvent = NewDomainEvent<CommentEvent>;\n"],"mappings":";;;AAQA,MAAM,gBAAgB,cACnB,KAAK;CACJ,IAAI;CACJ,OAAO;CACP,YAAY;CACZ,UAAU;CACV,WAAW;CACX,MAAM;CACN,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;AACb,CAAC,CAAC,CACD,MAAM;AAET,MAAM,sBAAsB,oBACzB,KAAK;CACJ,IAAI;CACJ,OAAO;CACP,WAAW;CACX,WAAW;CACX,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC,CAAC,CACD,MAAM;AAET,MAAa,mBAAmB;CAC9B,gBAAgB,YAAY;EAC1B,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,kBAAkB,YAAY;EAC5B,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,gBAAgB,YAAY;EAC1B,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,iBAAiB,YAAY;EAC3B,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;AACH"}
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../src/discussion/events.ts"],"sourcesContent":["import { z } from 'zod';\nimport {\n chatSchema,\n commentReportSchema,\n commentSchema,\n idSchema,\n messageFlagSchema,\n messageSchema,\n postFlagSchema,\n postSchema,\n reactionEmojiSchema,\n} from '../types/schemas/index.js';\nimport {\n defineEvent,\n type EventOf,\n type EventOfValues,\n type NewDomainEvent,\n} from '../shared/ports.js';\n\nconst mentioned = { mentionedOrgUserIds: z.array(idSchema) };\nconst commentEventSchema = commentSchema.extend(mentioned);\nconst postEventSchema = postSchema.extend(mentioned);\nconst publicPost = postSchema.strip();\nconst messageEventSchema = messageSchema.extend(mentioned);\n\nconst publicComment = commentSchema\n .pick({\n id: true,\n orgId: true,\n activityId: true,\n postId: true,\n communityId: true,\n parentId: true,\n orgUserId: true,\n body: true,\n status: true,\n removedBy: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\n\nconst reportedComment = commentReportSchema.extend({ communityId: idSchema.nullable() });\nconst publicCommentReport = reportedComment\n .pick({\n id: true,\n orgId: true,\n communityId: true,\n commentId: true,\n orgUserId: true,\n reason: true,\n resolvedAt: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\nconst reportedPost = postFlagSchema.extend({ communityId: idSchema });\n\nconst chatEventSchema = chatSchema.extend({\n participantIds: z.array(idSchema),\n});\n\nconst publicChat = chatEventSchema\n .pick({\n id: true,\n orgId: true,\n communityId: true,\n kind: true,\n status: true,\n createdBy: true,\n participantIds: true,\n })\n .strip();\n\nconst participantAddedSchema = z\n .object({\n chatId: idSchema,\n communityId: idSchema,\n orgUserId: idSchema,\n addedBy: idSchema,\n })\n .strict();\n\nconst publicMessage = messageSchema.omit({ body: true }).strip();\n\nconst postReactionAddedSchema = z\n .object({\n postId: idSchema,\n spaceId: idSchema,\n communityId: idSchema,\n orgUserId: idSchema,\n reaction: reactionEmojiSchema,\n })\n .strict();\n\nconst commentReactionAddedSchema = z\n .object({\n commentId: idSchema,\n postId: idSchema.nullable(),\n activityId: idSchema.nullable(),\n spaceId: idSchema.nullable(),\n communityId: idSchema.nullable(),\n orgUserId: idSchema,\n reaction: reactionEmojiSchema,\n })\n .strict();\n\nconst messageReactionAddedSchema = z\n .object({\n messageId: idSchema,\n chatId: idSchema,\n communityId: idSchema,\n orgUserId: idSchema,\n reaction: reactionEmojiSchema,\n })\n .strict();\n\nconst digestDueSchema = z\n .object({ communityId: idSchema, from: z.coerce.date(), to: z.coerce.date() })\n .strict();\nconst publicMessageFlag = messageFlagSchema.omit({ reason: true }).strip();\n\nexport const discussionEvents = {\n commentCreated: defineEvent({\n type: 'discussion.comment.created',\n version: 1,\n data: commentEventSchema,\n publicData: publicComment,\n }),\n commentPublished: defineEvent({\n type: 'discussion.comment.published',\n version: 1,\n data: commentEventSchema,\n publicData: publicComment,\n }),\n commentUpdated: defineEvent({\n type: 'discussion.comment.updated',\n version: 1,\n data: commentEventSchema,\n publicData: publicComment,\n }),\n commentReactionAdded: defineEvent({\n type: 'discussion.comment.reaction.added',\n version: 1,\n data: commentReactionAddedSchema,\n publicData: commentReactionAddedSchema,\n }),\n commentRemoved: defineEvent({\n type: 'discussion.comment.removed',\n version: 1,\n data: commentSchema,\n publicData: publicComment,\n }),\n commentReported: defineEvent({\n type: 'discussion.comment.reported',\n version: 1,\n data: reportedComment,\n publicData: publicCommentReport,\n }),\n postCreated: defineEvent({\n type: 'discussion.post.created',\n version: 1,\n data: postSchema,\n publicData: postSchema,\n }),\n postUpdated: defineEvent({\n type: 'discussion.post.updated',\n version: 1,\n data: postEventSchema,\n publicData: publicPost,\n }),\n postPublished: defineEvent({\n type: 'discussion.post.published',\n version: 1,\n data: postEventSchema,\n publicData: publicPost,\n }),\n postReactionAdded: defineEvent({\n type: 'discussion.post.reaction.added',\n version: 1,\n data: postReactionAddedSchema,\n publicData: postReactionAddedSchema,\n }),\n postRemoved: defineEvent({\n type: 'discussion.post.removed',\n version: 1,\n data: postSchema,\n publicData: postSchema,\n }),\n postReported: defineEvent({\n type: 'discussion.post.reported',\n version: 1,\n data: reportedPost,\n publicData: reportedPost,\n }),\n chatCreated: defineEvent({\n type: 'discussion.chat.created',\n version: 1,\n data: chatEventSchema,\n publicData: publicChat,\n }),\n chatUpdated: defineEvent({\n type: 'discussion.chat.updated',\n version: 1,\n data: chatEventSchema,\n publicData: publicChat,\n }),\n chatParticipantAdded: defineEvent({\n type: 'discussion.chat.participant.added',\n version: 1,\n data: participantAddedSchema,\n publicData: participantAddedSchema,\n }),\n messageSent: defineEvent({\n type: 'discussion.message.sent',\n version: 1,\n data: messageEventSchema,\n publicData: publicMessage,\n }),\n messageUpdated: defineEvent({\n type: 'discussion.message.updated',\n version: 1,\n data: messageEventSchema,\n publicData: publicMessage,\n }),\n messageReactionAdded: defineEvent({\n type: 'discussion.message.reaction.added',\n version: 1,\n data: messageReactionAddedSchema,\n publicData: messageReactionAddedSchema,\n }),\n messageDeleted: defineEvent({\n type: 'discussion.message.deleted',\n version: 1,\n data: messageSchema,\n publicData: publicMessage,\n }),\n messageReported: defineEvent({\n type: 'discussion.message.reported',\n version: 1,\n data: messageFlagSchema,\n publicData: publicMessageFlag,\n }),\n digestDue: defineEvent({\n type: 'discussion.digest.due',\n version: 2,\n data: digestDueSchema,\n publicData: digestDueSchema,\n }),\n};\n\nexport type CommentCreated = EventOf<typeof discussionEvents.commentCreated>;\nexport type CommentPublished = EventOf<typeof discussionEvents.commentPublished>;\nexport type CommentUpdated = EventOf<typeof discussionEvents.commentUpdated>;\nexport type CommentReactionAdded = EventOf<typeof discussionEvents.commentReactionAdded>;\nexport type CommentRemoved = EventOf<typeof discussionEvents.commentRemoved>;\nexport type CommentReported = EventOf<typeof discussionEvents.commentReported>;\nexport type DiscussionEvent = EventOfValues<typeof discussionEvents>;\nexport type PostCreated = EventOf<typeof discussionEvents.postCreated>;\nexport type PostUpdated = EventOf<typeof discussionEvents.postUpdated>;\nexport type PostPublished = EventOf<typeof discussionEvents.postPublished>;\nexport type PostReactionAdded = EventOf<typeof discussionEvents.postReactionAdded>;\nexport type PostRemoved = EventOf<typeof discussionEvents.postRemoved>;\nexport type PostReported = EventOf<typeof discussionEvents.postReported>;\nexport type ChatCreated = EventOf<typeof discussionEvents.chatCreated>;\nexport type ChatUpdated = EventOf<typeof discussionEvents.chatUpdated>;\nexport type ChatParticipantAdded = EventOf<typeof discussionEvents.chatParticipantAdded>;\nexport type MessageSent = EventOf<typeof discussionEvents.messageSent>;\nexport type MessageUpdated = EventOf<typeof discussionEvents.messageUpdated>;\nexport type MessageReactionAdded = EventOf<typeof discussionEvents.messageReactionAdded>;\nexport type MessageDeleted = EventOf<typeof discussionEvents.messageDeleted>;\nexport type MessageReported = EventOf<typeof discussionEvents.messageReported>;\nexport type DigestDue = EventOf<typeof discussionEvents.digestDue>;\nexport type NewDiscussionEvent = NewDomainEvent<DiscussionEvent>;\n"],"mappings":"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"}
@@ -1,8 +1,17 @@
1
1
  import { CommentListItem, CommentReaction, CommentReportSummary, CommentSettings, CommentStatus, CommentView, CommentsConfig, ListCommentsQuery, ReactionCounts, ReactionEmoji } from "../types/schemas/discussion.js";
2
2
  import { Comment, CommentAuthor, CommentReport } from "../types/discussion.js";
3
- import { CommentEvent, discussionEvents } from "./events.js";
3
+ import { Actor } from "../shared/actor.js";
4
4
  import "./model.js";
5
5
  import "./types.js";
6
- import { ActivityComments, Actor, AuthorRecord, CommentReactions, CommentWithContext, CourseAccessReader, DiscussionRepository, DiscussionService, DiscussionUnitOfWork, DiscussionWriteScope, PostCommentInput } from "./ports.js";
6
+ import { ActivityComments, AuthorProfileReader, AuthorRecord, AuthorRoleReader, BookmarkQuery, ChatInboxRow, ChatListItem, ChatRepository, ChatService, ChatUnitOfWork, ChatUnread, ChatWriteScope, CommentReactions, CommentWithContext, ContentAccessReader, CreatePostInput, DigestRunRepository, DigestScheduleReader, DigestService, DigestUnitOfWork, DigestWriteScope, DiscussionRepository, DiscussionService, DiscussionUnitOfWork, DiscussionWriteScope, FeedQuery, ItemTitle, ItemTitles, MentionsRepository, MessageQueue, MessageReactions, MuteInput, PageQuery, PostCommentInput, PostCommentReader, PostGuard, PostPatch, PostReactions, PostRepository, PostService, PostThreadsQuery, PostUnitOfWork, PostWriteScope, PublishedPost, SendMessageInput, SpaceModerationQueue, StartDirectInput, StartGroupInput, SubscriptionInput, SubscriptionService, SubscriptionsRepository, UpdatePostInput } from "./ports.js";
7
+ import { authorView } from "./authors.js";
8
+ import { ChatServiceImpl } from "./chats.js";
9
+ import { DigestServiceImpl, latestDueAt } from "./digests.js";
10
+ import { DiscussionEvent, discussionEvents } from "./events.js";
7
11
  import { DEFAULT_SETTINGS, DiscussionServiceImpl } from "./service.js";
8
- export { type ActivityComments, type Actor, type AuthorRecord, type Comment, type CommentAuthor, type CommentEvent, type CommentListItem, type CommentReaction, type CommentReactions, type CommentReport, type CommentReportSummary, type CommentSettings, type CommentStatus, type CommentView, type CommentWithContext, type CommentsConfig, type CourseAccessReader, DEFAULT_SETTINGS, type DiscussionRepository, type DiscussionService, DiscussionServiceImpl, type DiscussionUnitOfWork, type DiscussionWriteScope, type ListCommentsQuery, type PostCommentInput, type ReactionCounts, type ReactionEmoji, discussionEvents };
12
+ import { PostServiceImpl } from "./posts.js";
13
+ import { SubscriptionServiceImpl, activeSubscription } from "./subscriptions.js";
14
+ import { nameMentions } from "./mentions.js";
15
+ import { DiscussionItemTitles } from "./titles.js";
16
+ import { DIGEST_OPEN_JOB, POST_PUBLISH_JOB, discussionJobs, discussionRecurringJobs } from "./jobs.js";
17
+ export { type ActivityComments, type Actor, type AuthorProfileReader, type AuthorRecord, type AuthorRoleReader, type BookmarkQuery, type ChatInboxRow, type ChatListItem, type ChatRepository, type ChatService, ChatServiceImpl, type ChatUnitOfWork, type ChatUnread, type ChatWriteScope, type Comment, type CommentAuthor, type CommentListItem, type CommentReaction, type CommentReactions, type CommentReport, type CommentReportSummary, type CommentSettings, type CommentStatus, type CommentView, type CommentWithContext, type CommentsConfig, type ContentAccessReader, type CreatePostInput, DEFAULT_SETTINGS, DIGEST_OPEN_JOB, type DigestRunRepository, type DigestScheduleReader, type DigestService, DigestServiceImpl, type DigestUnitOfWork, type DigestWriteScope, type DiscussionEvent, DiscussionItemTitles, type DiscussionRepository, type DiscussionService, DiscussionServiceImpl, type DiscussionUnitOfWork, type DiscussionWriteScope, type FeedQuery, type ItemTitle, type ItemTitles, type ListCommentsQuery, type MentionsRepository, type MessageQueue, type MessageReactions, type MuteInput, POST_PUBLISH_JOB, type PageQuery, type PostCommentInput, type PostCommentReader, type PostGuard, type PostPatch, type PostReactions, type PostRepository, type PostService, PostServiceImpl, type PostThreadsQuery, type PostUnitOfWork, type PostWriteScope, type PublishedPost, type ReactionCounts, type ReactionEmoji, type SendMessageInput, type SpaceModerationQueue, type StartDirectInput, type StartGroupInput, type SubscriptionInput, type SubscriptionService, SubscriptionServiceImpl, type SubscriptionsRepository, type UpdatePostInput, activeSubscription, authorView, discussionEvents, discussionJobs, discussionRecurringJobs, latestDueAt, nameMentions };
@@ -1,3 +1,11 @@
1
1
  import { discussionEvents } from "./events.js";
2
+ import { authorView } from "./authors.js";
3
+ import { nameMentions } from "./mentions.js";
2
4
  import { DEFAULT_SETTINGS, DiscussionServiceImpl } from "./service.js";
3
- export { DEFAULT_SETTINGS, DiscussionServiceImpl, discussionEvents };
5
+ import { DIGEST_OPEN_JOB, POST_PUBLISH_JOB, discussionJobs, discussionRecurringJobs } from "./jobs.js";
6
+ import { SubscriptionServiceImpl, activeSubscription } from "./subscriptions.js";
7
+ import { PostServiceImpl } from "./posts.js";
8
+ import { DigestServiceImpl, latestDueAt } from "./digests.js";
9
+ import { ChatServiceImpl } from "./chats.js";
10
+ import { DiscussionItemTitles } from "./titles.js";
11
+ export { ChatServiceImpl, DEFAULT_SETTINGS, DIGEST_OPEN_JOB, DigestServiceImpl, DiscussionItemTitles, DiscussionServiceImpl, POST_PUBLISH_JOB, PostServiceImpl, SubscriptionServiceImpl, activeSubscription, authorView, discussionEvents, discussionJobs, discussionRecurringJobs, latestDueAt, nameMentions };
@@ -0,0 +1,16 @@
1
+ import { Logger } from "../types/ports.js";
2
+ import { RecurringJob, ScheduledJob } from "../shared/ports.js";
3
+ import { DigestService, PostService } from "./ports.js";
4
+ //#region src/discussion/jobs.d.ts
5
+ declare const POST_PUBLISH_JOB = "discussion.post.publish";
6
+ declare const DIGEST_OPEN_JOB = "discussion.digest.open";
7
+ interface DiscussionJobDeps {
8
+ posts: Pick<PostService, 'publishScheduled'>;
9
+ digests: Pick<DigestService, 'openDue'>;
10
+ logger?: Logger;
11
+ }
12
+ declare function discussionJobs(deps: DiscussionJobDeps): ScheduledJob[];
13
+ declare const discussionRecurringJobs: RecurringJob[];
14
+ //#endregion
15
+ export { DIGEST_OPEN_JOB, DiscussionJobDeps, POST_PUBLISH_JOB, discussionJobs, discussionRecurringJobs };
16
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { idSchema } from "../types/schemas/shared.js";
2
+ import { noopLogger } from "../shared/logger.js";
3
+ import { z } from "zod";
4
+ //#region src/discussion/jobs.ts
5
+ const POST_PUBLISH_JOB = "discussion.post.publish";
6
+ const DIGEST_OPEN_JOB = "discussion.digest.open";
7
+ const postPublishPayload = z.object({
8
+ orgId: idSchema,
9
+ postId: idSchema
10
+ }).strict();
11
+ function discussionJobs(deps) {
12
+ const logger = deps.logger ?? noopLogger;
13
+ return [{
14
+ job: POST_PUBLISH_JOB,
15
+ async run(payload, fire) {
16
+ const parsed = postPublishPayload.safeParse(payload);
17
+ if (!parsed.success) {
18
+ logger.error("scheduled post payload refused", {
19
+ job: POST_PUBLISH_JOB,
20
+ fireId: fire.id
21
+ });
22
+ return;
23
+ }
24
+ await deps.posts.publishScheduled(parsed.data.orgId, parsed.data.postId, fire.startedAt);
25
+ }
26
+ }, {
27
+ job: DIGEST_OPEN_JOB,
28
+ async run(_payload, fire) {
29
+ await deps.digests.openDue(fire.startedAt);
30
+ }
31
+ }];
32
+ }
33
+ const discussionRecurringJobs = [{
34
+ job: DIGEST_OPEN_JOB,
35
+ cron: "0 * * * *"
36
+ }];
37
+ //#endregion
38
+ export { DIGEST_OPEN_JOB, POST_PUBLISH_JOB, discussionJobs, discussionRecurringJobs };
39
+
40
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","names":[],"sources":["../../src/discussion/jobs.ts"],"sourcesContent":["import { z } from 'zod';\nimport { idSchema } from '../types/schemas/index.js';\nimport type { Logger, RecurringJob, ScheduledJob } from '../shared/ports.js';\nimport { noopLogger } from '../shared/logger.js';\nimport type { DigestService, PostService } from './ports.js';\n\nexport const POST_PUBLISH_JOB = 'discussion.post.publish';\nexport const DIGEST_OPEN_JOB = 'discussion.digest.open';\n\nconst postPublishPayload = z.object({ orgId: idSchema, postId: idSchema }).strict();\n\nexport interface DiscussionJobDeps {\n posts: Pick<PostService, 'publishScheduled'>;\n digests: Pick<DigestService, 'openDue'>;\n logger?: Logger;\n}\n\nexport function discussionJobs(deps: DiscussionJobDeps): ScheduledJob[] {\n const logger = deps.logger ?? noopLogger;\n return [\n {\n job: POST_PUBLISH_JOB,\n async run(payload, fire) {\n const parsed = postPublishPayload.safeParse(payload);\n if (!parsed.success) {\n logger.error('scheduled post payload refused', {\n job: POST_PUBLISH_JOB,\n fireId: fire.id,\n });\n return;\n }\n await deps.posts.publishScheduled(parsed.data.orgId, parsed.data.postId, fire.startedAt);\n },\n },\n {\n job: DIGEST_OPEN_JOB,\n async run(_payload, fire) {\n await deps.digests.openDue(fire.startedAt);\n },\n },\n ];\n}\n\nexport const discussionRecurringJobs: RecurringJob[] = [\n { job: DIGEST_OPEN_JOB, cron: '0 * * * *' },\n];\n"],"mappings":";;;;AAMA,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAE/B,MAAM,qBAAqB,EAAE,OAAO;CAAE,OAAO;CAAU,QAAQ;AAAS,CAAC,CAAC,CAAC,OAAO;AAQlF,SAAgB,eAAe,MAAyC;CACtE,MAAM,SAAS,KAAK,UAAU;CAC9B,OAAO,CACL;EACE,KAAK;EACL,MAAM,IAAI,SAAS,MAAM;GACvB,MAAM,SAAS,mBAAmB,UAAU,OAAO;GACnD,IAAI,CAAC,OAAO,SAAS;IACnB,OAAO,MAAM,kCAAkC;KAC7C,KAAK;KACL,QAAQ,KAAK;IACf,CAAC;IACD;GACF;GACA,MAAM,KAAK,MAAM,iBAAiB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,KAAK,SAAS;EACzF;CACF,GACA;EACE,KAAK;EACL,MAAM,IAAI,UAAU,MAAM;GACxB,MAAM,KAAK,QAAQ,QAAQ,KAAK,SAAS;EAC3C;CACF,CACF;AACF;AAEA,MAAa,0BAA0C,CACrD;CAAE,KAAK;CAAiB,MAAM;AAAY,CAC5C"}
@@ -0,0 +1,11 @@
1
+ import { MentionItemType, MentionView } from "../types/schemas/discussion.js";
2
+ import "../types/index.js";
3
+ import { AuthorProfileReader, MentionsRepository } from "./ports.js";
4
+ //#region src/discussion/mentions.d.ts
5
+ declare function mentionTokens(...texts: string[]): string[];
6
+ declare function nameMentions(text: string, nameOf: (orgUserId: string) => Promise<string>): Promise<string>;
7
+ declare function keepAllowed(tokens: string[], allowed: string[]): string[];
8
+ declare function mentionViews(mentions: Pick<MentionsRepository, 'forItems'>, profiles: AuthorProfileReader, orgId: string, itemType: MentionItemType, itemIds: string[]): Promise<Record<string, MentionView[]>>;
9
+ //#endregion
10
+ export { keepAllowed, mentionTokens, mentionViews, nameMentions };
11
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { authorView } from "./authors.js";
2
+ //#region src/discussion/mentions.ts
3
+ const TOKEN = /<@([A-Za-z0-9_-]+)>/g;
4
+ const UNNAMED = "A member";
5
+ function mentionTokens(...texts) {
6
+ const found = /* @__PURE__ */ new Set();
7
+ for (const text of texts) for (const match of text.matchAll(TOKEN)) found.add(match[1]);
8
+ return [...found];
9
+ }
10
+ async function nameMentions(text, nameOf) {
11
+ const names = /* @__PURE__ */ new Map();
12
+ for (const orgUserId of mentionTokens(text)) names.set(orgUserId, await nameOf(orgUserId));
13
+ return text.replace(TOKEN, (_token, orgUserId) => names.get(orgUserId) ?? UNNAMED);
14
+ }
15
+ function keepAllowed(tokens, allowed) {
16
+ const kept = new Set(allowed);
17
+ return tokens.filter((token) => kept.has(token));
18
+ }
19
+ async function mentionViews(mentions, profiles, orgId, itemType, itemIds) {
20
+ if (itemIds.length === 0) return {};
21
+ const byItem = await mentions.forItems(orgId, itemType, [...new Set(itemIds)]);
22
+ const people = [...new Set(Object.values(byItem).flat())];
23
+ const records = people.length > 0 ? await profiles.authorsOf(orgId, people) : {};
24
+ return Object.fromEntries(Object.entries(byItem).map(([itemId, orgUserIds]) => [itemId, orgUserIds.flatMap((orgUserId) => {
25
+ const record = records[orgUserId];
26
+ return record ? [{
27
+ orgUserId,
28
+ name: authorView(orgId, record, null).displayName || UNNAMED
29
+ }] : [];
30
+ })]));
31
+ }
32
+ //#endregion
33
+ export { keepAllowed, mentionTokens, mentionViews, nameMentions };
34
+
35
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","names":[],"sources":["../../src/discussion/mentions.ts"],"sourcesContent":["import type { MentionItemType, MentionView } from '../types/index.js';\nimport { authorView } from './authors.js';\nimport type { AuthorProfileReader, MentionsRepository } from './ports.js';\n\nconst TOKEN = /<@([A-Za-z0-9_-]+)>/g;\nconst UNNAMED = 'A member';\n\nexport function mentionTokens(...texts: string[]): string[] {\n const found = new Set<string>();\n for (const text of texts) {\n for (const match of text.matchAll(TOKEN)) {\n found.add(match[1]!);\n }\n }\n return [...found];\n}\n\nexport async function nameMentions(\n text: string,\n nameOf: (orgUserId: string) => Promise<string>,\n): Promise<string> {\n const names = new Map<string, string>();\n for (const orgUserId of mentionTokens(text)) {\n names.set(orgUserId, await nameOf(orgUserId));\n }\n return text.replace(TOKEN, (_token, orgUserId: string) => names.get(orgUserId) ?? UNNAMED);\n}\n\nexport function keepAllowed(tokens: string[], allowed: string[]): string[] {\n const kept = new Set(allowed);\n return tokens.filter((token) => kept.has(token));\n}\n\nexport async function mentionViews(\n mentions: Pick<MentionsRepository, 'forItems'>,\n profiles: AuthorProfileReader,\n orgId: string,\n itemType: MentionItemType,\n itemIds: string[],\n): Promise<Record<string, MentionView[]>> {\n if (itemIds.length === 0) {\n return {};\n }\n const byItem = await mentions.forItems(orgId, itemType, [...new Set(itemIds)]);\n const people = [...new Set(Object.values(byItem).flat())];\n const records = people.length > 0 ? await profiles.authorsOf(orgId, people) : {};\n return Object.fromEntries(\n Object.entries(byItem).map(([itemId, orgUserIds]) => [\n itemId,\n orgUserIds.flatMap((orgUserId) => {\n const record = records[orgUserId];\n return record\n ? [{ orgUserId, name: authorView(orgId, record, null).displayName || UNNAMED }]\n : [];\n }),\n ]),\n );\n}\n"],"mappings":";;AAIA,MAAM,QAAQ;AACd,MAAM,UAAU;AAEhB,SAAgB,cAAc,GAAG,OAA2B;CAC1D,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,QAAQ,OACjB,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK,GACrC,MAAM,IAAI,MAAM,EAAG;CAGvB,OAAO,CAAC,GAAG,KAAK;AAClB;AAEA,eAAsB,aACpB,MACA,QACiB;CACjB,MAAM,wBAAQ,IAAI,IAAoB;CACtC,KAAK,MAAM,aAAa,cAAc,IAAI,GACxC,MAAM,IAAI,WAAW,MAAM,OAAO,SAAS,CAAC;CAE9C,OAAO,KAAK,QAAQ,QAAQ,QAAQ,cAAsB,MAAM,IAAI,SAAS,KAAK,OAAO;AAC3F;AAEA,SAAgB,YAAY,QAAkB,SAA6B;CACzE,MAAM,OAAO,IAAI,IAAI,OAAO;CAC5B,OAAO,OAAO,QAAQ,UAAU,KAAK,IAAI,KAAK,CAAC;AACjD;AAEA,eAAsB,aACpB,UACA,UACA,OACA,UACA,SACwC;CACxC,IAAI,QAAQ,WAAW,GACrB,OAAO,CAAC;CAEV,MAAM,SAAS,MAAM,SAAS,SAAS,OAAO,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC;CAC7E,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;CACxD,MAAM,UAAU,OAAO,SAAS,IAAI,MAAM,SAAS,UAAU,OAAO,MAAM,IAAI,CAAC;CAC/E,OAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,gBAAgB,CACnD,QACA,WAAW,SAAS,cAAc;EAChC,MAAM,SAAS,QAAQ;EACvB,OAAO,SACH,CAAC;GAAE;GAAW,MAAM,WAAW,OAAO,QAAQ,IAAI,CAAC,CAAC,eAAe;EAAQ,CAAC,IAC5E,CAAC;CACP,CAAC,CACH,CAAC,CACH;AACF"}