@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
@@ -6,7 +6,8 @@ declare const assetEvents: {
6
6
  orgId: string;
7
7
  id: string;
8
8
  key: string;
9
- kind: "video" | "download" | "content";
9
+ kind: "image" | "video" | "audio" | "document";
10
+ source: "library" | "member";
10
11
  filename: string;
11
12
  contentType: string;
12
13
  size: number;
@@ -18,7 +19,8 @@ declare const assetEvents: {
18
19
  orgId: string;
19
20
  id: string;
20
21
  key: string;
21
- kind: "video" | "download" | "content";
22
+ kind: "image" | "video" | "audio" | "document";
23
+ source: "library" | "member";
22
24
  filename: string;
23
25
  contentType: string;
24
26
  size: number;
@@ -27,21 +29,25 @@ declare const assetEvents: {
27
29
  createdAt: unknown;
28
30
  updatedAt: unknown;
29
31
  }, import("zod").ZodObject<{
30
- orgId: import("zod").ZodString;
31
32
  id: import("zod").ZodString;
33
+ orgId: import("zod").ZodString;
34
+ createdAt: import("zod").ZodCoercedDate<unknown>;
35
+ updatedAt: import("zod").ZodCoercedDate<unknown>;
32
36
  kind: import("zod").ZodEnum<{
37
+ image: "image";
33
38
  video: "video";
34
- download: "download";
35
- content: "content";
39
+ audio: "audio";
40
+ document: "document";
41
+ }>;
42
+ source: import("zod").ZodEnum<{
43
+ library: "library";
44
+ member: "member";
36
45
  }>;
37
- createdAt: import("zod").ZodCoercedDate<unknown>;
38
- updatedAt: import("zod").ZodCoercedDate<unknown>;
39
46
  status: import("zod").ZodEnum<{
40
47
  pending: "pending";
41
48
  ready: "ready";
42
49
  }>;
43
50
  uploadedBy: import("zod").ZodString;
44
- key: import("zod").ZodString;
45
51
  filename: import("zod").ZodString;
46
52
  contentType: import("zod").ZodString;
47
53
  size: import("zod").ZodNumber;
@@ -50,7 +56,8 @@ declare const assetEvents: {
50
56
  orgId: string;
51
57
  id: string;
52
58
  key: string;
53
- kind: "video" | "download" | "content";
59
+ kind: "image" | "video" | "audio" | "document";
60
+ source: "library" | "member";
54
61
  filename: string;
55
62
  contentType: string;
56
63
  size: number;
@@ -62,7 +69,8 @@ declare const assetEvents: {
62
69
  orgId: string;
63
70
  id: string;
64
71
  key: string;
65
- kind: "video" | "download" | "content";
72
+ kind: "image" | "video" | "audio" | "document";
73
+ source: "library" | "member";
66
74
  filename: string;
67
75
  contentType: string;
68
76
  size: number;
@@ -71,21 +79,25 @@ declare const assetEvents: {
71
79
  createdAt: unknown;
72
80
  updatedAt: unknown;
73
81
  }, import("zod").ZodObject<{
74
- orgId: import("zod").ZodString;
75
82
  id: import("zod").ZodString;
83
+ orgId: import("zod").ZodString;
84
+ createdAt: import("zod").ZodCoercedDate<unknown>;
85
+ updatedAt: import("zod").ZodCoercedDate<unknown>;
76
86
  kind: import("zod").ZodEnum<{
87
+ image: "image";
77
88
  video: "video";
78
- download: "download";
79
- content: "content";
89
+ audio: "audio";
90
+ document: "document";
91
+ }>;
92
+ source: import("zod").ZodEnum<{
93
+ library: "library";
94
+ member: "member";
80
95
  }>;
81
- createdAt: import("zod").ZodCoercedDate<unknown>;
82
- updatedAt: import("zod").ZodCoercedDate<unknown>;
83
96
  status: import("zod").ZodEnum<{
84
97
  pending: "pending";
85
98
  ready: "ready";
86
99
  }>;
87
100
  uploadedBy: import("zod").ZodString;
88
- key: import("zod").ZodString;
89
101
  filename: import("zod").ZodString;
90
102
  contentType: import("zod").ZodString;
91
103
  size: import("zod").ZodNumber;
@@ -94,7 +106,8 @@ declare const assetEvents: {
94
106
  orgId: string;
95
107
  id: string;
96
108
  key: string;
97
- kind: "video" | "download" | "content";
109
+ kind: "image" | "video" | "audio" | "document";
110
+ source: "library" | "member";
98
111
  filename: string;
99
112
  contentType: string;
100
113
  size: number;
@@ -106,7 +119,8 @@ declare const assetEvents: {
106
119
  orgId: string;
107
120
  id: string;
108
121
  key: string;
109
- kind: "video" | "download" | "content";
122
+ kind: "image" | "video" | "audio" | "document";
123
+ source: "library" | "member";
110
124
  filename: string;
111
125
  contentType: string;
112
126
  size: number;
@@ -115,21 +129,25 @@ declare const assetEvents: {
115
129
  createdAt: unknown;
116
130
  updatedAt: unknown;
117
131
  }, import("zod").ZodObject<{
118
- orgId: import("zod").ZodString;
119
132
  id: import("zod").ZodString;
133
+ orgId: import("zod").ZodString;
134
+ createdAt: import("zod").ZodCoercedDate<unknown>;
135
+ updatedAt: import("zod").ZodCoercedDate<unknown>;
120
136
  kind: import("zod").ZodEnum<{
137
+ image: "image";
121
138
  video: "video";
122
- download: "download";
123
- content: "content";
139
+ audio: "audio";
140
+ document: "document";
141
+ }>;
142
+ source: import("zod").ZodEnum<{
143
+ library: "library";
144
+ member: "member";
124
145
  }>;
125
- createdAt: import("zod").ZodCoercedDate<unknown>;
126
- updatedAt: import("zod").ZodCoercedDate<unknown>;
127
146
  status: import("zod").ZodEnum<{
128
147
  pending: "pending";
129
148
  ready: "ready";
130
149
  }>;
131
150
  uploadedBy: import("zod").ZodString;
132
- key: import("zod").ZodString;
133
151
  filename: import("zod").ZodString;
134
152
  contentType: import("zod").ZodString;
135
153
  size: import("zod").ZodNumber;
@@ -4,8 +4,8 @@ import { defineEvent } from "../shared/events.js";
4
4
  const publicAsset = assetSchema.pick({
5
5
  orgId: true,
6
6
  id: true,
7
- key: true,
8
7
  kind: true,
8
+ source: true,
9
9
  filename: true,
10
10
  contentType: true,
11
11
  size: true,
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../src/assets/events.ts"],"sourcesContent":["import { assetSchema } from '../types/schemas/index.js';\nimport { defineEvent, type EventOf, type EventOfValues } from '../shared/ports.js';\n\nconst publicAsset = assetSchema\n .pick({\n orgId: true,\n id: true,\n key: true,\n kind: true,\n filename: true,\n contentType: true,\n size: true,\n status: true,\n uploadedBy: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\n\nexport const assetEvents = {\n assetCreated: defineEvent({\n type: 'asset.created',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n assetReady: defineEvent({\n type: 'asset.ready',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n assetDeleted: defineEvent({\n type: 'asset.deleted',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n};\n\nexport type AssetCreated = EventOf<typeof assetEvents.assetCreated>;\nexport type AssetReady = EventOf<typeof assetEvents.assetReady>;\nexport type AssetDeleted = EventOf<typeof assetEvents.assetDeleted>;\nexport type AssetEvent = EventOfValues<typeof assetEvents>;\n"],"mappings":";;;AAGA,MAAM,cAAc,YACjB,KAAK;CACJ,OAAO;CACP,IAAI;CACJ,KAAK;CACL,MAAM;CACN,UAAU;CACV,aAAa;CACb,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC,CAAC,CACD,MAAM;AAET,MAAa,cAAc;CACzB,cAAc,YAAY;EACxB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,YAAY,YAAY;EACtB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,cAAc,YAAY;EACxB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;AACH"}
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../src/assets/events.ts"],"sourcesContent":["import { assetSchema } from '../types/schemas/index.js';\nimport { defineEvent, type EventOf, type EventOfValues } from '../shared/ports.js';\n\nconst publicAsset = assetSchema\n .pick({\n orgId: true,\n id: true,\n kind: true,\n source: true,\n filename: true,\n contentType: true,\n size: true,\n status: true,\n uploadedBy: true,\n createdAt: true,\n updatedAt: true,\n })\n .strip();\n\nexport const assetEvents = {\n assetCreated: defineEvent({\n type: 'asset.created',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n assetReady: defineEvent({\n type: 'asset.ready',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n assetDeleted: defineEvent({\n type: 'asset.deleted',\n version: 1,\n data: assetSchema,\n publicData: publicAsset,\n }),\n};\n\nexport type AssetCreated = EventOf<typeof assetEvents.assetCreated>;\nexport type AssetReady = EventOf<typeof assetEvents.assetReady>;\nexport type AssetDeleted = EventOf<typeof assetEvents.assetDeleted>;\nexport type AssetEvent = EventOfValues<typeof assetEvents>;\n"],"mappings":";;;AAGA,MAAM,cAAc,YACjB,KAAK;CACJ,OAAO;CACP,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,UAAU;CACV,aAAa;CACb,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;AACb,CAAC,CAAC,CACD,MAAM;AAET,MAAa,cAAc;CACzB,cAAc,YAAY;EACxB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,YAAY,YAAY;EACtB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;CACD,cAAc,YAAY;EACxB,MAAM;EACN,SAAS;EACT,MAAM;EACN,YAAY;CACd,CAAC;AACH"}
@@ -0,0 +1,20 @@
1
+ //#region src/assets/file-urls.d.ts
2
+ type ThumbnailOwner = 'course' | 'download' | 'community';
3
+ /** Stable, access-checked URLs on the API for every file a response refers to.
4
+ * Each one is answered by a route that checks access, then redirects to a
5
+ * signed storage URL; none of them expires. */
6
+ interface FileUrls {
7
+ thumbnail(owner: ThumbnailOwner, ownerId: string): string;
8
+ activityAsset(activityId: string, assetId: string): string;
9
+ downloadFile(downloadId: string, assetId: string): string;
10
+ postCover(postId: string): string;
11
+ messageAttachment(chatId: string, messageId: string, assetId: string): string;
12
+ personImage(orgUserId: string): string;
13
+ memberUpload(assetId: string): string;
14
+ libraryFile(assetId: string): string;
15
+ libraryDownload(assetId: string): string;
16
+ }
17
+ declare function createFileUrls(apiUrl: string): FileUrls;
18
+ //#endregion
19
+ export { FileUrls, ThumbnailOwner, createFileUrls };
20
+ //# sourceMappingURL=file-urls.d.ts.map
@@ -0,0 +1,25 @@
1
+ //#region src/assets/file-urls.ts
2
+ const THUMBNAIL_PATHS = {
3
+ course: "courses",
4
+ download: "downloads",
5
+ community: "communities"
6
+ };
7
+ function createFileUrls(apiUrl) {
8
+ const base = apiUrl.replace(/\/+$/, "");
9
+ const at = (...segments) => `${base}/api/${segments.map((s) => encodeURIComponent(s)).join("/")}`;
10
+ return {
11
+ thumbnail: (owner, ownerId) => at("member", THUMBNAIL_PATHS[owner], ownerId, "thumbnail"),
12
+ activityAsset: (activityId, assetId) => at("member", "activities", activityId, "assets", assetId),
13
+ downloadFile: (downloadId, assetId) => at("member", "downloads", downloadId, "assets", assetId),
14
+ postCover: (postId) => at("member", "posts", postId, "cover"),
15
+ messageAttachment: (chatId, messageId, assetId) => at("member", "chats", chatId, "messages", messageId, "attachments", assetId),
16
+ personImage: (orgUserId) => at("member", "people", orgUserId, "image"),
17
+ memberUpload: (assetId) => at("member", "uploads", assetId, "file"),
18
+ libraryFile: (assetId) => at("assets", assetId, "file"),
19
+ libraryDownload: (assetId) => at("assets", assetId, "download")
20
+ };
21
+ }
22
+ //#endregion
23
+ export { createFileUrls };
24
+
25
+ //# sourceMappingURL=file-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-urls.js","names":[],"sources":["../../src/assets/file-urls.ts"],"sourcesContent":["export type ThumbnailOwner = 'course' | 'download' | 'community';\n\n/** Stable, access-checked URLs on the API for every file a response refers to.\n * Each one is answered by a route that checks access, then redirects to a\n * signed storage URL; none of them expires. */\nexport interface FileUrls {\n thumbnail(owner: ThumbnailOwner, ownerId: string): string;\n activityAsset(activityId: string, assetId: string): string;\n downloadFile(downloadId: string, assetId: string): string;\n postCover(postId: string): string;\n messageAttachment(chatId: string, messageId: string, assetId: string): string;\n personImage(orgUserId: string): string;\n memberUpload(assetId: string): string;\n libraryFile(assetId: string): string;\n libraryDownload(assetId: string): string;\n}\n\nconst THUMBNAIL_PATHS: Record<ThumbnailOwner, string> = {\n course: 'courses',\n download: 'downloads',\n community: 'communities',\n};\n\nexport function createFileUrls(apiUrl: string): FileUrls {\n const base = apiUrl.replace(/\\/+$/, '');\n const at = (...segments: string[]) =>\n `${base}/api/${segments.map((s) => encodeURIComponent(s)).join('/')}`;\n return {\n thumbnail: (owner, ownerId) => at('member', THUMBNAIL_PATHS[owner], ownerId, 'thumbnail'),\n activityAsset: (activityId, assetId) =>\n at('member', 'activities', activityId, 'assets', assetId),\n downloadFile: (downloadId, assetId) => at('member', 'downloads', downloadId, 'assets', assetId),\n postCover: (postId) => at('member', 'posts', postId, 'cover'),\n messageAttachment: (chatId, messageId, assetId) =>\n at('member', 'chats', chatId, 'messages', messageId, 'attachments', assetId),\n personImage: (orgUserId) => at('member', 'people', orgUserId, 'image'),\n memberUpload: (assetId) => at('member', 'uploads', assetId, 'file'),\n libraryFile: (assetId) => at('assets', assetId, 'file'),\n libraryDownload: (assetId) => at('assets', assetId, 'download'),\n };\n}\n"],"mappings":";AAiBA,MAAM,kBAAkD;CACtD,QAAQ;CACR,UAAU;CACV,WAAW;AACb;AAEA,SAAgB,eAAe,QAA0B;CACvD,MAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE;CACtC,MAAM,MAAM,GAAG,aACb,GAAG,KAAK,OAAO,SAAS,KAAK,MAAM,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;CACpE,OAAO;EACL,YAAY,OAAO,YAAY,GAAG,UAAU,gBAAgB,QAAQ,SAAS,WAAW;EACxF,gBAAgB,YAAY,YAC1B,GAAG,UAAU,cAAc,YAAY,UAAU,OAAO;EAC1D,eAAe,YAAY,YAAY,GAAG,UAAU,aAAa,YAAY,UAAU,OAAO;EAC9F,YAAY,WAAW,GAAG,UAAU,SAAS,QAAQ,OAAO;EAC5D,oBAAoB,QAAQ,WAAW,YACrC,GAAG,UAAU,SAAS,QAAQ,YAAY,WAAW,eAAe,OAAO;EAC7E,cAAc,cAAc,GAAG,UAAU,UAAU,WAAW,OAAO;EACrE,eAAe,YAAY,GAAG,UAAU,WAAW,SAAS,MAAM;EAClE,cAAc,YAAY,GAAG,UAAU,SAAS,MAAM;EACtD,kBAAkB,YAAY,GAAG,UAAU,SAAS,UAAU;CAChE;AACF"}
@@ -1,7 +1,9 @@
1
1
  import { Page } from "../types/shared.js";
2
- import { Asset, AssetKind, AssetStatus, AssetsQuery, DownloadTicket, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
2
+ import { Asset, AssetKind, AssetSource, AssetStatus, AssetUrls, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
3
3
  import { AssetCreated, AssetDeleted, AssetEvent, AssetReady, assetEvents } from "./events.js";
4
+ import { FileUrls, ThumbnailOwner, createFileUrls } from "./file-urls.js";
4
5
  import "./model.js";
5
- import { AssetsRepository, AssetsService } from "./ports.js";
6
- import { AssetsServiceImpl } from "./service.js";
7
- export { type Asset, type AssetCreated, type AssetDeleted, type AssetEvent, type AssetKind, type AssetReady, type AssetStatus, type AssetsQuery, type AssetsRepository, type AssetsService, AssetsServiceImpl, type DownloadTicket, type Page, type RequestUploadInput, type UploadTicket, assetEvents };
6
+ import { AssetFiles, AssetsRepository, AssetsService, LibraryAssetReader, MemberImageReader, MemberUploadInput, OrgDirectory, ReadyFile } from "./ports.js";
7
+ import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf } from "./service.js";
8
+ import { UPLOADS_REMOVE_UNATTACHED_JOB, assetsJobs, assetsRecurringJobs } from "./jobs.js";
9
+ export { type Asset, type AssetCreated, type AssetDeleted, type AssetEvent, type AssetFiles, type AssetKind, type AssetReady, type AssetSource, type AssetStatus, type AssetUrls, type AssetView, type AssetsQuery, type AssetsRepository, type AssetsService, AssetsServiceImpl, type FileUrls, type LibraryAssetReader, MEMBER_IMAGE_TYPE, type MemberImageReader, type MemberUploadInput, type OrgDirectory, type Page, type ReadyFile, type RequestUploadInput, type ThumbnailOwner, UPLOADS_REMOVE_UNATTACHED_JOB, type UploadTicket, assetEvents, assetsJobs, assetsRecurringJobs, createFileUrls, isMemberImageType, kindOf };
@@ -1,3 +1,5 @@
1
1
  import { assetEvents } from "./events.js";
2
- import { AssetsServiceImpl } from "./service.js";
3
- export { AssetsServiceImpl, assetEvents };
2
+ import { createFileUrls } from "./file-urls.js";
3
+ import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf } from "./service.js";
4
+ import { UPLOADS_REMOVE_UNATTACHED_JOB, assetsJobs, assetsRecurringJobs } from "./jobs.js";
5
+ export { AssetsServiceImpl, MEMBER_IMAGE_TYPE, UPLOADS_REMOVE_UNATTACHED_JOB, assetEvents, assetsJobs, assetsRecurringJobs, createFileUrls, isMemberImageType, kindOf };
@@ -0,0 +1,15 @@
1
+ import { Logger } from "../types/ports.js";
2
+ import { RecurringJob, ScheduledJob } from "../shared/ports.js";
3
+ import { AssetsService, OrgDirectory } from "./ports.js";
4
+ //#region src/assets/jobs.d.ts
5
+ declare const UPLOADS_REMOVE_UNATTACHED_JOB = "assets.uploads.removeUnattached";
6
+ interface AssetsJobDeps {
7
+ assets: Pick<AssetsService, 'removeUnattached'>;
8
+ orgs: OrgDirectory;
9
+ logger?: Logger;
10
+ }
11
+ declare function assetsJobs(deps: AssetsJobDeps): ScheduledJob[];
12
+ declare const assetsRecurringJobs: RecurringJob[];
13
+ //#endregion
14
+ export { AssetsJobDeps, UPLOADS_REMOVE_UNATTACHED_JOB, assetsJobs, assetsRecurringJobs };
15
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { noopLogger } from "../shared/logger.js";
2
+ //#region src/assets/jobs.ts
3
+ const UPLOADS_REMOVE_UNATTACHED_JOB = "assets.uploads.removeUnattached";
4
+ function assetsJobs(deps) {
5
+ const logger = deps.logger ?? noopLogger;
6
+ return [{
7
+ job: UPLOADS_REMOVE_UNATTACHED_JOB,
8
+ async run(_payload, fire) {
9
+ let failed = 0;
10
+ for (const orgId of await deps.orgs.orgIds()) try {
11
+ await deps.assets.removeUnattached(orgId, fire.startedAt);
12
+ } catch (err) {
13
+ failed += 1;
14
+ logger.error("unattached uploads not swept", {
15
+ orgId,
16
+ err
17
+ });
18
+ }
19
+ if (failed > 0) throw new Error(`unattached uploads of ${failed} orgs could not be swept`);
20
+ }
21
+ }];
22
+ }
23
+ const assetsRecurringJobs = [{
24
+ job: UPLOADS_REMOVE_UNATTACHED_JOB,
25
+ cron: "0 * * * *"
26
+ }];
27
+ //#endregion
28
+ export { UPLOADS_REMOVE_UNATTACHED_JOB, assetsJobs, assetsRecurringJobs };
29
+
30
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","names":[],"sources":["../../src/assets/jobs.ts"],"sourcesContent":["import type { Logger, RecurringJob, ScheduledJob } from '../shared/ports.js';\nimport { noopLogger } from '../shared/logger.js';\nimport type { AssetsService, OrgDirectory } from './ports.js';\n\nexport const UPLOADS_REMOVE_UNATTACHED_JOB = 'assets.uploads.removeUnattached';\n\nexport interface AssetsJobDeps {\n assets: Pick<AssetsService, 'removeUnattached'>;\n orgs: OrgDirectory;\n logger?: Logger;\n}\n\nexport function assetsJobs(deps: AssetsJobDeps): ScheduledJob[] {\n const logger = deps.logger ?? noopLogger;\n return [\n {\n job: UPLOADS_REMOVE_UNATTACHED_JOB,\n async run(_payload, fire) {\n let failed = 0;\n for (const orgId of await deps.orgs.orgIds()) {\n try {\n await deps.assets.removeUnattached(orgId, fire.startedAt);\n } catch (err) {\n failed += 1;\n logger.error('unattached uploads not swept', { orgId, err });\n }\n }\n if (failed > 0) {\n throw new Error(`unattached uploads of ${failed} orgs could not be swept`);\n }\n },\n },\n ];\n}\n\nexport const assetsRecurringJobs: RecurringJob[] = [\n { job: UPLOADS_REMOVE_UNATTACHED_JOB, cron: '0 * * * *' },\n];\n"],"mappings":";;AAIA,MAAa,gCAAgC;AAQ7C,SAAgB,WAAW,MAAqC;CAC9D,MAAM,SAAS,KAAK,UAAU;CAC9B,OAAO,CACL;EACE,KAAK;EACL,MAAM,IAAI,UAAU,MAAM;GACxB,IAAI,SAAS;GACb,KAAK,MAAM,SAAS,MAAM,KAAK,KAAK,OAAO,GACzC,IAAI;IACF,MAAM,KAAK,OAAO,iBAAiB,OAAO,KAAK,SAAS;GAC1D,SAAS,KAAK;IACZ,UAAU;IACV,OAAO,MAAM,gCAAgC;KAAE;KAAO;IAAI,CAAC;GAC7D;GAEF,IAAI,SAAS,GACX,MAAM,IAAI,MAAM,yBAAyB,OAAO,yBAAyB;EAE7E;CACF,CACF;AACF;AAEA,MAAa,sBAAsC,CACjD;CAAE,KAAK;CAA+B,MAAM;AAAY,CAC1D"}
@@ -1,4 +1,4 @@
1
1
  import { Page } from "../types/shared.js";
2
- import { Asset, AssetKind, AssetStatus, AssetsQuery, DownloadTicket, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
2
+ import { Asset, AssetKind, AssetSource, AssetStatus, AssetUrls, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
3
3
  import "../types/index.js";
4
- export type { Asset, AssetKind, AssetStatus, AssetsQuery, DownloadTicket, Page, RequestUploadInput, UploadTicket };
4
+ export type { Asset, AssetKind, AssetSource, AssetStatus, AssetUrls, AssetView, AssetsQuery, Page, RequestUploadInput, UploadTicket };
@@ -1,28 +1,59 @@
1
1
  import { Page } from "../types/shared.js";
2
- import { Asset, AssetsQuery, DownloadTicket, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
2
+ import { Asset, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
3
3
  import { OutboxAppender, UnitOfWork } from "../shared/ports.js";
4
4
  import "./model.js";
5
5
  //#region src/assets/ports.d.ts
6
- interface AssetsService {
7
- /** Register an asset and return a presigned URL to upload its bytes. */
6
+ interface MemberImageReader {
7
+ ownsImage(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
8
+ }
9
+ interface LibraryAssetReader {
10
+ libraryAssetsAmong(orgId: string, assetIds: string[]): Promise<string[]>;
11
+ }
12
+ interface ReadyFile {
13
+ filename: string;
14
+ contentType: string;
15
+ size: number;
16
+ }
17
+ interface AssetFiles {
18
+ /** Ready files of the org among these ids, with what a download shows of them. */
19
+ readyFiles(orgId: string, assetIds: readonly string[]): Promise<Record<string, ReadyFile>>;
20
+ /** A signed storage URL for a ready file of the org, after the caller has checked
21
+ * access. `saveAs` makes it a short-lived download under that name. */
22
+ signFile(orgId: string, assetId: string, opts?: {
23
+ saveAs?: string;
24
+ }): Promise<string | null>;
25
+ }
26
+ interface MemberUploadInput {
27
+ filename: string;
28
+ contentType: string;
29
+ }
30
+ interface AssetsService extends MemberImageReader, LibraryAssetReader, AssetFiles {
8
31
  requestUpload(orgId: string, input: RequestUploadInput): Promise<UploadTicket>;
9
- /** After upload, capture size/content-type from storage and mark ready. */
10
- confirm(orgId: string, id: string): Promise<Asset | null>;
11
- list(orgId: string, query: AssetsQuery): Promise<Page<Asset>>;
12
- get(orgId: string, id: string): Promise<Asset | null>;
13
- /** Short-lived presigned URL to download/serve the asset. `expiresInSeconds`
14
- * overrides the adapter default — entitled delivery passes its own. */
15
- requestDownload(orgId: string, id: string, filename?: string, expiresInSeconds?: number): Promise<DownloadTicket | null>;
16
- /** Remove the object from storage and the registry. */
32
+ requestMemberUpload(orgId: string, orgUserId: string, input: MemberUploadInput): Promise<UploadTicket>;
33
+ confirm(orgId: string, id: string): Promise<AssetView | null>;
34
+ confirmOwn(orgId: string, id: string, orgUserId: string): Promise<AssetView | null>;
35
+ list(orgId: string, query: AssetsQuery): Promise<Page<AssetView>>;
36
+ get(orgId: string, id: string): Promise<AssetView | null>;
37
+ libraryFile(orgId: string, assetId: string, opts: {
38
+ download: boolean;
39
+ }): Promise<string | null>;
40
+ ownUploadFile(orgId: string, assetId: string, orgUserId: string): Promise<string | null>;
17
41
  remove(orgId: string, id: string): Promise<boolean>;
42
+ removeOwn(orgId: string, id: string, orgUserId: string): Promise<boolean>;
43
+ removeUnattached(orgId: string, now: Date): Promise<number>;
44
+ }
45
+ interface OrgDirectory {
46
+ orgIds(): Promise<string[]>;
18
47
  }
19
48
  interface AssetsRepository {
20
49
  insert(orgId: string, asset: Asset): Promise<Asset>;
21
50
  list(orgId: string, query: AssetsQuery): Promise<Page<Asset>>;
22
- /** Scoped to the org — returns null if the asset belongs to another org. */
23
51
  findById(orgId: string, id: string): Promise<Asset | null>;
24
- update(id: string, patch: Partial<Pick<Asset, 'size' | 'contentType' | 'status'>>): Promise<Asset | null>;
25
- delete(id: string): Promise<boolean>;
52
+ findByIds(orgId: string, ids: string[]): Promise<Asset[]>;
53
+ markReady(orgId: string, id: string, patch: Pick<Asset, 'key' | 'kind' | 'size' | 'contentType'>): Promise<Asset | null>;
54
+ delete(orgId: string, id: string): Promise<boolean>;
55
+ listUnreferencedMemberUploads(orgId: string, before: Date): Promise<Asset[]>;
56
+ heldKeys(orgId: string, keys: string[]): Promise<string[]>;
26
57
  }
27
58
  interface AssetsWriteScope {
28
59
  assets: AssetsRepository;
@@ -30,5 +61,5 @@ interface AssetsWriteScope {
30
61
  }
31
62
  type AssetsUnitOfWork = UnitOfWork<AssetsWriteScope>;
32
63
  //#endregion
33
- export { AssetsRepository, AssetsService, AssetsUnitOfWork, AssetsWriteScope };
64
+ export { AssetFiles, AssetsRepository, AssetsService, AssetsUnitOfWork, AssetsWriteScope, LibraryAssetReader, MemberImageReader, MemberUploadInput, OrgDirectory, ReadyFile };
34
65
  //# sourceMappingURL=ports.d.ts.map
@@ -1,29 +1,60 @@
1
1
  import { Page } from "../types/shared.js";
2
2
  import { Logger, ObjectStorage } from "../types/ports.js";
3
- import { Asset, AssetsQuery, DownloadTicket, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
3
+ import { AssetKind, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
4
4
  import "../shared/ports.js";
5
+ import { FileUrls } from "./file-urls.js";
5
6
  import "./model.js";
6
- import { AssetsRepository, AssetsService, AssetsUnitOfWork } from "./ports.js";
7
+ import { AssetsRepository, AssetsService, AssetsUnitOfWork, MemberUploadInput, ReadyFile } from "./ports.js";
7
8
  //#region src/assets/service.d.ts
9
+ declare const MEMBER_IMAGE_TYPE: RegExp;
10
+ declare function isMemberImageType(contentType: string): boolean;
11
+ declare function kindOf(contentType: string): AssetKind;
8
12
  type AssetsServiceParams = {
9
13
  storage: ObjectStorage;
10
14
  repo: AssetsRepository;
11
15
  uow: AssetsUnitOfWork;
16
+ memberImageMaxBytes: number;
17
+ downloadLinkExpirySeconds: number;
18
+ fileUrls: FileUrls;
12
19
  logger?: Logger;
13
20
  };
14
21
  declare class AssetsServiceImpl implements AssetsService {
15
22
  private readonly storage;
16
23
  private readonly repo;
17
24
  private readonly uow;
25
+ private readonly memberImageMaxBytes;
26
+ private readonly downloadLinkExpirySeconds;
27
+ private readonly fileUrls;
18
28
  private readonly logger;
19
29
  constructor(params: AssetsServiceParams);
20
30
  requestUpload(orgId: string, input: RequestUploadInput): Promise<UploadTicket>;
21
- confirm(orgId: string, id: string): Promise<Asset | null>;
22
- list(orgId: string, query: AssetsQuery): Promise<Page<Asset>>;
23
- get(orgId: string, id: string): Promise<Asset | null>;
24
- requestDownload(orgId: string, id: string, filename?: string, expiresInSeconds?: number): Promise<DownloadTicket | null>;
31
+ requestMemberUpload(orgId: string, orgUserId: string, input: MemberUploadInput): Promise<UploadTicket>;
32
+ confirm(orgId: string, id: string): Promise<AssetView | null>;
33
+ confirmOwn(orgId: string, id: string, orgUserId: string): Promise<AssetView | null>;
34
+ ownUploadFile(orgId: string, assetId: string, orgUserId: string): Promise<string | null>;
35
+ ownsImage(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
36
+ libraryAssetsAmong(orgId: string, assetIds: string[]): Promise<string[]>;
37
+ list(orgId: string, query: AssetsQuery): Promise<Page<AssetView>>;
38
+ get(orgId: string, id: string): Promise<AssetView | null>;
39
+ readyFiles(orgId: string, assetIds: readonly string[]): Promise<Record<string, ReadyFile>>;
40
+ signFile(orgId: string, assetId: string, opts?: {
41
+ saveAs?: string;
42
+ }): Promise<string | null>;
43
+ libraryFile(orgId: string, assetId: string, opts: {
44
+ download: boolean;
45
+ }): Promise<string | null>;
25
46
  remove(orgId: string, id: string): Promise<boolean>;
47
+ removeOwn(orgId: string, id: string, orgUserId: string): Promise<boolean>;
48
+ removeUnattached(orgId: string, now: Date): Promise<number>;
49
+ private strayUploads;
50
+ private finalize;
51
+ private finalizeMember;
52
+ private markReady;
53
+ private readyAmong;
54
+ private view;
55
+ private discard;
56
+ private removeObject;
26
57
  }
27
58
  //#endregion
28
- export { AssetsServiceImpl, AssetsServiceParams };
59
+ export { AssetsServiceImpl, AssetsServiceParams, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf };
29
60
  //# sourceMappingURL=service.d.ts.map