feat: validazione expires_at ISO 8601 (422 con messaggio chiaro, niente fallback silenzioso)

- field_validator Pydantic su MemoryIn.expires_at
- verificato sul server: valida OK, invalida → 422 (istanza di test)
This commit is contained in:
Matteo Benedetto
2026-08-16 19:21:01 +02:00
parent 748356d769
commit 87d59ccb5c
+13 -1
View File
@@ -33,7 +33,7 @@ from typing import Any, Literal, Optional
import httpx import httpx
import uvicorn import uvicorn
from fastapi import Depends, FastAPI, Header, HTTPException, Request from fastapi import Depends, FastAPI, Header, HTTPException, Request
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, field_validator
from qdrant_client import QdrantClient from qdrant_client import QdrantClient
from qdrant_client.http import models as qm from qdrant_client.http import models as qm
@@ -135,6 +135,18 @@ class MemoryIn(BaseModel):
supersedes_id: Optional[str] = None supersedes_id: Optional[str] = None
supersede_reason: Optional[str] = Field(default=None, max_length=512) supersede_reason: Optional[str] = Field(default=None, max_length=512)
@field_validator("expires_at")
@classmethod
def _validate_expires_at(cls, v: Optional[str]) -> Optional[str]:
"""Valida il formato ISO 8601: invalida → 422 (niente fallback silenzioso)."""
if v is None:
return v
try:
datetime.fromisoformat(v.replace("Z", "+00:00"))
except ValueError:
raise ValueError("expires_at deve essere una data ISO 8601 valida (es. 2026-09-01T00:00:00Z)")
return v
class SearchIn(BaseModel): class SearchIn(BaseModel):
query: str = Field(min_length=1, max_length=512) query: str = Field(min_length=1, max_length=512)