Spaces:
Sleeping
Sleeping
Claude Code - Backend Implementation Specialist
Deploy AI-powered Todo application to Hugging Face Spaces
f2b5c2a | """ | |
| Subtask service layer for business logic. | |
| This module provides functions for: | |
| - Creating subtasks | |
| - Updating subtasks | |
| - Deleting subtasks | |
| - Getting subtasks for a task | |
| """ | |
| from sqlmodel import Session, select | |
| from typing import List, Optional | |
| from datetime import datetime | |
| from ..models.subtask import Subtask | |
| from ..models.task import Task | |
| def get_task_subtasks(session: Session, task_id: int, user_id: int) -> List[Subtask]: | |
| """ | |
| Get all subtasks for a task (with user verification). | |
| Args: | |
| session: Database session | |
| task_id: Task ID | |
| user_id: User ID for verification | |
| Returns: | |
| List of subtasks ordered by order field | |
| """ | |
| # First verify the task belongs to the user | |
| task = session.get(Task, task_id) | |
| if not task or task.user_id != user_id: | |
| return [] | |
| # Get subtasks | |
| statement = select(Subtask).where(Subtask.task_id == task_id).order_by(Subtask.order) | |
| subtasks = session.exec(statement).all() | |
| return list(subtasks) | |
| def create_subtask( | |
| session: Session, | |
| task_id: int, | |
| user_id: int, | |
| title: str, | |
| order: int = 0 | |
| ) -> Optional[Subtask]: | |
| """ | |
| Create a new subtask for a task. | |
| Args: | |
| session: Database session | |
| task_id: Task ID | |
| user_id: User ID for verification | |
| title: Subtask title | |
| order: Order position | |
| Returns: | |
| Created subtask or None if task doesn't belong to user | |
| """ | |
| # Verify task belongs to user | |
| task = session.get(Task, task_id) | |
| if not task or task.user_id != user_id: | |
| return None | |
| # Create subtask | |
| subtask = Subtask( | |
| task_id=task_id, | |
| title=title, | |
| order=order, | |
| completed=False | |
| ) | |
| session.add(subtask) | |
| session.commit() | |
| session.refresh(subtask) | |
| return subtask | |
| def update_subtask( | |
| session: Session, | |
| subtask_id: int, | |
| user_id: int, | |
| title: Optional[str] = None, | |
| completed: Optional[bool] = None, | |
| order: Optional[int] = None | |
| ) -> Optional[Subtask]: | |
| """ | |
| Update a subtask. | |
| Args: | |
| session: Database session | |
| subtask_id: Subtask ID | |
| user_id: User ID for verification | |
| title: New title (optional) | |
| completed: New completion status (optional) | |
| order: New order (optional) | |
| Returns: | |
| Updated subtask or None if not found or doesn't belong to user | |
| """ | |
| # Get subtask and verify ownership through task | |
| subtask = session.get(Subtask, subtask_id) | |
| if not subtask: | |
| return None | |
| task = session.get(Task, subtask.task_id) | |
| if not task or task.user_id != user_id: | |
| return None | |
| # Update fields | |
| if title is not None: | |
| subtask.title = title | |
| if completed is not None: | |
| subtask.completed = completed | |
| if order is not None: | |
| subtask.order = order | |
| subtask.updated_at = datetime.utcnow() | |
| session.add(subtask) | |
| session.commit() | |
| session.refresh(subtask) | |
| return subtask | |
| def delete_subtask( | |
| session: Session, | |
| subtask_id: int, | |
| user_id: int | |
| ) -> bool: | |
| """ | |
| Delete a subtask. | |
| Args: | |
| session: Database session | |
| subtask_id: Subtask ID | |
| user_id: User ID for verification | |
| Returns: | |
| True if deleted, False if not found or doesn't belong to user | |
| """ | |
| # Get subtask and verify ownership through task | |
| subtask = session.get(Subtask, subtask_id) | |
| if not subtask: | |
| return False | |
| task = session.get(Task, subtask.task_id) | |
| if not task or task.user_id != user_id: | |
| return False | |
| session.delete(subtask) | |
| session.commit() | |
| return True | |