Files
backend/core/services/sms.py

89 lines
3.0 KiB
Python

# type: ignore
import random
from datetime import datetime, timedelta
from config.env import env
from core.apps.accounts.tasks.sms import SendConfirm
from django_core import exceptions, models
class SmsService:
@staticmethod
def send_confirm(phone):
"""Tasdiqlash ko'dini yuborish
Args:
phone (str): telefon no'mer
Raises:
exceptions.SmsException: [TODO:description]
"""
# TODO: Deploy this change when deploying -> code = random.randint(1000, 9999) # noqa
if env.bool("OTP_PROD", False):
code = "".join(str(random.randint(0, 9)) for _ in range(env.int("OTP_SIZE", 4)))
else:
code = env.int("OTP_DEFAULT", 1111)
print("ishlayapti01")
sms_confirm, status = models.SmsConfirm.objects.get_or_create(phone=phone, defaults={"code": code})
print(sms_confirm)
print(status)
sms_confirm.sync_limits()
print("ishlayapti")
if sms_confirm.resend_unlock_time is not None:
expired = sms_confirm.interval(sms_confirm.resend_unlock_time)
exception = exceptions.SmsException(f"Resend blocked, try again in {expired}", expired=expired)
raise exception
print("ishlayapti2")
sms_confirm.code = code
sms_confirm.try_count = 0
sms_confirm.resend_count += 1
sms_confirm.phone = phone
sms_confirm.expired_time = datetime.now() + timedelta(seconds=models.SmsConfirm.SMS_EXPIRY_SECONDS) # noqa
sms_confirm.resend_unlock_time = datetime.now() + timedelta(
seconds=models.SmsConfirm.SMS_EXPIRY_SECONDS
) # noqa
print("ishlayapti3")
sms_confirm.save()
SendConfirm.delay(phone, code)
print("ishlayapti4")
return True
@staticmethod
def check_confirm(phone, code):
"""Tasdiqlash ko'dini haqiqiyligini tekshirish
Args:
phone ([TODO:type]): [TODO:description]
code ([TODO:type]): [TODO:description]
Raises:
exceptions.SmsException: [TODO:description]
exceptions.SmsException: [TODO:description]
exceptions.SmsException: [TODO:description]
exceptions.SmsException: [TODO:description]
"""
sms_confirm = models.SmsConfirm.objects.filter(phone=phone).first()
if sms_confirm is None:
raise exceptions.SmsException("Invalid confirmation code")
sms_confirm.sync_limits()
if sms_confirm.is_expired():
raise exceptions.SmsException("Time for confirmation has expired")
if sms_confirm.is_block():
expired = sms_confirm.interval(sms_confirm.unlock_time)
raise exceptions.SmsException(f"Try again in {expired}")
if str(sms_confirm.code) == str(code):
sms_confirm.delete()
return True
sms_confirm.try_count += 1
sms_confirm.save()
raise exceptions.SmsException("Invalid confirmation code")