feat(taskflow): add core task API, storage persistence, csv export, stats page, and test coverage

This commit is contained in:
Alexander Kalinovsky
2026-04-01 17:56:03 +03:00
commit 19d659df6b
31 changed files with 4197 additions and 0 deletions

58
app/storage/models.py Normal file
View File

@@ -0,0 +1,58 @@
from __future__ import annotations
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
DATA_FORMAT_VERSION = 1
class StoredTask(BaseModel):
model_config = ConfigDict(extra="forbid", frozen=True)
id: UUID
title: str = Field(..., min_length=1, max_length=100)
created_at: datetime
started_at: datetime | None = None
done_at: datetime | None = None
class StoragePayloadV1(BaseModel):
model_config = ConfigDict(extra="forbid")
version: int = Field(default=DATA_FORMAT_VERSION)
tasks: list[StoredTask] = Field(default_factory=list)
class StoragePayload(BaseModel):
"""
Canonical in-memory storage payload.
This model allows safe parsing of the top-level version field
before delegating to a concrete versioned schema.
"""
model_config = ConfigDict(extra="allow")
version: int
def upgrade_payload(raw_data: dict) -> StoragePayloadV1:
"""
Upgrade any supported payload version to the latest schema.
"""
payload = StoragePayload.model_validate(raw_data)
if payload.version == 1:
parsed_v1 = StoragePayloadV1.model_validate(raw_data)
return StoragePayloadV1(
version=DATA_FORMAT_VERSION,
tasks=parsed_v1.tasks,
)
raise ValueError(
f"Unsupported storage payload version: {payload.version}. "
f"Supported versions: 1..{DATA_FORMAT_VERSION}",
)