Files
mcphub/plugins/gitea/schemas/webhook.py
airano c73e39f6e4 fix(ci): fix black/ruff failures, add CoC and PR template
- Fix Python formatting (sync no longer strips blank lines from .py files)
- Remove test_community_build.py (tests private sync module)
- Fix ruff warnings in test files
- Add CODE_OF_CONDUCT.md
- Add .github/PULL_REQUEST_TEMPLATE.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 18:19:39 +03:30

169 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