yuvabe-dev / src /auth /service.py
Hp137's picture
feat:Added leave/assets
66536b4
import uuid
from src.auth.utils import (
# send_otp_email,
verify_password,
create_refresh_token,
verify_verification_token,
create_access_token,
hash_password,
create_verification_token,
)
from src.core.models import Users
from sqlmodel import Session, select
from fastapi import HTTPException
from sqlmodel.ext.asyncio.session import AsyncSession
async def create_user(session: AsyncSession, name: str, email: str, password: str):
"""Create user without sending email"""
if not email.lower().endswith("@yuvabe.com"):
raise HTTPException(status_code=400, detail="Enter you're Yuvabe email ID")
user = await session.exec(select(Users).where(Users.email_id == email))
existing_user = user.first()
if existing_user:
raise ValueError("User already exists")
new_user = Users(
user_name=name,
email_id=email,
password=hash_password(password),
is_verified=True,
)
session.add(new_user)
await session.commit()
await session.refresh(new_user)
access_token = create_access_token(
data={
"sub": str(new_user.id),
"name": new_user.user_name,
"email": new_user.email_id,
}
)
refresh_token = create_refresh_token(
data={
"sub": str(new_user.id),
"name": new_user.user_name,
"email": new_user.email_id,
}
)
return {
"message": "User created successfully",
"user_id": str(new_user.id),
"access_token": access_token,
"refresh_token": refresh_token,
}
# async def send_verification_link(session: Session, email: str):
# """Send verification email for an existing user."""
# result = await session.exec(select(Users).where(Users.email_id == email))
# user = result.first()
# if not user:
# raise HTTPException(status_code=404, detail="User not found")
# if user.is_verified:
# raise HTTPException(status_code=400, detail="User is already verified")
# # Create a token using existing user ID (opaque token)
# token = create_verification_token(str(user.id))
# try:
# send_verification_email(email, token)
# except Exception as e:
# raise HTTPException(
# status_code=500, detail=f"Failed to send verification email: {str(e)}"
# )
# return {
# "message": "Verification link sent successfully",
# "user_id": str(user.id),
# "email": user.email_id,
# }
async def verify_email(session: Session, token: str):
try:
user_id = await verify_verification_token(token)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
user = await session.get(Users, uuid.UUID(user_id))
if not user:
raise HTTPException(status_code=404, detail="User not found")
if not user.is_verified:
user.is_verified = True
await session.commit()
access_token = create_access_token(
data={"sub": str(user.id), "name": user.user_name, "email": user.email_id}
)
refresh_token = create_refresh_token(
data={"sub": str(user.id), "name": user.user_name, "email": user.email_id}
)
return {
"message": "Email verified successfully!",
"access_token": access_token,
"refresh_token": refresh_token,
"token_type": "bearer",
}
async def login_user(session: Session, email: str, password: str):
if not email.lower().endswith("@yuvabe.com"):
raise HTTPException(status_code=400, detail="Enter you're Yuvabe email ID")
users = await session.exec(select(Users).where(Users.email_id == email))
user = users.first()
if not user:
raise HTTPException(status_code=400, detail="Invalid email or password")
if not verify_password(password, user.password):
raise HTTPException(status_code=400, detail="Invalid email or password")
if not user.is_verified:
raise HTTPException(status_code=400, detail="Verify email to login")
access_token = create_access_token(
data={"sub": str(user.id), "name": user.user_name, "email": user.email_id}
)
refresh_token = create_refresh_token(
data={"sub": str(user.id), "name": user.user_name, "email": user.email_id}
)
return {
"access_token": access_token,
"refresh_token": refresh_token,
"token_type": "bearer",
"user": {
"id": str(user.id),
"name": user.user_name,
"email": user.email_id,
"is_verified": user.is_verified,
},
}