Files

87 lines
2.5 KiB
Python

"""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()