nft.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. from typing import Any, Optional
  2. import requests
  3. import uuid
  4. import json
  5. from fastapi import APIRouter, Depends, HTTPException, File, UploadFile, Form
  6. from fastapi.encoders import jsonable_encoder
  7. from sqlalchemy.orm import Session
  8. from app import crud, models, schemas
  9. from app.core.config import settings
  10. from app.api import deps
  11. from uuid import uuid4
  12. router = APIRouter()
  13. baseUrl = "https://nft-api-staging.joyso.io/api/v1/"
  14. headers = {
  15. 'Authorization': 'Basic bmZ0OmMxOTEzOWMzYjM3YjdjZWU3ZmY3OTFiZGU3NzdjZWNl',
  16. 'Content-Type': 'application/json'
  17. }
  18. @router.get("/", response_model=list[schemas.NftPrint])
  19. # @router.get("/")
  20. def read_items(
  21. db: Session = Depends(deps.get_db),
  22. skip: int = 0,
  23. limit: int = 100,
  24. current_user: models.users = Depends(deps.get_current_active_superuser),
  25. ) -> Any:
  26. """
  27. Retrieve items.
  28. """
  29. if crud.user.is_superuser(current_user):
  30. nfts = crud.nft.get_group_by_title(db)
  31. else:
  32. nfts = crud.nft.get_multi_by_owner(
  33. db=db, owner_id=current_user.userid
  34. )
  35. return nfts
  36. @router.post("/", response_model=schemas.NftBase)
  37. async def create_item(
  38. *,
  39. db: Session = Depends(deps.get_db),
  40. # item_in: schemas.NftCreate,
  41. hash: Optional[str] = Form(None),
  42. title: str = Form(...),
  43. context: Optional[str] = Form(None),
  44. is_active: Optional[bool] = Form(True),
  45. catagory: Optional[str] = Form(None),
  46. image: UploadFile = File(...),
  47. uid: int = Form(...),
  48. address: str = Form(...),
  49. amount: int = Form(...),
  50. current_user: models.users = Depends(deps.get_current_active_user),
  51. ) -> Any:
  52. """
  53. Create new item.
  54. """
  55. path = "erc1155"
  56. txid = str(uuid.uuid4())
  57. payload = json.dumps({
  58. "txid": txid,
  59. "to": address,
  60. "uid": uid,
  61. "amount": amount
  62. })
  63. r = requests.post(
  64. baseUrl + path,
  65. headers=headers,
  66. data=payload
  67. )
  68. if r.status_code != 200:
  69. raise HTTPException(status_code=400, detail="not correct mint informaiton")
  70. if image.content_type.split('/')[0] != 'image':
  71. raise HTTPException(status_code=415,
  72. detail='content type error! Please upload valid image type')
  73. filename = str(uuid4()) + '.' + image.content_type.split('/')[1]
  74. with open(settings.IMG_PATH + filename, 'wb+') as f:
  75. f.write(image.file.read())
  76. f.close()
  77. userid = crud.user.get_by_address(db, address = address)
  78. item_in = schemas.NftCreate
  79. item_in.hash = hash
  80. item_in.userid = userid
  81. item_in.title = title
  82. item_in.context = context
  83. item_in.is_active = is_active
  84. item_in.category = catagory
  85. item_in.imgurl = settings.IMG_HOST + filename
  86. item_in.uid = uid
  87. nft = crud.nft.create_with_owner(
  88. db=db, obj_in=item_in, owner_id=item_in.userid)
  89. return nft
  90. @router.put("/", response_model=schemas.NftCreate)
  91. def update_item(
  92. *,
  93. db: Session = Depends(deps.get_db),
  94. title: str,
  95. id: int,
  96. context: Optional[str] = Form(None),
  97. is_active: Optional[bool] = Form(True),
  98. catagory: Optional[str] = Form(None),
  99. image: Optional[UploadFile] = File(None),
  100. current_user: models.users = Depends(deps.get_current_active_user),
  101. ) -> Any:
  102. """
  103. Update items.
  104. """
  105. nft = crud.nft.get(db=db, id = id)
  106. if not nft:
  107. raise HTTPException(status_code=404, detail="Item not found")
  108. # if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  109. if not crud.user.is_superuser(current_user):
  110. raise HTTPException(status_code=400, detail="Not enough permissions")
  111. item_in = schemas.NftBulkUpdate(**jsonable_encoder(nft))
  112. if image:
  113. if image.content_type.split('/')[0] != 'image':
  114. raise HTTPException(status_code=415,
  115. detail='content type error! Please upload valid image type')
  116. filename = str(uuid4()) + '.' + image.content_type.split('/')[1]
  117. with open(settings.IMG_PATH + filename, 'wb+') as f:
  118. f.write(image.file.read())
  119. f.close()
  120. item_in.imgurl = settings.IMG_HOST + filename
  121. if title:
  122. item_in.title = title
  123. if context:
  124. item_in.context = context
  125. if is_active:
  126. item_in.is_active = is_active
  127. if catagory:
  128. item_in.category = catagory
  129. nft = crud.nft.update_bulk_title(db=db, db_obj_list=nft, obj_in=item_in)
  130. return nft
  131. @router.put("/{id}", response_model=schemas.NftCreate)
  132. def update_item(
  133. *,
  134. db: Session = Depends(deps.get_db),
  135. title: Optional[str] = Form(None),
  136. id: int,
  137. context: Optional[str] = Form(None),
  138. is_active: Optional[bool] = Form(True),
  139. catagory: Optional[str] = Form(None),
  140. image: Optional[UploadFile] = File(None),
  141. current_user: models.users = Depends(deps.get_current_active_user),
  142. ) -> Any:
  143. """
  144. Update an item.
  145. """
  146. nft = crud.nft.get(db=db, id=id)
  147. if not nft:
  148. raise HTTPException(status_code=404, detail="Item not found")
  149. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  150. raise HTTPException(status_code=400, detail="Not enough permissions")
  151. item_in = schemas.NftUpdate(**jsonable_encoder(nft))
  152. if image:
  153. if image.content_type.split('/')[0] != 'image':
  154. raise HTTPException(status_code=415,
  155. detail='content type error! Please upload valid image type')
  156. filename = str(uuid4()) + '.' + image.content_type.split('/')[1]
  157. with open(settings.IMG_PATH + filename, 'wb+') as f:
  158. f.write(image.file.read())
  159. f.close()
  160. item_in.imgurl = settings.IMG_HOST + filename
  161. if title:
  162. item_in.title = title
  163. if context:
  164. item_in.context = context
  165. if is_active:
  166. item_in.is_active = is_active
  167. if catagory:
  168. item_in.category = catagory
  169. nft = crud.nft.update(db=db, db_obj=nft, obj_in=item_in)
  170. return nft
  171. @router.get("/{id}", response_model=schemas.NftCreate)
  172. def read_item(
  173. *,
  174. db: Session = Depends(deps.get_db),
  175. id: int,
  176. current_user: models.users = Depends(deps.get_current_active_user),
  177. ) -> Any:
  178. """
  179. Get item by ID.
  180. """
  181. nft = crud.nft.get(db=db, id=id)
  182. if not nft:
  183. raise HTTPException(status_code=404, detail="Item not found")
  184. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  185. raise HTTPException(status_code=400, detail="Not enough permissions")
  186. return nft
  187. # @router.post("/title", response_model=schemas.NftCreate)
  188. @router.post("/title")
  189. def read_user_by_title(
  190. *,
  191. db: Session = Depends(deps.get_db),
  192. title: str,
  193. skip: int = 0,
  194. limit: int = 100,
  195. current_user: models.users = Depends(deps.get_current_active_user),
  196. ) -> Any:
  197. """
  198. Get item by title.
  199. """
  200. nft = crud.nft.get_user_by_title(db=db, title=title, skip=skip, limit=limit)
  201. if not nft:
  202. raise HTTPException(status_code=404, detail="Item not found")
  203. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  204. raise HTTPException(status_code=400, detail="Not enough permissions")
  205. return nft
  206. @router.delete("/{id}", response_model=schemas.NftCreate)
  207. def delete_item(
  208. *,
  209. db: Session = Depends(deps.get_db),
  210. id: int,
  211. current_user: models.users = Depends(deps.get_current_active_user),
  212. ) -> Any:
  213. """
  214. Delete an item.
  215. """
  216. nft = crud.nft.get(db=db, id=id)
  217. if not nft:
  218. raise HTTPException(status_code=404, detail="Item not found")
  219. if not crud.user.is_superuser(current_user) and (nft.userid != current_user.userid):
  220. raise HTTPException(status_code=400, detail="Not enough permissions")
  221. nft = crud.nft.remove(db=db, id=id)
  222. return nft