space

package
v1.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: Apache-2.0 Imports: 40 Imported by: 0

Documentation

Index

Constants

View Source
const (
	JoinModeDirect   = 0 // 直接加入
	JoinModeApproval = 1 // 需要审批
)
View Source
const (
	SpaceStatusDisbanded = 0 // 已解散
	SpaceStatusNormal    = 1 // 正常
	SpaceStatusBanned    = 2 // 已封禁
)

Space 状态常量(SpaceModel.Status)

View Source
const (
	EmailInviteTypeOwner  = 1 // 邀请成为新空间的 owner(lazy-create)
	EmailInviteTypeMember = 2 // 邀请加入已有空间作为成员/管理员
)

EmailInvite 类型常量

View Source
const (
	EmailInviteStatusPending  = 0
	EmailInviteStatusConsumed = 1
	EmailInviteStatusExpired  = 2
	EmailInviteStatusRevoked  = 3
)

EmailInvite 状态常量

View Source
const (
	EmailInviteRoleMember = 0
	EmailInviteRoleAdmin  = 1
)

EmailInvite 角色常量(仅 member 类型)

Variables

View Source
var ErrAlreadyMember = errors.New("already_member")

ErrAlreadyMember indicates the user is already an active member

View Source
var ErrCannotRemoveOwner = errors.New("cannot remove space owner; transfer ownership first")

ErrCannotRemoveOwner 拦截删除 owner 的请求,调用方需先转让所有权

View Source
var ErrRemoveHierarchy = errors.New("operator does not outrank removal target")

ErrRemoveHierarchy 操作者未严格高于目标角色,不能移除目标成员

View Source
var ErrSpaceBannedForUpdate = errors.New("space is banned and caller disallowed banned updates")

ErrSpaceBannedForUpdate 事务内发现空间已封禁,且调用方未授权对封禁空间执行更新。 用户端 PUT 应映射为 4xx;管理端调用 updateSpaceProfile 时 allowBanned=true, 该 sentinel 不会被触发。

View Source
var ErrSpaceDisbandedForUpdate = errors.New("space already disbanded")

ErrSpaceDisbandedForUpdate 事务内发现空间已解散,禁止更新基础信息

View Source
var ErrSpaceFull = errors.New("SPACE_FULL")

ErrSpaceFull indicates the space has reached its member capacity

View Source
var ErrSpaceNotFound = errors.New("space not found")

ErrSpaceNotFound 空间不存在(事务内 SELECT FOR UPDATE 未命中)

View Source
var ErrTransferTargetMissing = errors.New("transfer target not found or already removed")

ErrTransferTargetMissing 目标成员不存在或已被移除,不能成为新 owner

Functions

func GetCoMemberUIDs

func GetCoMemberUIDs(ctx *config.Context, uid string) ([]string, error)

GetCoMemberUIDs 包级别函数,供其他模块调用,查询与指定用户同在至少一个空间的所有用户UID

func GetCommonSpaceID

func GetCommonSpaceID(ctx *config.Context, uid1, uid2 string) string

GetCommonSpaceID 查找两个用户共同所在的第一个 Space 返回 space_id 或空字符串(无共同 Space)

func GetSpaceMemberUIDs

func GetSpaceMemberUIDs(ctx *config.Context, spaceID string) ([]string, error)

GetSpaceMemberUIDs 获取指定 Space 的所有成员 UID

func GetUserDefaultSpaceID deprecated

func GetUserDefaultSpaceID(ctx *config.Context, uid string) string

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

func GetUserDefaultSpaceIDE(ctx *config.Context, uid string) (string, error)

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

type BotDetailModel struct {
	RobotID string // 机器人ID
	Name    string // 名称
	Avatar  string // 头像
}

BotDetailModel Bot 详情模型

type DB

type DB struct {
	// contains filtered or unexported fields
}

func NewDB

func NewDB(ctx *config.Context) *DB

func (*DB) IsMember

func (d *DB) IsMember(spaceId string, uid string) (bool, error)

IsMember 检查用户是否是 Space 成员

type DefaultCategoryProvisioner

type DefaultCategoryProvisioner func(ctx *config.Context, uid, spaceID string) error

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

type Manager struct {
	log.Log
	// contains filtered or unexported fields
}

Manager Space 后台管理 API

func NewManager

func NewManager(ctx *config.Context, space *Space) *Manager

NewManager 创建 Space 管理实例。space 参数用于复用业务侧的 Space 实例 (共享 executeJoinSpace / notifyApplicantJoinResult / loadKnownSpaceIDs), 避免创建冗余实例;space 为 nil 时会兜底自建(主要给老调用点留后路)。

func (*Manager) Route

func (m *Manager) Route(r *wkhttp.WKHttp)

Route 路由配置。所有路径统一使用复数 `/spaces/`,子资源按 REST 嵌套。 注:`/spaces/disabled` 作为静态路径必须先于 `/spaces/:space_id` 注册, Gin 内部会让静态路由优先匹配,但显式有序更稳妥。

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 的兜底链解析:

  1. user.name 非空 → 原样返回;
  2. 否则 user_verification.real_name 非空 → 返回实名;
  3. 都空 → 返回稳定占位符 "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

type Space struct {
	log.Log
	// contains filtered or unexported fields
}

Space 团队空间API

func New

func New(ctx *config.Context) *Space

New 创建Space实例

func (*Space) GetCoMemberUIDs

func (s *Space) GetCoMemberUIDs(uid string) ([]string, error)

GetCoMemberUIDs 获取与指定用户同在至少一个空间的所有用户UID(公开方法,供其他模块调用)

func (*Space) Route

func (s *Space) Route(r *wkhttp.WKHttp)

Route 路由配置

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  // 空间描述
	Creator        string  // 创建者uid
	MaxUsers       int     // 最大成员数 0.不限制
	PresetGroupIds *string // 预设群组ID列表(JSON数组)
	JoinMode       int     // 加入模式 0=直接加入 1=需要审批
	Status         int     // 状态 1.正常 0.已解散
	Version        int64   // 版本号
	db.BaseModel
}

SpaceModel 空间表模型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL