feat(auth): enterprise authentication and user management

This commit is contained in:
Schubert Ferenc 2026-07-02 22:19:12 +02:00
parent 4bc8b20a21
commit 86a32a942c
36 changed files with 2239 additions and 324 deletions

View file

@ -1,27 +1,98 @@
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models.user import User
from app.schemas.user import UserCreate
from app.core.security import hash_password
from app.models.user import User
from app.schemas.user import UserCreate, UserPasswordUpdate, UserUpdate
class UserRepository:
@staticmethod
def get_all(db: Session) -> list[User]:
return list(db.scalars(select(User).order_by(User.created_at.desc())))
@staticmethod
def get_all(db: Session):
return db.query(User).all()
def get_by_id(db: Session, user_id: int) -> User | None:
return db.get(User, user_id)
@staticmethod
def create(db: Session, user: UserCreate):
def get_by_username(db: Session, username: str) -> User | None:
return db.scalar(select(User).where(User.username == username))
@staticmethod
def find_conflict(
db: Session,
*,
username: str,
email: str,
exclude_user_id: int | None = None,
) -> tuple[str, User] | None:
username_query = select(User).where(User.username == username)
email_query = select(User).where(User.email == email)
if exclude_user_id is not None:
username_query = username_query.where(User.id != exclude_user_id)
email_query = email_query.where(User.id != exclude_user_id)
username_user = db.scalar(username_query)
if username_user is not None:
return ("username", username_user)
email_user = db.scalar(email_query)
if email_user is not None:
return ("email", email_user)
return None
@staticmethod
def create(db: Session, user: UserCreate) -> User:
db_user = User(
username=user.username,
email=user.email,
password_hash=hash_password(user.password),
)
first_name=user.first_name,
last_name=user.last_name,
username=user.username,
email=str(user.email),
role=user.role,
is_active=user.is_active,
password_hash=hash_password(user.password),
)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
return db_user
@staticmethod
def update(db: Session, db_user: User, user: UserUpdate) -> User:
db_user.first_name = user.first_name
db_user.last_name = user.last_name
db_user.username = user.username
db_user.email = str(user.email)
db_user.role = user.role
db_user.is_active = user.is_active
if user.password:
db_user.password_hash = hash_password(user.password)
db.commit()
db.refresh(db_user)
return db_user
@staticmethod
def update_password(
db: Session,
db_user: User,
password_update: UserPasswordUpdate,
) -> User:
db_user.password_hash = hash_password(password_update.password)
db.commit()
db.refresh(db_user)
return db_user
@staticmethod
def delete(db: Session, db_user: User) -> None:
db.delete(db_user)
db.commit()