carts.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """试题篮路由"""
  2. from fastapi import APIRouter, Request, HTTPException, Depends
  3. from app.database import (
  4. get_connection, get_carts, create_cart, delete_cart, get_cart,
  5. add_cart_item, remove_cart_item,
  6. )
  7. from app.routers.auth import verify_token
  8. router = APIRouter()
  9. @router.get("/carts")
  10. def list_carts(request: Request, _=Depends(verify_token)):
  11. """篮子列表"""
  12. config = request.app.state.config
  13. conn = get_connection(config.db_path)
  14. try:
  15. return {"carts": get_carts(conn)}
  16. finally:
  17. conn.close()
  18. @router.post("/carts")
  19. def new_cart(request: Request, body: dict, _=Depends(verify_token)):
  20. """创建篮子"""
  21. name = body.get("name", "未命名")
  22. config = request.app.state.config
  23. conn = get_connection(config.db_path)
  24. try:
  25. cart = create_cart(conn, name)
  26. return cart
  27. finally:
  28. conn.close()
  29. @router.delete("/carts/{cart_id}")
  30. def remove_cart(request: Request, cart_id: int, _=Depends(verify_token)):
  31. """删除篮子"""
  32. config = request.app.state.config
  33. conn = get_connection(config.db_path)
  34. try:
  35. delete_cart(conn, cart_id)
  36. return {"ok": True}
  37. finally:
  38. conn.close()
  39. @router.get("/carts/{cart_id}")
  40. def cart_detail(request: Request, cart_id: int, _=Depends(verify_token)):
  41. """篮子详情(含题目列表)"""
  42. config = request.app.state.config
  43. conn = get_connection(config.db_path)
  44. try:
  45. cart = get_cart(conn, cart_id)
  46. if not cart:
  47. raise HTTPException(status_code=404, detail={
  48. "error": {"code": "not_found", "message": f"篮子 {cart_id} 不存在"}
  49. })
  50. return cart
  51. finally:
  52. conn.close()
  53. @router.post("/carts/{cart_id}/items")
  54. def add_item(request: Request, cart_id: int, body: dict, _=Depends(verify_token)):
  55. """添加题目到篮子"""
  56. problem_id = body.get("problem_id", "")
  57. config = request.app.state.config
  58. conn = get_connection(config.db_path)
  59. try:
  60. ok = add_cart_item(conn, cart_id, problem_id)
  61. if not ok:
  62. return {"ok": False, "message": "题目不存在或已存在于篮子中"}
  63. return {"ok": True}
  64. finally:
  65. conn.close()
  66. @router.delete("/carts/{cart_id}/items/{problem_id}")
  67. def remove_item(request: Request, cart_id: int, problem_id: str, _=Depends(verify_token)):
  68. """从篮子移除题目"""
  69. config = request.app.state.config
  70. conn = get_connection(config.db_path)
  71. try:
  72. remove_cart_item(conn, cart_id, problem_id)
  73. return {"ok": True}
  74. finally:
  75. conn.close()
  76. @router.post("/carts/{cart_id}/clear")
  77. def clear_cart(request: Request, cart_id: int, _=Depends(verify_token)):
  78. """清空篮子"""
  79. config = request.app.state.config
  80. conn = get_connection(config.db_path)
  81. try:
  82. conn.execute("DELETE FROM cart_items WHERE cart_id = ?", (cart_id,))
  83. conn.commit()
  84. return {"ok": True}
  85. finally:
  86. conn.close()