From c361caa604257f7d2ac9f29ccd095665403a127c Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:03:28 -0500 Subject: [PATCH 01/13] api response in decorators --- backend/core/api/public/decorators.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/core/api/public/decorators.py b/backend/core/api/public/decorators.py index 854a8e2b4..75e031c73 100644 --- a/backend/core/api/public/decorators.py +++ b/backend/core/api/public/decorators.py @@ -6,6 +6,7 @@ from rest_framework import status from backend.models import TeamMemberPermission, Organization, Client +from backend.core.api.public.helpers.response import APIResponse import logging @@ -21,21 +22,21 @@ def _wrapped_view(request, *args, **kwargs): logger.info( f"Authentication credentials were not provided in api request |" f" {request.META.get('REMOTE_ADDR', 'Unknown IP')}" ) - return Response({"detail": "Authentication credentials were not provided."}, status=status.HTTP_401_UNAUTHORIZED) + return APIResponse(False, {"detail": "Authentication credentials were not provided."}, status=status.HTTP_401_UNAUTHORIZED) if request.team_id and not request.team: - return Response({"detail": "Team not found."}, status=status.HTTP_404_NOT_FOUND) + return APIResponse(False, {"detail": "Team not found."}, status=status.HTTP_404_NOT_FOUND) if request.team: # Check for team permissions based on team_id and scopes if not request.team.is_owner(token.user) and not request.team.is_logged_in_as_team(request): team_permissions = TeamMemberPermission.objects.filter(team=request.team, user=token.user).first() if not team_permissions or not all(scope in team_permissions.scopes for scope in scopes): - return Response({"detail": "Permission denied."}, status=status.HTTP_403_FORBIDDEN) + return APIResponse(False, {"detail": "Permission denied."}, status=status.HTTP_403_FORBIDDEN) # Check for global API Key permissions based on token scopes if not all(scope in token.scopes for scope in scopes): - return Response({"detail": "Permission denied."}, status=status.HTTP_403_FORBIDDEN) + return APIResponse(False, {"detail": "Permission denied."}, status=status.HTTP_403_FORBIDDEN) token.update_last_used() From 70ef2fa7e928fd8fb9590ecb02b08de7aff10dd5 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:07:43 -0500 Subject: [PATCH 02/13] remove unused import --- backend/core/api/public/decorators.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/core/api/public/decorators.py b/backend/core/api/public/decorators.py index 75e031c73..71360540c 100644 --- a/backend/core/api/public/decorators.py +++ b/backend/core/api/public/decorators.py @@ -2,7 +2,6 @@ from rest_framework.exceptions import PermissionDenied from rest_framework.generics import get_object_or_404 -from rest_framework.response import Response from rest_framework import status from backend.models import TeamMemberPermission, Organization, Client From 5aee2fc2c12ce2dcc8ef63161e81a6ac39fbbb53 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:09:01 -0500 Subject: [PATCH 03/13] system health api resp --- backend/core/api/public/endpoints/system_health.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/core/api/public/endpoints/system_health.py b/backend/core/api/public/endpoints/system_health.py index 43d4a136b..391ae4fcc 100644 --- a/backend/core/api/public/endpoints/system_health.py +++ b/backend/core/api/public/endpoints/system_health.py @@ -4,9 +4,9 @@ from django.core.cache import cache from rest_framework.decorators import api_view, permission_classes -from rest_framework.response import Response from backend.core.api.public.permissions import IsSuperuser +from backend.core.api.public.helpers.response import APIResponse @swagger_auto_schema( @@ -46,7 +46,7 @@ @permission_classes([IsSuperuser]) def system_health_endpoint(request): if not request.user or not request.user.is_superuser: - return Response({"success": False, "message": "User is not permitted to view internal information"}, status=403) + return APIResponse(False, "User is not permitted to view internal information", status=403) problems = [] @@ -60,4 +60,4 @@ def system_health_endpoint(request): except ConnectionError: problems.append({"id": "redis", "message": "redis failed to connect"}) - return Response({"problems": problems, "healthy": not bool(problems)}) + return APIResponse({"problems": problems, "healthy": not bool(problems)}) From 6cafd4ef76c417a3a617172c1fa8977f835a5808 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:10:42 -0500 Subject: [PATCH 04/13] client delete api response --- backend/core/api/public/endpoints/clients/delete.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/core/api/public/endpoints/clients/delete.py b/backend/core/api/public/endpoints/clients/delete.py index 66e997ec4..398f77f1a 100644 --- a/backend/core/api/public/endpoints/clients/delete.py +++ b/backend/core/api/public/endpoints/clients/delete.py @@ -3,13 +3,13 @@ from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import api_view -from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.swagger_ui import TEAM_PARAMETER from backend.core.api.public.types import APIRequest from backend.core.service.clients.delete import delete_client, DeleteClientServiceResponse +from backend.core.api.public.helpers.response import APIResponse @swagger_auto_schema( @@ -64,5 +64,5 @@ def client_delete_endpoint(request: APIRequest, id: str): response: DeleteClientServiceResponse = delete_client(request, id) if response.failed: - return Response({"success": False, "message": response.error}, status=403 if "do not have permission" in response.error else 404) - return Response({"success": True, "client_id": id}, status=200) + return APIResponse(False, response.error, status=403 if "do not have permission" in response.error else 404) + return APIResponse(True, {"client_id": id}, status=200) From 8fd4f9e0961ca9b4780efb1350f0725b947b2605 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:15:25 -0500 Subject: [PATCH 05/13] updated invoice delete api calls --- backend/core/api/public/endpoints/Invoices/delete.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/core/api/public/endpoints/Invoices/delete.py b/backend/core/api/public/endpoints/Invoices/delete.py index f2f3f0b49..a64bfebe9 100644 --- a/backend/core/api/public/endpoints/Invoices/delete.py +++ b/backend/core/api/public/endpoints/Invoices/delete.py @@ -1,10 +1,11 @@ from django.http import QueryDict from rest_framework import status from rest_framework.decorators import api_view -from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.types import APIRequest +from backend.core.api.public.helpers.response import APIResponse + from backend.models import Invoice, QuotaLimit @@ -16,13 +17,13 @@ def delete_invoice_endpoint(request: APIRequest): try: invoice = Invoice.objects.get(id=delete_items.get("invoice", "")) except Invoice.DoesNotExist: - return Response({"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) + return APIResponse(False, {"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) if not invoice.has_access(request.user): - return Response({"error": "You do not have permission to delete this invoice"}, status=status.HTTP_403_FORBIDDEN) + return APIResponse(False, {"error": "You do not have permission to delete this invoice"}, status=status.HTTP_403_FORBIDDEN) QuotaLimit.delete_quota_usage("invoices-count", request.user, invoice.id, invoice.date_created) invoice.delete() - return Response({"message": "Invoice successfully deleted"}, status=status.HTTP_200_OK) + return APIResponse(False, {"message": "Invoice successfully deleted"}, status=status.HTTP_200_OK) From e1e8e66b9fcef1f0d9ca786e93771d7b1632a54b Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:19:03 -0500 Subject: [PATCH 06/13] download invoice API calls --- .../core/api/public/endpoints/Invoices/download_pdf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/core/api/public/endpoints/Invoices/download_pdf.py b/backend/core/api/public/endpoints/Invoices/download_pdf.py index 1d6a885e1..e7fd49f8d 100644 --- a/backend/core/api/public/endpoints/Invoices/download_pdf.py +++ b/backend/core/api/public/endpoints/Invoices/download_pdf.py @@ -5,7 +5,6 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.decorators import api_view -from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.helpers.deprecate import deprecated @@ -13,6 +12,7 @@ from backend.core.api.public.types import APIRequest from backend.finance.models import Invoice from backend.core.service.invoices.single.create_pdf import generate_pdf +from backend.core.api.public.helpers.response import APIResponse @swagger_auto_schema( @@ -61,15 +61,15 @@ @api_view(["GET"]) @deprecated(datetime(2024, 7, 16), datetime(2024, 7, 16)) @require_scopes(["invoices:read"]) -def download(request: APIRequest, id: str) -> HttpResponse | Response: +def download(request: APIRequest, id: str) -> HttpResponse | APIResponse: try: if request.team: invoice = Invoice.objects.get(organization=request.team, id=id) else: invoice = Invoice.objects.get(user=request.user, id=id) except Invoice.DoesNotExist: - return Response({"success": False, "message": "Invoice not found"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"message": "Invoice not found"}, status=status.HTTP_400_BAD_REQUEST) if response := generate_pdf(invoice, "attachment"): return response - return Response({"success": False, "message": "Error generating PDF"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + return APIResponse(False, {"message": "Error generating PDF"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) From c11ecf3e80548b3fe819b90507a648cd9316d7d8 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:22:05 -0500 Subject: [PATCH 07/13] edit invoice --- .../api/public/endpoints/Invoices/edit.py | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/backend/core/api/public/endpoints/Invoices/edit.py b/backend/core/api/public/endpoints/Invoices/edit.py index ada5aef10..da5dabf95 100644 --- a/backend/core/api/public/endpoints/Invoices/edit.py +++ b/backend/core/api/public/endpoints/Invoices/edit.py @@ -3,10 +3,10 @@ from rest_framework import status from rest_framework.decorators import api_view -from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.types import APIRequest +from backend.core.api.public.helpers.response import APIResponse from backend.finance.models import Invoice @@ -15,20 +15,22 @@ def edit_invoice_endpoint(request: APIRequest): invoice_id = request.data.get("invoice_id", "") if not invoice_id: - return Response({"error": "Invoice ID is required"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"error": "Invoice ID is required"}, status=status.HTTP_400_BAD_REQUEST) try: invoice = Invoice.objects.get(id=invoice_id) except Invoice.DoesNotExist: - return Response({"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) + return APIResponse(False, {"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) if request.user.logged_in_as_team and request.user.logged_in_as_team != invoice.organization: - return Response( + return APIResponse( + False, {"error": "You do not have permission to edit this invoice"}, status=status.HTTP_403_FORBIDDEN, ) elif request.user != invoice.user: - return Response( + return APIResponse( + False, {"error": "You do not have permission to edit this invoice"}, status=status.HTTP_403_FORBIDDEN, ) @@ -64,12 +66,12 @@ def edit_invoice_endpoint(request: APIRequest): try: new_value = datetime.strptime(new_value, "%Y-%m-%d").date() # type: ignore[assignment] except ValueError: - return Response({"error": "Invalid date format for date_due"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"error": "Invalid date format for date_due"}, status=status.HTTP_400_BAD_REQUEST) setattr(invoice, column_name, new_value) invoice.save() - return Response({"message": "Invoice successfully edited"}, status=status.HTTP_200_OK) + return APIResponse(False, {"message": "Invoice successfully edited"}, status=status.HTTP_200_OK) @api_view(["POST"]) @@ -79,20 +81,20 @@ def change_status_endpoint(request, invoice_id: int, invoice_status: str): try: invoice = Invoice.objects.get(id=invoice_id) except Invoice.DoesNotExist: - return Response({"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) + return APIResponse(False, {"error": "Invoice Not Found"}, status=status.HTTP_404_NOT_FOUND) if request.user.logged_in_as_team and request.user.logged_in_as_team != invoice.organization or request.user != invoice.user: - return Response({"error": "You do not have permission to edit this invoice"}, status=status.HTTP_403_FORBIDDEN) + return APIResponse(False, {"error": "You do not have permission to edit this invoice"}, status=status.HTTP_403_FORBIDDEN) if invoice_status not in ["paid", "draft", "pending"]: - return Response({"error": "Invalid status. Please choose from: pending, paid, draft"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"error": "Invalid status. Please choose from: pending, paid, draft"}, status=status.HTTP_400_BAD_REQUEST) if invoice.status == invoice_status: - return Response({"error": f"Invoice status is already {invoice_status}"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"error": f"Invoice status is already {invoice_status}"}, status=status.HTTP_400_BAD_REQUEST) invoice.set_status(invoice_status) - return Response({"message": f"Invoice status been changed to {invoice_status}"}, status=status.HTTP_200_OK) + return APIResponse(False, {"message": f"Invoice status been changed to {invoice_status}"}, status=status.HTTP_200_OK) @api_view(["POST"]) @@ -104,10 +106,10 @@ def edit_discount_endpoint(request, invoice_id: str): try: invoice: Invoice = Invoice.objects.get(id=invoice_id) except Invoice.DoesNotExist: - return Response({"error": "Invoice not found"}, status=status.HTTP_404_NOT_FOUND) + return APIResponse(False, {"error": "Invoice not found"}, status=status.HTTP_404_NOT_FOUND) if not invoice.has_access(request.user): - return Response({"error": "You don't have permission to make changes to this invoice."}, status=status.HTTP_403_FORBIDDEN) + return APIResponse(False, {"error": "You don't have permission to make changes to this invoice."}, status=status.HTTP_403_FORBIDDEN) if discount_type == "percentage": try: @@ -115,7 +117,9 @@ def edit_discount_endpoint(request, invoice_id: str): if percentage_amount < 0 or percentage_amount > 100: raise ValueError except ValueError: - return Response({"error": "Please enter a valid percentage amount (between 0 and 100)"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse( + False, {"error": "Please enter a valid percentage amount (between 0 and 100)"}, status=status.HTTP_400_BAD_REQUEST + ) invoice.discount_percentage = percentage_amount else: try: @@ -123,9 +127,9 @@ def edit_discount_endpoint(request, invoice_id: str): if discount_amount < 0: raise ValueError except ValueError: - return Response({"error": "Please enter a valid discount amount"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"error": "Please enter a valid discount amount"}, status=status.HTTP_400_BAD_REQUEST) invoice.discount_amount = discount_amount invoice.save() - return Response({"message": "Discount was applied successfully"}, status=status.HTTP_200_OK) + return APIResponse(False, {"message": "Discount was applied successfully"}, status=status.HTTP_200_OK) From 137013e59ac8d5d76309fd9b3ea7dc814320c345 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:23:09 -0500 Subject: [PATCH 08/13] get invoice --- backend/core/api/public/endpoints/Invoices/get.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/core/api/public/endpoints/Invoices/get.py b/backend/core/api/public/endpoints/Invoices/get.py index d20caac88..02f4d69dc 100644 --- a/backend/core/api/public/endpoints/Invoices/get.py +++ b/backend/core/api/public/endpoints/Invoices/get.py @@ -2,12 +2,12 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.decorators import api_view -from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.serializers.invoices import InvoiceSerializer from backend.core.api.public.swagger_ui import TEAM_PARAMETER from backend.core.api.public.types import APIRequest +from backend.core.api.public.helpers.response import APIResponse from backend.finance.models import Invoice @@ -45,15 +45,15 @@ ) @api_view(["GET"]) @require_scopes(["invoices:read"]) -def get_invoices_endpoint(request: APIRequest, id: str) -> Response: +def get_invoices_endpoint(request: APIRequest, id: str) -> APIResponse: try: if request.team: invoices = Invoice.objects.filter(organization=request.team, id=id) else: invoices = Invoice.objects.filter(user=request.user, id=id) except Invoice.DoesNotExist: - return Response({"success": False, "message": "Invoice not found"}, status=status.HTTP_400_BAD_REQUEST) + return APIResponse(False, {"message": "Invoice not found"}, status=status.HTTP_400_BAD_REQUEST) serializer = InvoiceSerializer(invoices, many=True) - return Response({"success": True, "invoice": serializer.data}, status=status.HTTP_200_OK) + return APIResponse(True, {"invoice": serializer.data}, status=status.HTTP_200_OK) From 346f289cc0b6d590d5a06e20195d734005a9e3ee Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:25:08 -0500 Subject: [PATCH 09/13] webhook task queue --- .../endpoints/webhooks/webhook_task_queue_handler.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/core/api/public/endpoints/webhooks/webhook_task_queue_handler.py b/backend/core/api/public/endpoints/webhooks/webhook_task_queue_handler.py index 3f8c4b44d..256f302ce 100644 --- a/backend/core/api/public/endpoints/webhooks/webhook_task_queue_handler.py +++ b/backend/core/api/public/endpoints/webhooks/webhook_task_queue_handler.py @@ -1,9 +1,9 @@ -from rest_framework.response import Response import logging from backend.core.api.public import APIAuthToken from rest_framework.decorators import api_view from backend.core.service.asyn_tasks.tasks import Task +from backend.core.api.public.helpers.response import APIResponse @api_view(["POST"]) @@ -11,10 +11,10 @@ def webhook_task_queue_handler_view_endpoint(request): token: APIAuthToken | None = request.auth if not token: - return Response({"status": "error", "message": "No token found"}, status=500) + return APIResponse(False, {"status": "error", "message": "No token found"}, status=500) if not token.administrator_service_type == token.AdministratorServiceTypes.AWS_WEBHOOK_CALLBACK: - return Response({"status": "error", "message": "Invalid API key for this service"}, status=500) + return APIResponse(False, {"status": "error", "message": "Invalid API key for this service"}, status=500) try: data: dict = request.data @@ -39,8 +39,8 @@ def webhook_task_queue_handler_view_endpoint(request): # Handle the result (e.g., store it or log it) print(f"Webhook executed: {func_name} with result: {result}") - return Response({"status": "success", "result": result}) + return APIResponse(True, {"status": "success", "result": result}) except Exception as e: logging.error(f"Error executing webhook task: {str(e)}") - return Response({"status": "error", "message": "An internal error has occurred."}, status=500) + return APIResponse(False, {"status": "error", "message": "An internal error has occurred."}, status=500) From d4d8e88df2279bf061a3ea12438e816e58705ff9 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:26:53 -0500 Subject: [PATCH 10/13] typecheck in download invoice --- backend/core/api/public/endpoints/Invoices/download_pdf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/core/api/public/endpoints/Invoices/download_pdf.py b/backend/core/api/public/endpoints/Invoices/download_pdf.py index e7fd49f8d..d49c18224 100644 --- a/backend/core/api/public/endpoints/Invoices/download_pdf.py +++ b/backend/core/api/public/endpoints/Invoices/download_pdf.py @@ -5,6 +5,7 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.decorators import api_view +from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.helpers.deprecate import deprecated @@ -61,7 +62,7 @@ @api_view(["GET"]) @deprecated(datetime(2024, 7, 16), datetime(2024, 7, 16)) @require_scopes(["invoices:read"]) -def download(request: APIRequest, id: str) -> HttpResponse | APIResponse: +def download(request: APIRequest, id: str) -> HttpResponse | Response: try: if request.team: invoice = Invoice.objects.get(organization=request.team, id=id) From 6988d4ad5bc3c15bb554985687da3f9eafc561fa Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:28:11 -0500 Subject: [PATCH 11/13] fix delete invoice api response --- backend/core/api/public/endpoints/Invoices/delete.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/core/api/public/endpoints/Invoices/delete.py b/backend/core/api/public/endpoints/Invoices/delete.py index a64bfebe9..6f7ed1770 100644 --- a/backend/core/api/public/endpoints/Invoices/delete.py +++ b/backend/core/api/public/endpoints/Invoices/delete.py @@ -26,4 +26,4 @@ def delete_invoice_endpoint(request: APIRequest): invoice.delete() - return APIResponse(False, {"message": "Invoice successfully deleted"}, status=status.HTTP_200_OK) + return APIResponse(True, {"message": "Invoice successfully deleted"}, status=status.HTTP_200_OK) From 70d3865b544739cf572dfcdd7b45554221ac6a97 Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:29:50 -0500 Subject: [PATCH 12/13] invoice endpoint success bool --- backend/core/api/public/endpoints/Invoices/edit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/core/api/public/endpoints/Invoices/edit.py b/backend/core/api/public/endpoints/Invoices/edit.py index da5dabf95..145666bdb 100644 --- a/backend/core/api/public/endpoints/Invoices/edit.py +++ b/backend/core/api/public/endpoints/Invoices/edit.py @@ -71,7 +71,7 @@ def edit_invoice_endpoint(request: APIRequest): invoice.save() - return APIResponse(False, {"message": "Invoice successfully edited"}, status=status.HTTP_200_OK) + return APIResponse(True, {"message": "Invoice successfully edited"}, status=status.HTTP_200_OK) @api_view(["POST"]) @@ -94,7 +94,7 @@ def change_status_endpoint(request, invoice_id: int, invoice_status: str): invoice.set_status(invoice_status) - return APIResponse(False, {"message": f"Invoice status been changed to {invoice_status}"}, status=status.HTTP_200_OK) + return APIResponse(True, {"message": f"Invoice status been changed to {invoice_status}"}, status=status.HTTP_200_OK) @api_view(["POST"]) @@ -132,4 +132,4 @@ def edit_discount_endpoint(request, invoice_id: str): invoice.save() - return APIResponse(False, {"message": "Discount was applied successfully"}, status=status.HTTP_200_OK) + return APIResponse(True, {"message": "Discount was applied successfully"}, status=status.HTTP_200_OK) From 4c2f4bdddba3efe4aaafea99b5003be58c0fbb9e Mon Sep 17 00:00:00 2001 From: Gunin Wasan Date: Sat, 9 Nov 2024 23:30:37 -0500 Subject: [PATCH 13/13] typecheck in get invoice --- backend/core/api/public/endpoints/Invoices/get.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/core/api/public/endpoints/Invoices/get.py b/backend/core/api/public/endpoints/Invoices/get.py index 02f4d69dc..044be292e 100644 --- a/backend/core/api/public/endpoints/Invoices/get.py +++ b/backend/core/api/public/endpoints/Invoices/get.py @@ -2,6 +2,7 @@ from drf_yasg.utils import swagger_auto_schema from rest_framework import status from rest_framework.decorators import api_view +from rest_framework.response import Response from backend.core.api.public.decorators import require_scopes from backend.core.api.public.serializers.invoices import InvoiceSerializer @@ -45,7 +46,7 @@ ) @api_view(["GET"]) @require_scopes(["invoices:read"]) -def get_invoices_endpoint(request: APIRequest, id: str) -> APIResponse: +def get_invoices_endpoint(request: APIRequest, id: str) -> Response: try: if request.team: invoices = Invoice.objects.filter(organization=request.team, id=id)