diff --git a/backend/main.py b/backend/main.py index 5e770ff..ec4ab70 100644 --- a/backend/main.py +++ b/backend/main.py @@ -398,20 +398,6 @@ async def delete_list( item = await _owned_list(db, user.id, list_id) if item.is_inbox: raise HTTPException(status_code=409, detail="系统收集箱不能删除") - inbox_id = await db.scalar( - select(TaskList.id).where( - TaskList.user_id == user.id, - TaskList.is_inbox.is_(True), - TaskList.deleted_at.is_(None), - ) - ) - if inbox_id is None: - raise HTTPException(status_code=409, detail="系统收集箱不存在") - await db.execute( - update(Task) - .where(Task.user_id == user.id, Task.list_id == item.id, Task.deleted_at.is_(None)) - .values(list_id=inbox_id, version=Task.version + 1, updated_at=utcnow()) - ) item.deleted_at = utcnow() await db.commit() return Response(status_code=204) @@ -507,7 +493,16 @@ async def list_tasks( db: AsyncSession = Depends(get_db), ): query = select(Task).where( - Task.user_id == user.id, Task.deleted_at.is_(None), Task.parent_id.is_(None) + Task.user_id == user.id, + Task.deleted_at.is_(None), + Task.parent_id.is_(None), + exists( + select(TaskList.id).where( + TaskList.id == Task.list_id, + TaskList.user_id == user.id, + TaskList.deleted_at.is_(None), + ) + ), ) if list_id is not None: await _owned_list(db, user.id, list_id) @@ -617,7 +612,15 @@ async def get_task( db: AsyncSession = Depends(get_db), ): task = await db.scalar( - select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_(None)) + select(Task) + .join(TaskList, TaskList.id == Task.list_id) + .where( + Task.id == task_id, + Task.user_id == user.id, + Task.deleted_at.is_(None), + TaskList.user_id == user.id, + TaskList.deleted_at.is_(None), + ) ) if task is None: raise HTTPException(status_code=404, detail="任务不存在") diff --git a/tests/test_app.py b/tests/test_app.py index db1bbcd..a9dbfc2 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -314,15 +314,25 @@ def test_inbox_is_protected_and_deleted_collections_are_hidden(client): task = client.post( "/api/v1/tasks", json={"title": "保留任务", "list_id": task_list["id"]} ).json() + completed_task = client.post( + "/api/v1/tasks", json={"title": "已完成任务", "list_id": task_list["id"]} + ).json() + completed_task = client.patch( + f"/api/v1/tasks/{completed_task['id']}", + json={"completed": True, "version": completed_task["version"]}, + ).json() assert client.delete(f"/api/v1/lists/{task_list['id']}").status_code == 204 assert all(row["id"] != task_list["id"] for row in client.get("/api/v1/lists").json()) + assert client.get("/api/v1/tasks", params={"q": "保留任务"}).json()["items"] == [] + assert client.get(f"/api/v1/tasks/{task['id']}").status_code == 404 archived = client.get("/api/v1/lists", params={"archived": True}) assert archived.status_code == 200 assert [row["id"] for row in archived.json()] == [task_list["id"]] assert client.post(f"/api/v1/lists/{task_list['id']}/restore").status_code == 200 assert any(row["id"] == task_list["id"] for row in client.get("/api/v1/lists").json()) - moved = client.get(f"/api/v1/tasks/{task['id']}").json() - assert moved["list_id"] == inbox["id"] + restored = client.get("/api/v1/tasks", params={"list_id": task_list["id"]}).json()["items"] + assert [row["id"] for row in restored] == [task["id"], completed_task["id"]] + assert restored[1]["completed"] is True assert client.delete(f"/api/v1/folders/{folder['id']}").status_code == 204 assert client.get("/api/v1/folders").json() == []