from datetime import datetime from typing import Literal from pydantic import BaseModel, Field, field_validator from app.schemas.validators import normalize_required_text, validate_log_source ServiceType = Literal["systemd", "docker"] ServiceActionName = Literal["start", "stop", "restart"] ServiceStatusName = Literal["running", "stopped", "unknown"] class ManagedServiceCreate(BaseModel): name: str = Field(min_length=1, max_length=128) service_type: ServiceType = "systemd" control_enabled: bool = True log_source: str | None = Field(default=None, max_length=512) @field_validator("name") @classmethod def validate_name_value(cls, value: str) -> str: return normalize_required_text(value, field_name="name") @field_validator("log_source") @classmethod def validate_log_source_value(cls, value: str | None) -> str | None: return validate_log_source(value) class ManagedServiceUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=128) service_type: ServiceType | None = None control_enabled: bool | None = None log_source: str | None = Field(default=None, max_length=512) @field_validator("name") @classmethod def validate_name_value(cls, value: str | None) -> str | None: if value is None: return None return normalize_required_text(value, field_name="name") @field_validator("log_source") @classmethod def validate_log_source_value(cls, value: str | None) -> str | None: return validate_log_source(value) class ManagedServiceRead(BaseModel): id: int server_id: int name: str service_type: ServiceType control_enabled: bool log_source: str | None created_at: datetime status: ServiceStatusName last_checked_at: datetime detail: str | None = None model_config = {"from_attributes": True}