nft.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. from typing import Any, Optional
  2. from fastapi import APIRouter, Depends, HTTPException, File, UploadFile, Form
  3. from fastapi.encoders import jsonable_encoder
  4. from sqlalchemy.orm import Session
  5. from app import crud, models, schemas
  6. from app.core.config import settings
  7. from app.api import deps
  8. from uuid import uuid4
  9. router = APIRouter()
  10. @router.get("/", response_model=list[schemas.NftPrint])
  11. # @router.get("/")
  12. def read_items(
  13. db: Session = Depends(deps.get_db),
  14. skip: int = 0,
  15. limit: int = 100,
  16. current_user: models.users = Depends(deps.get_current_active_superuser),
  17. ) -> Any:
  18. """
  19. Retrieve items.
  20. """
  21. if crud.user.is_superuser(current_user):
  22. nfts = crud.nft.get_group_by_title(db)
  23. else:
  24. nfts = crud.nft.get_multi_by_owner(
  25. db=db, owner_id=current_user.userid
  26. )
  27. return nfts
  28. @router.post("/", response_model=schemas.NftBase)
  29. async def create_item(
  30. *,
  31. db: Session = Depends(deps.get_db),
  32. # item_in: schemas.NftCreate,
  33. hash: Optional[str] = Form(None),
  34. userid: Optional[str] = Form(None),
  35. title: Optional[str] = Form(None),
  36. context: Optional[str] = Form(None),
  37. is_active: Optional[bool] = Form(True),
  38. catagory: Optional[str] = Form(None),
  39. image: UploadFile = File(...),
  40. current_user: models.users = Depends(deps.get_current_active_user),
  41. ) -> Any:
  42. """
  43. Create new item.
  44. """
  45. if image.content_type.split('/')[0] != 'image':
  46. raise HTTPException(status_code=415,
  47. detail='content type error! Please upload valid image type')
  48. filename = str(uuid4()) + '.' + image.content_type.split('/')[1]
  49. with open(settings.IMG_PATH + filename, 'wb+') as f:
  50. f.write(image.file.read())
  51. f.close()
  52. item_in = schemas.NftCreate
  53. item_in.hash = hash
  54. item_in.userid = userid
  55. item_in.title = title
  56. item_in.context = context
  57. item_in.is_active = is_active
  58. item_in.category = catagory
  59. item_in.imgurl = settings.IMG_HOST + filename
  60. nft = crud.nft.create_with_owner(
  61. db=db, obj_in=item_in, owner_id=item_in.userid)
  62. return nft
  63. @router.put("/", response_model=schemas.NftCreate)
  64. def update_item(
  65. *,
  66. db: Session = Depends(deps.get_db),
  67. title: str,
  68. title_new: Optional[str] = Form(None),
  69. context: Optional[str] = Form(None),
  70. is_active: Optional[bool] = Form(True),
  71. catagory: Optional[str] = Form(None),
  72. image: Optional[UploadFile] = File(None),
  73. current_user: models.users = Depends(deps.get_current_active_user),
  74. ) -> Any:
  75. """
  76. Update bulk items.
  77. """
  78. nft = crud.nft.get_by_title(db=db, title=title)
  79. if not nft:
  80. raise HTTPException(status_code=404, detail="Item not found")
  81. # if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  82. if not crud.user.is_superuser(current_user):
  83. raise HTTPException(status_code=400, detail="Not enough permissions")
  84. item_in = schemas.NftBulkUpdate(**jsonable_encoder(nft[0]))
  85. if image:
  86. if image.content_type.split('/')[0] != 'image':
  87. raise HTTPException(status_code=415,
  88. detail='content type error! Please upload valid image type')
  89. filename = str(uuid4()) + '.' + image.content_type.split('/')[1]
  90. with open(settings.IMG_PATH + filename, 'wb+') as f:
  91. f.write(image.file.read())
  92. f.close()
  93. item_in.imgurl = settings.IMG_HOST + filename
  94. if title_new:
  95. item_in.title = title_new
  96. if context:
  97. item_in.context = context
  98. if is_active:
  99. item_in.is_active = is_active
  100. if catagory:
  101. item_in.category = catagory
  102. nft = crud.nft.update_bulk_title(db=db, db_obj_list=nft, obj_in=item_in)
  103. return nft
  104. @router.put("/{id}", response_model=schemas.NftCreate)
  105. def update_item(
  106. *,
  107. db: Session = Depends(deps.get_db),
  108. id: int,
  109. item_in: schemas.NftUpdate,
  110. current_user: models.users = Depends(deps.get_current_active_user),
  111. ) -> Any:
  112. """
  113. Update an item.
  114. """
  115. nft = crud.nft.get(db=db, id=id)
  116. if not nft:
  117. raise HTTPException(status_code=404, detail="Item not found")
  118. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  119. raise HTTPException(status_code=400, detail="Not enough permissions")
  120. nft = crud.nft.update(db=db, db_obj=nft, obj_in=item_in)
  121. return nft
  122. @router.get("/{id}", response_model=schemas.NftCreate)
  123. def read_item(
  124. *,
  125. db: Session = Depends(deps.get_db),
  126. id: int,
  127. current_user: models.users = Depends(deps.get_current_active_user),
  128. ) -> Any:
  129. """
  130. Get item by ID.
  131. """
  132. nft = crud.nft.get(db=db, id=id)
  133. if not nft:
  134. raise HTTPException(status_code=404, detail="Item not found")
  135. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  136. raise HTTPException(status_code=400, detail="Not enough permissions")
  137. return nft
  138. # @router.post("/title", response_model=schemas.NftCreate)
  139. @router.post("/title")
  140. def read_user_by_title(
  141. *,
  142. db: Session = Depends(deps.get_db),
  143. title: str,
  144. skip: int = 0,
  145. limit: int = 100,
  146. current_user: models.users = Depends(deps.get_current_active_user),
  147. ) -> Any:
  148. """
  149. Get item by title.
  150. """
  151. nft = crud.nft.get_user_by_title(db=db, title=title, skip=skip, limit=limit)
  152. if not nft:
  153. raise HTTPException(status_code=404, detail="Item not found")
  154. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  155. raise HTTPException(status_code=400, detail="Not enough permissions")
  156. return nft
  157. @router.delete("/{id}", response_model=schemas.NftCreate)
  158. def delete_item(
  159. *,
  160. db: Session = Depends(deps.get_db),
  161. id: int,
  162. current_user: models.users = Depends(deps.get_current_active_user),
  163. ) -> Any:
  164. """
  165. Delete an item.
  166. """
  167. nft = crud.nft.get(db=db, id=id)
  168. if not nft:
  169. raise HTTPException(status_code=404, detail="Item not found")
  170. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  171. raise HTTPException(status_code=400, detail="Not enough permissions")
  172. nft = crud.nft.remove(db=db, id=id)
  173. return nft