Files
dify-plugin-sdks/python/examples/github_trigger/events/release/release_published.py
T

79 lines
2.7 KiB
Python

from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from werkzeug import Request
from dify_plugin.entities.trigger import Variables
from dify_plugin.errors.trigger import EventIgnoreError
from dify_plugin.interfaces.trigger import Event
class ReleasePublishedEvent(Event):
"""GitHub Release Published Event"""
def _on_event(self, request: Request, parameters: Mapping[str, Any], payload: Mapping[str, Any]) -> Variables:
payload = request.get_json()
if not payload:
raise ValueError("No payload received")
if payload.get("action") != "published":
raise EventIgnoreError()
release = payload.get("release")
if not isinstance(release, Mapping):
raise ValueError("No release data in payload")
self._check_tag_name(release, parameters.get("tag_name"))
self._check_prerelease(release, parameters.get("prerelease"))
self._check_draft(release, parameters.get("draft"))
self._check_target_branch(release, parameters.get("target_branch"))
self._check_creator(payload, parameters.get("creator"))
return Variables(variables={**payload})
def _check_tag_name(self, release: Mapping[str, Any], value: str | None) -> None:
if not value:
return
names = [v.strip() for v in value.split(",") if v.strip()]
if not names:
return
tag = (release.get("tag_name") or "").strip()
if tag not in names:
raise EventIgnoreError()
def _check_prerelease(self, release: Mapping[str, Any], value: Any) -> None:
if value is None:
return
is_pre = bool(release.get("prerelease"))
if is_pre != bool(value):
raise EventIgnoreError()
def _check_draft(self, release: Mapping[str, Any], value: Any) -> None:
if value is None:
return
is_draft = bool(release.get("draft"))
if is_draft != bool(value):
raise EventIgnoreError()
def _check_target_branch(self, release: Mapping[str, Any], value: str | None) -> None:
if not value:
return
branches = [v.strip() for v in value.split(",") if v.strip()]
if not branches:
return
target = (release.get("target_commitish") or "").strip()
if target not in branches:
raise EventIgnoreError()
def _check_creator(self, payload: Mapping[str, Any], value: str | None) -> None:
if not value:
return
users = [v.strip() for v in value.split(",") if v.strip()]
if not users:
return
actor = payload.get("sender", {}).get("login")
if actor not in users:
raise EventIgnoreError()