pychatbot / service /OTPService.py
kltn20133118's picture
Upload 258 files
13ba451 verified
from datetime import timedelta,datetime
from request import RequestOTP as req
from response import ResponseOTP as res
import re
from firebase_admin import auth, exceptions
from repository import OTPRepository
from datetime import datetime, timedelta
import datetime, string,random
from function import support_function as sf
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
def get_user1(email):
try:
user = auth.get_user_by_email(email)
return user
except exceptions.FirebaseError as e:
return None
def check_email(email):
if isinstance(email, str) and re.fullmatch(regex, email):
return True
else:
return False
def generate_otp(length=6):
characters = string.ascii_uppercase + string.digits
otp = ''.join(random.choice(characters) for _ in range(length))
return otp
async def createOTP(request: req.RequestCreateOTP):
try:
email = request.email
otp = generate_otp()
check_email_fc = sf.check_email_empty_invalid(email)
if check_email_fc is not True:
return check_email_fc
OTPRepository.addOTP(email,otp)
return res.ResponseCreateOTP(
status=200,
data = res.CheckModel(check=True),
otp = otp
)
except:
return res.ReponseError(
status=500,
data=res.Message(message="Server Error")
)
async def verifyOTP(request: req.RequestVerifyOTP):
try:
email = request.email
otp = request.otp
check_email_fc = sf.check_email_empty_invalid(email)
if check_email_fc is not True:
return check_email_fc
if otp is None:
return res.ReponseError(
status=400,
data=res.Message(message="otp is empty")
)
user_otp = OTPRepository.getOtpByEmail(email)
if user_otp:
otp_db = user_otp.otp
otp_created_at = user_otp.created_at
if otp == otp_db:
current_time = datetime.datetime.now()
otp_expiry_time = otp_created_at + timedelta(minutes=15)
if current_time <= otp_expiry_time:
OTPRepository.deleteOTP(email, otp)
return res.ResponseVerifyOTPSignUp(
status=200,
data=res.Message(message="OTP is valid")
)
else:
return res.ReponseError(
status=400,
data=res.Message(message="OTP has expired")
)
else:
return res.ReponseError(
status=400,
data=res.Message(message="Invalid OTP")
)
else:
return res.ReponseError(
status=404,
data=res.Message(message="No OTP found for this email")
)
except:
return res.ReponseError(
status=500,
data=res.Message(message="Server Error")
)
async def createOTPReset(email):
try:
otp = generate_otp()
check_email_fc = sf.check_email_empty_invalid(email)
if check_email_fc is not True:
return check_email_fc
OTPRepository.addOTP(email,otp)
return res.ResponseCreateOTP(
status=200,
data = res.CheckModel(check=True),
otp = otp
)
except:
return res.ReponseError(
status=500,
data=res.Message(message="Server Error")
)
async def generate_random_password(length=8):
characters = string.ascii_letters + string.digits
password = ''.join(random.choice(characters) for i in range(length))
return password
async def verifyOTPReset(request: req.RequestVerifyOTP):
try:
email = request.email
otp = request.otp
check_email_fc = sf.check_email_empty_invalid(email)
if check_email_fc is not True:
return check_email_fc
if otp is None:
return res.ReponseError(
status=400,
data=res.Message(message="OTP is empty")
)
user_otp = OTPRepository.getOtpByEmail(email)
if user_otp:
otp_db = user_otp.otp
otp_created_at = user_otp.created_at
if otp == otp_db:
current_time = datetime.datetime.now() # Lấy thời gian hiện tại với múi giờ hệ thống (múi giờ +7)
otp_expiry_time = otp_created_at + timedelta(minutes=15)
new_password = generate_random_password()
if current_time <= otp_expiry_time:
OTPRepository.deleteOTP(email, otp)
user_email = auth.get_user_by_email(email)
auth.update_user(
user_email.uid,
password=new_password)
return res.ResponseVerifyOTP(
status=200,
data=res.Message(message="New Password send to Email"),
newpassword=new_password
)
else:
return res.ReponseError(
status=400,
data=res.Message(message="OTP has expired")
)
else:
return res.ReponseError(
status=400,
data=res.Message(message="Invalid OTP")
)
else:
return res.ReponseError(
status=404,
data=res.Message(message="No OTP found for this email")
)
except:
return res.ReponseError(
status=500,
data=res.Message(message="Server Error")
)