from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker from src.model.database_model.model import User, Permissions class ActionsDB: def __init__(self) -> None: self.engine=create_engine("sqlite:///DB/database.db", echo=True) self.Session=sessionmaker(self.engine,expire_on_commit=False) def get_user_by_email(self, email: str) -> User | None: with self.Session() as session: with session.begin(): q=select(User).where(User.email==email) r=session.scalars(q).first() if r: return r else: return None def get_user_by_id(self, id:int)->User|None: with self.Session() as session: with session.begin(): q=select(User).where(User.id==id) r=session.scalars(q).first() if r: return r else: return None def create_user(self, user:dict, permission_names:list[str])->User: with self.Session() as session: with session.begin(): new_user=User(**user) if permission_names: perms = session.scalars( select(Permissions).where(Permissions.permission.in_(permission_names)) ).all() new_user.permissions.extend(perms) session.add(new_user) session.refresh(new_user, attribute_names=["permissions"]) return new_user def delete_user(self, id:int)->bool: with self.Session() as session: with session.begin(): q=select(User).where(User.id==id) r=session.scalar(q) if r is None: return False r.status = False return True def update_user(self, data: dict, permission_names: list[str]) -> User | None: with self.Session() as session: with session.begin(): q = select(User).where(User.id == data["id"]) user = session.execute(q).scalar_one_or_none() if user is None: return None if permission_names: perms = session.scalars( select(Permissions).where(Permissions.permission.in_(permission_names)) ).all() user.permissions = list(perms) for key, value in data.items(): if key != "id": setattr(user, key, value) session.refresh(user, attribute_names=["permissions"]) return user def get_all_permissions(self)->list[str]: with self.Session() as session: with session.begin(): q=select(Permissions) permissions=session.scalars(q).all() return [p.permission for p in permissions]