presentation.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from http import HTTPStatus
  2. from typing import Optional
  3. from fastapi import Depends
  4. from fastapi import Form
  5. from fastapi import Response
  6. from fastapi import UploadFile
  7. from clean_python import DoesNotExist
  8. from clean_python import Page
  9. from clean_python import ValueObject
  10. from clean_python.fastapi import delete
  11. from clean_python.fastapi import get
  12. from clean_python.fastapi import patch
  13. from clean_python.fastapi import post
  14. from clean_python.fastapi import put
  15. from clean_python.fastapi import RequestQuery
  16. from clean_python.fastapi import Resource
  17. from clean_python.fastapi import v
  18. from .application import ManageBook
  19. from .domain import Author
  20. from .domain import Book
  21. class BookCreate(ValueObject):
  22. author: Author
  23. title: str
  24. class BookUpdate(ValueObject):
  25. author: Optional[Author] = None
  26. title: Optional[str] = None
  27. class V1Books(Resource, version=v(1), name="books"):
  28. def __init__(self):
  29. self.manager = ManageBook()
  30. @get("/books", response_model=Page[Book])
  31. async def list(self, q: RequestQuery = Depends()):
  32. return await self.manager.filter([], q.as_page_options())
  33. @post("/books", status_code=HTTPStatus.CREATED, response_model=Book)
  34. async def create(self, obj: BookCreate):
  35. return await self.manager.create(obj.model_dump())
  36. @get("/books/{id}", response_model=Book)
  37. async def retrieve(self, id: int):
  38. return await self.manager.retrieve(id)
  39. @patch("/books/{id}", response_model=Book)
  40. async def update(self, id: int, obj: BookUpdate):
  41. return await self.manager.update(id, obj.model_dump(exclude_unset=True))
  42. @delete("/books/{id}", status_code=HTTPStatus.NO_CONTENT, response_class=Response)
  43. async def destroy(self, id: int):
  44. if not await self.manager.destroy(id):
  45. raise DoesNotExist("object", id)
  46. @get("/text")
  47. async def text(self):
  48. return Response("foo", media_type="text/plain")
  49. @post("/form", response_model=Author)
  50. async def form(self, name: str = Form()):
  51. return {"name": name}
  52. @post("/file")
  53. async def file(self, file: UploadFile):
  54. return {file.filename: (await file.read()).decode()}
  55. @put("/urlencode/{name}", response_model=Author)
  56. async def urlencode(self, name: str):
  57. return {"name": name}