"""Challenge service for business logic.""" from typing import List, Optional from sqlalchemy.orm import Session from sqlalchemy import func from backend.models.challenge import Challenge from backend.schemas.challenge import ChallengeCreate class ChallengeService: """Service for challenge operations.""" @staticmethod def create_challenge( db: Session, challenge_data: ChallengeCreate, user_id: int ) -> Challenge: """Create a new challenge for a user.""" # Calculate next display_order for THIS user max_order = db.query(func.max(Challenge.display_order)).filter( Challenge.user_id == user_id ).scalar() new_order = (max_order if max_order is not None else -1) + 1 db_challenge = Challenge( **challenge_data.dict(), display_order=new_order, user_id=user_id ) db.add(db_challenge) db.commit() db.refresh(db_challenge) return db_challenge @staticmethod def get_user_challenges( db: Session, user_id: int ) -> List[Challenge]: """Get all challenges for a user.""" challenges = db.query(Challenge).filter( Challenge.user_id == user_id ).order_by(Challenge.display_order.asc()).all() return challenges @staticmethod def reorder_challenges( db: Session, ordered_ids: List[int], user_id: int ) -> None: """Reorder challenges for a user.""" for index, challenge_id in enumerate(ordered_ids): db.query(Challenge).filter( Challenge.id == challenge_id, Challenge.user_id == user_id ).update({"display_order": index}) db.commit() @staticmethod def delete_challenge( db: Session, challenge_id: int, user_id: int ) -> Optional[Challenge]: """Delete a challenge for a user.""" db_challenge = db.query(Challenge).filter( Challenge.id == challenge_id, Challenge.user_id == user_id ).first() if db_challenge: db.delete(db_challenge) db.commit() return db_challenge @staticmethod def get_challenge_by_id( db: Session, challenge_id: int, user_id: int ) -> Optional[Challenge]: """Get a challenge by ID for a user.""" return db.query(Challenge).filter( Challenge.id == challenge_id, Challenge.user_id == user_id ).first()