75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
"""
|
|
===============================================================================
|
|
FILE: modules/web_api/routers/tasks.py
|
|
PROJECT: SCUD Orion AI (Unified Architecture)
|
|
MODULE: web_api / routers
|
|
ROLE: REST API эндпоинты реестра задач (получение, создание и обновление).
|
|
===============================================================================
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
from pydantic import BaseModel
|
|
from typing import Optional, Dict, Any
|
|
|
|
from routers.auth import get_current_user
|
|
from llm.db_tools import db_get_tasks, db_add_task, db_update_task_details
|
|
|
|
router = APIRouter(prefix="/api/v1/tasks", tags=["Tasks"])
|
|
|
|
class TaskCreateRequest(BaseModel):
|
|
title: str
|
|
priority: Optional[str] = "MEDIUM"
|
|
module: Optional[str] = "general"
|
|
due_date: Optional[str] = None
|
|
status: Optional[str] = "BACKLOG"
|
|
|
|
class TaskUpdateRequest(BaseModel):
|
|
title: Optional[str] = None
|
|
priority: Optional[str] = None
|
|
due_date: Optional[str] = None
|
|
status: Optional[str] = None
|
|
|
|
|
|
def resolve_user_id(current_user: Dict[str, Any]) -> int:
|
|
"""Извлекает корректный ID пользователя из JWT payload или ставит дефолтный 1."""
|
|
if not current_user:
|
|
return 1
|
|
return current_user.get("id") or current_user.get("user_id") or 1
|
|
|
|
|
|
@router.get("")
|
|
async def get_tasks_endpoint(status: Optional[str] = None, current_user = Depends(get_current_user)):
|
|
user_id = resolve_user_id(current_user)
|
|
return {"tasks": db_get_tasks(user_id=user_id, status=status)}
|
|
|
|
|
|
@router.post("")
|
|
async def create_task_endpoint(req: TaskCreateRequest, current_user = Depends(get_current_user)):
|
|
user_id = resolve_user_id(current_user)
|
|
res = db_add_task(
|
|
user_id=user_id,
|
|
module=req.module,
|
|
title=req.title,
|
|
priority=req.priority,
|
|
due_date=req.due_date,
|
|
status=req.status
|
|
)
|
|
if "error" in res:
|
|
raise HTTPException(status_code=400, detail=res["error"])
|
|
return res
|
|
|
|
|
|
@router.patch("/{task_id}")
|
|
async def update_task_endpoint(task_id: str, req: TaskUpdateRequest, current_user = Depends(get_current_user)):
|
|
user_id = resolve_user_id(current_user)
|
|
res = db_update_task_details(
|
|
user_id=user_id,
|
|
task_id=task_id,
|
|
title=req.title,
|
|
priority=req.priority,
|
|
status=req.status,
|
|
due_date=req.due_date
|
|
)
|
|
if "error" in res:
|
|
raise HTTPException(status_code=404, detail=res["error"])
|
|
return res |