重构: User 默认实现移到 req/userx,消除 req 对 contracts 的循环依赖
GetAnonymous/GetSystemUser 原来在 contracts/base 里实现,req 自己的测试 又要用它们构造测试用户,形成 req(测试)依赖 contracts、contracts(正式 代码)依赖 req 的循环——两边 go.mod 只能靠指向本地兄弟目录的 replace 绕过, 没法各自独立解析成真实版本号。 跟 resx 之于 req.Resource 一个思路:接口留在 req 包,默认实现挪到子包 req/userx,req 主包保持不引入实现细节所需的依赖(这里是 samber/lo)。 req 自己的测试文件改用 req/userx,不用触碰 contracts 了;contracts/base 里的 GetAnonymous/GetSystemUser 改成指向 req/userx 的函数别名,保持 兼容不用改调用方。
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
// Package userx 提供 req.User 的默认实现,跟 resx 之于 req.Resource 是同一个思路:接口留在
|
||||
// req 包里保持依赖最小,具体实现(包括内置的匿名用户/系统用户)放在子包里,避免 req 包本身
|
||||
// 引入实现所需的依赖(这里是 github.com/samber/lo)。
|
||||
package userx
|
||||
|
||||
import (
|
||||
"github.com/samber/lo"
|
||||
|
||||
"git.fsdpf.net/go/req"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
id int64
|
||||
uuid string
|
||||
username string
|
||||
nickname string
|
||||
roles []string
|
||||
runtime req.UserRuntime
|
||||
}
|
||||
|
||||
func (this user) ID() int64 {
|
||||
return this.id
|
||||
}
|
||||
|
||||
func (this user) Uuid() string {
|
||||
return this.uuid
|
||||
}
|
||||
|
||||
func (this user) Username() string {
|
||||
return this.username
|
||||
}
|
||||
|
||||
func (this user) Nickname() string {
|
||||
return this.nickname
|
||||
}
|
||||
|
||||
func (this user) GetUserInfo() map[string]any {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this user) Roles() (roles []string) {
|
||||
return this.roles
|
||||
}
|
||||
|
||||
func (this user) HasUserRoles(roles ...string) bool {
|
||||
return lo.Contains(this.Roles(), "ffffffff-ffff-ffff-ffff-ffffffffffff") || len(lo.Intersect(this.Roles(), roles)) > 0
|
||||
}
|
||||
|
||||
func (this user) IsAnonymous() bool {
|
||||
return this.id == 0
|
||||
}
|
||||
|
||||
func (this user) Runtime() req.UserRuntime {
|
||||
return this.runtime
|
||||
}
|
||||
|
||||
// GetAnonymous 获取匿名用户
|
||||
func GetAnonymous(opts ...req.UserRuntimeOption) req.User {
|
||||
return user{
|
||||
id: 0,
|
||||
uuid: "00000000-0000-0000-0000-000000000000",
|
||||
username: "anonymous",
|
||||
nickname: "匿名者",
|
||||
roles: []string{"00000000-0000-0000-0000-000000000000"},
|
||||
runtime: req.NewUserRuntime(opts...),
|
||||
}
|
||||
}
|
||||
|
||||
// GetSystemUser 系统用户
|
||||
func GetSystemUser(opts ...req.UserRuntimeOption) req.User {
|
||||
return user{
|
||||
id: -1,
|
||||
uuid: "ffffffff-ffff-ffff-ffff-ffffffffffff",
|
||||
username: "system",
|
||||
nickname: "系统",
|
||||
roles: []string{"ffffffff-ffff-ffff-ffff-ffffffffffff"},
|
||||
runtime: req.NewUserRuntime(opts...),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user