fix: preserve tasks when archiving lists
This commit is contained in:
+19
-16
@@ -398,20 +398,6 @@ async def delete_list(
|
|||||||
item = await _owned_list(db, user.id, list_id)
|
item = await _owned_list(db, user.id, list_id)
|
||||||
if item.is_inbox:
|
if item.is_inbox:
|
||||||
raise HTTPException(status_code=409, detail="系统收集箱不能删除")
|
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()
|
item.deleted_at = utcnow()
|
||||||
await db.commit()
|
await db.commit()
|
||||||
return Response(status_code=204)
|
return Response(status_code=204)
|
||||||
@@ -507,7 +493,16 @@ async def list_tasks(
|
|||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
):
|
):
|
||||||
query = select(Task).where(
|
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:
|
if list_id is not None:
|
||||||
await _owned_list(db, user.id, list_id)
|
await _owned_list(db, user.id, list_id)
|
||||||
@@ -617,7 +612,15 @@ async def get_task(
|
|||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
):
|
):
|
||||||
task = await db.scalar(
|
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:
|
if task is None:
|
||||||
raise HTTPException(status_code=404, detail="任务不存在")
|
raise HTTPException(status_code=404, detail="任务不存在")
|
||||||
|
|||||||
+12
-2
@@ -314,15 +314,25 @@ def test_inbox_is_protected_and_deleted_collections_are_hidden(client):
|
|||||||
task = client.post(
|
task = client.post(
|
||||||
"/api/v1/tasks", json={"title": "保留任务", "list_id": task_list["id"]}
|
"/api/v1/tasks", json={"title": "保留任务", "list_id": task_list["id"]}
|
||||||
).json()
|
).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 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 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})
|
archived = client.get("/api/v1/lists", params={"archived": True})
|
||||||
assert archived.status_code == 200
|
assert archived.status_code == 200
|
||||||
assert [row["id"] for row in archived.json()] == [task_list["id"]]
|
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 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())
|
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()
|
restored = client.get("/api/v1/tasks", params={"list_id": task_list["id"]}).json()["items"]
|
||||||
assert moved["list_id"] == inbox["id"]
|
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.delete(f"/api/v1/folders/{folder['id']}").status_code == 204
|
||||||
assert client.get("/api/v1/folders").json() == []
|
assert client.get("/api/v1/folders").json() == []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user