backend/app/blockchain/api/views.py

77 lines
2.6 KiB
Python

from drf_yasg.utils import swagger_auto_schema
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
from blockchain.api.serializers import (
TransactFromAdminSerializer,
TransactToAdminSerializer,
)
from blockchain.models import Transaction
from blockchain.services import (
transact_from_admin,
transact_to_admin,
list_user_transactions,
)
from common.permissions import IsAdmin
from utils.blockchain import get_balance
class TransactFromAdminView(APIView):
permission_classes = [IsAuthenticated, IsAdmin]
@swagger_auto_schema(request_body=TransactFromAdminSerializer)
def post(self, request):
serializer = TransactFromAdminSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data["username"]
amount = serializer.validated_data["amount"]
transact_from_admin(user, amount)
return Response({"amount": user.money})
class TransactToAdminView(APIView):
permission_classes = [IsAuthenticated]
@swagger_auto_schema(request_body=TransactToAdminSerializer)
def post(self, request):
serializer = TransactToAdminSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
amount = serializer.validated_data["amount"]
transact_to_admin(request.user, amount)
return Response({"amount": request.user.money})
class TransactToUserView(APIView):
permission_classes = [IsAuthenticated]
@swagger_auto_schema(request_body=TransactFromAdminSerializer)
def post(self, request):
serializer = TransactFromAdminSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data["username"]
amount = serializer.validated_data["amount"]
t = Transaction.objects.create(
user_from=request.user, user_to=user, amount=amount
)
return Response({"your_amount": t.user_from.money, "amount": t.user_to.money})
class GetMoneyApi(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
user_money = int(get_balance(request.user.wallet_public_key).coins)
if request.user.money != user_money:
request.user.money = user_money
request.user.save(update_fields=["money"])
return Response({"amount": user_money})
class TransactionHistoryApi(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
return Response(list_user_transactions(request.user))