Skip to content

Commit b9f50a8

Browse files
authored
Merge pull request #2593 from gtech-mulearn/production-07-09-2025
[Feature] Achievements
2 parents 901eb8f + 2e5d317 commit b9f50a8

22 files changed

+2945
-318
lines changed

api/auth/auth_views.py

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import decouple
2+
import requests
3+
from rest_framework.views import APIView
4+
5+
from utils.response import CustomResponse
6+
7+
8+
AUTH_DOMAIN = decouple.config("AUTH_DOMAIN")
9+
10+
11+
class GoogleMobileAuthProxyAPI(APIView):
12+
"""
13+
Proxy endpoint for Google mobile authentication.
14+
Forwards requests to the auth server and returns the response.
15+
"""
16+
17+
def post(self, request):
18+
id_token = request.data.get("id_token") or request.data.get("idToken")
19+
20+
if not id_token:
21+
return CustomResponse(
22+
general_message="ID token is required"
23+
).get_failure_response()
24+
25+
try:
26+
response = requests.post(
27+
f"{AUTH_DOMAIN}/api/v1/auth/google-mobile/",
28+
json={"id_token": id_token},
29+
headers={"Content-Type": "application/json"},
30+
timeout=30,
31+
)
32+
33+
data = response.json()
34+
35+
if data.get("hasError"):
36+
return CustomResponse(
37+
general_message=data.get("message", {}).get("general", ["Authentication failed"])[0]
38+
).get_failure_response()
39+
40+
return CustomResponse(
41+
general_message="Access Granted",
42+
response=data.get("response"),
43+
).get_success_response()
44+
45+
except requests.exceptions.Timeout:
46+
return CustomResponse(
47+
general_message="Authentication server timeout"
48+
).get_failure_response()
49+
except requests.exceptions.RequestException as e:
50+
return CustomResponse(
51+
general_message=f"Authentication server error: {str(e)}"
52+
).get_failure_response()
53+
54+
55+
class AppleMobileAuthProxyAPI(APIView):
56+
"""
57+
Proxy endpoint for Apple mobile authentication.
58+
Forwards requests to the auth server and returns the response.
59+
"""
60+
61+
def post(self, request):
62+
identity_token = request.data.get("identity_token") or request.data.get("identityToken")
63+
email = request.data.get("email")
64+
65+
if not identity_token:
66+
return CustomResponse(
67+
general_message="Identity token is required"
68+
).get_failure_response()
69+
70+
try:
71+
payload = {"identity_token": identity_token}
72+
if email:
73+
payload["email"] = email
74+
75+
response = requests.post(
76+
f"{AUTH_DOMAIN}/api/v1/auth/apple-mobile/",
77+
json=payload,
78+
headers={"Content-Type": "application/json"},
79+
timeout=30,
80+
)
81+
82+
data = response.json()
83+
84+
if data.get("hasError"):
85+
return CustomResponse(
86+
general_message=data.get("message", {}).get("general", ["Authentication failed"])[0]
87+
).get_failure_response()
88+
89+
return CustomResponse(
90+
general_message="Access Granted",
91+
response=data.get("response"),
92+
).get_success_response()
93+
94+
except requests.exceptions.Timeout:
95+
return CustomResponse(
96+
general_message="Authentication server timeout"
97+
).get_failure_response()
98+
except requests.exceptions.RequestException as e:
99+
return CustomResponse(
100+
general_message=f"Authentication server error: {str(e)}"
101+
).get_failure_response()
102+
103+
104+
class UserAuthenticationProxyAPI(APIView):
105+
"""
106+
Proxy endpoint for email/password user authentication.
107+
Forwards requests to the auth server and returns the response.
108+
"""
109+
110+
def post(self, request):
111+
email = request.data.get("emailOrMuid")
112+
password = request.data.get("password")
113+
114+
if not email or not password:
115+
return CustomResponse(
116+
general_message="Email and password are required"
117+
).get_failure_response()
118+
119+
try:
120+
response = requests.post(
121+
f"{AUTH_DOMAIN}/api/v1/auth/user-authentication/",
122+
json={"emailOrMuid": email, "password": password},
123+
headers={"Content-Type": "application/json"},
124+
timeout=30,
125+
)
126+
127+
data = response.json()
128+
129+
if data.get("hasError"):
130+
return CustomResponse(
131+
general_message=data.get("message", {}).get("general", ["Authentication failed"])[0]
132+
).get_failure_response()
133+
134+
return CustomResponse(
135+
general_message="Access Granted",
136+
response=data.get("response"),
137+
).get_success_response()
138+
139+
except requests.exceptions.Timeout:
140+
return CustomResponse(
141+
general_message="Authentication server timeout"
142+
).get_failure_response()
143+
except requests.exceptions.RequestException as e:
144+
return CustomResponse(
145+
general_message=f"Authentication server error: {str(e)}"
146+
).get_failure_response()
147+
148+
149+
class RefreshTokenProxyAPI(APIView):
150+
"""
151+
Proxy endpoint for token refresh.
152+
Forwards requests to the auth server and returns fresh tokens.
153+
"""
154+
155+
def post(self, request):
156+
refresh_token = request.data.get("refreshToken") or request.data.get("refresh_token")
157+
158+
if not refresh_token:
159+
return CustomResponse(
160+
general_message="Refresh token is required"
161+
).get_failure_response()
162+
163+
try:
164+
response = requests.post(
165+
f"{AUTH_DOMAIN}/api/v1/auth/get-access-token/",
166+
json={"refreshToken": refresh_token},
167+
headers={"Content-Type": "application/json"},
168+
timeout=30,
169+
)
170+
171+
data = response.json()
172+
173+
if data.get("hasError"):
174+
return CustomResponse(
175+
general_message=data.get("message", {}).get("general", ["Token refresh failed"])[0]
176+
).get_failure_response()
177+
178+
return CustomResponse(
179+
response=data.get("response"),
180+
).get_success_response()
181+
182+
except requests.exceptions.Timeout:
183+
return CustomResponse(
184+
general_message="Authentication server timeout"
185+
).get_failure_response()
186+
except requests.exceptions.RequestException as e:
187+
return CustomResponse(
188+
general_message=f"Authentication server error: {str(e)}"
189+
).get_failure_response()

api/auth/urls.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.urls import path
2+
3+
from . import auth_views
4+
5+
urlpatterns = [
6+
path('user-authentication/', auth_views.UserAuthenticationProxyAPI.as_view(), name='user_auth_proxy'),
7+
path('google-mobile/', auth_views.GoogleMobileAuthProxyAPI.as_view(), name='google_mobile_proxy'),
8+
path('apple-mobile/', auth_views.AppleMobileAuthProxyAPI.as_view(), name='apple_mobile_proxy'),
9+
path('refresh-token/', auth_views.RefreshTokenProxyAPI.as_view(), name='refresh_token_proxy'),
10+
]

0 commit comments

Comments
 (0)