From a1ee756d1d4fe0a5383716e1536c0897d9ea972d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 09:04:41 +0000 Subject: [PATCH] chore: auto-fix lint & formatting [skip ci] --- app/pages/admin/[...slug].vue | 2 +- docs/api/admin.md | 48 +++++++++++++++++------------------ docs/guide/storage.md | 38 +++++++++++++-------------- docs/zh/api/admin.md | 48 +++++++++++++++++------------------ docs/zh/guide/storage.md | 38 +++++++++++++-------------- 5 files changed, 87 insertions(+), 87 deletions(-) diff --git a/app/pages/admin/[...slug].vue b/app/pages/admin/[...slug].vue index 8b11566..771b572 100644 --- a/app/pages/admin/[...slug].vue +++ b/app/pages/admin/[...slug].vue @@ -1,3 +1,3 @@ \ No newline at end of file + diff --git a/docs/api/admin.md b/docs/api/admin.md index 71fb02f..b3982dc 100644 --- a/docs/api/admin.md +++ b/docs/api/admin.md @@ -6,31 +6,31 @@ The console itself is served at `/admin`; its tabs are deep-linkable via the URL ## Endpoints -| Endpoint | Description | -| ----------------------------------------------- | ----------------------------------------------------------------- | -| `GET /admin` | Config console UI | -| `GET /admin/login` | Start admin sign-in (GitHub OAuth) | -| `GET /admin/logout` | Sign out and destroy the session | -| `GET /admin/invite?token=…` | Accept a group invite (browser page) | -| `GET /admin/api/me` | Current session, scope, groups, and roles | -| `GET /admin/api/routes` | List routes (scoped to access) | -| `PUT /admin/api/routes` | Replace routes (owner/admin per group) | -| `GET /admin/api/groups` | List groups + the signed-in user's role in each | -| `PUT /admin/api/groups` | Replace groups (super: all; owner: own only) | -| `GET /admin/api/groups/:id/routes` | List a group's routes | -| `PUT /admin/api/groups/:id/routes` | Replace a group's routes (owner/admin) | -| `PUT /admin/api/groups/:id/rename` | Rename a group (owner); routes, webhook secret and invites follow | -| `GET /admin/api/groups/:id/invites` | List pending invites (owner) | -| `POST /admin/api/groups/:id/invites` | Create an invite link (owner) | -| `DELETE /admin/api/invites/:token` | Revoke an invite (owner) | -| `GET /admin/api/groups/:id/webhook` | Group webhook endpoint info (owner) | -| `POST /admin/api/groups/:id/webhook/regenerate` | Generate/regenerate the group webhook secret (owner) | -| `DELETE /admin/api/groups/:id/webhook` | Disable the group webhook ingress (owner) | -| `GET /admin/api/logs` | Send logs (scoped to accessible routes) | -| `GET /admin/api/logs/:id` | Single send-log entry (scoped) | -| `GET /admin/api/audit` | Audit log (scoped to accessible groups) | +| Endpoint | Description | +| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| `GET /admin` | Config console UI | +| `GET /admin/login` | Start admin sign-in (GitHub OAuth) | +| `GET /admin/logout` | Sign out and destroy the session | +| `GET /admin/invite?token=…` | Accept a group invite (browser page) | +| `GET /admin/api/me` | Current session, scope, groups, and roles | +| `GET /admin/api/routes` | List routes (scoped to access) | +| `PUT /admin/api/routes` | Replace routes (owner/admin per group) | +| `GET /admin/api/groups` | List groups + the signed-in user's role in each | +| `PUT /admin/api/groups` | Replace groups (super: all; owner: own only) | +| `GET /admin/api/groups/:id/routes` | List a group's routes | +| `PUT /admin/api/groups/:id/routes` | Replace a group's routes (owner/admin) | +| `PUT /admin/api/groups/:id/rename` | Rename a group (owner); routes, webhook secret and invites follow | +| `GET /admin/api/groups/:id/invites` | List pending invites (owner) | +| `POST /admin/api/groups/:id/invites` | Create an invite link (owner) | +| `DELETE /admin/api/invites/:token` | Revoke an invite (owner) | +| `GET /admin/api/groups/:id/webhook` | Group webhook endpoint info (owner) | +| `POST /admin/api/groups/:id/webhook/regenerate` | Generate/regenerate the group webhook secret (owner) | +| `DELETE /admin/api/groups/:id/webhook` | Disable the group webhook ingress (owner) | +| `GET /admin/api/logs` | Send logs (scoped to accessible routes) | +| `GET /admin/api/logs/:id` | Single send-log entry (scoped) | +| `GET /admin/api/audit` | Audit log (scoped to accessible groups) | | `GET /admin/api/metrics` | Delivery metrics (totals, failure rate, per platform/event/status, recent failures; recent failures scoped to accessible groups for non-super) | -| `GET /admin/api/delivery/:deliveryId` | All send-log attempts for one delivery (group-scoped) | +| `GET /admin/api/delivery/:deliveryId` | All send-log attempts for one delivery (group-scoped) | ## Validation diff --git a/docs/guide/storage.md b/docs/guide/storage.md index e36d91e..5f51138 100644 --- a/docs/guide/storage.md +++ b/docs/guide/storage.md @@ -2,26 +2,26 @@ ## KV Storage Layout -| Key Pattern | Value | TTL | -| ------------------------------ | ----------------------------------------------------------------------------- | ------------------ | -| `config:routes` | JSON array of routes | Permanent | -| `config:groups` | JSON array of groups | Permanent | -| `session:{id}` | Admin session `{ userId, login }` | 7 days | -| `token:{userId}` | `{ userId, accessToken, expiresAt, refreshToken? }` | 0.9 × token expiry | -| `token-reverse:{sha256}` | User id for reverse lookup by token | 0.9 × token expiry | -| `state:{hex}` | `{ redirectTo, expiresAt, discordUserId?, telegramUserId?, telegramChatId? }` | 600 seconds | -| `invite:{token}` | `{ groupId, role, expiresAt, createdBy, note? }` | 7 days | -| `invite:group:{id}` | Token index per group (keeps invite listing consistent) | Permanent | -| `delivery:{provider}:{groupId}:{id}` | Webhook delivery dedup (provider- and tenant-scoped) | 300 seconds | +| Key Pattern | Value | TTL | +| ------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------ | +| `config:routes` | JSON array of routes | Permanent | +| `config:groups` | JSON array of groups | Permanent | +| `session:{id}` | Admin session `{ userId, login }` | 7 days | +| `token:{userId}` | `{ userId, accessToken, expiresAt, refreshToken? }` | 0.9 × token expiry | +| `token-reverse:{sha256}` | User id for reverse lookup by token | 0.9 × token expiry | +| `state:{hex}` | `{ redirectTo, expiresAt, discordUserId?, telegramUserId?, telegramChatId? }` | 600 seconds | +| `invite:{token}` | `{ groupId, role, expiresAt, createdBy, note? }` | 7 days | +| `invite:group:{id}` | Token index per group (keeps invite listing consistent) | Permanent | +| `delivery:{provider}:{groupId}:{id}` | Webhook delivery dedup (provider- and tenant-scoped) | 300 seconds | | `delivery-state:{provider}:{groupId}:{id}` | Queue delivery state (`pending`/`processing`/`delivered`/`retrying`/`failed`/`dead`) | 1 day | -| `queue:payload:{provider}:{groupId}:{id}` | Oversized webhook payload parked for the queue consumer | 1 day | -| `nonce:{nonce}` | Custom-webhook replay protection nonce (single use) | 600 seconds | -| `tenant:{groupId}` | Per-group webhook secret (64-char hex, generated from the console) | Permanent | -| `msg:{routeId}:{key}:{target}` | Message id tracking for in-place updates (e.g. `workflow_run` / `check_run`) | 7 days | -| `cmd:guild:{id}` | Guild id whose commands were registered (dedup) | Permanent | -| `cmd:registered:global` | Global command registration marker (dedup) | 1 day | -| `config:discord-app-id` | Cached Discord application id | Permanent | -| `i18n:{lang}` | Translation overrides merged on top of English | Permanent | +| `queue:payload:{provider}:{groupId}:{id}` | Oversized webhook payload parked for the queue consumer | 1 day | +| `nonce:{nonce}` | Custom-webhook replay protection nonce (single use) | 600 seconds | +| `tenant:{groupId}` | Per-group webhook secret (64-char hex, generated from the console) | Permanent | +| `msg:{routeId}:{key}:{target}` | Message id tracking for in-place updates (e.g. `workflow_run` / `check_run`) | 7 days | +| `cmd:guild:{id}` | Guild id whose commands were registered (dedup) | Permanent | +| `cmd:registered:global` | Global command registration marker (dedup) | 1 day | +| `config:discord-app-id` | Cached Discord application id | Permanent | +| `i18n:{lang}` | Translation overrides merged on top of English | Permanent | ## D1 Storage Layout diff --git a/docs/zh/api/admin.md b/docs/zh/api/admin.md index 19f892e..0ee98de 100644 --- a/docs/zh/api/admin.md +++ b/docs/zh/api/admin.md @@ -6,31 +6,31 @@ ## 端点 -| 端点 | 说明 | -| ----------------------------------------------- | -------------------------------------------------------- | -| `GET /admin` | 配置控制台页面 | -| `GET /admin/login` | 开始管理员登录(GitHub OAuth) | -| `GET /admin/logout` | 退出登录并销毁会话 | -| `GET /admin/invite?token=…` | 接受分组邀请(浏览器页面) | -| `GET /admin/api/me` | 当前会话、权限范围、分组与角色 | -| `GET /admin/api/routes` | 列出路由(按权限过滤) | -| `PUT /admin/api/routes` | 替换路由(按分组 owner/admin) | -| `GET /admin/api/groups` | 列出分组 + 当前用户在各分组的角色 | -| `PUT /admin/api/groups` | 替换分组(超级管理员全部;owner 仅自己的) | -| `GET /admin/api/groups/:id/routes` | 列出某分组的路由 | -| `PUT /admin/api/groups/:id/routes` | 替换某分组的路由(owner/admin) | -| `PUT /admin/api/groups/:id/rename` | 重命名分组(owner);路由、webhook secret 与邀请自动跟随 | -| `GET /admin/api/groups/:id/invites` | 列出待处理的邀请(owner) | -| `POST /admin/api/groups/:id/invites` | 创建邀请链接(owner) | -| `DELETE /admin/api/invites/:token` | 撤销邀请(owner) | -| `GET /admin/api/groups/:id/webhook` | 分组 webhook 端点信息(owner) | -| `POST /admin/api/groups/:id/webhook/regenerate` | 生成/重新生成分组 webhook secret(owner) | -| `DELETE /admin/api/groups/:id/webhook` | 停用分组 webhook 入口(owner) | -| `GET /admin/api/logs` | 发送日志(按可访问的路由过滤) | -| `GET /admin/api/logs/:id` | 单条发送日志(按权限过滤) | -| `GET /admin/api/audit` | 审计日志(按可访问的分组过滤) | +| 端点 | 说明 | +| ----------------------------------------------- | ------------------------------------------------------------------------------------ | +| `GET /admin` | 配置控制台页面 | +| `GET /admin/login` | 开始管理员登录(GitHub OAuth) | +| `GET /admin/logout` | 退出登录并销毁会话 | +| `GET /admin/invite?token=…` | 接受分组邀请(浏览器页面) | +| `GET /admin/api/me` | 当前会话、权限范围、分组与角色 | +| `GET /admin/api/routes` | 列出路由(按权限过滤) | +| `PUT /admin/api/routes` | 替换路由(按分组 owner/admin) | +| `GET /admin/api/groups` | 列出分组 + 当前用户在各分组的角色 | +| `PUT /admin/api/groups` | 替换分组(超级管理员全部;owner 仅自己的) | +| `GET /admin/api/groups/:id/routes` | 列出某分组的路由 | +| `PUT /admin/api/groups/:id/routes` | 替换某分组的路由(owner/admin) | +| `PUT /admin/api/groups/:id/rename` | 重命名分组(owner);路由、webhook secret 与邀请自动跟随 | +| `GET /admin/api/groups/:id/invites` | 列出待处理的邀请(owner) | +| `POST /admin/api/groups/:id/invites` | 创建邀请链接(owner) | +| `DELETE /admin/api/invites/:token` | 撤销邀请(owner) | +| `GET /admin/api/groups/:id/webhook` | 分组 webhook 端点信息(owner) | +| `POST /admin/api/groups/:id/webhook/regenerate` | 生成/重新生成分组 webhook secret(owner) | +| `DELETE /admin/api/groups/:id/webhook` | 停用分组 webhook 入口(owner) | +| `GET /admin/api/logs` | 发送日志(按可访问的路由过滤) | +| `GET /admin/api/logs/:id` | 单条发送日志(按权限过滤) | +| `GET /admin/api/audit` | 审计日志(按可访问的分组过滤) | | `GET /admin/api/metrics` | 投递指标(总计、失败率、按平台/事件/状态、最近失败;非超管按可访问分组过滤最近失败) | -| `GET /admin/api/delivery/:deliveryId` | 单次投递的全部发送日志(按分组过滤) | +| `GET /admin/api/delivery/:deliveryId` | 单次投递的全部发送日志(按分组过滤) | ## 校验 diff --git a/docs/zh/guide/storage.md b/docs/zh/guide/storage.md index 174b9f8..e9fe1f2 100644 --- a/docs/zh/guide/storage.md +++ b/docs/zh/guide/storage.md @@ -2,26 +2,26 @@ ## KV 存储布局 -| 键模式 | 值 | TTL | -| ------------------------------ | ----------------------------------------------------------------------------- | ------------------ | -| `config:routes` | 路由 JSON 数组 | 永久 | -| `config:groups` | 分组 JSON 数组 | 永久 | -| `session:{id}` | 管理员会话 `{ userId, login }` | 7 天 | -| `token:{userId}` | `{ userId, accessToken, expiresAt, refreshToken? }` | 0.9 × Token 有效期 | -| `token-reverse:{sha256}` | 用于按 Token 反查的用户 id | 0.9 × Token 有效期 | -| `state:{hex}` | `{ redirectTo, expiresAt, discordUserId?, telegramUserId?, telegramChatId? }` | 600 秒 | -| `invite:{token}` | `{ groupId, role, expiresAt, createdBy, note? }` | 7 天 | -| `invite:group:{id}` | 每组的 Token 索引(保证邀请列表一致性) | 永久 | -| `delivery:{provider}:{groupId}:{id}` | Webhook 投递去重(按 provider 与租户隔离) | 300 秒 | +| 键模式 | 值 | TTL | +| ------------------------------------------ | ----------------------------------------------------------------------------- | ------------------ | +| `config:routes` | 路由 JSON 数组 | 永久 | +| `config:groups` | 分组 JSON 数组 | 永久 | +| `session:{id}` | 管理员会话 `{ userId, login }` | 7 天 | +| `token:{userId}` | `{ userId, accessToken, expiresAt, refreshToken? }` | 0.9 × Token 有效期 | +| `token-reverse:{sha256}` | 用于按 Token 反查的用户 id | 0.9 × Token 有效期 | +| `state:{hex}` | `{ redirectTo, expiresAt, discordUserId?, telegramUserId?, telegramChatId? }` | 600 秒 | +| `invite:{token}` | `{ groupId, role, expiresAt, createdBy, note? }` | 7 天 | +| `invite:group:{id}` | 每组的 Token 索引(保证邀请列表一致性) | 永久 | +| `delivery:{provider}:{groupId}:{id}` | Webhook 投递去重(按 provider 与租户隔离) | 300 秒 | | `delivery-state:{provider}:{groupId}:{id}` | 队列投递状态(`pending`/`processing`/`delivered`/`retrying`/`failed`/`dead`) | 1 天 | -| `queue:payload:{provider}:{groupId}:{id}` | 暂存供队列消费者读取的超大 webhook 负载 | 1 天 | -| `nonce:{nonce}` | 自定义 webhook 重放防护 nonce(一次性) | 600 秒 | -| `tenant:{groupId}` | 分组 webhook secret(64 位 hex,控制台生成) | 永久 | -| `msg:{routeId}:{key}:{target}` | 原地更新用消息 id 追踪(如 `workflow_run` / `check_run`) | 7 天 | -| `cmd:guild:{id}` | 已注册命令的服务器 id(去重) | 永久 | -| `cmd:registered:global` | 全局命令注册标记(去重) | 1 天 | -| `config:discord-app-id` | 缓存的 Discord 应用 id | 永久 | -| `i18n:{lang}` | 叠加在英文之上的翻译覆盖 | 永久 | +| `queue:payload:{provider}:{groupId}:{id}` | 暂存供队列消费者读取的超大 webhook 负载 | 1 天 | +| `nonce:{nonce}` | 自定义 webhook 重放防护 nonce(一次性) | 600 秒 | +| `tenant:{groupId}` | 分组 webhook secret(64 位 hex,控制台生成) | 永久 | +| `msg:{routeId}:{key}:{target}` | 原地更新用消息 id 追踪(如 `workflow_run` / `check_run`) | 7 天 | +| `cmd:guild:{id}` | 已注册命令的服务器 id(去重) | 永久 | +| `cmd:registered:global` | 全局命令注册标记(去重) | 1 天 | +| `config:discord-app-id` | 缓存的 Discord 应用 id | 永久 | +| `i18n:{lang}` | 叠加在英文之上的翻译覆盖 | 永久 | ## D1 存储布局