From 66a2e250fdcb2b7774007e406dd79e2ef16b1e5a Mon Sep 17 00:00:00 2001 From: Lyna <19539165+Blooym@users.noreply.github.com> Date: Wed, 10 Dec 2025 23:17:51 +0000 Subject: [PATCH] refactor: use a transaction for deleteAccount (#46) This prevents a potential, although unlikely, issue where an account is left in an invalid state due to one or more delete operations failing. This would prevent a user from being able to delete their account on the network without manual intervention. --- server/handle_server_delete_account.go | 38 +++++++++++++++++++++++++++++--------- 1 file(s) changed, 29 insertion(s)(+), 9 deletion(s)(-) diff --git a/server/handle_server_delete_account.go b/server/handle_server_delete_account.go --- a/server/handle_server_delete_account.go +++ b/server/handle_server_delete_account.go @@ -66,48 +66,68 @@ "message": "Token is expired", }) } - if err := s.db.Exec("DELETE FROM blocks WHERE did = ?", nil, req.Did).Error; err != nil { + tx := s.db.BeginDangerously() + if tx.Error != nil { + s.logger.Error("error starting transaction", "error", tx.Error) + return helpers.ServerError(e, nil) + } + + if err := tx.Exec("DELETE FROM blocks WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting blocks", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM records WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM records WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting records", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM blobs WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM blobs WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting blobs", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM tokens WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM tokens WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting tokens", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM refresh_tokens WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM refresh_tokens WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting refresh tokens", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM reserved_keys WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM reserved_keys WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting reserved keys", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM invite_codes WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM invite_codes WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting invite codes", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM actors WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM actors WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting actor", "error", err) return helpers.ServerError(e, nil) } - if err := s.db.Exec("DELETE FROM repos WHERE did = ?", nil, req.Did).Error; err != nil { + if err := tx.Exec("DELETE FROM repos WHERE did = ?", nil, req.Did).Error; err != nil { + tx.Rollback() s.logger.Error("error deleting repo", "error", err) + return helpers.ServerError(e, nil) + } + + if err := tx.Commit().Error; err != nil { + s.logger.Error("error committing transaction", "error", err) return helpers.ServerError(e, nil) } -- tangled.sh