psb_hack/api/app/controllers/tasks_router.py

152 lines
4.2 KiB
Python

from typing import List, Optional
from fastapi import APIRouter, Depends, status, File, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from starlette.responses import FileResponse
from app.database.session import get_db
from app.domain.entities.task_files import ReadTaskFile
from app.domain.entities.tasks import TaskRead, TaskCreate
from app.domain.models import User
from app.infrastructure.dependencies import require_auth_user, require_teacher
from app.infrastructure.task_files_service import TaskFilesService
from app.infrastructure.tasks_service import TasksService
tasks_router = APIRouter()
@tasks_router.get(
'/course/{course_id}/',
response_model=Optional[List[TaskRead]],
summary='Get all tasks by course',
description='Get all tasks by course',
)
async def get_course_tasks(
course_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_auth_user),
):
tasks_service = TasksService(db)
return await tasks_service.get_all_by_course(course_id)
@tasks_router.get(
'/{task_id}/',
response_model=Optional[TaskRead],
summary='Get task by task ID',
description='Get task by task ID',
)
async def get_task(
task_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_auth_user),
):
tasks_service = TasksService(db)
return await tasks_service.get_by_id(task_id)
@tasks_router.post(
'/{course_id}/',
response_model=Optional[TaskRead],
summary='Create a new task',
description='Create a new task',
)
async def create_task(
course_id: int,
task_data: TaskCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_teacher),
):
tasks_service = TasksService(db)
return await tasks_service.create(task_data, current_user, course_id)
@tasks_router.put(
'/{task_id}/',
response_model=Optional[TaskRead],
summary='Update a task',
description='Update a task',
)
async def update_task(
task_id: int,
task_data: TaskCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_teacher),
):
tasks_service = TasksService(db)
return await tasks_service.update(task_id, task_data, current_user)
@tasks_router.delete(
'/{task_id}/',
response_model=Optional[TaskRead],
summary='Delete a task',
description='Delete a task',
)
async def delete_task(
task_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_teacher),
):
tasks_service = TasksService(db)
return await tasks_service.delete(task_id, current_user)
@tasks_router.get(
'/files/{task_id}/',
response_model=Optional[List[ReadTaskFile]],
summary='Get a files list by task ID',
description='Get a files list by task ID',
)
async def get_files(
task_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_auth_user),
):
task_files_service = TaskFilesService(db)
return await task_files_service.get_files_list_by_task(task_id)
@tasks_router.get(
'/file/{file_id}/',
response_class=FileResponse,
)
async def get_file(
file_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_auth_user),
):
task_files_service = TaskFilesService(db)
return await task_files_service.get_file_by_id(file_id)
@tasks_router.post(
'/files/{task_id}/upload/',
response_model=ReadTaskFile,
summary='Upload a file',
description='Upload a file',
)
async def upload_file(
task_id: int,
file: UploadFile = File(...),
db: AsyncSession = Depends(get_db),
user: User = Depends(require_teacher),
):
task_files_service = TaskFilesService(db)
return await task_files_service.upload_file(task_id, file)
@tasks_router.delete(
'/files/{file_id}/',
response_model=Optional[ReadTaskFile],
summary='Delete a file',
description='Delete a file',
)
async def delete_file(
file_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(require_teacher),
):
task_files_service = TaskFilesService(db)
return await task_files_service.delete_file(file_id)