重构: 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:
2026-08-20 18:00:40 +08:00
parent 632c5476a0
commit 3c757d53c5
4 changed files with 116 additions and 37 deletions
+79
View File
@@ -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...),
}
}