"""Family repository""" from typing import Optional, List from sqlalchemy.orm import Session from app.db.models import Family, FamilyMember, FamilyInvite from app.db.repositories.base import BaseRepository class FamilyRepository(BaseRepository[Family]): """Family data access operations""" def __init__(self, session: Session): super().__init__(session, Family) def get_by_invite_code(self, invite_code: str) -> Optional[Family]: """Get family by invite code""" return self.session.query(Family).filter(Family.invite_code == invite_code).first() def get_user_families(self, user_id: int) -> List[Family]: """Get all families for a user""" return ( self.session.query(Family) .join(FamilyMember) .filter(FamilyMember.user_id == user_id) .all() ) def is_member(self, family_id: int, user_id: int) -> bool: """Check if user is member of family""" return ( self.session.query(FamilyMember) .filter( FamilyMember.family_id == family_id, FamilyMember.user_id == user_id ) .first() is not None ) def add_member(self, family_id: int, user_id: int, role: str = "member") -> FamilyMember: """Add user to family""" member = FamilyMember(family_id=family_id, user_id=user_id, role=role) self.session.add(member) self.session.commit() self.session.refresh(member) return member def remove_member(self, family_id: int, user_id: int) -> bool: """Remove user from family""" member = ( self.session.query(FamilyMember) .filter( FamilyMember.family_id == family_id, FamilyMember.user_id == user_id ) .first() ) if member: self.session.delete(member) self.session.commit() return True return False def get_invite(self, invite_code: str) -> Optional[FamilyInvite]: """Get invite by code""" return ( self.session.query(FamilyInvite) .filter(FamilyInvite.invite_code == invite_code) .first() )