feat(admin): add AdminTopupCreateView for admin top-up functionality
All checks were successful
Build and Push Docker Images / Build and Push Docker Images (push) Successful in 4m33s

This commit is contained in:
2025-07-27 10:50:40 +05:00
parent 3e7a74950e
commit cdef5ed27c
2 changed files with 43 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ from .views import (
TopupDetailAPIView, TopupDetailAPIView,
CancelTopupView, CancelTopupView,
ListWalletTransactionView, ListWalletTransactionView,
AdminTopupCreateView,
) )
urlpatterns = [ urlpatterns = [
@@ -37,6 +38,7 @@ urlpatterns = [
VerifyTopupPaymentAPIView.as_view(), VerifyTopupPaymentAPIView.as_view(),
name="verify-topup-payment", name="verify-topup-payment",
), ),
path("admin-topup/", AdminTopupCreateView.as_view(), name="admin-topup"),
path( path(
"topup/<str:pk>/cancel/", "topup/<str:pk>/cancel/",
CancelTopupView.as_view(), CancelTopupView.as_view(),

View File

@@ -595,6 +595,47 @@ class CancelTopupView(StaffEditorPermissionMixin, generics.UpdateAPIView):
return super().update(request, *args, **kwargs) return super().update(request, *args, **kwargs)
class AdminTopupCreateView(StaffEditorPermissionMixin, generics.CreateAPIView):
queryset = Topup.objects.all().select_related("user")
serializer_class = TopupSerializer
def create(self, request, *args, **kwargs):
data = request.data
user_id = data.get("user_id")
amount = data.get("amount")
if not getattr(request.user, "is_admin", False):
return Response(
{"message": "You are not authorized to perform this action."},
status=status.HTTP_403_FORBIDDEN,
)
if not user_id:
return Response(
{"message": "user_id is required."},
status=status.HTTP_400_BAD_REQUEST,
)
if not amount:
return Response(
{"message": "amount is required."},
status=status.HTTP_400_BAD_REQUEST,
)
user = User.objects.filter(id=user_id).first()
if not user:
return Response(
{"message": "User not found."},
status=status.HTTP_404_NOT_FOUND,
)
topup = Topup.objects.create(amount=amount, user=user)
description = f"Topup of {amount} MVR (Cash)"
WalletTransaction.objects.create(
user=user,
amount=amount,
transaction_type="TOPUP",
description=description,
)
serializer = TopupSerializer(topup)
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ListWalletTransactionView(StaffEditorPermissionMixin, generics.ListAPIView): class ListWalletTransactionView(StaffEditorPermissionMixin, generics.ListAPIView):
serializer_class = WalletTransactionSerializer serializer_class = WalletTransactionSerializer
queryset = WalletTransaction.objects.all().select_related("user") queryset = WalletTransaction.objects.all().select_related("user")