@headless-lms/core 0.4.0 → 0.5.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.
- package/dist/assets/events.d.ts +27 -21
- package/dist/assets/file-urls.d.ts +11 -7
- package/dist/assets/file-urls.js +14 -4
- package/dist/assets/file-urls.js.map +1 -1
- package/dist/assets/index.d.ts +4 -4
- package/dist/assets/index.js +3 -3
- package/dist/assets/ports.d.ts +34 -15
- package/dist/assets/service.d.ts +30 -14
- package/dist/assets/service.js +230 -56
- package/dist/assets/service.js.map +1 -1
- package/dist/automations/actions.js.map +1 -1
- package/dist/automations/catalog.js +69 -4
- package/dist/automations/catalog.js.map +1 -1
- package/dist/automations/community-derivations.js +16 -16
- package/dist/automations/community-derivations.js.map +1 -1
- package/dist/automations/community-mail.d.ts +34 -4
- package/dist/automations/community-mail.js +32 -4
- package/dist/automations/community-mail.js.map +1 -1
- package/dist/automations/event-permissions.d.ts +12 -0
- package/dist/automations/event-permissions.js +38 -0
- package/dist/automations/event-permissions.js.map +1 -0
- package/dist/automations/index.d.ts +2 -1
- package/dist/automations/index.js +2 -1
- package/dist/automations/notifications/applicable.d.ts +8 -0
- package/dist/automations/notifications/applicable.js +12 -0
- package/dist/automations/notifications/applicable.js.map +1 -0
- package/dist/automations/notifications/debounce.js +1 -1
- package/dist/automations/notifications/debounce.js.map +1 -1
- package/dist/automations/notifications/defaults.js +33 -3
- package/dist/automations/notifications/defaults.js.map +1 -1
- package/dist/automations/notifications/processor.js +3 -3
- package/dist/automations/notifications/processor.js.map +1 -1
- package/dist/automations/notifications/rules/content.js +60 -3
- package/dist/automations/notifications/rules/content.js.map +1 -1
- package/dist/automations/notifications/rules/discussion.js +29 -29
- package/dist/automations/notifications/rules/discussion.js.map +1 -1
- package/dist/automations/notifications/rules/entitlements.js +36 -9
- package/dist/automations/notifications/rules/entitlements.js.map +1 -1
- package/dist/automations/notifications/rules/events.d.ts +9 -0
- package/dist/automations/notifications/rules/events.js +27 -0
- package/dist/automations/notifications/rules/events.js.map +1 -0
- package/dist/automations/notifications/rules/organizations.js +17 -10
- package/dist/automations/notifications/rules/organizations.js.map +1 -1
- package/dist/automations/notifications/rules/recipients.js +0 -1
- package/dist/automations/notifications/rules/recipients.js.map +1 -1
- package/dist/automations/notifications/service.d.ts +8 -6
- package/dist/automations/notifications/service.js +13 -13
- package/dist/automations/notifications/service.js.map +1 -1
- package/dist/automations/notifications/types.js +94 -7
- package/dist/automations/notifications/types.js.map +1 -1
- package/dist/automations/ports.d.ts +30 -31
- package/dist/automations/service.d.ts +20 -17
- package/dist/automations/service.js +91 -62
- package/dist/automations/service.js.map +1 -1
- package/dist/content/event-sight.d.ts +11 -0
- package/dist/content/event-sight.js +11 -0
- package/dist/content/event-sight.js.map +1 -0
- package/dist/content/events.d.ts +413 -72
- package/dist/content/events.js +34 -1
- package/dist/content/events.js.map +1 -1
- package/dist/content/index.d.ts +6 -4
- package/dist/content/index.js +3 -1
- package/dist/content/jobs.d.ts +16 -0
- package/dist/content/jobs.js +37 -0
- package/dist/content/jobs.js.map +1 -0
- package/dist/content/model.d.ts +2 -2
- package/dist/content/notification-categories.d.ts +5 -4
- package/dist/content/notification-categories.js +15 -6
- package/dist/content/notification-categories.js.map +1 -1
- package/dist/content/ports.d.ts +113 -68
- package/dist/content/service.d.ts +99 -67
- package/dist/content/service.js +680 -139
- package/dist/content/service.js.map +1 -1
- package/dist/content/titles.d.ts +6 -3
- package/dist/content/titles.js +37 -24
- package/dist/content/titles.js.map +1 -1
- package/dist/content/types.d.ts +2 -2
- package/dist/discussion/authors.d.ts +4 -2
- package/dist/discussion/authors.js +9 -5
- package/dist/discussion/authors.js.map +1 -1
- package/dist/discussion/chats.d.ts +56 -37
- package/dist/discussion/chats.js +393 -161
- package/dist/discussion/chats.js.map +1 -1
- package/dist/discussion/events.d.ts +77 -39
- package/dist/discussion/events.js +41 -3
- package/dist/discussion/events.js.map +1 -1
- package/dist/discussion/index.d.ts +8 -5
- package/dist/discussion/index.js +5 -3
- package/dist/discussion/live.d.ts +106 -0
- package/dist/discussion/live.js +642 -0
- package/dist/discussion/live.js.map +1 -0
- package/dist/discussion/mentions.js +2 -2
- package/dist/discussion/mentions.js.map +1 -1
- package/dist/discussion/ports.d.ts +182 -100
- package/dist/discussion/ports.js.map +1 -1
- package/dist/discussion/posts.d.ts +45 -39
- package/dist/discussion/posts.js +268 -154
- package/dist/discussion/posts.js.map +1 -1
- package/dist/discussion/rules.d.ts +18 -0
- package/dist/discussion/rules.js +22 -0
- package/dist/discussion/rules.js.map +1 -0
- package/dist/discussion/service.d.ts +37 -31
- package/dist/discussion/service.js +252 -188
- package/dist/discussion/service.js.map +1 -1
- package/dist/discussion/subscriptions.d.ts +8 -8
- package/dist/discussion/subscriptions.js +29 -13
- package/dist/discussion/subscriptions.js.map +1 -1
- package/dist/discussion/titles.d.ts +4 -2
- package/dist/discussion/titles.js +27 -13
- package/dist/discussion/titles.js.map +1 -1
- package/dist/entitlements/events.d.ts +20 -20
- package/dist/entitlements/index.d.ts +4 -4
- package/dist/entitlements/index.js +2 -2
- package/dist/entitlements/model.d.ts +2 -2
- package/dist/entitlements/ports.d.ts +65 -39
- package/dist/entitlements/rules.d.ts +3 -6
- package/dist/entitlements/rules.js +5 -10
- package/dist/entitlements/rules.js.map +1 -1
- package/dist/entitlements/service.d.ts +40 -28
- package/dist/entitlements/service.js +370 -163
- package/dist/entitlements/service.js.map +1 -1
- package/dist/identity/devices.d.ts +3 -3
- package/dist/identity/devices.js +7 -5
- package/dist/identity/devices.js.map +1 -1
- package/dist/identity/events.d.ts +2 -2
- package/dist/identity/index.d.ts +2 -2
- package/dist/identity/index.js +2 -2
- package/dist/identity/notification-settings.d.ts +1 -1
- package/dist/identity/notification-settings.js +3 -2
- package/dist/identity/notification-settings.js.map +1 -1
- package/dist/identity/ports.d.ts +7 -7
- package/dist/identity/service.d.ts +8 -7
- package/dist/identity/service.js +17 -13
- package/dist/identity/service.js.map +1 -1
- package/dist/integrations/events.d.ts +3 -3
- package/dist/integrations/ports.d.ts +9 -8
- package/dist/integrations/service.d.ts +9 -8
- package/dist/integrations/service.js +33 -16
- package/dist/integrations/service.js.map +1 -1
- package/dist/organizations/default-roles.d.ts +22 -0
- package/dist/organizations/default-roles.js +89 -0
- package/dist/organizations/default-roles.js.map +1 -0
- package/dist/organizations/effective-permissions.d.ts +45 -0
- package/dist/organizations/effective-permissions.js +113 -0
- package/dist/organizations/effective-permissions.js.map +1 -0
- package/dist/organizations/events.d.ts +320 -181
- package/dist/organizations/events.js +90 -18
- package/dist/organizations/events.js.map +1 -1
- package/dist/organizations/index.d.ts +14 -10
- package/dist/organizations/index.js +7 -3
- package/dist/organizations/members.d.ts +66 -8
- package/dist/organizations/members.js.map +1 -1
- package/dist/organizations/notification-catalog.d.ts +31 -0
- package/dist/organizations/notification-catalog.js +32 -0
- package/dist/organizations/notification-catalog.js.map +1 -0
- package/dist/organizations/notification-categories.d.ts +6 -4
- package/dist/organizations/notification-categories.js +25 -10
- package/dist/organizations/notification-categories.js.map +1 -1
- package/dist/organizations/org-roles.d.ts +33 -0
- package/dist/organizations/org-roles.js +49 -0
- package/dist/organizations/org-roles.js.map +1 -0
- package/dist/organizations/permissions.d.ts +311 -0
- package/dist/organizations/permissions.js +327 -0
- package/dist/organizations/permissions.js.map +1 -0
- package/dist/organizations/ports.d.ts +184 -65
- package/dist/organizations/service.d.ts +102 -35
- package/dist/organizations/service.js +1245 -328
- package/dist/organizations/service.js.map +1 -1
- package/dist/organizations/testing.d.ts +18 -0
- package/dist/organizations/testing.js +37 -0
- package/dist/organizations/testing.js.map +1 -0
- package/dist/organizations/types.d.ts +5 -16
- package/dist/progress/events.d.ts +14 -14
- package/dist/progress/index.d.ts +2 -2
- package/dist/progress/ports.d.ts +11 -3
- package/dist/progress/service.d.ts +6 -5
- package/dist/progress/service.js +23 -8
- package/dist/progress/service.js.map +1 -1
- package/dist/reporting/admin/index.d.ts +6 -4
- package/dist/reporting/admin/model.d.ts +36 -3
- package/dist/reporting/admin/ports.d.ts +39 -14
- package/dist/reporting/admin/service.d.ts +32 -11
- package/dist/reporting/admin/service.js +102 -18
- package/dist/reporting/admin/service.js.map +1 -1
- package/dist/reporting/events/index.d.ts +27 -0
- package/dist/reporting/events/index.js +20 -0
- package/dist/reporting/events/index.js.map +1 -0
- package/dist/reporting/member/calendar.d.ts +11 -0
- package/dist/reporting/member/calendar.js +75 -0
- package/dist/reporting/member/calendar.js.map +1 -0
- package/dist/reporting/member/index.d.ts +3 -2
- package/dist/reporting/member/model.d.ts +26 -5
- package/dist/reporting/member/ports.d.ts +48 -29
- package/dist/reporting/member/service.d.ts +56 -29
- package/dist/reporting/member/service.js +328 -113
- package/dist/reporting/member/service.js.map +1 -1
- package/dist/shared/actor.d.ts +22 -3
- package/dist/shared/errors.d.ts +2 -1
- package/dist/shared/errors.js +3 -1
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/id.d.ts +4 -0
- package/dist/shared/id.js +4 -0
- package/dist/shared/id.js.map +1 -1
- package/dist/shared/logger.d.ts +2 -1
- package/dist/shared/logger.js +10 -1
- package/dist/shared/logger.js.map +1 -1
- package/dist/shared/ports.d.ts +25 -5
- package/dist/types/content.d.ts +2 -2
- package/dist/types/discussion.d.ts +4 -5
- package/dist/types/email-templates.d.ts +22 -3
- package/dist/types/entitlements.d.ts +2 -2
- package/dist/types/identity.d.ts +13 -16
- package/dist/types/index.d.ts +9 -9
- package/dist/types/index.js +2 -1
- package/dist/types/notifications.d.ts +4 -4
- package/dist/types/organizations.d.ts +3 -2
- package/dist/types/ports.d.ts +8 -1
- package/dist/types/ports.js +7 -1
- package/dist/types/ports.js.map +1 -0
- package/dist/types/schemas/assets.d.ts +5 -5
- package/dist/types/schemas/assets.js +4 -3
- package/dist/types/schemas/assets.js.map +1 -1
- package/dist/types/schemas/content.d.ts +537 -13
- package/dist/types/schemas/content.js +201 -7
- package/dist/types/schemas/content.js.map +1 -1
- package/dist/types/schemas/discussion.d.ts +282 -59
- package/dist/types/schemas/discussion.js +77 -3
- package/dist/types/schemas/discussion.js.map +1 -1
- package/dist/types/schemas/entitlements.d.ts +14 -1
- package/dist/types/schemas/entitlements.js +11 -4
- package/dist/types/schemas/entitlements.js.map +1 -1
- package/dist/types/schemas/index.d.ts +5 -5
- package/dist/types/schemas/index.js +5 -5
- package/dist/types/schemas/notifications.d.ts +13 -12
- package/dist/types/schemas/notifications.js +3 -2
- package/dist/types/schemas/notifications.js.map +1 -1
- package/dist/types/schemas/organizations.d.ts +96 -60
- package/dist/types/schemas/organizations.js +78 -27
- package/dist/types/schemas/organizations.js.map +1 -1
- package/dist/types/schemas/progress.d.ts +3 -4
- package/dist/types/schemas/progress.js +0 -1
- package/dist/types/schemas/progress.js.map +1 -1
- package/package.json +1 -1
- package/dist/organizations/access-scopes.d.ts +0 -19
- package/dist/organizations/access-scopes.js +0 -89
- package/dist/organizations/access-scopes.js.map +0 -1
- package/dist/organizations/roles.d.ts +0 -19
- package/dist/organizations/roles.js +0 -82
- package/dist/organizations/roles.js.map +0 -1
package/dist/assets/events.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ declare const assetEvents: {
|
|
|
13
13
|
size: number;
|
|
14
14
|
status: "pending" | "ready";
|
|
15
15
|
uploadedBy: string;
|
|
16
|
+
contentId: string | null;
|
|
16
17
|
createdAt: Date;
|
|
17
18
|
updatedAt: Date;
|
|
18
19
|
}, "asset.created", 1>, {
|
|
@@ -26,27 +27,28 @@ declare const assetEvents: {
|
|
|
26
27
|
size: number;
|
|
27
28
|
status: "pending" | "ready";
|
|
28
29
|
uploadedBy: string;
|
|
30
|
+
contentId: string | null;
|
|
29
31
|
createdAt: unknown;
|
|
30
32
|
updatedAt: unknown;
|
|
31
33
|
}, import("zod").ZodObject<{
|
|
32
|
-
id: import("zod").ZodString;
|
|
33
34
|
orgId: import("zod").ZodString;
|
|
34
|
-
|
|
35
|
-
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
35
|
+
id: import("zod").ZodString;
|
|
36
36
|
kind: import("zod").ZodEnum<{
|
|
37
37
|
image: "image";
|
|
38
38
|
video: "video";
|
|
39
39
|
audio: "audio";
|
|
40
40
|
document: "document";
|
|
41
41
|
}>;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
member: "member";
|
|
45
|
-
}>;
|
|
42
|
+
createdAt: import("zod").ZodCoercedDate<unknown>;
|
|
43
|
+
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
46
44
|
status: import("zod").ZodEnum<{
|
|
47
45
|
pending: "pending";
|
|
48
46
|
ready: "ready";
|
|
49
47
|
}>;
|
|
48
|
+
source: import("zod").ZodEnum<{
|
|
49
|
+
library: "library";
|
|
50
|
+
member: "member";
|
|
51
|
+
}>;
|
|
50
52
|
uploadedBy: import("zod").ZodString;
|
|
51
53
|
filename: import("zod").ZodString;
|
|
52
54
|
contentType: import("zod").ZodString;
|
|
@@ -63,6 +65,7 @@ declare const assetEvents: {
|
|
|
63
65
|
size: number;
|
|
64
66
|
status: "pending" | "ready";
|
|
65
67
|
uploadedBy: string;
|
|
68
|
+
contentId: string | null;
|
|
66
69
|
createdAt: Date;
|
|
67
70
|
updatedAt: Date;
|
|
68
71
|
}, "asset.ready", 1>, {
|
|
@@ -76,27 +79,28 @@ declare const assetEvents: {
|
|
|
76
79
|
size: number;
|
|
77
80
|
status: "pending" | "ready";
|
|
78
81
|
uploadedBy: string;
|
|
82
|
+
contentId: string | null;
|
|
79
83
|
createdAt: unknown;
|
|
80
84
|
updatedAt: unknown;
|
|
81
85
|
}, import("zod").ZodObject<{
|
|
82
|
-
id: import("zod").ZodString;
|
|
83
86
|
orgId: import("zod").ZodString;
|
|
84
|
-
|
|
85
|
-
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
87
|
+
id: import("zod").ZodString;
|
|
86
88
|
kind: import("zod").ZodEnum<{
|
|
87
89
|
image: "image";
|
|
88
90
|
video: "video";
|
|
89
91
|
audio: "audio";
|
|
90
92
|
document: "document";
|
|
91
93
|
}>;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
member: "member";
|
|
95
|
-
}>;
|
|
94
|
+
createdAt: import("zod").ZodCoercedDate<unknown>;
|
|
95
|
+
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
96
96
|
status: import("zod").ZodEnum<{
|
|
97
97
|
pending: "pending";
|
|
98
98
|
ready: "ready";
|
|
99
99
|
}>;
|
|
100
|
+
source: import("zod").ZodEnum<{
|
|
101
|
+
library: "library";
|
|
102
|
+
member: "member";
|
|
103
|
+
}>;
|
|
100
104
|
uploadedBy: import("zod").ZodString;
|
|
101
105
|
filename: import("zod").ZodString;
|
|
102
106
|
contentType: import("zod").ZodString;
|
|
@@ -113,6 +117,7 @@ declare const assetEvents: {
|
|
|
113
117
|
size: number;
|
|
114
118
|
status: "pending" | "ready";
|
|
115
119
|
uploadedBy: string;
|
|
120
|
+
contentId: string | null;
|
|
116
121
|
createdAt: Date;
|
|
117
122
|
updatedAt: Date;
|
|
118
123
|
}, "asset.deleted", 1>, {
|
|
@@ -126,27 +131,28 @@ declare const assetEvents: {
|
|
|
126
131
|
size: number;
|
|
127
132
|
status: "pending" | "ready";
|
|
128
133
|
uploadedBy: string;
|
|
134
|
+
contentId: string | null;
|
|
129
135
|
createdAt: unknown;
|
|
130
136
|
updatedAt: unknown;
|
|
131
137
|
}, import("zod").ZodObject<{
|
|
132
|
-
id: import("zod").ZodString;
|
|
133
138
|
orgId: import("zod").ZodString;
|
|
134
|
-
|
|
135
|
-
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
139
|
+
id: import("zod").ZodString;
|
|
136
140
|
kind: import("zod").ZodEnum<{
|
|
137
141
|
image: "image";
|
|
138
142
|
video: "video";
|
|
139
143
|
audio: "audio";
|
|
140
144
|
document: "document";
|
|
141
145
|
}>;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
member: "member";
|
|
145
|
-
}>;
|
|
146
|
+
createdAt: import("zod").ZodCoercedDate<unknown>;
|
|
147
|
+
updatedAt: import("zod").ZodCoercedDate<unknown>;
|
|
146
148
|
status: import("zod").ZodEnum<{
|
|
147
149
|
pending: "pending";
|
|
148
150
|
ready: "ready";
|
|
149
151
|
}>;
|
|
152
|
+
source: import("zod").ZodEnum<{
|
|
153
|
+
library: "library";
|
|
154
|
+
member: "member";
|
|
155
|
+
}>;
|
|
150
156
|
uploadedBy: import("zod").ZodString;
|
|
151
157
|
filename: import("zod").ZodString;
|
|
152
158
|
contentType: import("zod").ZodString;
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
//#region src/assets/file-urls.d.ts
|
|
2
|
-
type ThumbnailOwner = 'course' | 'download' | 'community';
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
type ThumbnailOwner = 'course' | 'download' | 'community' | 'event';
|
|
3
|
+
/** URLs for every file a response refers to. A public image (a profile photo, or the
|
|
4
|
+
* thumbnail or cover of a published item) is a public storage URL; every other file is a
|
|
5
|
+
* stable, access-checked URL on the API that redirects to a signed storage URL. */
|
|
6
6
|
interface FileUrls {
|
|
7
|
+
publicImage(orgId: string, ownerId: string, assetId: string): string;
|
|
7
8
|
thumbnail(owner: ThumbnailOwner, ownerId: string): string;
|
|
8
9
|
activityAsset(activityId: string, assetId: string): string;
|
|
9
10
|
downloadFile(downloadId: string, assetId: string): string;
|
|
11
|
+
eventFile(eventId: string, assetId: string): string;
|
|
10
12
|
postCover(postId: string): string;
|
|
13
|
+
postAsset(postId: string, assetId: string): string;
|
|
11
14
|
messageAttachment(chatId: string, messageId: string, assetId: string): string;
|
|
12
|
-
personImage(orgUserId: string): string;
|
|
13
15
|
memberUpload(assetId: string): string;
|
|
14
16
|
libraryFile(assetId: string): string;
|
|
15
17
|
libraryDownload(assetId: string): string;
|
|
16
18
|
}
|
|
17
|
-
declare function
|
|
19
|
+
declare function publicImagePrefix(orgId: string, ownerId: string): string;
|
|
20
|
+
declare function publicImageKey(orgId: string, ownerId: string, assetId: string): string;
|
|
21
|
+
declare function createFileUrls(apiUrl: string, publicUrl: (key: string) => string): FileUrls;
|
|
18
22
|
//#endregion
|
|
19
|
-
export { FileUrls, ThumbnailOwner, createFileUrls };
|
|
23
|
+
export { FileUrls, ThumbnailOwner, createFileUrls, publicImageKey, publicImagePrefix };
|
|
20
24
|
//# sourceMappingURL=file-urls.d.ts.map
|
package/dist/assets/file-urls.js
CHANGED
|
@@ -1,25 +1,35 @@
|
|
|
1
|
+
import { PUBLIC_PREFIX } from "../types/ports.js";
|
|
1
2
|
//#region src/assets/file-urls.ts
|
|
2
3
|
const THUMBNAIL_PATHS = {
|
|
3
4
|
course: "courses",
|
|
4
5
|
download: "downloads",
|
|
5
|
-
community: "communities"
|
|
6
|
+
community: "communities",
|
|
7
|
+
event: "events"
|
|
6
8
|
};
|
|
7
|
-
function
|
|
9
|
+
function publicImagePrefix(orgId, ownerId) {
|
|
10
|
+
return `${PUBLIC_PREFIX}${orgId}/${ownerId}/`;
|
|
11
|
+
}
|
|
12
|
+
function publicImageKey(orgId, ownerId, assetId) {
|
|
13
|
+
return `${publicImagePrefix(orgId, ownerId)}${assetId}`;
|
|
14
|
+
}
|
|
15
|
+
function createFileUrls(apiUrl, publicUrl) {
|
|
8
16
|
const base = apiUrl.replace(/\/+$/, "");
|
|
9
17
|
const at = (...segments) => `${base}/api/${segments.map((s) => encodeURIComponent(s)).join("/")}`;
|
|
10
18
|
return {
|
|
19
|
+
publicImage: (orgId, ownerId, assetId) => publicUrl(publicImageKey(orgId, ownerId, assetId)),
|
|
11
20
|
thumbnail: (owner, ownerId) => at("member", THUMBNAIL_PATHS[owner], ownerId, "thumbnail"),
|
|
12
21
|
activityAsset: (activityId, assetId) => at("member", "activities", activityId, "assets", assetId),
|
|
13
22
|
downloadFile: (downloadId, assetId) => at("member", "downloads", downloadId, "assets", assetId),
|
|
23
|
+
eventFile: (eventId, assetId) => at("member", "events", eventId, "assets", assetId),
|
|
14
24
|
postCover: (postId) => at("member", "posts", postId, "cover"),
|
|
25
|
+
postAsset: (postId, assetId) => at("member", "posts", postId, "assets", assetId),
|
|
15
26
|
messageAttachment: (chatId, messageId, assetId) => at("member", "chats", chatId, "messages", messageId, "attachments", assetId),
|
|
16
|
-
personImage: (orgUserId) => at("member", "people", orgUserId, "image"),
|
|
17
27
|
memberUpload: (assetId) => at("member", "uploads", assetId, "file"),
|
|
18
28
|
libraryFile: (assetId) => at("assets", assetId, "file"),
|
|
19
29
|
libraryDownload: (assetId) => at("assets", assetId, "download")
|
|
20
30
|
};
|
|
21
31
|
}
|
|
22
32
|
//#endregion
|
|
23
|
-
export { createFileUrls };
|
|
33
|
+
export { createFileUrls, publicImageKey, publicImagePrefix };
|
|
24
34
|
|
|
25
35
|
//# sourceMappingURL=file-urls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-urls.js","names":[],"sources":["../../src/assets/file-urls.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"file-urls.js","names":[],"sources":["../../src/assets/file-urls.ts"],"sourcesContent":["import { PUBLIC_PREFIX } from '../types/index.js';\n\nexport type ThumbnailOwner = 'course' | 'download' | 'community' | 'event';\n\n/** URLs for every file a response refers to. A public image (a profile photo, or the\n * thumbnail or cover of a published item) is a public storage URL; every other file is a\n * stable, access-checked URL on the API that redirects to a signed storage URL. */\nexport interface FileUrls {\n publicImage(orgId: string, ownerId: string, assetId: string): string;\n thumbnail(owner: ThumbnailOwner, ownerId: string): string;\n activityAsset(activityId: string, assetId: string): string;\n downloadFile(downloadId: string, assetId: string): string;\n eventFile(eventId: string, assetId: string): string;\n postCover(postId: string): string;\n postAsset(postId: string, assetId: string): string;\n messageAttachment(chatId: string, messageId: string, assetId: 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 event: 'events',\n};\n\nexport function publicImagePrefix(orgId: string, ownerId: string): string {\n return `${PUBLIC_PREFIX}${orgId}/${ownerId}/`;\n}\n\nexport function publicImageKey(orgId: string, ownerId: string, assetId: string): string {\n return `${publicImagePrefix(orgId, ownerId)}${assetId}`;\n}\n\nexport function createFileUrls(apiUrl: string, publicUrl: (key: string) => string): FileUrls {\n const base = apiUrl.replace(/\\/+$/, '');\n const at = (...segments: string[]) =>\n `${base}/api/${segments.map((s) => encodeURIComponent(s)).join('/')}`;\n return {\n publicImage: (orgId, ownerId, assetId) => publicUrl(publicImageKey(orgId, ownerId, assetId)),\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 eventFile: (eventId, assetId) => at('member', 'events', eventId, 'assets', assetId),\n postCover: (postId) => at('member', 'posts', postId, 'cover'),\n postAsset: (postId, assetId) => at('member', 'posts', postId, 'assets', assetId),\n messageAttachment: (chatId, messageId, assetId) =>\n at('member', 'chats', chatId, 'messages', messageId, 'attachments', assetId),\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":";;AAqBA,MAAM,kBAAkD;CACtD,QAAQ;CACR,UAAU;CACV,WAAW;CACX,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAAe,SAAyB;CACxE,OAAO,GAAG,gBAAgB,MAAM,GAAG,QAAQ;AAC7C;AAEA,SAAgB,eAAe,OAAe,SAAiB,SAAyB;CACtF,OAAO,GAAG,kBAAkB,OAAO,OAAO,IAAI;AAChD;AAEA,SAAgB,eAAe,QAAgB,WAA8C;CAC3F,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,cAAc,OAAO,SAAS,YAAY,UAAU,eAAe,OAAO,SAAS,OAAO,CAAC;EAC3F,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,SAAS,YAAY,GAAG,UAAU,UAAU,SAAS,UAAU,OAAO;EAClF,YAAY,WAAW,GAAG,UAAU,SAAS,QAAQ,OAAO;EAC5D,YAAY,QAAQ,YAAY,GAAG,UAAU,SAAS,QAAQ,UAAU,OAAO;EAC/E,oBAAoB,QAAQ,WAAW,YACrC,GAAG,UAAU,SAAS,QAAQ,YAAY,WAAW,eAAe,OAAO;EAC7E,eAAe,YAAY,GAAG,UAAU,WAAW,SAAS,MAAM;EAClE,cAAc,YAAY,GAAG,UAAU,SAAS,MAAM;EACtD,kBAAkB,YAAY,GAAG,UAAU,SAAS,UAAU;CAChE;AACF"}
|
package/dist/assets/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Page } from "../types/shared.js";
|
|
2
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
|
+
import { FileUrls, ThumbnailOwner, createFileUrls, publicImageKey, publicImagePrefix } from "./file-urls.js";
|
|
5
5
|
import "./model.js";
|
|
6
|
-
import { AssetFiles, AssetsRepository, AssetsService, LibraryAssetReader, MemberImageReader, MemberUploadInput, OrgDirectory, ReadyFile } from "./ports.js";
|
|
7
|
-
import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf } from "./service.js";
|
|
6
|
+
import { AssetFiles, AssetsRepository, AssetsService, LibraryAssetReader, MemberImageReader, MemberUpload, MemberUploadInput, MemberUploadReader, OrgDirectory, ReadyFile } from "./ports.js";
|
|
7
|
+
import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf, memberKindOf } from "./service.js";
|
|
8
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 };
|
|
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 MemberUpload, type MemberUploadInput, type MemberUploadReader, type OrgDirectory, type Page, type ReadyFile, type RequestUploadInput, type ThumbnailOwner, UPLOADS_REMOVE_UNATTACHED_JOB, type UploadTicket, assetEvents, assetsJobs, assetsRecurringJobs, createFileUrls, isMemberImageType, kindOf, memberKindOf, publicImageKey, publicImagePrefix };
|
package/dist/assets/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { createFileUrls, publicImageKey, publicImagePrefix } from "./file-urls.js";
|
|
1
2
|
import { assetEvents } from "./events.js";
|
|
2
|
-
import {
|
|
3
|
-
import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf } from "./service.js";
|
|
3
|
+
import { AssetsServiceImpl, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf, memberKindOf } from "./service.js";
|
|
4
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 };
|
|
5
|
+
export { AssetsServiceImpl, MEMBER_IMAGE_TYPE, UPLOADS_REMOVE_UNATTACHED_JOB, assetEvents, assetsJobs, assetsRecurringJobs, createFileUrls, isMemberImageType, kindOf, memberKindOf, publicImageKey, publicImagePrefix };
|
package/dist/assets/ports.d.ts
CHANGED
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
import { Page } from "../types/shared.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ContentType } from "../types/schemas/content.js";
|
|
3
|
+
import { Asset, AssetKind, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
|
|
4
|
+
import "../types/index.js";
|
|
5
|
+
import { Actor } from "../shared/actor.js";
|
|
3
6
|
import { OutboxAppender, UnitOfWork } from "../shared/ports.js";
|
|
4
7
|
import "./model.js";
|
|
5
8
|
//#region src/assets/ports.d.ts
|
|
6
9
|
interface MemberImageReader {
|
|
7
10
|
ownsImage(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
|
|
8
11
|
}
|
|
12
|
+
interface MemberUpload {
|
|
13
|
+
id: string;
|
|
14
|
+
kind: AssetKind;
|
|
15
|
+
filename: string;
|
|
16
|
+
contentType: string;
|
|
17
|
+
size: number;
|
|
18
|
+
}
|
|
19
|
+
interface MemberUploadReader {
|
|
20
|
+
ownsUpload(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
|
|
21
|
+
memberUploads(orgId: string, assetIds: string[]): Promise<MemberUpload[]>;
|
|
22
|
+
}
|
|
9
23
|
interface LibraryAssetReader {
|
|
10
|
-
|
|
24
|
+
libraryAssetsFor(orgId: string, assetIds: string[]): Promise<{
|
|
25
|
+
id: string;
|
|
26
|
+
contentId: string | null;
|
|
27
|
+
}[]>;
|
|
11
28
|
}
|
|
12
29
|
interface ReadyFile {
|
|
13
30
|
filename: string;
|
|
@@ -22,24 +39,25 @@ interface AssetFiles {
|
|
|
22
39
|
signFile(orgId: string, assetId: string, opts?: {
|
|
23
40
|
saveAs?: string;
|
|
24
41
|
}): Promise<string | null>;
|
|
42
|
+
syncPublicImage(orgId: string, ownerId: string, assetId: string | null): Promise<void>;
|
|
25
43
|
}
|
|
26
44
|
interface MemberUploadInput {
|
|
27
45
|
filename: string;
|
|
28
46
|
contentType: string;
|
|
29
47
|
}
|
|
30
|
-
interface AssetsService extends MemberImageReader, LibraryAssetReader, AssetFiles {
|
|
31
|
-
requestUpload(
|
|
32
|
-
requestMemberUpload(
|
|
33
|
-
confirm(
|
|
34
|
-
confirmOwn(
|
|
35
|
-
list(
|
|
36
|
-
get(
|
|
37
|
-
libraryFile(
|
|
48
|
+
interface AssetsService extends MemberImageReader, MemberUploadReader, LibraryAssetReader, AssetFiles {
|
|
49
|
+
requestUpload(input: RequestUploadInput, actor: Actor): Promise<UploadTicket>;
|
|
50
|
+
requestMemberUpload(input: MemberUploadInput, actor: Actor): Promise<UploadTicket>;
|
|
51
|
+
confirm(id: string, actor: Actor): Promise<AssetView>;
|
|
52
|
+
confirmOwn(id: string, actor: Actor): Promise<AssetView>;
|
|
53
|
+
list(query: AssetsQuery, actor: Actor): Promise<Page<AssetView>>;
|
|
54
|
+
get(id: string, actor: Actor): Promise<AssetView>;
|
|
55
|
+
libraryFile(assetId: string, opts: {
|
|
38
56
|
download: boolean;
|
|
39
|
-
}): Promise<string
|
|
40
|
-
ownUploadFile(
|
|
41
|
-
remove(
|
|
42
|
-
removeOwn(
|
|
57
|
+
}, actor: Actor): Promise<string>;
|
|
58
|
+
ownUploadFile(assetId: string, actor: Actor): Promise<string>;
|
|
59
|
+
remove(id: string, actor: Actor): Promise<void>;
|
|
60
|
+
removeOwn(id: string, actor: Actor): Promise<void>;
|
|
43
61
|
removeUnattached(orgId: string, now: Date): Promise<number>;
|
|
44
62
|
}
|
|
45
63
|
interface OrgDirectory {
|
|
@@ -54,6 +72,7 @@ interface AssetsRepository {
|
|
|
54
72
|
delete(orgId: string, id: string): Promise<boolean>;
|
|
55
73
|
listUnreferencedMemberUploads(orgId: string, before: Date): Promise<Asset[]>;
|
|
56
74
|
heldKeys(orgId: string, keys: string[]): Promise<string[]>;
|
|
75
|
+
contentTypeOf(orgId: string, contentId: string): Promise<ContentType | null>;
|
|
57
76
|
}
|
|
58
77
|
interface AssetsWriteScope {
|
|
59
78
|
assets: AssetsRepository;
|
|
@@ -61,5 +80,5 @@ interface AssetsWriteScope {
|
|
|
61
80
|
}
|
|
62
81
|
type AssetsUnitOfWork = UnitOfWork<AssetsWriteScope>;
|
|
63
82
|
//#endregion
|
|
64
|
-
export { AssetFiles, AssetsRepository, AssetsService, AssetsUnitOfWork, AssetsWriteScope, LibraryAssetReader, MemberImageReader, MemberUploadInput, OrgDirectory, ReadyFile };
|
|
83
|
+
export { AssetFiles, AssetsRepository, AssetsService, AssetsUnitOfWork, AssetsWriteScope, LibraryAssetReader, MemberImageReader, MemberUpload, MemberUploadInput, MemberUploadReader, OrgDirectory, ReadyFile };
|
|
65
84
|
//# sourceMappingURL=ports.d.ts.map
|
package/dist/assets/service.d.ts
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { Page } from "../types/shared.js";
|
|
2
2
|
import { Logger, ObjectStorage } from "../types/ports.js";
|
|
3
3
|
import { AssetKind, AssetView, AssetsQuery, RequestUploadInput, UploadTicket } from "../types/schemas/assets.js";
|
|
4
|
+
import { Actor } from "../shared/actor.js";
|
|
4
5
|
import "../shared/ports.js";
|
|
5
6
|
import { FileUrls } from "./file-urls.js";
|
|
6
7
|
import "./model.js";
|
|
7
|
-
import { AssetsRepository, AssetsService, AssetsUnitOfWork, MemberUploadInput, ReadyFile } from "./ports.js";
|
|
8
|
+
import { AssetsRepository, AssetsService, AssetsUnitOfWork, MemberUpload, MemberUploadInput, ReadyFile } from "./ports.js";
|
|
8
9
|
//#region src/assets/service.d.ts
|
|
9
10
|
declare const MEMBER_IMAGE_TYPE: RegExp;
|
|
10
11
|
declare function isMemberImageType(contentType: string): boolean;
|
|
12
|
+
declare function memberKindOf(contentType: string): AssetKind;
|
|
11
13
|
declare function kindOf(contentType: string): AssetKind;
|
|
12
14
|
type AssetsServiceParams = {
|
|
13
15
|
storage: ObjectStorage;
|
|
14
16
|
repo: AssetsRepository;
|
|
15
17
|
uow: AssetsUnitOfWork;
|
|
16
18
|
memberImageMaxBytes: number;
|
|
19
|
+
memberFileMaxBytes: number;
|
|
17
20
|
downloadLinkExpirySeconds: number;
|
|
18
21
|
fileUrls: FileUrls;
|
|
19
22
|
logger?: Logger;
|
|
@@ -23,29 +26,41 @@ declare class AssetsServiceImpl implements AssetsService {
|
|
|
23
26
|
private readonly repo;
|
|
24
27
|
private readonly uow;
|
|
25
28
|
private readonly memberImageMaxBytes;
|
|
29
|
+
private readonly memberFileMaxBytes;
|
|
26
30
|
private readonly downloadLinkExpirySeconds;
|
|
27
31
|
private readonly fileUrls;
|
|
28
32
|
private readonly logger;
|
|
29
33
|
constructor(params: AssetsServiceParams);
|
|
30
|
-
requestUpload(
|
|
31
|
-
requestMemberUpload(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
requestUpload(input: RequestUploadInput, actor: Actor): Promise<UploadTicket>;
|
|
35
|
+
requestMemberUpload(input: MemberUploadInput, actor: Actor): Promise<UploadTicket>;
|
|
36
|
+
private createUpload;
|
|
37
|
+
confirm(id: string, actor: Actor): Promise<AssetView>;
|
|
38
|
+
confirmOwn(id: string, actor: Actor): Promise<AssetView>;
|
|
39
|
+
ownUploadFile(assetId: string, actor: Actor): Promise<string>;
|
|
40
|
+
ownsUpload(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
|
|
41
|
+
memberUploads(orgId: string, assetIds: string[]): Promise<MemberUpload[]>;
|
|
35
42
|
ownsImage(orgId: string, assetId: string, orgUserId: string): Promise<boolean>;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
libraryAssetsFor(orgId: string, assetIds: string[]): Promise<{
|
|
44
|
+
id: string;
|
|
45
|
+
contentId: string | null;
|
|
46
|
+
}[]>;
|
|
47
|
+
list(query: AssetsQuery, actor: Actor): Promise<Page<AssetView>>;
|
|
48
|
+
get(id: string, actor: Actor): Promise<AssetView>;
|
|
39
49
|
readyFiles(orgId: string, assetIds: readonly string[]): Promise<Record<string, ReadyFile>>;
|
|
40
50
|
signFile(orgId: string, assetId: string, opts?: {
|
|
41
51
|
saveAs?: string;
|
|
42
52
|
}): Promise<string | null>;
|
|
43
|
-
|
|
53
|
+
syncPublicImage(orgId: string, ownerId: string, assetId: string | null): Promise<void>;
|
|
54
|
+
libraryFile(assetId: string, opts: {
|
|
44
55
|
download: boolean;
|
|
45
|
-
}): Promise<string
|
|
46
|
-
remove(
|
|
47
|
-
removeOwn(
|
|
56
|
+
}, actor: Actor): Promise<string>;
|
|
57
|
+
remove(id: string, actor: Actor): Promise<void>;
|
|
58
|
+
removeOwn(id: string, actor: Actor): Promise<void>;
|
|
59
|
+
private removeAsset;
|
|
60
|
+
private requireReach;
|
|
61
|
+
private requireItemWrite;
|
|
48
62
|
removeUnattached(orgId: string, now: Date): Promise<number>;
|
|
63
|
+
private orphanPublicImages;
|
|
49
64
|
private strayUploads;
|
|
50
65
|
private finalize;
|
|
51
66
|
private finalizeMember;
|
|
@@ -53,8 +68,9 @@ declare class AssetsServiceImpl implements AssetsService {
|
|
|
53
68
|
private readyAmong;
|
|
54
69
|
private view;
|
|
55
70
|
private discard;
|
|
71
|
+
private removePublicCopies;
|
|
56
72
|
private removeObject;
|
|
57
73
|
}
|
|
58
74
|
//#endregion
|
|
59
|
-
export { AssetsServiceImpl, AssetsServiceParams, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf };
|
|
75
|
+
export { AssetsServiceImpl, AssetsServiceParams, MEMBER_IMAGE_TYPE, isMemberImageType, kindOf, memberKindOf };
|
|
60
76
|
//# sourceMappingURL=service.d.ts.map
|