API 参考 / me

我的通知标记已读(跨项目:全部或指定若干条)

POST /api/v1/me/notifications/read · markMyNotificationsRead

中央面「跨项目标记已读」:把当前用户在【所有有成员关系的项目】里的通知标记为已读。与 GET /me/notifications 对称,对每个成员项目在其自己的 TenantTx/RLS 内先 catch-up 投影再标记 (不跨库裸 SQL、不建聚合表),有界并发 fan-out。actor 从会话取,绝不信任前端传入的用户 id。 两种模式:all=true 标记全部未读;all=false + 非空 ids 只标记指定的几条(B-00277,中央面铃铛点开 单条即已读)。中央面拿不到「这条通知属于哪个项目」的可信上下文,故【不在中央面消歧】——同一份 id 子集下发给每个成员项目,各项目只标记确实属于它、且属于当前用户的行(RLS + user_id 双重过滤), 不属于的 id 匹配不到、无副作用。all=false 且 ids 为空时返回 422。 部分失败可见:某项目业务库不可达 / 出错时 【不静默跳过】——计入 failedProjectCount 返回,调用方据此给出可见告警并提示重试,绝不当作全部成功。

PAT 只看得到 token 绑定的那一个项目(B-00328):API Token 在哪个项目设置页创建就只对 哪个项目生效,而本端点是跨项目聚合——因此用 PAT 调用时,聚合范围收敛到 token 所属项目 (不是拒绝调用:Agent 用 PAT 读自己项目的东西是正当用法)。会话 cookie 调用方不受影响, 仍聚合全部成员项目。

鉴权:项目 API Token(Authorization: Bearer wfp_…)。详见 Agent 接入。

请求体

all(必填)
boolean —— 为 true 时跨【当前用户所有成员项目】把该用户全部未读标记为已读(ids 忽略)。为 false 时必须给出非空 ids,否则端点返回 422。
ids
string[] —— 要标记为已读的通知 id(all=false 时必填非空,all=true 时忽略)。中央面拿不到「这条通知属于哪个项目」的可信上下文,故不在此消歧:同一份 id 子集下发给每个成员项目,各项目在自己的 TenantTx/RLS 内只标记确实属于它、且属于当前用户的那些行,不属于的 id 自然匹配不到、无副作用。

响应字段 · 200

unreadCount(必填)
integer —— 操作后当前用户【跨所有成员项目】的未读通知总数之和——仅累计标记成功的项目;失败项目的未读未知、不纳入此数,故有失败时本数可能偏低。是否有残留一律以 failedProjectCount>0 为准,不得据 unreadCount==0 判定「全部已读」。
failedProjectCount(必填)
integer —— 标记失败(业务库不可达 / 出错)的项目数。>0 表示这些项目的通知未能标记为已读,调用方必须给出可见告警并提示重试,绝不静默当作全部成功(mutation 失败必须可见)。

错误

请求示例(curl)

curl -X POST "https://workflow.games/api/v1/me/notifications/read" \
  -H "Authorization: Bearer wfp_…" \
  -H "content-type: application/json" \
  --data '{"all":true,"ids":["018f3c2e-0000-7000-8000-000000000000"]}'

响应示例

HTTP/1.1 200
{
  "unreadCount": 1,
  "failedProjectCount": 1
}

合同真值:OpenAPI 3.1(0.1.0)。

相关:Agent 接入指南 · 使用指南 · API 参考索引

Workflow 正在加载…