""" User Repository - Data Access Layer for User operations Following Python Quick Start Guide: - Repository layer contains ONLY database operations - No business logic (that goes in services) - Simple CRUD operations and queries """ from typing import Optional, List, Dict, Any from app.core.database import db from models import User class UserRepository: """ User repository - handles all User database operations. Responsibilities: - CRUD operations - Database queries - No business logic """ def __init__(self, db_session=None): """Initialize repository with database session.""" self.db = db_session or db.session def find_by_id(self, user_id: int) -> Optional[User]: """Find user by ID.""" return User.query.get(user_id) def find_by_username(self, username: str) -> Optional[User]: """Find user by username.""" return User.query.filter_by(username=username).first() def find_by_email(self, email: str) -> Optional[User]: """Find user by email.""" return User.query.filter_by(email=email).first() def find_all(self, page: int = 1, per_page: int = 50) -> Any: """ Find all users with pagination. Returns: Pagination object with users """ return User.query.order_by(User.id.desc()).paginate( page=page, per_page=per_page, error_out=False ) def count_all(self) -> int: """Count total users.""" return User.query.count() def count_active(self) -> int: """Count active users.""" return User.query.filter_by(is_active=True).count() def count_inactive(self) -> int: """Count inactive users.""" return User.query.filter_by(is_active=False).count() def count_admins(self) -> int: """Count admin users.""" return User.query.filter_by(is_admin=True).count() def create(self, user: User) -> User: """ Create a new user. Args: user: User object to create Returns: Created user with ID """ self.db.add(user) self.db.commit() return user def update(self, user: User) -> User: """ Update an existing user. Args: user: User object with updated fields Returns: Updated user """ self.db.commit() return user def delete(self, user: User) -> None: """ Delete a user. Args: user: User object to delete """ self.db.delete(user) self.db.commit() def rollback(self) -> None: """Rollback current transaction.""" self.db.rollback()