mirror of
https://github.com/langgenius/dify-plugin-sdks.git
synced 2026-07-22 10:25:23 -04:00
79 lines
2.7 KiB
Python
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()
|