46 lines
1.5 KiB
Go

// 本包承载 user-service 认证链路的 MySQL 持久化。
package auth
import (
"database/sql"
"errors"
"strings"
mysqldriver "github.com/go-sql-driver/mysql"
"hyapp/pkg/xerr"
)
// Repository 是认证数据在 MySQL 上的存储实现。
type Repository struct {
// db 由父级 MySQL repository 持有,本包只复用连接池。
db *sql.DB
}
// New 基于共享 MySQL 连接池创建认证存储对象。
func New(db *sql.DB) *Repository {
return &Repository{db: db}
}
func mapAuthDuplicateError(err error) error {
var mysqlErr *mysqldriver.MySQLError
if !errors.As(err, &mysqlErr) || mysqlErr.Number != 1062 {
// 非 MySQL 重复键错误保持原样返回。
return err
}
// 根据约束名或表名把重复键错误映射成稳定领域 reason。
message := mysqlErr.Message
switch {
case strings.Contains(message, "uk_users_register_device_id"):
return xerr.New(xerr.DeviceAlreadyRegistered, "device already registered")
case strings.Contains(message, "password_accounts"):
return xerr.New(xerr.PasswordAlreadySet, "password already set")
case strings.Contains(message, "third_party") || strings.Contains(message, "uk_third_party_provider_subject"):
return xerr.New(xerr.Conflict, "third-party identity already exists")
case strings.Contains(message, "display") || strings.Contains(message, "uk_users_current_display_user_id"):
return xerr.New(xerr.DisplayUserIDExists, "display_user_id already exists")
default:
return xerr.New(xerr.Conflict, "duplicate key")
}
}