"""Pydantic schemas for dynamo_cli Lambda event/response contracts.""" from typing import Literal from pydantic import BaseModel from .auth0 import Auth0Match from .common import TerraformHit class Snapshot(BaseModel): """Frozen Phase 1 discovery results for one ticket. ``auth0_action`` records the Phase 2 Auth0 operation this ticket type requires: ``delete`` (offboarding) or ``suspend`` (suspension). It defaults to ``delete`` so snapshots written before this field existed remain valid. """ ticket_id: str email: str full_name: str last_working_day: str auth0_matches: list[Auth0Match] = [] terraform_hits: list[TerraformHit] = [] auth0_action: Literal['delete', 'suspend'] = 'delete' checked_at: str class PutSnapshotEvent(BaseModel): """Event for storing a Phase 1 snapshot.""" action: Literal['put-snapshot'] ticket_id: str email: str full_name: str last_working_day: str auth0_matches: list[Auth0Match] = [] terraform_hits: list[TerraformHit] = [] auth0_action: Literal['delete', 'suspend'] = 'delete' dry_run: bool = False class PutSnapshotResponse(BaseModel): """Response from storing a snapshot.""" ticket_id: str stored: bool dry_run: bool class GetSnapshotEvent(BaseModel): """Event for retrieving a Phase 1 snapshot.""" action: Literal['get-snapshot'] ticket_id: str class GetSnapshotResponse(BaseModel): """Response from retrieving a snapshot.""" ticket_id: str found: bool snapshot: Snapshot | None = None class DeleteSnapshotEvent(BaseModel): """Event for deleting a snapshot after Phase 2 completes.""" action: Literal['delete-snapshot'] ticket_id: str dry_run: bool = False class DeleteSnapshotResponse(BaseModel): """Response from deleting a snapshot.""" ticket_id: str deleted: bool dry_run: bool