123 lines
3.2 KiB
Python
123 lines
3.2 KiB
Python
"""业务逻辑层模块。
|
||
|
||
提供任务管理的核心业务逻辑,使用内存存储模拟数据库操作。
|
||
"""
|
||
|
||
from datetime import datetime, timezone
|
||
from typing import Optional
|
||
|
||
from app.models import TodoItem, TodoCreate, TodoUpdate
|
||
|
||
|
||
class TodoService:
|
||
"""任务管理服务类。
|
||
|
||
使用内存字典存储任务数据,提供完整的增删改查操作。
|
||
线程不安全,仅适用于单线程演示场景。
|
||
"""
|
||
|
||
def __init__(self) -> None:
|
||
"""初始化服务,创建空的内存存储和 ID 计数器。"""
|
||
self._store: dict[int, TodoItem] = {}
|
||
self._next_id: int = 1
|
||
|
||
def _generate_id(self) -> int:
|
||
"""生成下一个可用的任务 ID。
|
||
|
||
Returns:
|
||
自增的任务 ID。
|
||
"""
|
||
current = self._next_id
|
||
self._next_id += 1
|
||
return current
|
||
|
||
def _now(self) -> datetime:
|
||
"""获取当前 UTC 时间。
|
||
|
||
Returns:
|
||
当前 UTC 时间戳。
|
||
"""
|
||
return datetime.now(timezone.utc)
|
||
|
||
def list_todos(self) -> tuple[list[TodoItem], int]:
|
||
"""获取所有任务列表。
|
||
|
||
Returns:
|
||
(任务列表, 总数) 的元组。
|
||
"""
|
||
items = list(self._store.values())
|
||
return items, len(items)
|
||
|
||
def get_todo(self, todo_id: int) -> Optional[TodoItem]:
|
||
"""根据 ID 获取单个任务。
|
||
|
||
Args:
|
||
todo_id: 任务 ID。
|
||
|
||
Returns:
|
||
如果找到返回 TodoItem,否则返回 None。
|
||
"""
|
||
return self._store.get(todo_id)
|
||
|
||
def create_todo(self, data: TodoCreate) -> TodoItem:
|
||
"""创建新任务。
|
||
|
||
Args:
|
||
data: 创建任务的请求数据。
|
||
|
||
Returns:
|
||
创建成功的 TodoItem。
|
||
"""
|
||
now = self._now()
|
||
item = TodoItem(
|
||
id=self._generate_id(),
|
||
title=data.title,
|
||
description=data.description,
|
||
completed=False,
|
||
created_at=now,
|
||
updated_at=now,
|
||
)
|
||
self._store[item.id] = item
|
||
return item
|
||
|
||
def update_todo(self, todo_id: int, data: TodoUpdate) -> Optional[TodoItem]:
|
||
"""更新已有任务。
|
||
|
||
Args:
|
||
todo_id: 要更新的任务 ID。
|
||
data: 包含更新字段的请求数据。
|
||
|
||
Returns:
|
||
更新后的 TodoItem,如果任务不存在返回 None。
|
||
"""
|
||
existing = self._store.get(todo_id)
|
||
if existing is None:
|
||
return None
|
||
|
||
update_dict = data.model_dump(exclude_none=True)
|
||
if not update_dict:
|
||
return existing
|
||
|
||
updated_item = existing.model_copy(update=update_dict)
|
||
updated_item.updated_at = self._now()
|
||
self._store[todo_id] = updated_item
|
||
return updated_item
|
||
|
||
def delete_todo(self, todo_id: int) -> bool:
|
||
"""删除指定任务。
|
||
|
||
Args:
|
||
todo_id: 要删除的任务 ID。
|
||
|
||
Returns:
|
||
删除成功返回 True,任务不存在返回 False。
|
||
"""
|
||
if todo_id in self._store:
|
||
del self._store[todo_id]
|
||
return True
|
||
return False
|
||
|
||
|
||
# 全局单例服务实例
|
||
todo_service = TodoService()
|