外观
邀请加入
当前实现限制
WorkspaceUserServiceImpl.queryPoByUserIdAndWorkspaceId 与 queryPoByWorkspaceIdForOwner 实际调用必取接口,无结果会抛异常。因此首次加入成员会在检查阶段失败,创建空间或默认初始化可能已先写入空间记录。本文的创建、邀请、加入步骤说明接口顺序;需先修正并验证该调用链才能跑通新成员流程。isAdmin、isOwner、contains 的缺失成员情况也可能抛异常,不能统一当作 false。详见重点文件与方法。
所有者或管理员创建邀请码,另一个已登录用户使用该码加入空间。邀请确定目标空间和加入角色,不绑定指定收件人;模块不发送短信、邮件,也不自动生成前端分享页面。
创建邀请
请求 POST /api/app/workspace/user/invite/,以当前登录用户校验目标空间的所有者或管理员身份。
json
{
"workspaceId": "10001",
"permission": "MEMBER",
"expiredTime": "2099-01-01 18:00:00"
}示例时间仅用于展示格式,实际使用时设置所需有效期。
| 字段 | 规则 |
|---|---|
workspaceId | 必填,目标空间 ID |
permission | 必填,只能为 ADMIN 或 MEMBER,不能邀请为 OWNER |
expiredTime | 可省略,DTO 检查时默认设置为服务端当前时间加一天;使用 yyyy-MM-dd HH:mm:ss |
创建成功后,data 为 WorkspaceUserInviteVo,包含 id、workspaceId、UUID 字符串 inviteCode、permission、enabled=1、expiredTime 及基础审计字段。创建响应没有额外查询 workspace 简要对象。
当前创建校验不拒绝过去时间;这类邀请码创建后,在加入时会报过期。过期比较使用服务端 LocalDateTime.now(),时间没有时区偏移,客户端和服务端应约定一致的业务时间。
查看与撤销邀请
以下路径统一加前缀 /api/app/workspace/user/invite。响应包装和分页格式见接口约定。当前没有管理端邀请 Controller。
| 方法与路径 | 请求体 | 返回数据与行为 |
|---|---|---|
POST /page/{workspaceId} | WorkspaceUserInviteQuery | 分页邀请列表;路径空间 ID 覆盖请求体的空间 ID |
GET /id/{id} | 无 | 按邀请记录 ID 获取详情,补充空间简要信息 |
GET /code/{inviteCode} | 无 | 根据邀请码获取详情;找不到时返回 INVITE_CODE_NOT_EXIST |
DELETE /id/{id} | 无 | 当前用户须为邀请所属空间的所有者或管理员;删除邀请,成功时无业务数据 |
分页 Query 支持 inviteCode 精确匹配、workspaceId、page、rows,按创建时间及 ID 倒序排列。列表后处理会填充 workspace;当前不支持按启用状态、有效期或角色筛选。
分页和两个详情入口都没有显式校验调用者的空间成员身份。应用应按实际分享与管理场景增加访问策略,不能将这些读取接口默认视为“仅管理员可见”。按邀请码预览只检查记录存在,不检查启用状态和有效期;预览成功不代表仍可加入。
删除邀请可阻止后续用该记录加入,但不会移除已经加入的成员。模型包含 enabled 字段,当前预置 Controller 没有启停、编辑或续期接口;需要替换有效期或加入角色时,创建新邀请并撤销旧邀请。
使用邀请码加入
以被邀请用户的登录会话请求 POST /api/app/workspace/user/invite/join/{inviteCode},不需要 JSON 请求体。服务按以下顺序处理:
- 查找邀请码,检查记录存在。
- 检查
enabled是否为 0,检查expiredTime是否早于服务端当前时间。 - 按空间 ID 与当前用户 ID 加锁,确认没有已有成员关系。
- 写入成员关系,角色取自邀请,
inviteCode记录加入来源。
加入成功返回无业务数据的成功响应,可通过成员查询或当前用户的空间列表确认结果。
邀请码不是一次性凭证:没有使用次数上限,也不会在加入后自动失效。不同用户可在有效期内反复使用同一个码;同一用户已在空间时再次加入会报重复。当前加入流程没有再次检查空间是否已删除,也没有重新验证邀请创建者是否仍为管理员,应用删除空间或调整邀请策略时需同步处理邀请。
处理失败与自定义接入
| 业务码 | 含义与处理 |
|---|---|
WORKSPACE_CANNOT_EMPTY / PERMISSION_CANNOT_EMPTY | 补齐创建邀请所需字段 |
CANNOT_SET_TO_OWNER | 改用 ADMIN 或 MEMBER;所有权通过转让处理 |
INVITE_ONLY_ADMIN_CAN_CREATE_INVITE | 当前用户不是目标空间的所有者或管理员 |
INVITE_ONLY_ADMIN_CAN_DELETE_INVITE | 当前用户无权撤销该空间邀请 |
INVITE_CODE_NOT_EXIST | 邀请不存在或已删除,重新获取邀请 |
INVITE_CODE_DISABLED | 邀请被禁用,联系空间管理员 |
INVITE_CODE_EXPIRED | 有效期已过,重新创建邀请 |
USER_ALREADY_IN_WORKSPACE | 当前用户已经加入,无需重复加入 |
自行接入 Service 时,WorkspaceUserInviteService.create(userId, workspaceId, permission, expiredTime) 会校验创建者的管理员身份,但不会执行 DTO 的角色校验与默认时间初始化。调用方需先执行 DTO check() 或实现等价校验,传入非空有效期及合法加入角色。join(userId, inviteCode) 中的用户 ID 也必须由可信身份获取。