🪻 distributed transcription service thistle.dunkirk.sh
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: change status codes

+55 -64
+10 -20
src/index.test.ts
··· 208 208 }), 209 209 }); 210 210 211 - if (registerResponse.status !== 200) { 211 + if (registerResponse.status !== 201) { 212 212 const error = await registerResponse.json(); 213 213 throw new Error(`Registration failed: ${JSON.stringify(error)}`); 214 214 } ··· 275 275 }), 276 276 }); 277 277 278 - if (response.status !== 200) { 278 + if (response.status !== 201) { 279 279 const error = await response.json(); 280 280 console.error("Registration failed:", response.status, error); 281 281 } 282 282 283 - expect(response.status).toBe(200); 283 + expect(response.status).toBe(201); 284 284 285 285 const data = await response.json(); 286 286 expect(data.user).toBeDefined(); ··· 348 348 }), 349 349 }); 350 350 351 - expect(response.status).toBe(400); 351 + expect(response.status).toBe(409); 352 352 const data = await response.json(); 353 353 expect(data.error).toBe("Email already registered"); 354 354 }); ··· 431 431 }, 432 432 ); 433 433 434 - expect(response.status).toBe(200); 435 - const data = await response.json(); 436 - expect(data.success).toBe(true); 434 + expect(response.status).toBe(204); 437 435 438 436 // Verify user is deleted 439 437 const verifyResponse = await authRequest( ··· 505 503 }, 506 504 ); 507 505 508 - expect(response.status).toBe(400); 506 + expect(response.status).toBe(409); 509 507 const data = await response.json(); 510 508 expect(data.error).toBe("Email already in use"); 511 509 }); ··· 586 584 ); 587 585 588 586 expect(response.status).toBe(200); 589 - const data = await response.json(); 590 - expect(data.success).toBe(true); 591 587 592 588 // Verify name updated 593 589 const meResponse = await authRequest( ··· 720 716 }, 721 717 ); 722 718 723 - expect(response.status).toBe(200); 719 + expect(response.status).toBe(201); 724 720 const data = await response.json(); 725 721 expect(data.id).toBeDefined(); 726 722 expect(data.message).toContain("Upload successful"); ··· 881 877 }, 882 878 ); 883 879 884 - expect(response.status).toBe(200); 885 - const data = await response.json(); 886 - expect(data.success).toBe(true); 880 + expect(response.status).toBe(204); 887 881 888 882 // Verify user is deleted 889 883 const verifyResponse = await authRequest( ··· 919 913 ); 920 914 921 915 expect(response.status).toBe(200); 922 - const data = await response.json(); 923 - expect(data.success).toBe(true); 924 916 925 917 // Verify role updated 926 918 const meResponse = await authRequest( ··· 1033 1025 }, 1034 1026 ); 1035 1027 1036 - expect(response.status).toBe(400); 1028 + expect(response.status).toBe(409); 1037 1029 const data = await response.json(); 1038 1030 expect(data.error).toBe("Email already in use"); 1039 1031 }); ··· 1062 1054 }, 1063 1055 ); 1064 1056 1065 - expect(response.status).toBe(200); 1066 - const data = await response.json(); 1067 - expect(data.success).toBe(true); 1057 + expect(response.status).toBe(204); 1068 1058 1069 1059 // Verify sessions are deleted 1070 1060 const verifyResponse = await authRequest(
+45 -44
src/index.ts
··· 400 400 email_verification_required: true, 401 401 verification_code_sent_at: sentAt, 402 402 }, 403 - { status: 200 }, 403 + { status: 201 }, 404 404 ); 405 405 } catch (err: unknown) { 406 406 const error = err as { message?: string }; 407 407 if (error.message?.includes("UNIQUE constraint failed")) { 408 408 return Response.json( 409 409 { error: "Email already registered" }, 410 - { status: 400 }, 410 + { status: 409 }, 411 411 ); 412 412 } 413 413 console.error("[Auth] Registration error:", err); ··· 1065 1065 } 1066 1066 1067 1067 updatePasskeyName(passkeyId, user.id, name); 1068 - return Response.json({ success: true }); 1068 + return new Response(null, { status: 204 }); 1069 1069 } catch (err) { 1070 1070 return handleError(err); 1071 1071 } ··· 1081 1081 1082 1082 const passkeyId = req.params.id; 1083 1083 deletePasskey(passkeyId, user.id); 1084 - return Response.json({ success: true }); 1084 + return new Response(null, { status: 204 }); 1085 1085 } catch (err) { 1086 1086 return handleError(err); 1087 1087 } ··· 1147 1147 // Verify the session belongs to the user 1148 1148 const targetSession = getSession(targetSessionId); 1149 1149 if (!targetSession || targetSession.user_id !== user.id) { 1150 - return Response.json({ error: "Session not found" }, { status: 404 }); 1150 + return Response.json({ error: "Forbidden" }, { status: 403 }); 1151 1151 } 1152 1152 deleteSession(targetSessionId); 1153 - return Response.json({ success: true }); 1153 + return new Response(null, { status: 204 }); 1154 1154 } catch (err) { 1155 1155 return handleError(err); 1156 1156 } ··· 1168 1168 if (rateLimitError) return rateLimitError; 1169 1169 1170 1170 await deleteUser(user.id); 1171 - return Response.json( 1172 - { success: true }, 1173 - { 1174 - headers: { 1175 - "Set-Cookie": 1176 - "session=; HttpOnly; Secure; Path=/; Max-Age=0; SameSite=Lax", 1177 - }, 1171 + return new Response(null, { 1172 + status: 204, 1173 + headers: { 1174 + "Set-Cookie": 1175 + "session=; HttpOnly; Secure; Path=/; Max-Age=0; SameSite=Lax", 1178 1176 }, 1179 - ); 1177 + }); 1180 1178 } catch (err) { 1181 1179 return handleError(err); 1182 1180 } ··· 1204 1202 if (existingUser) { 1205 1203 return Response.json( 1206 1204 { error: "Email already in use" }, 1207 - { status: 400 }, 1205 + { status: 409 }, 1208 1206 ); 1209 1207 } 1210 1208 ··· 1649 1647 // Allow access if: owner, admin, or enrolled in the class 1650 1648 if (!isOwner && !isAdmin && !isClassMember) { 1651 1649 return Response.json( 1652 - { error: "Transcription not found" }, 1653 - { status: 404 }, 1650 + { error: "Forbidden" }, 1651 + { status: 403 }, 1654 1652 ); 1655 1653 } 1656 1654 ··· 1892 1890 // Allow access if: owner, admin, or enrolled in the class 1893 1891 if (!isOwner && !isAdmin && !isClassMember) { 1894 1892 return Response.json( 1895 - { error: "Transcription not found" }, 1896 - { status: 404 }, 1893 + { error: "Forbidden" }, 1894 + { status: 403 }, 1897 1895 ); 1898 1896 } 1899 1897 ··· 1910 1908 if (transcription.status !== "completed") { 1911 1909 return Response.json( 1912 1910 { error: "Transcription not completed yet" }, 1913 - { status: 400 }, 1911 + { status: 409 }, 1914 1912 ); 1915 1913 } 1916 1914 ··· 2000 1998 // Allow access if: owner, admin, or enrolled in the class 2001 1999 if (!isOwner && !isAdmin && !isClassMember) { 2002 2000 return Response.json( 2003 - { error: "Transcription not found" }, 2004 - { status: 404 }, 2001 + { error: "Forbidden" }, 2002 + { status: 403 }, 2005 2003 ); 2006 2004 } 2007 2005 ··· 2302 2300 // Don't auto-start transcription - admin will select recordings 2303 2301 // whisperService.startTranscription(transcriptionId, filename); 2304 2302 2305 - return Response.json({ 2306 - id: transcriptionId, 2307 - message: "Upload successful", 2308 - }); 2303 + return Response.json( 2304 + { 2305 + id: transcriptionId, 2306 + message: "Upload successful", 2307 + }, 2308 + { status: 201 }, 2309 + ); 2309 2310 } catch (error) { 2310 2311 return handleError(error); 2311 2312 } ··· 2377 2378 requireAdmin(req); 2378 2379 const id = req.params.id; 2379 2380 deleteWaitlistEntry(id); 2380 - return Response.json({ success: true }); 2381 + return new Response(null, { status: 204 }); 2381 2382 } catch (error) { 2382 2383 return handleError(error); 2383 2384 } ··· 2389 2390 requireAdmin(req); 2390 2391 const transcriptionId = req.params.id; 2391 2392 deleteTranscription(transcriptionId); 2392 - return Response.json({ success: true }); 2393 + return new Response(null, { status: 204 }); 2393 2394 } catch (error) { 2394 2395 return handleError(error); 2395 2396 } ··· 2404 2405 return Response.json({ error: "Invalid user ID" }, { status: 400 }); 2405 2406 } 2406 2407 await deleteUser(userId); 2407 - return Response.json({ success: true }); 2408 + return new Response(null, { status: 204 }); 2408 2409 } catch (error) { 2409 2410 return handleError(error); 2410 2411 } ··· 2654 2655 2655 2656 const { passkeyId } = req.params; 2656 2657 deletePasskey(passkeyId, userId); 2657 - return Response.json({ success: true }); 2658 + return new Response(null, { status: 204 }); 2658 2659 } catch (error) { 2659 2660 return handleError(error); 2660 2661 } ··· 2720 2721 if (existing) { 2721 2722 return Response.json( 2722 2723 { error: "Email already in use" }, 2723 - { status: 400 }, 2724 + { status: 409 }, 2724 2725 ); 2725 2726 } 2726 2727 ··· 2805 2806 } 2806 2807 2807 2808 deleteAllUserSessions(userId); 2808 - return Response.json({ success: true }); 2809 + return new Response(null, { status: 204 }); 2809 2810 } catch (error) { 2810 2811 return handleError(error); 2811 2812 } ··· 2830 2831 ); 2831 2832 } 2832 2833 2833 - return Response.json({ success: true }); 2834 + return new Response(null, { status: 204 }); 2834 2835 } catch (error) { 2835 2836 return handleError(error); 2836 2837 } ··· 3013 3014 meeting_times, 3014 3015 }); 3015 3016 3016 - return Response.json(newClass); 3017 + return Response.json(newClass, { status: 201 }); 3017 3018 } catch (error) { 3018 3019 return handleError(error); 3019 3020 } ··· 3073 3074 return Response.json({ error: result.error }, { status: 400 }); 3074 3075 } 3075 3076 3076 - return Response.json({ success: true }); 3077 + return new Response(null, { status: 204 }); 3077 3078 } catch (error) { 3078 3079 return handleError(error); 3079 3080 } ··· 3149 3150 meetingTimes || null, 3150 3151 ); 3151 3152 3152 - return Response.json({ success: true, id }); 3153 + return Response.json({ success: true, id }, { status: 201 }); 3153 3154 } catch (error) { 3154 3155 return handleError(error); 3155 3156 } ··· 3199 3200 } 3200 3201 3201 3202 deleteClass(classId); 3202 - return Response.json({ success: true }); 3203 + return new Response(null, { status: 204 }); 3203 3204 } catch (error) { 3204 3205 return handleError(error); 3205 3206 } ··· 3227 3228 } 3228 3229 3229 3230 toggleClassArchive(classId, archived); 3230 - return Response.json({ success: true }); 3231 + return new Response(null, { status: 204 }); 3231 3232 } catch (error) { 3232 3233 return handleError(error); 3233 3234 } ··· 3268 3269 } 3269 3270 3270 3271 enrollUserInClass(user.id, classId); 3271 - return Response.json({ success: true }); 3272 + return new Response(null, { status: 201 }); 3272 3273 } catch (error) { 3273 3274 return handleError(error); 3274 3275 } ··· 3292 3293 } 3293 3294 3294 3295 removeUserFromClass(userId, classId); 3295 - return Response.json({ success: true }); 3296 + return new Response(null, { status: 204 }); 3296 3297 } catch (error) { 3297 3298 return handleError(error); 3298 3299 } ··· 3337 3338 } 3338 3339 3339 3340 const meetingTime = createMeetingTime(classId, label); 3340 - return Response.json(meetingTime); 3341 + return Response.json(meetingTime, { status: 201 }); 3341 3342 } catch (error) { 3342 3343 return handleError(error); 3343 3344 } ··· 3362 3363 } 3363 3364 3364 3365 updateMeetingTime(meetingId, label); 3365 - return Response.json({ success: true }); 3366 + return new Response(null, { status: 204 }); 3366 3367 } catch (error) { 3367 3368 return handleError(error); 3368 3369 } ··· 3379 3380 } 3380 3381 3381 3382 deleteMeetingTime(meetingId); 3382 - return Response.json({ success: true }); 3383 + return new Response(null, { status: 204 }); 3383 3384 } catch (error) { 3384 3385 return handleError(error); 3385 3386 } ··· 3427 3428 transcription.filename, 3428 3429 ); 3429 3430 3430 - return Response.json({ success: true }); 3431 + return new Response(null, { status: 204 }); 3431 3432 } catch (error) { 3432 3433 return handleError(error); 3433 3434 }