69 lines
2.2 KiB
Python

"""
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)