diff --git a/openedx/features/edly/api/v1/urls.py b/openedx/features/edly/api/v1/urls.py index 9b10c5a80e9c..543df19f17ee 100644 --- a/openedx/features/edly/api/v1/urls.py +++ b/openedx/features/edly/api/v1/urls.py @@ -3,6 +3,7 @@ from openedx.features.edly.api.v1.views.course_enrollments import EdlyCourseEnrollmentViewSet from openedx.features.edly.api.v1.views.enrollment_count import EdlyProgramEnrollmentCountViewSet from openedx.features.edly.api.v1.views.user_mutisites import MultisitesViewset +from openedx.features.edly.api.v1.views.user_paid_for_course import UserPaidForCourseViewSet from openedx.features.edly.api.v1.views.user_sites import UserSitesViewSet router = routers.SimpleRouter() @@ -21,4 +22,10 @@ base_name='program_enrollment_count', ) +router.register( + r'user_paid_for_course', + UserPaidForCourseViewSet, + base_name='user_paid_for_course' +) + urlpatterns = router.urls diff --git a/openedx/features/edly/api/v1/views/user_paid_for_course.py b/openedx/features/edly/api/v1/views/user_paid_for_course.py new file mode 100644 index 000000000000..57d1a7a93b9a --- /dev/null +++ b/openedx/features/edly/api/v1/views/user_paid_for_course.py @@ -0,0 +1,60 @@ +from enum import Enum + +from opaque_keys import InvalidKeyError +from opaque_keys.edx.keys import CourseKey +from rest_framework import viewsets +from rest_framework.permissions import IsAuthenticated + +from common.djangoapps.student.models import CourseEnrollment +from common.djangoapps.util.json_request import JsonResponse + + +class PaymentStatus(Enum): + PAID = "paid" + UNPAID = "unpaid" + NOT_ENROLLED = "not_enrolled" + ERROR = "error" + + +class UserPaidForCourseViewSet(viewsets.ViewSet): + """ + **Use Case** + + Get the status of a user's paid status for a given course. + + **Example Request** + + GET /api/v1/user_paid_for_course/{course_id} + + **GET Parameters** + + * pk: The course id of the course to retrieve the user's paid status for. + + **Response Values** + + If the request is successful, the request returns an HTTP 200 "OK" response. + + The HTTP 200 response has the following values. + + * status: The status of the user's paid status for the course. + Possible values are: + * "paid": The user has paid for the course. + * "unpaid": The user has not paid for the course. + * "error": An error occurred while retrieving the user's paid status. + """ + permission_classes = [IsAuthenticated] + + def retrieve(self, request, pk=None): + try: + course_key = CourseKey.from_string(pk) + enrollment = CourseEnrollment.get_enrollment(request.user, course_key) + if not enrollment: + return JsonResponse({"status": PaymentStatus.NOT_ENROLLED.value}, status=200) + + order_exists = enrollment.get_order_attribute_value('order_number') + payment_status = PaymentStatus.PAID if order_exists else PaymentStatus.UNPAID + + return JsonResponse({"status": payment_status.value}, status=200) + + except (InvalidKeyError, Exception): + return JsonResponse({"status": PaymentStatus.ERROR.value}, status=406)