nft.py 8.0 KB

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