user process

This commit is contained in:
Bedir Tuğra Karaabalı 2025-05-07 18:33:35 +03:00
parent 36da53a562
commit 842c127817
2 changed files with 101 additions and 3 deletions

View File

@ -1,4 +1,6 @@
from enum import Enum from enum import Enum
import random
import smtplib
from backend.config import SECRET_KEY, ALGORITHM, ACCESS_TOKEN_EXPIRE_MINUTES ,pwd_context, get_session_db, Base from backend.config import SECRET_KEY, ALGORITHM, ACCESS_TOKEN_EXPIRE_MINUTES ,pwd_context, get_session_db, Base
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from pydantic import BaseModel from pydantic import BaseModel
@ -8,6 +10,7 @@ from fastapi.security import OAuth2PasswordBearer
from pydantic.networks import EmailStr from pydantic.networks import EmailStr
from sqlalchemy import Column, Integer, String from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from email.message import EmailMessage
import jwt import jwt
class Token(BaseModel): class Token(BaseModel):
@ -170,4 +173,68 @@ def register_user(
session.add(db_user) # donuşum yaparken dikkat et session.add(db_user) # donuşum yaparken dikkat et
session.commit() session.commit()
session.refresh(db_user) session.refresh(db_user)
return db_user return db_user
def find_user_w_email(
session: Annotated[Session, Depends(get_session_db)],
email: EmailStr | None = None,
):
exist_user = session.query(DBUser).filter(DBUser.email == email).first() #email ile kullanıcıyı bul
if exist_user is None:
raise HTTPException(status_code=400, detail="User not found")
if exist_user.status == Status.banned:
raise HTTPException(status_code=400, detail="Inactive user")
return True
def send_password_to_email(
session: Annotated[Session, Depends(get_session_db)],
email: EmailStr | None = None,
) -> str:
msg = EmailMessage() #obje oluştur
msg['Subject'] = 'Password Reset'
msg['From'] = 'hansneiumann@gmail.com'
msg['To'] = email
veritification_code = generate_password_reset_number()
msg.set_content(veritification_code)
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login("hansneiumann@gmail.com", "rwaq mbil lzut dgja")
smtp.send_message(msg)
update_password_w_email(session, email=email, password=veritification_code) #şifreyi güncelle
def generate_password_reset_number() -> str:
return str(random.randint(10000000, 99999999)) # 8 haneli rastgele bir sayı döndür
def update_password_w_email(
session: Annotated[Session, Depends(get_session_db)],
password: str | None = None,
email: EmailStr | None = None,
) -> dict:
hashed_password = get_password_hash(password)
session.query(DBUser).filter(DBUser.email == email).update({"hashed_password": hashed_password})
session.commit()
return {"message": "Password updated successfully"}
def update_password_w_user(
session: Annotated[Session, Depends(get_session_db)],
user: Annotated[DBUser , None],
password: str | None = None,
):
hashed_password = get_password_hash(password)
session.query(DBUser).filter(DBUser.user_id == user.user_id).update({"hashed_password": hashed_password})
session.commit()
session.refresh(user)

View File

@ -1,10 +1,12 @@
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks
from .models import Token, UserPublic, authenticate_user, create_access_token, UserCreate, register_user from .models import Token, UserPublic, authenticate_user, create_access_token, UserCreate, find_user_w_email, get_current_user, register_user, send_password_to_email, update_password_w_user
from datetime import timedelta from datetime import timedelta
from typing import Annotated from typing import Annotated
from ..config import get_session_db from ..config import get_session_db
from fastapi.security import OAuth2PasswordRequestForm from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from pydantic.networks import EmailStr
router = APIRouter( router = APIRouter(
prefix="/auth", prefix="/auth",
@ -41,4 +43,33 @@ async def create_user(
return register_user(session, user) return register_user(session, user)
@router.post('/password_reset')
async def password_reset(
session : Annotated[Session, Depends(get_session_db)],
email : Annotated[EmailStr, None] = None,
task: Annotated[BackgroundTasks, None] = None, # BackgroundTasks, task'ı arka planda çalıştırmak için kullanıyoruz
):
if not find_user_w_email(session, email):
return HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="bad request",
)
task.add_task(send_password_to_email, session, email)
return {"message": "New password has been sent to your email."}
@router.post('/update_password')
async def update_password(
user: Annotated[str, Depends(get_current_user)],
session: Annotated[Session, Depends(get_session_db)],
new_password: Annotated[str, None] = None,
) -> dict:
update_password_w_user(session, user, new_password)
return {"message": "Password updated successfully."}