// 功能描述:转换工作人员写入时的数据库错误,避免向客户端泄露数据库实现细节。 // 版本: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 }