""" Schémas Pydantic pour la gestion des groupes Ansible. """ from typing import Optional, List import re from pydantic import BaseModel, Field, field_validator class GroupRequest(BaseModel): """Requête pour créer un groupe.""" name: str = Field(..., min_length=3, max_length=50, description="Nom du groupe (ex: env_prod, role_web)") type: str = Field(..., description="Type de groupe: 'env' ou 'role'") @field_validator('name') @classmethod def validate_name(cls, v: str) -> str: if not re.match(r'^[a-zA-Z0-9_-]+$', v): raise ValueError('Le nom du groupe ne peut contenir que des lettres, chiffres, tirets et underscores') return v @field_validator('type') @classmethod def validate_type(cls, v: str) -> str: if v not in ['env', 'role']: raise ValueError("Le type doit être 'env' ou 'role'") return v class GroupUpdateRequest(BaseModel): """Requête pour modifier un groupe.""" new_name: str = Field(..., min_length=3, max_length=50, description="Nouveau nom du groupe") @field_validator('new_name') @classmethod def validate_new_name(cls, v: str) -> str: if not re.match(r'^[a-zA-Z0-9_-]+$', v): raise ValueError('Le nom du groupe ne peut contenir que des lettres, chiffres, tirets et underscores') return v class GroupDeleteRequest(BaseModel): """Requête pour supprimer un groupe.""" move_hosts_to: Optional[str] = Field(default=None, description="Groupe vers lequel déplacer les hôtes") class GroupResponse(BaseModel): """Réponse API pour un groupe.""" name: str type: str display_name: str hosts_count: int = 0 hosts: List[str] = Field(default_factory=list) class GroupsListResponse(BaseModel): """Réponse API pour la liste des groupes.""" groups: List[GroupResponse] = Field(default_factory=list) env_count: int = 0 role_count: int = 0 class HostGroupsResponse(BaseModel): """Réponse API pour les groupes disponibles.""" env_groups: List[str] = Field(default_factory=list) role_groups: List[str] = Field(default_factory=list) all_groups: List[str] = Field(default_factory=list)