58 lines
1.4 KiB
Python
58 lines
1.4 KiB
Python
"""Incident-related schemas."""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Literal
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
IncidentStatus = Literal["triggered", "acknowledged", "mitigated", "resolved"]
|
|
IncidentSeverity = Literal["critical", "high", "medium", "low"]
|
|
|
|
|
|
class IncidentCreate(BaseModel):
|
|
"""Request body for creating an incident."""
|
|
|
|
title: str = Field(min_length=1, max_length=200)
|
|
description: str | None = Field(default=None, max_length=5000)
|
|
severity: IncidentSeverity = "medium"
|
|
|
|
|
|
class IncidentResponse(BaseModel):
|
|
"""Incident response."""
|
|
|
|
id: UUID
|
|
service_id: UUID
|
|
title: str
|
|
description: str | None
|
|
status: IncidentStatus
|
|
severity: IncidentSeverity
|
|
version: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class IncidentEventResponse(BaseModel):
|
|
"""Incident event response."""
|
|
|
|
id: UUID
|
|
incident_id: UUID
|
|
event_type: str
|
|
actor_user_id: UUID | None
|
|
payload: dict[str, Any] | None
|
|
created_at: datetime
|
|
|
|
|
|
class TransitionRequest(BaseModel):
|
|
"""Request body for transitioning incident status."""
|
|
|
|
to_status: IncidentStatus
|
|
version: int = Field(description="Current version for optimistic locking")
|
|
note: str | None = Field(default=None, max_length=1000)
|
|
|
|
|
|
class CommentRequest(BaseModel):
|
|
"""Request body for adding a comment to an incident."""
|
|
|
|
content: str = Field(min_length=1, max_length=5000)
|