🧪 Tests: 73 → 130 (+57 tests) - Upload API, labels sync, commit history (401/400/502/cached) - File create/update (sha=null, sha=abc) - Admin delete cascade (12 tests: oauth, tags, workspaces, pages…) - Gitea status (linked/unlinked/disconnect) - OAuth link mode (session, redirect, callback) 🔒 Sécurité - ContentSecurityPolicyMiddleware (CSP headers) - RateLimitMiddleware (100 req/min/IP) - Pydantic models: ErrorResponse, SuccessResponse - Input validation upload (10MB, allowed extensions) - Pydantic request models 🎨 UX - static/css/design-tokens.css (500 lines, thèmes + skeletons) - Toast system: 16 alert() remplacés par toast() - 59 lignes CSS dupliquées retirées (6 templates) - Skeletons cohérents sur toutes les vues ⚡ Performance - Cache TTL sur get_file_commits (consistant avec les autres méthodes)
39 lines
892 B
Python
39 lines
892 B
Python
"""FlowDeck — Standardized response models."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""Standardized error response.
|
|
|
|
Example:
|
|
ErrorResponse(error="Rate limit exceeded", detail="Max 100 req/min per IP")
|
|
"""
|
|
error: str
|
|
detail: Optional[str] = None
|
|
|
|
model_config = {
|
|
"json_schema_extra": {
|
|
"example": {"error": "Not found", "detail": "Board not found"}
|
|
}
|
|
}
|
|
|
|
|
|
class SuccessResponse(BaseModel):
|
|
"""Standardized success response.
|
|
|
|
Example:
|
|
SuccessResponse(status="ok", data={"issue_id": 42})
|
|
"""
|
|
status: str = "ok"
|
|
data: Optional[dict[str, Any]] = None
|
|
|
|
model_config = {
|
|
"json_schema_extra": {
|
|
"example": {"status": "ok", "data": {"issue_id": 42, "column": "Done"}}
|
|
}
|
|
}
|