diff --git a/server/app.js b/server/app.js index fa6babad3..bdc0b319d 100644 --- a/server/app.js +++ b/server/app.js @@ -384,27 +384,31 @@ export default async function createApp(vite) { app.delete('/api/user/delete', async (req, res)=>{ const { username } = req.body; - const ownAccount = req.account && (req.account.username == username); - if(!ownAccount) return res.status(403).json({ error: 'Must be logged in to delete your account' }); + if(!req.account || req.account.username !== username) { + return res.status(403).json({error : 'Must be logged in to delete your account'}); + } try { - const brews = await HomebrewModel.getByUser(username, true, ['_id', 'googleId', 'editId', 'authors']); + const result = await api.deleteUserBrews(username, req.account); - const deletePromises = brews.map((brew)=>{ - req.brew = brew; - return new Promise((resolve, reject)=>{ - api.deleteBrew(req, res, (err)=>err ? reject(err) : resolve()); + if(!result.success) { + return res.status(500).json({ + error : 'Failed to delete brew.', + brewId : result.brewId, + googleId : result.googleId }); - }); - - await Promise.all(deletePromises); - - return res.json({ success: true, message: `All brews for ${username} have been deleted.` }); - } catch (error) { - console.error('Error deleting brews:', error); - if(!res.headersSent) { - return res.status(500).json({ error: 'Failed to delete the brews.' }); } + + return res.json({ + success : true, + message : `All brews for ${username} have been processed.` + }); + } catch (error) { + console.error('Error deleting user brews:', error); + + return res.status(500).json({ + error : 'Failed to process user brews.' + }); } }); diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 4cca76193..7e3946466 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -568,7 +568,50 @@ const api = { } res.status(204).send(); - } + }, + deleteUserBrews : async (username, account)=>{ + const brews = await HomebrewModel.getByUser( + username, + true, + ['_id', 'googleId', 'editId', 'shareId', 'authors'] + ); + + for (const brew of brews) { + const isOwner = brew.authors[0] === username; + + try { + if(brew.googleId && isOwner) { + await api.deleteGoogleBrew( + account, + brew.googleId, + brew.editId + ); + } + + // Remove the user from the authors array. + brew.authors = _.pull(brew.authors, username); + + if(brew.authors.length === 0) { + await HomebrewModel.deleteOne({ _id: brew._id }); + } else { + brew.markModified('authors'); + await brew.save(); + } + } catch (error) { + console.error(`Failed to delete${googleId ? ' google' : ''} brew with shareId ${brew.shareId}:`, error); + + return { + success : false, + brewId : brew.shareId, + googleId : brew.googleId || null + }; + } + } + + return { + success : true + }; + }, }; router.use(dbCheck);