"""Repository: get_or_create_user, get_duties, insert_duty.""" from sqlalchemy.orm import Session from db.models import User, Duty def get_or_create_user( session: Session, telegram_user_id: int, full_name: str, username: str | None = None, first_name: str | None = None, last_name: str | None = None, ) -> User: user = session.query(User).filter(User.telegram_user_id == telegram_user_id).first() if user: user.full_name = full_name user.username = username user.first_name = first_name user.last_name = last_name session.commit() session.refresh(user) return user user = User( telegram_user_id=telegram_user_id, full_name=full_name, username=username, first_name=first_name, last_name=last_name, ) session.add(user) session.commit() session.refresh(user) return user def get_duties( session: Session, from_date: str, to_date: str, ) -> list[tuple[Duty, str]]: """Return list of (Duty, full_name) overlapping the given date range. from_date/to_date are YYYY-MM-DD (first/last day of month in client's local calendar). Duty.start_at and end_at are stored in UTC (ISO 8601 with Z); lexicographic comparison with date strings yields correct overlap. """ q = ( session.query(Duty, User.full_name) .join(User, Duty.user_id == User.id) .filter(Duty.start_at <= to_date, Duty.end_at >= from_date) ) return list(q.all()) def insert_duty( session: Session, user_id: int, start_at: str, end_at: str, ) -> Duty: """Create a duty. start_at and end_at must be UTC, ISO 8601 with Z (e.g. 2025-01-15T09:00:00Z).""" duty = Duty(user_id=user_id, start_at=start_at, end_at=end_at) session.add(duty) session.commit() session.refresh(duty) return duty