b7640e9be4
CI / changes (push) Has been cancelled
CI / Build (push) Has been cancelled
Deploy Docs / build (push) Has been cancelled
Docker Build and Test / Build and Test Docker Image (push) Has been cancelled
Docker Publish (release, main, dry-run) / Pre-publish Tests (push) Has been cancelled
CI / Frontend — svelte-check, ESLint, Stylelint, Prettier (push) Has been cancelled
CI / Message-bus spec — AsyncAPI + TypeScript DTO drift (push) Has been cancelled
CI / Migration ordering (new migrations postdate target branch) (push) Has been cancelled
CI / Rustfmt (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Wasm — fmt + clippy (push) Has been cancelled
CI / Wasm — release tests (push) Has been cancelled
CI / Plugins — fixtures + runtime tests (push) Has been cancelled
CI / Server Unit and Functionnal Tests (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / API, WebDAV & OIDC tests (push) Has been cancelled
CI / Bundled-assets binary — embed + SPA-serve integration (push) Has been cancelled
CI / WebDAV RFC 4918 — litmus (59/59) (push) Has been cancelled
CI / CalDAV + CardDAV — python-caldav (push) Has been cancelled
CI / Frontend end-to-end tests (via Playwright) (push) Has been cancelled
Deploy Docs / deploy (push) Has been cancelled
Docker Publish (release, main, dry-run) / Build & Push Multi-Arch (push) Has been cancelled
9.9 KiB
9.9 KiB
status.md — 计划与进度记录
本文件由 agent 自动维护,规则见 AGENTS.md 末尾的"本地 fork 维护规则"一节。 新条目加在"进行中"区域顶部;完成后移入"已完成"。
进行中
(暂无)
已完成
[2026-09-19] 缩略图路径 DB 点查缓存(find_attached_blob 进程内缓存)
- 状态: 已完成(commit
d33d1932;cargo fmt --check ✓;clippy --all-features --all-targets -D warnings 0 警告 ✓;cargo test --lib927 通过 0 失败,含新增 5 个缓存契约测试 ✓) - 计划: 给缩略图热路径(ETag 计算
thumbnail_content_id+ tier 2b)每次请求都要打的find_attached_blobDB 点查加进程内缓存(moka::future + try_get_with,正+负缓存,Err 不入缓存;写路径成功后失效;删除经ThumbnailRefreshHook::on_file_deleted搭车失效 + 60s TTL 兜底)。缓解"每次进照片墙 = 每张可见图 1-2 次 DB 点查"的负载。 - 改动文件:
src/infrastructure/services/dedup_service.rs— 模块顶ATTACHED_BLOB_CACHE_*常量 +AttachedBlobKey+AttachedLookupFault;attached_blob_cache字段/build_attached_blob_cache;find_attached_blob缓存包装(SQL 下移find_attached_blob_uncached返回sqlx::Result,Err 永不入缓存);store_attached_blob/store_attached_blob_if_absent成功路径失效(Inserted臂失效 + AlreadyPresent 读回注释);invalidate_attached_blobs_for_file;5 个纯内存单测src/infrastructure/services/thumbnail_service.rs—ThumbnailRefreshHook::on_file_deleted搭车失效(补self.dedup.clone())docs/architecture/caching.md— Layer 1 表新增 Attached blob 行 + "The attached-blob cache" 小节(键/正负缓存/两条诚实规则)docs/architecture/derived-and-attached-blobs.md— Lifecycle 节新增"Reads are cached"段落(缓存失效协议)
- 仅本地文件: 无新增(
status.md本身) - 上游冲突风险: 低 — 两个上游文件均为局部追加,无重排
- 备注: 本机此前无 Rust 工具链,本次顺带装好 rustup stable 1.98.1(minimal+clippy+rustfmt)、VS Build Tools 2022(MSVC 14.44 + SDK 10.0.26100)、Node 前端构建(
static-dist/已生成)——后续 agent 可直接跑cargo检查;注意 shell 无管理员权限,提权操作需 UAC 确认
[2026-09-19] 文档更新:公开分享端点与落地页行为
- 状态: 已完成
- 计划: 按 AGENTS.md 的文档约定,把本会话的分享相关修复/功能同步进架构文档与用户指南
- 改动文件:
docs/architecture/share-integration.md— 公开路由表补全(download/contents/file/zip 共 6 条);新增 "/file/{file_id} 文件作用域"(file 分享仅限分享项本身、folder 分享限子树、其余 404 反枚举)与"落地页 meta 富化"(mime_type/size 仅展示、查询失败不失败响应)两小节docs/guide/sharing.md— 新增 "What recipients see" 用户向小节(单文件内联预览/视频流式拖动、文件夹浏览 + ZIP)
- 上游冲突风险: 低 — 两文档均属低频改动区
[2026-09-19] 文件页刷新按钮
- 状态: 已完成(vitest 467 通过;svelte-check 0 错误;我改的文件 prettier/eslint 全绿)
- 计划: actions 工具栏加手动刷新,点击重拉当前文件夹列表
- 改动文件:
frontend/src/routes/files/[...path]/+page.svelte— "New folder" 右侧新增刷新按钮:load(true)重置分页拉第 1 页,loading时禁用,图标repeat(沿用 AdminJobsPanel 先例),testidfiles-refresh-btnfrontend/static/locales/{en,zh,zh-TW}.json—common.refresh(刷新 / 重新整理)frontend/src/routes/files/page.test.ts— 点击刷新 →fetchFolderPage第二次调用
- 上游冲突风险: 中 — files 页与 locales 是上游活跃区,但改动面小
[2026-09-19] 文件页文件夹内容统计
- 状态: 已完成(验证同上)
- 计划: 进入文件夹时在面包屑旁显示内容统计
- 改动文件:
frontend/src/routes/files/[...path]/+page.svelte—folderStatderived(对rlItems即点文件过滤后的展示列表计数;分页未完时数字尾随 "+");统计 span 渲染在 breadcrumb snippet 内(.rl-breadcrumb本身是 flex);空文件夹不显示frontend/static/locales/{en,zh,zh-TW}.json—files.folder_stat(其余 13 语言回退英文)frontend/src/routes/files/page.test.ts— 精确计数 / 分页 "+" 两条测试
- 上游冲突风险: 中 — 同上
[2026-09-19] 开发环境修复 + 测试 locale 固定
- 状态: 已完成
- 计划: 本机装 Node 跑前端检查;修复暴露出的换行符与 locale 问题
- 改动文件:
frontend/src/lib/utils/time.test.ts—vi.spyOn(Intl, 'RelativeTimeFormat')固定enlocale(time.ts 用运行时默认 locale,中文系统上/second/等英文断言必挂);注意 mock 需普通函数(time.ts 经new调用)- 环境级(无仓库 diff): winget 装 Node 26.7.0;
core.autocrlf=false(仓库级)+git rm --cached -r . && git reset --hard全量重写工作区为 LF——修复 276 个文件的 Prettier 假报错
- 仅本地文件: 无新增
- 上游冲突风险: 低 — LF 归一化后与上游(CI 全 LF)一致;建议后续给
.gitattributes加* text=auto eol=lf(未做,待定)
[2026-09-19] 文件页模糊筛选搜索 + 批量操作共享化
- 状态: 已完成(
npm run check0 错误 0 警告;vitest run467 个测试全部通过) - 计划:
- 文件页(
/files/[...path])新增搜索过滤栏:关键词(防抖)+ 类型/大小/时间预设 + 递归开关, 筛选生效时列表切换为当前文件夹的递归搜索(GET /api/search的folder_id+recursive, 空query后端视为匹配全部),支持结果多选/全选 + 批量收藏/移动/复制/下载/删除 - 批量操作提取为共享 composable,
/search结果页同步接入选择 + 批量操作(项目去重规范) - 两处页内裸
apiFetch(favorites/batch、batch/download)改为 endpoint 封装
- 文件页(
- 改动文件:
- 新增(仅本地):
frontend/src/lib/components/SearchFilterBar.svelte— 搜索过滤栏组件(关键词 + 高级筛选 + 递归开关)frontend/src/lib/composables/useResourceActions.svelte.ts— 共享批量操作(收藏/下载/删除/移动/复制 + MoveDialog 状态)frontend/src/lib/utils/searchFilters.ts— 类型/大小/时间预设模型 →SearchOptions映射frontend/src/lib/utils/mapLimit.ts— 有界并发工具(自文件页提取)- 以上各文件的 Vitest 测试(
*.test.ts)
- 修改(上游文件):
frontend/src/routes/files/[...path]/+page.svelte— 搜索模式状态/runSearch/模式切换/Escape 优先级/深链兼容;批量 handler 换用 composablefrontend/src/routes/search/+page.svelte— 接入选择 + 批量操作;筛选逻辑改用共享 searchFilters;MoveDialog 绑定 composablefrontend/src/lib/api/endpoints/batch.ts— 新增downloadBatch()frontend/src/lib/api/endpoints/favorites.ts— 新增addFavoritesBatch()frontend/src/routes/files/page.test.ts、frontend/src/routes/search/page.test.ts— mock 补齐 + 新增搜索模式/批量删除测试frontend/static/locales/*.json(16 个语言文件)— 新增filter.*6 个 key(zh/zh-TW 为真实翻译)
- 新增(仅本地):
- 仅本地文件:
status.md、上述新增的 4 个源文件及其测试 - 上游冲突风险: 高 — locales 与两个页面文件是上游活跃区;页面文件改动较大(files 页 ~490 行、search 页 ~170 行 diff),合并时需逐块核对本地意图
- 设计要点(合并上游时用于核对行为):
- 批量操作参数化接口:
getItems/getSelected/clearSelection/onChanged/afterDelete回调注入; 文件页getItems按模式切换(searchActive ? searchItems : orderedItems),onChanged按模式重跑搜索或重载目录 - 删除保持 per-item
mapLimit(ids, 6)行为(后端POST /api/batch/trash批量软删存在,切换记为可选后续) - 搜索分页 limit 50;"全选"只覆盖已加载页(与 ResourceList 既有语义一致)
- 文件页搜索 wire 层
type排序映射为name(SortBy无 type),modified_at映射为updated_at;始终传 sortBy 不传 relevance - Escape 优先级:清除选中 → 清除筛选;过滤输入框内 Escape 自行处理并 stopPropagation
- 批量操作参数化接口:
[2026-09-15] 单文件分享无法流式预览修复
- 状态: 已完成(commit
68e21f4b;本机无 Rust 环境,fmt/clippy/api-test 未能在本地运行——push 前需在有 Rust 的环境跑just check+just api-test) - 计划: 修复单文件分享落地页预览窗口无内容/按钮失效——根因是
resolve_folder_share对item_type != "folder"一律拒绝,/api/s/{token}/file/{id}对 file 分享返回 400 - 改动文件:
src/application/services/share_browse_service.rs—assert_file_in_share改为按item_type分支:file 分享仅接受file_id == share.item_id;folder 分享维持 ltree 子树校验;其余一律 404(反枚举,保持与"文件不存在"同形)src/interfaces/api/handlers/share_handler.rs— OpenAPIfile_id参数描述同步("the shared item itself, or a file inside the shared folder's subtree")tests/api/public_shares.hurl— 8b 节扩展:file 分享 token 流式取自身 item(200 + disposition)+ 局外人 id 404 断言
- 仅本地文件: 无
- 上游冲突风险: 中 —
share_browse_service.rs属上游安全敏感活跃区;改动集中在单个函数,冲突时按"file 分享限自身、folder 限子树、其余 404"核对意图
上游合并记录
(暂无。首次合并前先 git remote add upstream <上游仓库地址>。)