53 lines
1.9 KiB
Go
53 lines
1.9 KiB
Go
// 功能描述:转换工作人员写入时的数据库错误,避免向客户端泄露数据库实现细节。
|
||
// 版本:v1.0
|
||
package common
|
||
|
||
import (
|
||
"errors"
|
||
"log"
|
||
|
||
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
|
||
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
|
||
"github.com/jackc/pgx/v5/pgconn"
|
||
)
|
||
|
||
const (
|
||
staffUsernameUniqueConstraint = "idx_staff_account_username"
|
||
staffPhoneUniqueConstraint = "idx_staff_account_phone"
|
||
)
|
||
|
||
var (
|
||
errStaffUsernameExists = errors.New("该用户名已存在")
|
||
errStaffPhoneExists = errors.New("该联系电话已被其他工作人员使用")
|
||
errStaffSaveFailed = errors.New("保存失败,请稍后重试")
|
||
)
|
||
|
||
// CreateStaffRecord 创建工作人员记录,并统一转换数据库写入错误。
|
||
// 参数:staff 为已经完成业务校验和密码哈希处理的工作人员模型。
|
||
// 返回值:创建成功返回 nil,失败返回脱敏后的工作人员写入错误。
|
||
func CreateStaffRecord(staff *models.StaffAccount) error {
|
||
if err := impl.DBService.Create(staff).Error; err != nil {
|
||
return StaffWriteError(err)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// StaffWriteError 将工作人员写入错误转换为稳定的中文业务提示。
|
||
// 参数:err 为工作人员创建或更新操作返回的数据库错误。
|
||
// 返回值:已知唯一约束冲突返回对应业务提示,其他错误脱敏后返回通用保存失败提示。
|
||
func StaffWriteError(err error) error {
|
||
var postgresError *pgconn.PgError
|
||
if errors.As(err, &postgresError) && postgresError.Code == "23505" {
|
||
switch postgresError.ConstraintName {
|
||
case staffUsernameUniqueConstraint:
|
||
return errStaffUsernameExists
|
||
case staffPhoneUniqueConstraint:
|
||
return errStaffPhoneExists
|
||
}
|
||
}
|
||
|
||
// 未识别错误仅写入服务端日志,客户端不能看到数据库表名、约束名或 SQLSTATE。
|
||
log.Printf("staff write failed: %v", err)
|
||
return errStaffSaveFailed
|
||
}
|