from sqlalchemy import delete, select from sqlalchemy.orm import Session from app.models.company import Company from app.models.role import Role from app.models.site import Site from app.models.site_role import SiteRole from app.models.system import System from app.models.user import User from app.models.user_site import UserSite class UserSitesRepository: def __init__(self, db: Session) -> None: self.db = db def list_user_site_rows(self, user_id: str) -> list[tuple[UserSite, Site, Company]]: stmt = ( select(UserSite, Site, Company) .join(Site, Site.id == UserSite.site_id) .join(Company, Company.id == Site.company_id) .where(UserSite.user_id == user_id) .order_by(Company.name.asc(), Site.display_name.asc()) ) return list(self.db.execute(stmt).all()) def list_site_member_rows(self, site_id: str) -> list[tuple[UserSite, User]]: stmt = ( select(UserSite, User) .join(User, User.id == UserSite.user_id) .where(UserSite.site_id == site_id) .order_by(User.display_name.asc().nulls_last(), User.username.asc().nulls_last(), User.user_sub.asc()) ) return list(self.db.execute(stmt).all()) def set_user_sites(self, *, user_id: str, site_ids: list[str]) -> None: self.db.execute(delete(UserSite).where(UserSite.user_id == user_id)) for site_id in site_ids: self.db.add(UserSite(user_id=user_id, site_id=site_id)) self.db.commit() def get_user_role_rows(self, user_id: str) -> list[tuple[Site, Company, Role, System]]: stmt = ( select(Site, Company, Role, System) .select_from(UserSite) .join(Site, Site.id == UserSite.site_id) .join(Company, Company.id == Site.company_id) .join(SiteRole, SiteRole.site_id == Site.id) .join(Role, Role.id == SiteRole.role_id) .join(System, System.id == Role.system_id) .where(UserSite.user_id == user_id) .order_by(Company.name.asc(), Site.display_name.asc(), System.name.asc(), Role.name.asc()) ) return list(self.db.execute(stmt).all())