""" Webhook Pydantic Schemas Validation schemas for Gitea webhook operations. """ from datetime import datetime from typing import Any from pydantic import BaseModel, ConfigDict, Field, field_validator class Webhook(BaseModel): """Gitea webhook model""" model_config = ConfigDict(extra="allow") id: int type: str # "gitea", "gogs", "slack", "discord", etc. config: dict[str, Any] events: list[str] active: bool updated_at: datetime created_at: datetime class WebhookConfig(BaseModel): """Webhook configuration""" model_config = ConfigDict(extra="allow") url: str content_type: str = "json" # "json" or "form" secret: str | None = None http_method: str | None = "POST" branch_filter: str | None = None class CreateWebhookRequest(BaseModel): """Request to create a webhook""" model_config = ConfigDict(extra="forbid") type: str = Field( default="gitea", description="Webhook type (gitea/gogs/slack/discord/dingtalk/telegram/msteams/feishu/wechatwork/packagist)", ) config: dict[str, Any] = Field(..., description="Webhook configuration") events: list[str] = Field(..., min_items=1, description="List of events to trigger webhook") active: bool = Field(default=True, description="Activate webhook immediately") branch_filter: str | None = Field(None, description="Branch filter pattern") @classmethod @field_validator("type") def validate_type(cls, v): allowed = [ "gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "wechatwork", "packagist", ] if v not in allowed: raise ValueError(f"Webhook type must be one of: {', '.join(allowed)}") return v @classmethod @field_validator("events") def validate_events(cls, v): allowed_events = [ "create", "delete", "fork", "push", "issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment", "pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone", "pull_request_comment", "pull_request_review_approved", "pull_request_review_rejected", "pull_request_review_comment", "pull_request_sync", "wiki", "repository", "release", ] for event in v: if event not in allowed_events: raise ValueError( f"Invalid event: {event}. Must be one of: {', '.join(allowed_events)}" ) return v @classmethod @field_validator("config") def validate_config(cls, v): """Validate webhook config has required fields""" if "url" not in v: raise ValueError("Webhook config must contain 'url'") if "content_type" not in v: v["content_type"] = "json" return v class UpdateWebhookRequest(BaseModel): """Request to update a webhook""" model_config = ConfigDict(extra="forbid") config: dict[str, Any] | None = Field(None, description="Webhook configuration") events: list[str] | None = Field(None, description="List of events to trigger webhook") active: bool | None = Field(None, description="Activate/deactivate webhook") branch_filter: str | None = Field(None, description="Branch filter pattern") @classmethod @field_validator("events") def validate_events(cls, v): if v is None: return v allowed_events = [ "create", "delete", "fork", "push", "issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment", "pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone", "pull_request_comment", "pull_request_review_approved", "pull_request_review_rejected", "pull_request_review_comment", "pull_request_sync", "wiki", "repository", "release", ] for event in v: if event not in allowed_events: raise ValueError(f"Invalid event: {event}") return v class WebhookTestResult(BaseModel): """Webhook test result""" model_config = ConfigDict(extra="allow") success: bool message: str | None = None response_code: int | None = None response_body: str | None = None