An atproto PDS written in Go

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.

authored by Lyna and committed by GitHub 66a2e250 6ec2a2a5

Changed files
+29 -9
server
+29 -9
server/handle_server_delete_account.go
··· 66 }) 67 } 68 69 - if err := s.db.Exec("DELETE FROM blocks WHERE did = ?", nil, req.Did).Error; err != nil { 70 s.logger.Error("error deleting blocks", "error", err) 71 return helpers.ServerError(e, nil) 72 } 73 74 - if err := s.db.Exec("DELETE FROM records WHERE did = ?", nil, req.Did).Error; err != nil { 75 s.logger.Error("error deleting records", "error", err) 76 return helpers.ServerError(e, nil) 77 } 78 79 - if err := s.db.Exec("DELETE FROM blobs WHERE did = ?", nil, req.Did).Error; err != nil { 80 s.logger.Error("error deleting blobs", "error", err) 81 return helpers.ServerError(e, nil) 82 } 83 84 - if err := s.db.Exec("DELETE FROM tokens WHERE did = ?", nil, req.Did).Error; err != nil { 85 s.logger.Error("error deleting tokens", "error", err) 86 return helpers.ServerError(e, nil) 87 } 88 89 - if err := s.db.Exec("DELETE FROM refresh_tokens WHERE did = ?", nil, req.Did).Error; err != nil { 90 s.logger.Error("error deleting refresh tokens", "error", err) 91 return helpers.ServerError(e, nil) 92 } 93 94 - if err := s.db.Exec("DELETE FROM reserved_keys WHERE did = ?", nil, req.Did).Error; err != nil { 95 s.logger.Error("error deleting reserved keys", "error", err) 96 return helpers.ServerError(e, nil) 97 } 98 99 - if err := s.db.Exec("DELETE FROM invite_codes WHERE did = ?", nil, req.Did).Error; err != nil { 100 s.logger.Error("error deleting invite codes", "error", err) 101 return helpers.ServerError(e, nil) 102 } 103 104 - if err := s.db.Exec("DELETE FROM actors WHERE did = ?", nil, req.Did).Error; err != nil { 105 s.logger.Error("error deleting actor", "error", err) 106 return helpers.ServerError(e, nil) 107 } 108 109 - if err := s.db.Exec("DELETE FROM repos WHERE did = ?", nil, req.Did).Error; err != nil { 110 s.logger.Error("error deleting repo", "error", err) 111 return helpers.ServerError(e, nil) 112 } 113
··· 66 }) 67 } 68 69 + tx := s.db.BeginDangerously() 70 + if tx.Error != nil { 71 + s.logger.Error("error starting transaction", "error", tx.Error) 72 + return helpers.ServerError(e, nil) 73 + } 74 + 75 + if err := tx.Exec("DELETE FROM blocks WHERE did = ?", nil, req.Did).Error; err != nil { 76 + tx.Rollback() 77 s.logger.Error("error deleting blocks", "error", err) 78 return helpers.ServerError(e, nil) 79 } 80 81 + if err := tx.Exec("DELETE FROM records WHERE did = ?", nil, req.Did).Error; err != nil { 82 + tx.Rollback() 83 s.logger.Error("error deleting records", "error", err) 84 return helpers.ServerError(e, nil) 85 } 86 87 + if err := tx.Exec("DELETE FROM blobs WHERE did = ?", nil, req.Did).Error; err != nil { 88 + tx.Rollback() 89 s.logger.Error("error deleting blobs", "error", err) 90 return helpers.ServerError(e, nil) 91 } 92 93 + if err := tx.Exec("DELETE FROM tokens WHERE did = ?", nil, req.Did).Error; err != nil { 94 + tx.Rollback() 95 s.logger.Error("error deleting tokens", "error", err) 96 return helpers.ServerError(e, nil) 97 } 98 99 + if err := tx.Exec("DELETE FROM refresh_tokens WHERE did = ?", nil, req.Did).Error; err != nil { 100 + tx.Rollback() 101 s.logger.Error("error deleting refresh tokens", "error", err) 102 return helpers.ServerError(e, nil) 103 } 104 105 + if err := tx.Exec("DELETE FROM reserved_keys WHERE did = ?", nil, req.Did).Error; err != nil { 106 + tx.Rollback() 107 s.logger.Error("error deleting reserved keys", "error", err) 108 return helpers.ServerError(e, nil) 109 } 110 111 + if err := tx.Exec("DELETE FROM invite_codes WHERE did = ?", nil, req.Did).Error; err != nil { 112 + tx.Rollback() 113 s.logger.Error("error deleting invite codes", "error", err) 114 return helpers.ServerError(e, nil) 115 } 116 117 + if err := tx.Exec("DELETE FROM actors WHERE did = ?", nil, req.Did).Error; err != nil { 118 + tx.Rollback() 119 s.logger.Error("error deleting actor", "error", err) 120 return helpers.ServerError(e, nil) 121 } 122 123 + if err := tx.Exec("DELETE FROM repos WHERE did = ?", nil, req.Did).Error; err != nil { 124 + tx.Rollback() 125 s.logger.Error("error deleting repo", "error", err) 126 + return helpers.ServerError(e, nil) 127 + } 128 + 129 + if err := tx.Commit().Error; err != nil { 130 + s.logger.Error("error committing transaction", "error", err) 131 return helpers.ServerError(e, nil) 132 } 133