@striae-org/striae 5.4.3 → 5.4.4
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/app/utils/auth/auth-action-settings.ts +1 -1
- package/package.json +1 -1
- package/workers/image-worker/src/auth.ts +7 -0
- package/workers/image-worker/src/handlers/delete-image.ts +26 -0
- package/workers/image-worker/src/handlers/mint-signed-url.ts +83 -0
- package/workers/image-worker/src/handlers/serve-image.ts +65 -0
- package/workers/image-worker/src/handlers/upload-image.ts +62 -0
- package/workers/image-worker/src/image-worker.example.ts +3 -707
- package/workers/image-worker/src/router.ts +53 -0
- package/workers/image-worker/src/security/key-registry.ts +193 -0
- package/workers/image-worker/src/security/signed-url.ts +163 -0
- package/workers/image-worker/src/types.ts +68 -0
- package/workers/image-worker/src/utils/content-disposition.ts +33 -0
- package/workers/image-worker/src/utils/path-utils.ts +50 -0
- package/workers/image-worker/src/utils/storage-metadata.ts +27 -0
- package/workers/user-worker/src/handlers/user-routes.ts +23 -34
- package/workers/user-worker/src/user-worker.example.ts +17 -23
|
@@ -13,7 +13,20 @@ import type {
|
|
|
13
13
|
function createJsonResponse(data: unknown, headers: ResponseHeaders, status: number = 200): Response {
|
|
14
14
|
return new Response(JSON.stringify(data), {
|
|
15
15
|
status,
|
|
16
|
-
headers
|
|
16
|
+
headers: {
|
|
17
|
+
...headers,
|
|
18
|
+
'Content-Type': 'application/json; charset=utf-8'
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function createTextResponse(message: string, headers: ResponseHeaders, status: number): Response {
|
|
24
|
+
return new Response(message, {
|
|
25
|
+
status,
|
|
26
|
+
headers: {
|
|
27
|
+
...headers,
|
|
28
|
+
'Content-Type': 'text/plain; charset=utf-8'
|
|
29
|
+
}
|
|
17
30
|
});
|
|
18
31
|
}
|
|
19
32
|
|
|
@@ -25,10 +38,7 @@ export async function handleGetUser(
|
|
|
25
38
|
try {
|
|
26
39
|
const userData = await readUserRecord(env, userUid);
|
|
27
40
|
if (userData === null) {
|
|
28
|
-
return
|
|
29
|
-
status: 404,
|
|
30
|
-
headers: corsHeaders
|
|
31
|
-
});
|
|
41
|
+
return createTextResponse('User not found', corsHeaders, 404);
|
|
32
42
|
}
|
|
33
43
|
|
|
34
44
|
return createJsonResponse(userData, corsHeaders);
|
|
@@ -36,10 +46,7 @@ export async function handleGetUser(
|
|
|
36
46
|
const errorMessage = error instanceof Error ? error.message : 'Unknown user data read error';
|
|
37
47
|
console.error('Failed to get user data:', { uid: userUid, reason: errorMessage });
|
|
38
48
|
|
|
39
|
-
return
|
|
40
|
-
status: 500,
|
|
41
|
-
headers: corsHeaders
|
|
42
|
-
});
|
|
49
|
+
return createTextResponse('Failed to get user data', corsHeaders, 500);
|
|
43
50
|
}
|
|
44
51
|
}
|
|
45
52
|
|
|
@@ -91,10 +98,7 @@ export async function handleAddUser(
|
|
|
91
98
|
|
|
92
99
|
return createJsonResponse(userData, corsHeaders, existingUser !== null ? 200 : 201);
|
|
93
100
|
} catch {
|
|
94
|
-
return
|
|
95
|
-
status: 500,
|
|
96
|
-
headers: corsHeaders
|
|
97
|
-
});
|
|
101
|
+
return createTextResponse('Failed to save user data', corsHeaders, 500);
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
104
|
|
|
@@ -115,10 +119,7 @@ export async function handleDeleteUser(
|
|
|
115
119
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
116
120
|
|
|
117
121
|
if (errorMessage === 'User not found') {
|
|
118
|
-
return
|
|
119
|
-
status: 404,
|
|
120
|
-
headers: corsHeaders
|
|
121
|
-
});
|
|
122
|
+
return createTextResponse('User not found', corsHeaders, 404);
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
return createJsonResponse({
|
|
@@ -135,7 +136,7 @@ export function handleDeleteUserWithProgress(
|
|
|
135
136
|
): Response {
|
|
136
137
|
const sseHeaders: ResponseHeaders = {
|
|
137
138
|
...corsHeaders,
|
|
138
|
-
'Content-Type': 'text/event-stream',
|
|
139
|
+
'Content-Type': 'text/event-stream; charset=utf-8',
|
|
139
140
|
'Cache-Control': 'no-cache, no-transform',
|
|
140
141
|
Connection: 'keep-alive'
|
|
141
142
|
};
|
|
@@ -188,10 +189,7 @@ export async function handleAddCases(
|
|
|
188
189
|
const { cases = [] }: AddCasesRequest = await request.json();
|
|
189
190
|
const userData = await readUserRecord(env, userUid);
|
|
190
191
|
if (!userData) {
|
|
191
|
-
return
|
|
192
|
-
status: 404,
|
|
193
|
-
headers: corsHeaders
|
|
194
|
-
});
|
|
192
|
+
return createTextResponse('User not found', corsHeaders, 404);
|
|
195
193
|
}
|
|
196
194
|
|
|
197
195
|
const existingCases = userData.cases || [];
|
|
@@ -205,10 +203,7 @@ export async function handleAddCases(
|
|
|
205
203
|
|
|
206
204
|
return createJsonResponse(userData, corsHeaders);
|
|
207
205
|
} catch {
|
|
208
|
-
return
|
|
209
|
-
status: 500,
|
|
210
|
-
headers: corsHeaders
|
|
211
|
-
});
|
|
206
|
+
return createTextResponse('Failed to add cases', corsHeaders, 500);
|
|
212
207
|
}
|
|
213
208
|
}
|
|
214
209
|
|
|
@@ -222,10 +217,7 @@ export async function handleDeleteCases(
|
|
|
222
217
|
const { casesToDelete }: DeleteCasesRequest = await request.json();
|
|
223
218
|
const userData = await readUserRecord(env, userUid);
|
|
224
219
|
if (!userData) {
|
|
225
|
-
return
|
|
226
|
-
status: 404,
|
|
227
|
-
headers: corsHeaders
|
|
228
|
-
});
|
|
220
|
+
return createTextResponse('User not found', corsHeaders, 404);
|
|
229
221
|
}
|
|
230
222
|
|
|
231
223
|
userData.cases = userData.cases.filter((caseItem) => !casesToDelete.includes(caseItem.caseNumber));
|
|
@@ -234,9 +226,6 @@ export async function handleDeleteCases(
|
|
|
234
226
|
|
|
235
227
|
return createJsonResponse(userData, corsHeaders);
|
|
236
228
|
} catch {
|
|
237
|
-
return
|
|
238
|
-
status: 500,
|
|
239
|
-
headers: corsHeaders
|
|
240
|
-
});
|
|
229
|
+
return createTextResponse('Failed to delete cases', corsHeaders, 500);
|
|
241
230
|
}
|
|
242
231
|
}
|
|
@@ -13,10 +13,19 @@ import type { Env } from './types';
|
|
|
13
13
|
const corsHeaders: Record<string, string> = {
|
|
14
14
|
'Access-Control-Allow-Origin': 'PAGES_CUSTOM_DOMAIN',
|
|
15
15
|
'Access-Control-Allow-Methods': 'GET, PUT, DELETE, OPTIONS',
|
|
16
|
-
'Access-Control-Allow-Headers': 'Content-Type, X-Custom-Auth-Key'
|
|
17
|
-
'Content-Type': 'application/json'
|
|
16
|
+
'Access-Control-Allow-Headers': 'Content-Type, X-Custom-Auth-Key'
|
|
18
17
|
};
|
|
19
18
|
|
|
19
|
+
function createTextResponse(message: string, status: number, headers: Record<string, string>): Response {
|
|
20
|
+
return new Response(message, {
|
|
21
|
+
status,
|
|
22
|
+
headers: {
|
|
23
|
+
...headers,
|
|
24
|
+
'Content-Type': 'text/plain; charset=utf-8'
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
20
29
|
export default {
|
|
21
30
|
async fetch(request: Request, env: Env): Promise<Response> {
|
|
22
31
|
if (request.method === 'OPTIONS') {
|
|
@@ -39,7 +48,7 @@ export default {
|
|
|
39
48
|
const isCasesEndpoint = parts[2] === USER_CASES_SEGMENT;
|
|
40
49
|
|
|
41
50
|
if (!userUid) {
|
|
42
|
-
return
|
|
51
|
+
return createTextResponse('Not Found', 404, corsHeaders);
|
|
43
52
|
}
|
|
44
53
|
|
|
45
54
|
// Handle regular cases endpoint
|
|
@@ -47,10 +56,7 @@ export default {
|
|
|
47
56
|
switch (request.method) {
|
|
48
57
|
case 'PUT': return handleAddCases(request, env, userUid, corsHeaders);
|
|
49
58
|
case 'DELETE': return handleDeleteCases(request, env, userUid, corsHeaders);
|
|
50
|
-
default: return
|
|
51
|
-
status: 405,
|
|
52
|
-
headers: corsHeaders
|
|
53
|
-
});
|
|
59
|
+
default: return createTextResponse('Method not allowed', 405, corsHeaders);
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
62
|
|
|
@@ -64,31 +70,19 @@ export default {
|
|
|
64
70
|
case 'DELETE': return streamProgress
|
|
65
71
|
? handleDeleteUserWithProgress(env, userUid, corsHeaders)
|
|
66
72
|
: handleDeleteUser(env, userUid, corsHeaders);
|
|
67
|
-
default: return
|
|
68
|
-
status: 405,
|
|
69
|
-
headers: corsHeaders
|
|
70
|
-
});
|
|
73
|
+
default: return createTextResponse('Method not allowed', 405, corsHeaders);
|
|
71
74
|
}
|
|
72
75
|
} catch (error) {
|
|
73
76
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
74
77
|
if (errorMessage === 'Unauthorized') {
|
|
75
|
-
return
|
|
76
|
-
status: 403,
|
|
77
|
-
headers: corsHeaders
|
|
78
|
-
});
|
|
78
|
+
return createTextResponse('Forbidden', 403, corsHeaders);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
if (errorMessage === 'User KV encryption is not fully configured') {
|
|
82
|
-
return
|
|
83
|
-
status: 500,
|
|
84
|
-
headers: corsHeaders
|
|
85
|
-
});
|
|
82
|
+
return createTextResponse(errorMessage, 500, corsHeaders);
|
|
86
83
|
}
|
|
87
84
|
|
|
88
|
-
return
|
|
89
|
-
status: 500,
|
|
90
|
-
headers: corsHeaders
|
|
91
|
-
});
|
|
85
|
+
return createTextResponse('Internal Server Error', 500, corsHeaders);
|
|
92
86
|
}
|
|
93
87
|
}
|
|
94
88
|
};
|