🪻 distributed transcription service thistle.dunkirk.sh

chore: sync account deletion and subscription cancelation

dunkirk.sh d39cfeca 20f7055c

verified
Changed files
+28 -4
src
+3 -3
src/index.ts
···
},
},
"/api/user": {
-
DELETE: (req) => {
+
DELETE: async (req) => {
const sessionId = getSessionFromRequest(req);
if (!sessionId) {
return Response.json({ error: "Not authenticated" }, { status: 401 });
···
});
if (rateLimitError) return rateLimitError;
-
deleteUser(user.id);
+
await deleteUser(user.id);
return Response.json(
{ success: true },
{
···
if (Number.isNaN(userId)) {
return Response.json({ error: "Invalid user ID" }, { status: 400 });
-
deleteUser(userId);
+
await deleteUser(userId);
return Response.json({ success: true });
} catch (error) {
return handleError(error);
+25 -1
src/lib/auth.ts
···
return match?.[1] ?? null;
}
-
export function deleteUser(userId: number): void {
+
export async function deleteUser(userId: number): Promise<void> {
+
// Get user's subscription if they have one
+
const subscription = db
+
.query<{ id: string }, [number]>(
+
"SELECT id FROM subscriptions WHERE user_id = ? ORDER BY created_at DESC LIMIT 1",
+
)
+
.get(userId);
+
+
// Revoke subscription if it exists
+
if (subscription) {
+
try {
+
const { polar } = await import("./polar");
+
await polar.subscriptions.revoke({ id: subscription.id });
+
console.log(
+
`[User Delete] Revoked subscription ${subscription.id} for user ${userId}`,
+
);
+
} catch (error) {
+
console.error(
+
`[User Delete] Failed to revoke subscription ${subscription.id}:`,
+
error,
+
);
+
// Continue with user deletion even if subscription revocation fails
+
}
+
}
+
db.run("DELETE FROM users WHERE id = ?", [userId]);
}