From 2c98047ec08dda7dbb11f0cb933e2e20f13c07f6 Mon Sep 17 00:00:00 2001 From: Face <69168154+face-hh@users.noreply.github.com> Date: Sat, 31 May 2025 13:27:30 +0300 Subject: [PATCH] fix: more helpful messaging on account deletion --- .../api/settings/delete-account/+server.ts | 57 +++++++++++-------- website/src/routes/settings/+page.svelte | 31 +++++----- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/website/src/routes/api/settings/delete-account/+server.ts b/website/src/routes/api/settings/delete-account/+server.ts index 58d77a6..1f685a4 100644 --- a/website/src/routes/api/settings/delete-account/+server.ts +++ b/website/src/routes/api/settings/delete-account/+server.ts @@ -21,38 +21,45 @@ export async function POST({ request }) { throw error(400, 'Invalid confirmation text'); } - const scheduledDeletionAt = new Date(); - scheduledDeletionAt.setDate(scheduledDeletionAt.getDate() + 14); - - await db.transaction(async (tx) => { - const existingRequest = await tx.select() + try { + const existingRequest = await db.select() .from(accountDeletionRequest) .where(eq(accountDeletionRequest.userId, userId)) .limit(1); if (existingRequest.length > 0) { - throw new Error('Account deletion already requested'); + throw error(409, 'Account deletion already requested'); } - await tx.insert(accountDeletionRequest).values({ - userId, - scheduledDeletionAt, - reason: 'User requested account deletion' + const scheduledDeletionAt = new Date(); + scheduledDeletionAt.setDate(scheduledDeletionAt.getDate() + 14); + + await db.transaction(async (tx) => { + await tx.insert(accountDeletionRequest).values({ + userId, + scheduledDeletionAt, + reason: 'User requested account deletion' + }); + + await tx.update(user) + .set({ + isBanned: true, + banReason: 'Account deletion requested - scheduled for ' + scheduledDeletionAt.toISOString(), + updatedAt: new Date() + }) + .where(eq(user.id, userId)); }); - await tx.update(user) - .set({ - isBanned: true, - banReason: 'Account deletion requested - scheduled for ' + scheduledDeletionAt.toISOString(), - updatedAt: new Date() - }) - .where(eq(user.id, userId)); - }); - - - return json({ - success: true, - message: `Account deletion has been scheduled for ${scheduledDeletionAt.toLocaleDateString()}. Your account has been temporarily suspended. You can cancel this request by contacting support before the scheduled date.`, - scheduledDeletionAt: scheduledDeletionAt.toISOString() - }); + return json({ + success: true, + message: `Account deletion has been scheduled for ${scheduledDeletionAt.toLocaleDateString()}. Your account has been temporarily suspended. You can cancel this request by contacting support before the scheduled date.`, + scheduledDeletionAt: scheduledDeletionAt.toISOString() + }); + } catch (e) { + if (e && typeof e === 'object' && 'status' in e) { + throw e; + } + console.error('Account deletion error:', e); + throw error(500, 'Internal server error'); + } } \ No newline at end of file diff --git a/website/src/routes/settings/+page.svelte b/website/src/routes/settings/+page.svelte index 605af10..53cbe32 100644 --- a/website/src/routes/settings/+page.svelte +++ b/website/src/routes/settings/+page.svelte @@ -239,16 +239,21 @@ }) }); + const result = await response.json(); + if (!response.ok) { - const result = await response.json(); - throw new Error(result.message || 'Failed to delete account'); + if (response.status === 409) { + toast.error('Account deletion already scheduled', { + description: 'You have already requested account deletion. Contact support to cancel.' + }); + } else { + throw new Error(result.message || 'Failed to delete account'); + } + } else { + toast.success('Account deletion scheduled successfully', { + description: result.message + }); } - - toast.success('Account deleted successfully. You will be logged out shortly.'); - - setTimeout(() => { - window.location.href = '/'; - }, 2000); } catch (error: any) { console.error('Delete account error:', error); toast.error('Failed to delete account: ' + error.message); @@ -260,7 +265,7 @@ } -

Delete Account

- Permanently delete your account. This will anonymize your data while preserving - transaction records for compliance. + Schedule your account for permanent deletion. This will anonymize your data while + preserving transaction records for compliance.