items.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python
  2. """
  3. @Contact : liuyuqi.gov@msn.cn
  4. @Time : 2024/03/24 13:44:40
  5. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  6. @Desc :
  7. """
  8. from typing import Any
  9. from app.api.deps import CurrentUser, SessionDep
  10. from app.models.item import Item, ItemCreate, ItemOut, ItemsOut, ItemUpdate
  11. from app.models.models import Message
  12. from sqlmodel import func, select
  13. from fastapi import APIRouter, HTTPException
  14. router = APIRouter()
  15. @router.get("/", response_model=ItemsOut)
  16. def read_items(
  17. session: SessionDep, current_user: CurrentUser, skip: int = 0, limit: int = 100
  18. ) -> Any:
  19. """
  20. Retrieve items.
  21. """
  22. if current_user.is_superuser:
  23. count_statement = select(func.count()).select_from(Item)
  24. count = session.exec(count_statement).one()
  25. statement = select(Item).offset(skip).limit(limit)
  26. items = session.exec(statement).all()
  27. else:
  28. count_statement = (
  29. select(func.count())
  30. .select_from(Item)
  31. .where(Item.owner_id == current_user.id)
  32. )
  33. count = session.exec(count_statement).one()
  34. statement = (
  35. select(Item)
  36. .where(Item.owner_id == current_user.id)
  37. .offset(skip)
  38. .limit(limit)
  39. )
  40. items = session.exec(statement).all()
  41. return ItemsOut(data=items, count=count)
  42. @router.get("/{id}", response_model=ItemOut)
  43. def read_item(session: SessionDep, current_user: CurrentUser, id: int) -> Any:
  44. """
  45. Get item by ID.
  46. """
  47. item = session.get(Item, id)
  48. if not item:
  49. raise HTTPException(status_code=404, detail="Item not found")
  50. if not current_user.is_superuser and (item.owner_id != current_user.id):
  51. raise HTTPException(status_code=400, detail="Not enough permissions")
  52. return item
  53. @router.post("/", response_model=ItemOut)
  54. def create_item(
  55. *, session: SessionDep, current_user: CurrentUser, item_in: ItemCreate
  56. ) -> Any:
  57. """
  58. Create new item.
  59. """
  60. item = Item.model_validate(item_in, update={"owner_id": current_user.id})
  61. session.add(item)
  62. session.commit()
  63. session.refresh(item)
  64. return item
  65. @router.put("/{id}", response_model=ItemOut)
  66. def update_item(
  67. *, session: SessionDep, current_user: CurrentUser, id: int, item_in: ItemUpdate
  68. ) -> Any:
  69. """
  70. Update an item.
  71. """
  72. item = session.get(Item, id)
  73. if not item:
  74. raise HTTPException(status_code=404, detail="Item not found")
  75. if not current_user.is_superuser and (item.owner_id != current_user.id):
  76. raise HTTPException(status_code=400, detail="Not enough permissions")
  77. update_dict = item_in.model_dump(exclude_unset=True)
  78. item.sqlmodel_update(update_dict)
  79. session.add(item)
  80. session.commit()
  81. session.refresh(item)
  82. return item
  83. @router.delete("/{id}")
  84. def delete_item(session: SessionDep, current_user: CurrentUser, id: int) -> Message:
  85. """
  86. Delete an item.
  87. """
  88. item = session.get(Item, id)
  89. if not item:
  90. raise HTTPException(status_code=404, detail="Item not found")
  91. if not current_user.is_superuser and (item.owner_id != current_user.id):
  92. raise HTTPException(status_code=400, detail="Not enough permissions")
  93. session.delete(item)
  94. session.commit()
  95. return Message(message="Item deleted successfully")