Documentation
¶
Index ¶
- Constants
- Variables
- func GetCoMemberUIDs(ctx *config.Context, uid string) ([]string, error)
- func GetCommonSpaceID(ctx *config.Context, uid1, uid2 string) string
- func GetSpaceMemberUIDs(ctx *config.Context, spaceID string) ([]string, error)
- func GetUserDefaultSpaceID(ctx *config.Context, uid string) stringdeprecated
- func GetUserDefaultSpaceIDE(ctx *config.Context, uid string) (string, error)
- func IsUserCreateDisabled() bool
- func RegisterDefaultCategoryProvisioner(fn DefaultCategoryProvisioner)
- func SetInviteEmailSenderForTest(s inviteEmailSender)
- type BotDetailModel
- type DB
- type DefaultCategoryProvisioner
- type InvitationModel
- type Manager
- type MemberDetailModel
- type MemberModel
- type Space
- type SpaceDetailModel
- type SpaceModel
Constants ¶
const ( JoinModeDirect = 0 // 直接加入 JoinModeApproval = 1 // 需要审批 )
const ( SpaceStatusDisbanded = 0 // 已解散 SpaceStatusNormal = 1 // 正常 SpaceStatusBanned = 2 // 已封禁 )
Space 状态常量(SpaceModel.Status)
const ( EmailInviteTypeOwner = 1 // 邀请成为新空间的 owner(lazy-create) EmailInviteTypeMember = 2 // 邀请加入已有空间作为成员/管理员 )
EmailInvite 类型常量
const ( EmailInviteStatusPending = 0 EmailInviteStatusConsumed = 1 EmailInviteStatusExpired = 2 EmailInviteStatusRevoked = 3 )
EmailInvite 状态常量
const ( EmailInviteRoleMember = 0 EmailInviteRoleAdmin = 1 )
EmailInvite 角色常量(仅 member 类型)
Variables ¶
var ErrAlreadyMember = errors.New("already_member")
ErrAlreadyMember indicates the user is already an active member
var ErrCannotRemoveOwner = errors.New("cannot remove space owner; transfer ownership first")
ErrCannotRemoveOwner 拦截删除 owner 的请求,调用方需先转让所有权
var ErrRemoveHierarchy = errors.New("operator does not outrank removal target")
ErrRemoveHierarchy 操作者未严格高于目标角色,不能移除目标成员
var ErrSpaceBannedForUpdate = errors.New("space is banned and caller disallowed banned updates")
ErrSpaceBannedForUpdate 事务内发现空间已封禁,且调用方未授权对封禁空间执行更新。 用户端 PUT 应映射为 4xx;管理端调用 updateSpaceProfile 时 allowBanned=true, 该 sentinel 不会被触发。
var ErrSpaceDisbandedForUpdate = errors.New("space already disbanded")
ErrSpaceDisbandedForUpdate 事务内发现空间已解散,禁止更新基础信息
var ErrSpaceFull = errors.New("SPACE_FULL")
ErrSpaceFull indicates the space has reached its member capacity
var ErrSpaceNotFound = errors.New("space not found")
ErrSpaceNotFound 空间不存在(事务内 SELECT FOR UPDATE 未命中)
var ErrTransferTargetMissing = errors.New("transfer target not found or already removed")
ErrTransferTargetMissing 目标成员不存在或已被移除,不能成为新 owner
Functions ¶
func GetCoMemberUIDs ¶
GetCoMemberUIDs 包级别函数,供其他模块调用,查询与指定用户同在至少一个空间的所有用户UID
func GetCommonSpaceID ¶
GetCommonSpaceID 查找两个用户共同所在的第一个 Space 返回 space_id 或空字符串(无共同 Space)
func GetSpaceMemberUIDs ¶
GetSpaceMemberUIDs 获取指定 Space 的所有成员 UID
func GetUserDefaultSpaceID
deprecated
GetUserDefaultSpaceID 获取用户最早加入的 Space(默认 Space)
Deprecated: 内部吞掉 DB 错误,调用方无法区分"用户没默认 Space"和"查询失败"。 对于"authoritative-empty 契约"敏感的路径(如 /v1/conversation/sync 的 space_memberships sideband),请改用 GetUserDefaultSpaceIDE 拿到 error 后 fail-closed 返回非 200。
func GetUserDefaultSpaceIDE ¶ added in v1.5.0
GetUserDefaultSpaceIDE 是 GetUserDefaultSpaceID 的 error-returning 变体。 用户没默认 Space 时返回 ("", nil);DB 查询失败时返回 ("", err)。
func IsUserCreateDisabled ¶
func IsUserCreateDisabled() bool
IsUserCreateDisabled 是否已通过环境变量关闭用户侧创建空间。env-only 的低层 解析器,语义与 modules/common/system_settings.go:parseSpaceDisableUserCreateEnv 保持一致 —— 后者是 system_setting 查询的 env fallback。修改此函数的解析 规则时必须同步那一处,否则同一开关会在两个出口产生漂移。
调用方应优先走 (*Space).isUserCreateDisabled 以获得 DB → env 完整链路;本 函数保留是为了向前兼容已有 callers / 测试,以及作为最简 env-only 探测点。
func RegisterDefaultCategoryProvisioner ¶
func RegisterDefaultCategoryProvisioner(fn DefaultCategoryProvisioner)
RegisterDefaultCategoryProvisioner 由 modules/category 的 init 调用完成注册。 覆盖允许(latest wins),方便测试替身。nil 时等价于取消注册。
func SetInviteEmailSenderForTest ¶
func SetInviteEmailSenderForTest(s inviteEmailSender)
SetInviteEmailSenderForTest 测试专用:替换全局发送器。production 代码不要调用。
Types ¶
type BotDetailModel ¶
BotDetailModel Bot 详情模型
type DefaultCategoryProvisioner ¶
DefaultCategoryProvisioner 保证 (uid, spaceID) 下默认分类存在的钩子。
为什么用 hook 而不是直接 import:modules/category 的测试通过 blank import 拉入 modules/space 进行迁移注册;若 modules/space 反过来 import modules/category,即构成测试期 import cycle。此处由 category 在 init 中反向 注入 provisioner,两模块生产代码单向依赖(category → space),cycle 消除。
调用方需把任何错误视作非关键路径(降级为 warn),因为:
- category.EnsureDefaultCategory 内部依赖表唯一索引 + INSERT IGNORE, 重复 / 并发调用天然幂等;
- GET /v1/spaces/{id}/categories 端有兜底补偿;
- 生产 flow(创建/加入空间)绝不能因 category 初始化失败而回滚。
type InvitationModel ¶
type InvitationModel struct {
SpaceId string // 空间ID
InviteCode string // 邀请码
Creator string // 创建者uid
MaxUses int // 最大使用次数
UsedCount int // 已使用次数
ExpiresAt *db.Time // 过期时间
Status int // 状态 1.有效 0.无效
db.BaseModel
}
InvitationModel 邀请表模型
type Manager ¶
Manager Space 后台管理 API
func NewManager ¶
NewManager 创建 Space 管理实例。space 参数用于复用业务侧的 Space 实例 (共享 executeJoinSpace / notifyApplicantJoinResult / loadKnownSpaceIDs), 避免创建冗余实例;space 为 nil 时会兜底自建(主要给老调用点留后路)。
type MemberDetailModel ¶
type MemberDetailModel struct {
MemberModel
Name string // 用户名称(user.name)
RealName string // 实名兜底(user_verification.real_name),仅作 name 为空时的回退源
Robot int // 是否机器人 1=是 0=否
}
MemberDetailModel 带用户名的成员详情
func (*MemberDetailModel) DisplayName ¶ added in v1.7.0
func (m *MemberDetailModel) DisplayName() string
DisplayName 返回成员的展示名,按 issue #344 的兜底链解析:
- user.name 非空 → 原样返回;
- 否则 user_verification.real_name 非空 → 返回实名;
- 都空 → 返回稳定占位符 "User <uid>"。
任何分支都不会返回空串,也不会暴露 short_no / username。
type MemberModel ¶
type MemberModel struct {
SpaceId string // 空间ID
UID string // 成员uid
Role int // 成员角色 0.普通成员 1.管理员 2.拥有者
Status int // 状态 1.正常 0.已移除
Version int64 // 版本号
db.BaseModel
}
MemberModel 空间成员表模型
type Space ¶
Space 团队空间API
func (*Space) GetCoMemberUIDs ¶
GetCoMemberUIDs 获取与指定用户同在至少一个空间的所有用户UID(公开方法,供其他模块调用)
type SpaceDetailModel ¶
type SpaceDetailModel struct {
SpaceModel
Role int // 当前用户角色
MemberCount int // 成员数
}
SpaceDetailModel 带成员数和角色的空间详情(MaxUsers 从 SpaceModel 继承)
type SpaceModel ¶
type SpaceModel struct {
SpaceId string // 空间ID
Name string // 空间名称
Description string // 空间描述
Logo string // 空间Logo
Creator string // 创建者uid
MaxUsers int // 最大成员数 0.不限制
PresetGroupIds *string // 预设群组ID列表(JSON数组)
JoinMode int // 加入模式 0=直接加入 1=需要审批
Status int // 状态 1.正常 0.已解散
Version int64 // 版本号
db.BaseModel
}
SpaceModel 空间表模型