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