refactor: improve error handling and database transactions in 2FA model methods

This commit is contained in:
Seefs
2025-08-03 10:49:55 +08:00
parent d85eeabf11
commit 398ae7156b
2 changed files with 32 additions and 27 deletions

View File

@@ -1,12 +1,12 @@
package controller package controller
import ( import (
"errors"
"fmt" "fmt"
"net/http" "net/http"
"one-api/common" "one-api/common"
"one-api/model" "one-api/model"
"strconv" "strconv"
"strings"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -530,7 +530,7 @@ func AdminDisable2FA(c *gin.Context) {
// 禁用2FA // 禁用2FA
if err := model.DisableTwoFA(userId); err != nil { if err := model.DisableTwoFA(userId); err != nil {
if strings.Contains(err.Error(), "未启用2FA") { if errors.Is(err, model.ErrTwoFANotEnabled) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"success": false, "success": false,
"message": "用户未启用2FA", "message": "用户未启用2FA",

View File

@@ -100,13 +100,16 @@ func (t *TwoFA) Delete() error {
return errors.New("2FA记录ID不能为空") return errors.New("2FA记录ID不能为空")
} }
// 使用事务确保原子性
return DB.Transaction(func(tx *gorm.DB) error {
// 同时删除相关的备用码记录(硬删除) // 同时删除相关的备用码记录(硬删除)
if err := DB.Unscoped().Where("user_id = ?", t.UserId).Delete(&TwoFABackupCode{}).Error; err != nil { if err := tx.Unscoped().Where("user_id = ?", t.UserId).Delete(&TwoFABackupCode{}).Error; err != nil {
return err return err
} }
// 硬删除2FA记录 // 硬删除2FA记录
return DB.Unscoped().Delete(t).Error return tx.Unscoped().Delete(t).Error
})
} }
// ResetFailedAttempts 重置失败尝试次数 // ResetFailedAttempts 重置失败尝试次数
@@ -139,8 +142,9 @@ func (t *TwoFA) IsLocked() bool {
// CreateBackupCodes 创建备用码 // CreateBackupCodes 创建备用码
func CreateBackupCodes(userId int, codes []string) error { func CreateBackupCodes(userId int, codes []string) error {
return DB.Transaction(func(tx *gorm.DB) error {
// 先删除现有的备用码 // 先删除现有的备用码
if err := DB.Where("user_id = ?", userId).Delete(&TwoFABackupCode{}).Error; err != nil { if err := tx.Where("user_id = ?", userId).Delete(&TwoFABackupCode{}).Error; err != nil {
return err return err
} }
@@ -157,12 +161,13 @@ func CreateBackupCodes(userId int, codes []string) error {
IsUsed: false, IsUsed: false,
} }
if err := DB.Create(&backupCode).Error; err != nil { if err := tx.Create(&backupCode).Error; err != nil {
return err return err
} }
} }
return nil return nil
})
} }
// ValidateBackupCode 验证并使用备用码 // ValidateBackupCode 验证并使用备用码