// 本包承载 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") } }