Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
164 lines
4.7 KiB
Python
164 lines
4.7 KiB
Python
"""
|
|
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
|