11import { Router } from 'express' ;
22import jwt from 'jsonwebtoken' ;
33import argon2 from 'argon2' ;
4- import { randomBytes } from 'crypto' ;
54import { query } from '../config/db.js' ;
6- import { generateToken } from '../middleware/auth.js' ;
7- import { createPteroUser , getPteroUserByEmail , updatePteroPassword , updatePteroEmail , deletePteroUser , getServersByUser , deletePteroServer } from '../services/pterodactyl.js' ;
8- import { authenticateToken } from '../middleware/auth .js' ;
5+ import { generateToken , authenticateToken } from '../middleware/auth.js' ;
6+ import { createPteroUser , updatePteroPassword , updatePteroEmail , deletePteroUser , getServersByUser , deletePteroServer } from '../services/pterodactyl.js' ;
7+ import { verifyTurnstile } from '../config/turnstile .js' ;
98
109const router = Router ( ) ;
1110
12- import { verifyTurnstile } from '../config/turnstile.js' ;
13- import { v4 as uuidv4 } from 'uuid' ;
14-
1511function getClientIp ( req ) {
1612 const forwarded = req . headers [ 'x-forwarded-for' ] ;
1713 if ( forwarded ) return forwarded . split ( ',' ) [ 0 ] . trim ( ) ;
@@ -344,13 +340,14 @@ router.post('/change-email', authenticateToken, async (req, res) => {
344340router . post ( '/delete-account' , authenticateToken , async ( req , res ) => {
345341 try {
346342 const { password } = req . body ;
343+ const userId = req . user ?. userId ;
347344 const pteroId = req . user ?. pteroId ;
348345
349346 if ( ! password ) {
350347 return res . status ( 400 ) . json ( { error : 'Password is required' } ) ;
351348 }
352349
353- const users = await query ( 'SELECT * FROM users WHERE ptero_user_id = ?' , [ pteroId ] ) ;
350+ const users = await query ( 'SELECT * FROM users WHERE id = ?' , [ userId ] ) ;
354351 if ( users . length === 0 ) {
355352 return res . status ( 404 ) . json ( { error : 'User not found' } ) ;
356353 }
@@ -362,30 +359,31 @@ router.post('/delete-account', authenticateToken, async (req, res) => {
362359 return res . status ( 401 ) . json ( { error : 'Password is incorrect' } ) ;
363360 }
364361
365- // Delete all Pterodactyl servers first
366- try {
367- const servers = await getServersByUser ( pteroId ) ;
368- for ( const server of servers ) {
369- try {
370- await deletePteroServer ( server . id ) ;
371- } catch ( err ) {
372- console . error ( `Failed to delete server ${ server . id } :` , err . message ) ;
362+ // Delete from local DB first (cascades to user_ips)
363+ await query ( 'DELETE FROM users WHERE id = ?' , [ user . id ] ) ;
364+
365+ // Then try to clean up Pterodactyl (best effort)
366+ if ( pteroId ) {
367+ try {
368+ const servers = await getServersByUser ( pteroId ) ;
369+ for ( const server of servers ) {
370+ try {
371+ await deletePteroServer ( server . id ) ;
372+ } catch ( err ) {
373+ console . error ( `Failed to delete server ${ server . id } :` , err . message ) ;
374+ }
373375 }
376+ } catch ( err ) {
377+ console . error ( 'Failed to fetch servers for deletion:' , err . message ) ;
374378 }
375- } catch ( err ) {
376- console . error ( 'Failed to fetch servers for deletion:' , err . message ) ;
377- }
378379
379- // Delete Pterodactyl user
380- try {
381- await deletePteroUser ( pteroId ) ;
382- } catch ( err ) {
383- console . error ( 'Failed to delete Pterodactyl user:' , err . message ) ;
380+ try {
381+ await deletePteroUser ( pteroId ) ;
382+ } catch ( err ) {
383+ console . error ( 'Failed to delete Pterodactyl user:' , err . message ) ;
384+ }
384385 }
385386
386- // Delete from local DB (cascades to user_ips)
387- await query ( 'DELETE FROM users WHERE id = ?' , [ user . id ] ) ;
388-
389387 res . json ( { message : 'Account deleted successfully' } ) ;
390388 } catch ( err ) {
391389 console . error ( 'Delete account error:' , err . message ) ;
0 commit comments