46 lines
1.5 KiB
Go
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")
|
|
}
|
|
}
|