The backend component to interface with the smart contract.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

64 linhas
1.9 KiB

  1. import pika
  2. from fastapi import APIRouter
  3. from datetime import datetime
  4. from app.core.config import settings
  5. from app.contracts.issue import IssueContract
  6. from app.crud.user import get_user
  7. from app.db.session import get_db_session
  8. from app.schemas.issue import IssuePost, AddIssueRequest, VoteIssueRequest, AddIssueResponse
  9. router = APIRouter()
  10. @router.get("/list", response_model=list[IssuePost])
  11. async def list_issues():
  12. smart_contract = IssueContract(
  13. settings.CONTRACT_ID,
  14. settings.WALLET_ID
  15. )
  16. issue_list = await smart_contract.list_issues()
  17. return issue_list
  18. @router.get("/paragraphs")
  19. async def get_paragraphs(issue_id: str):
  20. smart_contract = IssueContract(
  21. settings.CONTRACT_ID,
  22. settings.WALLET_ID
  23. )
  24. paragraphs = await smart_contract.get_paragraphs(bytes.fromhex(issue_id))
  25. return paragraphs
  26. @router.post("/create", response_model=AddIssueResponse)
  27. async def create_issue(request: AddIssueRequest):
  28. smart_contract = IssueContract(
  29. settings.CONTRACT_ID,
  30. settings.WALLET_ID
  31. )
  32. async for session in get_db_session():
  33. user = await get_user(session, request.session_id)
  34. time_since_auth = datetime.now() - datetime.fromtimestamp(user.auth_date)
  35. if user and time_since_auth.total_seconds() < settings.AUTH_TIMEOUT:
  36. await smart_contract.add_issue(request.title, request.paragraphs, user.username)
  37. return {'result': True}
  38. else:
  39. return {'result': False}
  40. return {'result': False}
  41. @router.post("/vote")
  42. async def vote_issue(request: VoteIssueRequest):
  43. smart_contract = IssueContract(
  44. settings.CONTRACT_ID,
  45. settings.WALLET_ID
  46. )
  47. if request.increase and not request.decrease:
  48. await smart_contract.increase_vote(bytes.fromhex(request.issue_id))
  49. elif request.decrease and not request.increase:
  50. await smart_contract.decrease_vote(bytes.fromhex(request.issue_id))
  51. return