Spaces:
Sleeping
Sleeping
File size: 6,256 Bytes
6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 6a3de9e 697c967 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | from fastapi import APIRouter, Depends, HTTPException, status, Request, Response
from sqlmodel.ext.asyncio.session import AsyncSession
from typing import List
from database.session import get_session_dep
from models.task import TaskRead, TaskCreate, TaskUpdate, TaskComplete
from services.task_service import TaskService
from middleware.auth_middleware import get_current_user_id, validate_user_id_from_token
from utils.logging import get_logger
from services.sse_service import notify_clients # Import notify_clients
router = APIRouter()
logger = get_logger(__name__)
@router.get("/tasks", response_model=List[TaskRead])
async def get_tasks(
request: Request,
user_id: int,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Retrieve all tasks for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
tasks = await TaskService.get_tasks_by_user_id(session, user_id)
logger.info(f"Successfully retrieved {len(tasks)} tasks for user {user_id}")
return tasks
except Exception as e:
logger.error(f"Error retrieving tasks for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error retrieving tasks"
)
@router.post("/tasks", response_model=TaskRead, status_code=status.HTTP_201_CREATED)
async def create_task(
request: Request,
user_id: int,
task_data: TaskCreate,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Create a new task for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
created_task = await TaskService.create_task(session, user_id, task_data)
logger.info(f"Successfully created task {created_task.id} for user {user_id}")
await notify_clients(user_id, "tasks_updated") # Notify clients
return created_task
except Exception as e:
logger.error(f"Error creating task for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error creating task"
)
@router.get("/tasks/{task_id}", response_model=TaskRead)
async def get_task(
request: Request,
user_id: int,
task_id: int,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Retrieve a specific task by ID for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
task = await TaskService.get_task_by_id(session, user_id, task_id)
logger.info(f"Successfully retrieved task {task_id} for user {user_id}")
return task
except HTTPException:
raise
except Exception as e:
logger.error(f"Error retrieving task {task_id} for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error retrieving task"
)
@router.put("/tasks/{task_id}", response_model=TaskRead)
async def update_task(
request: Request,
user_id: int,
task_id: int,
task_data: TaskUpdate,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Update a specific task for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
updated_task = await TaskService.update_task(session, user_id, task_id, task_data)
logger.info(f"Successfully updated task {task_id} for user {user_id}")
await notify_clients(user_id, "tasks_updated") # Notify clients
return updated_task
except HTTPException:
raise
except Exception as e:
logger.error(f"Error updating task {task_id} for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error updating task"
)
@router.delete("/tasks/{task_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_task(
request: Request,
user_id: int,
task_id: int,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Delete a specific task for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
await TaskService.delete_task(session, user_id, task_id)
logger.info(f"Successfully deleted task {task_id} for user {user_id}")
await notify_clients(user_id, "tasks_updated") # Notify clients
return Response(status_code=status.HTTP_204_NO_CONTENT)
except HTTPException:
raise
except Exception as e:
logger.error(f"Error deleting task {task_id} for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error deleting task"
)
@router.patch("/tasks/{task_id}/complete", response_model=TaskRead)
async def update_task_completion(
request: Request,
user_id: int,
task_id: int,
completion_data: TaskComplete,
session: AsyncSession = Depends(get_session_dep),
current_user_id: int = Depends(get_current_user_id)
):
"""
Update the completion status of a specific task for the specified user.
"""
validate_user_id_from_token(request, url_user_id=user_id)
try:
updated_task = await TaskService.update_task_completion(session, user_id, task_id, completion_data)
logger.info(f"Successfully updated completion status for task {task_id} for user {user_id}")
await notify_clients(user_id, "tasks_updated") # Notify clients
return updated_task
except HTTPException:
raise
except Exception as e:
logger.error(f"Error updating completion status for task {task_id} for user {user_id}: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error updating task completion status"
) |