feat: add API views for user registration, profile management, and WhatsApp OTP verification
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 23s

This commit is contained in:
vickytechkey 2026-10-04 10:27:41 +05:30
parent dc60cf95b2
commit 017897453c

View file

@ -64,61 +64,69 @@ class SendWhatsAppOTPView(APIView):
clean_phone = str(mobile_number).replace('+', '').strip()
cache.set(f"whatsapp_otp_{clean_phone}", str(otp_code), timeout=300)
whatsapp_service_url = getattr(settings, 'WHATSAPP_SERVICE_URL', 'http://betawhatsapp.tradhox.com/api/send/')
whatsapp_urls = [
getattr(settings, 'WHATSAPP_SERVICE_URL', 'https://betawhatsapp.tradhox.com/api/send/'),
'http://betawhatsapp.tradhox.com/api/send/',
'http://127.0.0.1:8081/api/send/'
]
payload = {
"mobile_number": mobile_number,
"otp_code": otp_code,
"template_name": template_name
}
try:
req_data = json.dumps(payload).encode('utf-8')
req = urllib.request.Request(
whatsapp_service_url,
data=req_data,
headers={'Content-Type': 'application/json', 'User-Agent': 'TradhoxBackend/1.0'}
)
with urllib.request.urlopen(req, timeout=10) as resp:
status_code = resp.status
body_bytes = resp.read()
try:
res_data = json.loads(body_bytes.decode('utf-8'))
except Exception:
res_data = {"text": body_bytes.decode('utf-8', errors='ignore')}
req_data = json.dumps(payload).encode('utf-8')
last_error = None
res_data = None
status_code = 500
if status_code == 200 and res_data.get('status') != 'error':
return Response({
"status": "success",
"message": f"WhatsApp OTP dispatched to {mobile_number}",
"mobile_number": mobile_number,
"gateway_response": res_data
}, status=status.HTTP_200_OK)
else:
audit_logger.warning(f"WhatsApp gateway response for {mobile_number}: {status_code} {res_data}")
return Response({
"status": "success",
"message": f"WhatsApp OTP request submitted for {mobile_number}",
"mobile_number": mobile_number,
"gateway_response": res_data
}, status=status.HTTP_200_OK)
except urllib.error.HTTPError as e:
err_body = e.read().decode('utf-8', errors='ignore')
for url in whatsapp_urls:
try:
err_data = json.loads(err_body)
except Exception:
err_data = {"text": err_body}
audit_logger.warning(f"WhatsApp gateway HTTPError {e.code} for {mobile_number}: {err_data}")
req = urllib.request.Request(
url,
data=req_data,
headers={'Content-Type': 'application/json', 'User-Agent': 'TradhoxBackend/1.0'}
)
with urllib.request.urlopen(req, timeout=8) as resp:
status_code = resp.status
body_bytes = resp.read()
try:
res_data = json.loads(body_bytes.decode('utf-8'))
except Exception:
res_data = {"text": body_bytes.decode('utf-8', errors='ignore')}
if status_code == 200 and res_data.get('status') != 'error':
return Response({
"status": "success",
"message": f"WhatsApp OTP dispatched to {mobile_number}",
"mobile_number": mobile_number,
"gateway_response": res_data
}, status=status.HTTP_200_OK)
except urllib.error.HTTPError as e:
status_code = e.code
err_body = e.read().decode('utf-8', errors='ignore')
try:
res_data = json.loads(err_body)
except Exception:
res_data = {"text": err_body}
last_error = f"HTTP {e.code}: {res_data}"
audit_logger.warning(f"WhatsApp gateway attempt {url} returned HTTP {e.code}: {res_data}")
except Exception as e:
last_error = str(e)
audit_logger.warning(f"WhatsApp gateway attempt {url} failed: {e}")
if status_code == 200:
return Response({
"status": "warning",
"message": f"WhatsApp gateway returned status {e.code}",
"gateway_response": err_data,
"mobile_number": mobile_number
"status": "success",
"message": f"WhatsApp OTP request submitted for {mobile_number}",
"mobile_number": mobile_number,
"gateway_response": res_data
}, status=status.HTTP_200_OK)
except Exception as e:
audit_logger.error(f"WhatsApp service connection error for {mobile_number}: {e}")
else:
return Response({
"status": "error",
"message": f"Could not reach WhatsApp service gateway: {str(e)}",
"message": f"WhatsApp service gateway error: {last_error}",
"mobile_number": mobile_number
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)