|
1 |
| -# budget/views.py |
2 |
| -from django.shortcuts import render |
3 |
| -from django.http import JsonResponse |
| 1 | +from rest_framework import viewsets, status |
| 2 | +from rest_framework.response import Response |
4 | 3 | from .models import Budget
|
5 |
| -from django.views.decorators.csrf import csrf_exempt |
6 |
| -import json |
| 4 | +from .serializers import BudgetSerializer |
| 5 | +from authentication.decorators import cognito_authenticated |
| 6 | +import jwt |
7 | 7 |
|
8 | 8 |
|
9 |
| -@csrf_exempt |
10 |
| -def get_user_budget(request): |
11 |
| - if request.method == "GET": |
| 9 | +class BudgetViewSet(viewsets.ViewSet): |
| 10 | + def get_user_id_from_token(self, request): |
12 | 11 | try:
|
13 |
| - user_id = request.GET.get("user_id") |
| 12 | + authorization_header = request.headers.get("Authorization") |
| 13 | + if not authorization_header: |
| 14 | + raise Exception("Authorization header not found") |
| 15 | + |
| 16 | + token = authorization_header.split()[1] |
| 17 | + decoded_token = jwt.decode(token, options={"verify_signature": False}) |
| 18 | + user_id = decoded_token.get("username") |
14 | 19 | if not user_id:
|
15 |
| - return JsonResponse({"error": "User ID is required in the query parameters."}, status=400) |
| 20 | + raise Exception("User ID not found in token") |
| 21 | + return user_id |
| 22 | + except jwt.DecodeError: |
| 23 | + raise Exception("Invalid token") |
| 24 | + except jwt.ExpiredSignatureError: |
| 25 | + raise Exception("Expired token") |
| 26 | + except Exception as e: |
| 27 | + raise Exception(f"Error decoding token: {e}") |
16 | 28 |
|
17 |
| - budget = Budget.objects.get(user_id=user_id) |
18 |
| - return JsonResponse({"user_id": int(user_id), "amount": budget.amount}) |
| 29 | + @cognito_authenticated |
| 30 | + def list(self, request): |
| 31 | + try: |
| 32 | + username = self.get_user_id_from_token(request) |
| 33 | + budget = Budget.objects.get(username=username) |
| 34 | + serializer = BudgetSerializer(budget) |
| 35 | + return Response(serializer.data) |
19 | 36 | except Budget.DoesNotExist:
|
20 |
| - return JsonResponse({"error": "Budget not found"}, status=404) |
21 |
| - else: |
22 |
| - return JsonResponse({"error": "Invalid request method."}, status=405) |
23 |
| - |
| 37 | + return Response({"error": "Budget not found"}, status=status.HTTP_404_NOT_FOUND) |
| 38 | + except Exception as e: |
| 39 | + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) |
24 | 40 |
|
25 |
| -@csrf_exempt |
26 |
| -def set_user_budget(request): |
27 |
| - if request.method == "POST": |
| 41 | + @cognito_authenticated |
| 42 | + def create(self, request): |
28 | 43 | try:
|
29 |
| - data = json.loads(request.body) |
30 |
| - user_id = data.get("user_id") |
31 |
| - amount = data.get("amount") |
32 |
| - |
33 |
| - if not user_id or not amount: |
34 |
| - return JsonResponse({"error": "User ID and amount are required."}, status=400) |
35 |
| - |
36 |
| - budget = Budget.objects.create(user_id=user_id, amount=amount) |
37 |
| - budget.save() |
38 |
| - |
39 |
| - return JsonResponse({"message": "Budget created successfully."}, status=201) |
40 |
| - except json.JSONDecodeError: |
41 |
| - return JsonResponse({"error": "Invalid JSON."}, status=400) |
| 44 | + user_id = self.get_user_id_from_token(request) |
| 45 | + data = request.data.copy() |
| 46 | + data["username"] = user_id |
| 47 | + |
| 48 | + serializer = BudgetSerializer(data=data) |
| 49 | + print(serializer) |
| 50 | + if serializer.is_valid(): |
| 51 | + serializer.save() |
| 52 | + return Response(serializer.data, status=status.HTTP_201_CREATED) |
| 53 | + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
42 | 54 | except Exception as e:
|
43 |
| - return JsonResponse({"error": str(e)}, status=500) |
44 |
| - else: |
45 |
| - return JsonResponse({"error": "Invalid request method."}, status=405) |
| 55 | + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) |
46 | 56 |
|
47 |
| - |
48 |
| -@csrf_exempt |
49 |
| -def delete_user_budget(request): |
50 |
| - if request.method == "DELETE": |
| 57 | + @cognito_authenticated |
| 58 | + def destroy(self, request): |
51 | 59 | try:
|
52 |
| - data = json.loads(request.body) |
53 |
| - user_id = data.get("user_id") |
54 |
| - |
55 |
| - budget = Budget.objects.get(user_id=user_id) |
| 60 | + username = self.get_user_id_from_token(request) |
| 61 | + budget = Budget.objects.get(username=username) |
56 | 62 | budget.delete()
|
57 |
| - |
58 |
| - return JsonResponse({"message": "Budget deleted successfully", "user_id": user_id}) |
| 63 | + return Response(status=status.HTTP_204_NO_CONTENT) |
59 | 64 | except Budget.DoesNotExist:
|
60 |
| - return JsonResponse({"error": "Budget not found"}, status=404) |
61 |
| - except json.JSONDecodeError: |
62 |
| - return JsonResponse({"error": "Invalid JSON data"}, status=400) |
63 |
| - else: |
64 |
| - return JsonResponse({"error": "Invalid request method."}, status=405) |
65 |
| - |
| 65 | + return Response({"error": "Budget not found"}, status=status.HTTP_404_NOT_FOUND) |
| 66 | + except Exception as e: |
| 67 | + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) |
66 | 68 |
|
67 |
| -@csrf_exempt |
68 |
| -def update_user_budget(request): |
69 |
| - if request.method == "PATCH": |
| 69 | + @cognito_authenticated |
| 70 | + def partial_update(self, request): |
70 | 71 | try:
|
71 |
| - data = json.loads(request.body) |
72 |
| - user_id = data.get("user_id") |
73 |
| - amount = data.get("amount") |
74 |
| - |
75 |
| - budget = Budget.objects.get(user_id=user_id) |
76 |
| - budget.amount = amount |
77 |
| - budget.save() |
78 |
| - |
79 |
| - return JsonResponse({"user_id": user_id, "budget": budget.amount}) |
| 72 | + username = self.get_user_id_from_token(request) |
| 73 | + budget = Budget.objects.get(username=username) |
| 74 | + serializer = BudgetSerializer(budget, data=request.data, partial=True) |
| 75 | + if serializer.is_valid(): |
| 76 | + serializer.save() |
| 77 | + return Response(serializer.data) |
| 78 | + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
80 | 79 | except Budget.DoesNotExist:
|
81 |
| - return JsonResponse({"error": "Budget not found"}, status=404) |
82 |
| - except json.JSONDecodeError: |
83 |
| - return JsonResponse({"error": "Invalid JSON data"}, status=400) |
84 |
| - else: |
85 |
| - return JsonResponse({"error": "Invalid request method."}, status=405) |
| 80 | + return Response({"error": "Budget not found"}, status=status.HTTP_404_NOT_FOUND) |
| 81 | + except Exception as e: |
| 82 | + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) |
0 commit comments