|
5 | 5 | from django_email_learning.models import ContentDelivery, EnrollmentStatus |
6 | 6 | from django_email_learning.services import jwt_service |
7 | 7 | from django_email_learning.personalised.serializers import PublicQuizSerializer |
| 8 | +from django_email_learning.services.command_models.verify_enrollment_command import ( |
| 9 | + VerifyEnrollmentCommand, |
| 10 | +) |
8 | 11 | import uuid |
9 | 12 | import logging |
10 | 13 |
|
11 | 14 |
|
12 | | -class QuizPublicView(View, TemplateResponseMixin): |
| 15 | +class ErrrorLoggingMixin(TemplateResponseMixin): |
| 16 | + def errr_response( |
| 17 | + self, message: str, exception: Exception | None, status_code: int = 500 |
| 18 | + ) -> HttpResponse: |
| 19 | + error_ref = uuid.uuid4().hex |
| 20 | + if exception: |
| 21 | + logging.exception( |
| 22 | + f"{message} - Ref: {error_ref}", extra={"error_ref": error_ref} |
| 23 | + ) |
| 24 | + else: |
| 25 | + logging.error( |
| 26 | + f"{message} - Ref: {error_ref}", extra={"error_ref": error_ref} |
| 27 | + ) |
| 28 | + return self.render_to_response( |
| 29 | + context={"ref": error_ref, "error_message": message}, status=status_code |
| 30 | + ) |
| 31 | + |
| 32 | + |
| 33 | +class QuizPublicView(View, ErrrorLoggingMixin): |
13 | 34 | template_name = "personalised/quiz_public.html" |
14 | 35 |
|
15 | 36 | def get(self, request, *args, **kwargs) -> HttpResponse: # type: ignore[no-untyped-def] |
@@ -69,18 +90,47 @@ def get(self, request, *args, **kwargs) -> HttpResponse: # type: ignore[no-unty |
69 | 90 | message="The link has expired", exception=e, status_code=410 |
70 | 91 | ) |
71 | 92 |
|
72 | | - def errr_response( |
73 | | - self, message: str, exception: Exception | None, status_code: int = 500 |
74 | | - ) -> HttpResponse: |
75 | | - error_ref = uuid.uuid4().hex |
76 | | - if exception: |
77 | | - logging.exception( |
78 | | - f"{message} - Ref: {error_ref}", extra={"error_ref": error_ref} |
| 93 | + |
| 94 | +class VerifyEnrollmentView(View, ErrrorLoggingMixin): |
| 95 | + template_name = "personalised/verify_enrollment.html" |
| 96 | + |
| 97 | + def get(self, request, *args, **kwargs) -> HttpResponse: # type: ignore[no-untyped-def] |
| 98 | + try: |
| 99 | + token = request.GET["token"] |
| 100 | + except KeyError as e: |
| 101 | + return self.errr_response( |
| 102 | + message="The verification link is not valid.", |
| 103 | + exception=e, |
| 104 | + status_code=400, |
79 | 105 | ) |
80 | | - else: |
81 | | - logging.error( |
82 | | - f"{message} - Ref: {error_ref}", extra={"error_ref": error_ref} |
| 106 | + try: |
| 107 | + decoded = jwt_service.decode_jwt(token=token) |
| 108 | + except jwt_service.InvalidTokenException as e: |
| 109 | + return self.errr_response( |
| 110 | + message="The verification link is not valid.", |
| 111 | + exception=e, |
| 112 | + status_code=400, |
83 | 113 | ) |
84 | | - return self.render_to_response( |
85 | | - context={"ref": error_ref, "error_message": message}, status=status_code |
| 114 | + except jwt_service.ExpiredTokenException as e: |
| 115 | + return self.errr_response( |
| 116 | + message="The verification link has expired.", |
| 117 | + exception=e, |
| 118 | + status_code=410, |
| 119 | + ) |
| 120 | + |
| 121 | + enrollment_id = decoded["enrollment_id"] |
| 122 | + verification_code = decoded["verification_code"] |
| 123 | + |
| 124 | + command = VerifyEnrollmentCommand( |
| 125 | + command_name="verify_enrollment", |
| 126 | + enrollment_id=enrollment_id, |
| 127 | + verification_code=verification_code, |
86 | 128 | ) |
| 129 | + try: |
| 130 | + command.execute() |
| 131 | + except Exception as e: |
| 132 | + return self.errr_response( |
| 133 | + message="An error occurred during enrollment verification.", exception=e |
| 134 | + ) |
| 135 | + |
| 136 | + return self.render_to_response(context={"page_title": "Enrollment Verified"}) |
0 commit comments