"""Schemas für Kiosk-User-Authentifizierung.""" import uuid from pydantic import BaseModel, Field class KioskPinLoginRequest(BaseModel): """Login via Personalnummer + PIN.""" personnel_number: str = Field(..., min_length=1) pin: str = Field(..., min_length=4, max_length=16) class KioskNfcLoginRequest(BaseModel): """Login via NFC-UID + Pflicht-PIN (Zweitfaktor, da UID allein klonbar ist).""" nfc_uid: str = Field(..., min_length=1, max_length=64) pin: str = Field(..., min_length=4, max_length=16) class KioskQrLoginRequest(BaseModel): """Login via QR-Code (enthält verschlüsselten Token).""" qr_token: str = Field(..., min_length=1) class KioskSessionResponse(BaseModel): """Antwort nach erfolgreichem Kiosk-Login.""" session_token: str user_id: uuid.UUID user_name: str # "Max M." (Vorname + Nachname abgekürzt für Datenschutz) expires_in_seconds: int # 900 (15 min) auth_method: str # "pin" | "nfc" | "qr" | "list" class KioskUserListEntry(BaseModel): """Minimale User-Info für Auswahl in der Mitarbeiterliste.""" id: uuid.UUID display_name: str # "Max M." oder Kürzel class KioskUserListResponse(BaseModel): users: list[KioskUserListEntry] class KioskStampRequest(BaseModel): """Body für Stempel-Aktionen. session_token identifiziert den eingeloggten Mitarbeiter (aus /auth/pin|nfc|qr|list), das Gerät ist bereits über die Ed25519-Signatur (verify_kiosk_request) authentifiziert.""" session_token: str = Field(..., min_length=1) note: str | None = None class KioskStampResponse(BaseModel): entry_id: uuid.UUID status: str # "stamped_in" | "stamped_out" | "break_started" | "break_ended" warnings: list[str] = [] class KioskStampStatusRequest(BaseModel): session_token: str = Field(..., min_length=1) class KioskStampStatusResponse(BaseModel): stamped_in: bool on_break: bool start_time: str | None = None