跳转到正文

邀请加入

当前实现限制

WorkspaceUserServiceImpl.queryPoByUserIdAndWorkspaceIdqueryPoByWorkspaceIdForOwner 实际调用必取接口,无结果会抛异常。因此首次加入成员会在检查阶段失败,创建空间或默认初始化可能已先写入空间记录。本文的创建、邀请、加入步骤说明接口顺序;需先修正并验证该调用链才能跑通新成员流程。isAdminisOwnercontains 的缺失成员情况也可能抛异常,不能统一当作 false。详见重点文件与方法

所有者或管理员创建邀请码,另一个已登录用户使用该码加入空间。邀请确定目标空间和加入角色,不绑定指定收件人;模块不发送短信、邮件,也不自动生成前端分享页面。

创建邀请

请求 POST /api/app/workspace/user/invite/,以当前登录用户校验目标空间的所有者或管理员身份。

json
{
  "workspaceId": "10001",
  "permission": "MEMBER",
  "expiredTime": "2099-01-01 18:00:00"
}

示例时间仅用于展示格式,实际使用时设置所需有效期。

字段规则
workspaceId必填,目标空间 ID
permission必填,只能为 ADMINMEMBER,不能邀请为 OWNER
expiredTime可省略,DTO 检查时默认设置为服务端当前时间加一天;使用 yyyy-MM-dd HH:mm:ss

创建成功后,dataWorkspaceUserInviteVo,包含 idworkspaceId、UUID 字符串 inviteCodepermissionenabled=1expiredTime 及基础审计字段。创建响应没有额外查询 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 精确匹配、workspaceIdpagerows,按创建时间及 ID 倒序排列。列表后处理会填充 workspace;当前不支持按启用状态、有效期或角色筛选。

分页和两个详情入口都没有显式校验调用者的空间成员身份。应用应按实际分享与管理场景增加访问策略,不能将这些读取接口默认视为“仅管理员可见”。按邀请码预览只检查记录存在,不检查启用状态和有效期;预览成功不代表仍可加入。

删除邀请可阻止后续用该记录加入,但不会移除已经加入的成员。模型包含 enabled 字段,当前预置 Controller 没有启停、编辑或续期接口;需要替换有效期或加入角色时,创建新邀请并撤销旧邀请。

使用邀请码加入

以被邀请用户的登录会话请求 POST /api/app/workspace/user/invite/join/{inviteCode},不需要 JSON 请求体。服务按以下顺序处理:

  1. 查找邀请码,检查记录存在。
  2. 检查 enabled 是否为 0,检查 expiredTime 是否早于服务端当前时间。
  3. 按空间 ID 与当前用户 ID 加锁,确认没有已有成员关系。
  4. 写入成员关系,角色取自邀请,inviteCode 记录加入来源。

加入成功返回无业务数据的成功响应,可通过成员查询或当前用户的空间列表确认结果。

邀请码不是一次性凭证:没有使用次数上限,也不会在加入后自动失效。不同用户可在有效期内反复使用同一个码;同一用户已在空间时再次加入会报重复。当前加入流程没有再次检查空间是否已删除,也没有重新验证邀请创建者是否仍为管理员,应用删除空间或调整邀请策略时需同步处理邀请。

处理失败与自定义接入

业务码含义与处理
WORKSPACE_CANNOT_EMPTY / PERMISSION_CANNOT_EMPTY补齐创建邀请所需字段
CANNOT_SET_TO_OWNER改用 ADMINMEMBER;所有权通过转让处理
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 也必须由可信身份获取。