"""Schemas d'entree/sortie de l'API de partage.""" from __future__ import annotations from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from app.schemas.map import MapDocumentIn class ShareCreateIn(BaseModel): """Corps de POST /api/shares et de PUT /api/shares/{token}.""" model_config = ConfigDict(extra="forbid") title: str = Field(default="", max_length=255) map: MapDocumentIn # Absent = valeur par defaut de l'instance ; null explicite = permanent. expires_in_days: int | None = Field(default=None, ge=1, le=3650) # Distingue "champ absent" de "null explicite", que Pydantic ne separe pas. permanent: bool = False class ShareExpiryIn(BaseModel): """Corps de PATCH /api/shares/{token} : uniquement l'expiration.""" model_config = ConfigDict(extra="forbid") expires_in_days: int | None = Field(default=None, ge=1, le=3650) permanent: bool = False class ShareCreatedOut(BaseModel): """Reponse renvoyee une seule fois, a la creation du partage. `management_token` n'est jamais renvoye ailleurs et n'apparait jamais dans une URL publique : il est conserve par le proprietaire. """ share_token: str management_token: str share_path: str title: str created_at: datetime updated_at: datetime expires_at: datetime | None = None class ShareUpdatedOut(BaseModel): share_token: str share_path: str title: str updated_at: datetime expires_at: datetime | None = None class ShareOwnerOut(BaseModel): """Vue reservee au detenteur du jeton de gestion. Aucune donnee de carte.""" share_token: str title: str created_at: datetime updated_at: datetime expires_at: datetime | None = None class SharePublicOut(BaseModel): """Vue publique : aucune information de gestion.""" share_token: str title: str map_version: int map: dict created_at: datetime updated_at: datetime expires_at: datetime | None = None