Compare commits

..

2 Commits

Author SHA1 Message Date
IluaAir
6e6613662a patch schema 2025-09-03 23:32:31 +03:00
IluaAir
e1c554e4f0 add statusenum 2025-09-03 23:12:27 +03:00
5 changed files with 43 additions and 35 deletions

View File

@@ -1,32 +1,13 @@
from datetime import date from datetime import date
from enum import Enum
from typing import Annotated from typing import Annotated
from fastapi import Depends, Query from fastapi import Depends, Query
from fastapi.exceptions import HTTPException from fastapi.exceptions import HTTPException
from pydantic import BaseModel, model_validator from pydantic import BaseModel, model_validator
from src.schemas.tasks import TaskFilter
class StatEnum(str, Enum): TaskFilterDep = Annotated[TaskFilter, Depends()]
open = "open"
closed = "closed"
in_progress = "in_progress"
todo = "todo"
class Pagination(BaseModel):
page: int | None = Query(default=0, ge=0)
limit: int | None = Query(default=30, ge=0, le=50)
PaginationTasksDep = Annotated[Pagination, Depends()]
class Status(BaseModel):
status: StatEnum | None = Query(default=None)
StatusTaskDep = Annotated[Status, Depends()]
class Date(BaseModel): class Date(BaseModel):

View File

@@ -3,7 +3,7 @@ from typing import Annotated
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from src.api.dependacies.db_dep import sessionDep from src.api.dependacies.db_dep import sessionDep
from src.api.dependacies.task_dep import DateDep, PaginationTasksDep, StatusTaskDep from src.api.dependacies.task_dep import TaskFilterDep
from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep
from src.schemas.tasks import TaskADDRequest from src.schemas.tasks import TaskADDRequest
from src.services.tasks import TaskService from src.services.tasks import TaskService
@@ -16,17 +16,11 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"])
async def get_tasks( async def get_tasks(
session: sessionDep, session: sessionDep,
user: ActiveUser, user: ActiveUser,
page: PaginationTasksDep, filter: TaskFilterDep
status: StatusTaskDep,
date_filter: DateDep,
): ):
result = await UserService(session).get_user_with_tasks( result = await UserService(session).get_user_with_tasks(
user_id=user.id, user_id=user.id,
status=status.status, **filter.model_dump(exclude_unset=True)
limit=page.limit,
offset=page.page,
date_to=date_filter.date_to,
date_from=date_filter.date_from,
) )
return result return result

View File

@@ -1,13 +1,27 @@
from datetime import date from datetime import date
from typing import Literal from enum import Enum
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
class PriorityEnum(str, Enum):
low = "low"
medium = "medium"
high = "high"
critical = "critical"
class StatusEnum(str, Enum):
open = "open"
closed = "closed"
in_progress = "in_progress"
todo = "todo"
class TaskShort(BaseModel): class TaskShort(BaseModel):
title: str title: str
due_date: date | None = None due_date: date | None = None
priority: Literal["low", "medium", "high", "critical"] = "medium" priority: PriorityEnum = PriorityEnum.medium
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)
@@ -20,10 +34,27 @@ class TaskADDRequest(TaskShort):
description: str | None = None description: str | None = None
class TaskPATCHRequest(BaseModel):
title: str | None = None
description: str | None = None
due_date: date | None = None
status: StatusEnum | None = None
priority: PriorityEnum | None = None
time_spent: int | None = None
class Task(TaskADDRequest): class Task(TaskADDRequest):
id: int id: int
user_id: int user_id: int
status: Literal["open", "closed", "in_progress", "todo"] status: StatusEnum
time_spent: int time_spent: int
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)
class TaskFilter(BaseModel):
status: StatusEnum | None = None
limit: int | None = 30
offset: int | None = None
date_from: date | None = None
date_to: date | None = None

View File

@@ -20,6 +20,8 @@ class TaskService(BaseService):
async def get_task(self, task_id: int): async def get_task(self, task_id: int):
task = await self.session.task.get_one_or_none(id=task_id) task = await self.session.task.get_one_or_none(id=task_id)
if task is None:
raise HTTPException(status_code=404, detail="Task not found.")
return Task.model_validate(task) return Task.model_validate(task)
async def delete_task(self, task_id: int): async def delete_task(self, task_id: int):

View File

@@ -49,8 +49,8 @@ class UserService(BaseService):
offset: int | None, offset: int | None,
date_to: date | None, date_to: date | None,
date_from: date | None, date_from: date | None,
): ):
print(type(status), status)
user = await self.session.user.get_one_with_load( user = await self.session.user.get_one_with_load(
user_id=user_id, user_id=user_id,
status=status, status=status,