mirror of
https://github.com/langgenius/dify-plugin-sdks.git
synced 2026-07-22 10:25:23 -04:00
c67ef57f10
- Added `TriggerIgnoreEventError` to handle cases where events should be ignored based on filter criteria. - Updated various GitHub trigger files to return relevant payload fields directly, improving data accessibility for event handling. - Enhanced the handling of event filtering in triggers to ensure only relevant events are processed. These changes improve the robustness and clarity of the GitHub trigger integration, allowing for better error management and data handling.
118 lines
4.5 KiB
Python
118 lines
4.5 KiB
Python
from collections.abc import Mapping
|
|
from typing import Any
|
|
|
|
from werkzeug import Request
|
|
|
|
from dify_plugin.entities.trigger import Event
|
|
from dify_plugin.errors.trigger import TriggerIgnoreEventError
|
|
from dify_plugin.interfaces.trigger import TriggerEvent
|
|
|
|
|
|
class IssueEditedTrigger(TriggerEvent):
|
|
"""
|
|
GitHub Issue Edited Event Trigger
|
|
|
|
This trigger handles GitHub issue edited events and extracts relevant
|
|
information from the webhook payload to provide as variables to the workflow.
|
|
"""
|
|
|
|
def _trigger(self, request: Request, parameters: Mapping[str, Any]) -> Event:
|
|
"""
|
|
Handle GitHub issue edited event trigger
|
|
|
|
Parameters:
|
|
- issue_filter: Filter by specific issue number (optional)
|
|
"""
|
|
# Get the event payload
|
|
payload = request.get_json()
|
|
if not payload:
|
|
raise ValueError("No payload received")
|
|
|
|
# Verify this is an edited action
|
|
action = payload.get("action", "")
|
|
if action != "edited":
|
|
# This trigger only handles edited events
|
|
raise TriggerIgnoreEventError(f"Action \'{action}\' is not \'edited\'")
|
|
|
|
# Extract issue information
|
|
issue = payload.get("issue", {})
|
|
repository = payload.get("repository", {})
|
|
sender = payload.get("sender", {})
|
|
changes = payload.get("changes", {})
|
|
|
|
# Apply issue number filter if specified
|
|
issue_filter = parameters.get("issue_filter")
|
|
if issue_filter is not None:
|
|
issue_number = issue.get("number")
|
|
if issue_number != int(issue_filter):
|
|
# Skip this event if it doesn't match the issue filter
|
|
raise TriggerIgnoreEventError("Event does not match filter criteria")
|
|
|
|
# Extract labels
|
|
labels = [
|
|
{
|
|
"name": label.get("name", ""),
|
|
"color": label.get("color", ""),
|
|
"description": label.get("description", ""),
|
|
}
|
|
for label in issue.get("labels", [])
|
|
]
|
|
|
|
# Extract changes information
|
|
changes_data = {}
|
|
if "title" in changes:
|
|
changes_data["title"] = {
|
|
"from": changes["title"].get("from", "")
|
|
}
|
|
if "body" in changes:
|
|
changes_data["body"] = {
|
|
"from": changes["body"].get("from", "")
|
|
}
|
|
|
|
# Build variables for the workflow
|
|
variables = {
|
|
"issue": {
|
|
"number": issue.get("number"),
|
|
"title": issue.get("title", ""),
|
|
"body": issue.get("body", ""),
|
|
"state": issue.get("state", ""),
|
|
"html_url": issue.get("html_url", ""),
|
|
"created_at": issue.get("created_at", ""),
|
|
"updated_at": issue.get("updated_at", ""),
|
|
"labels": labels,
|
|
"assignees": [
|
|
{
|
|
"login": assignee.get("login", ""),
|
|
"avatar_url": assignee.get("avatar_url", ""),
|
|
"html_url": assignee.get("html_url", ""),
|
|
}
|
|
for assignee in issue.get("assignees", [])
|
|
],
|
|
"author": {
|
|
"login": issue.get("user", {}).get("login", ""),
|
|
"avatar_url": issue.get("user", {}).get("avatar_url", ""),
|
|
"html_url": issue.get("user", {}).get("html_url", ""),
|
|
},
|
|
},
|
|
"changes": changes_data,
|
|
"repository": {
|
|
"name": repository.get("name", ""),
|
|
"full_name": repository.get("full_name", ""),
|
|
"html_url": repository.get("html_url", ""),
|
|
"description": repository.get("description", ""),
|
|
"private": repository.get("private", False),
|
|
"owner": {
|
|
"login": repository.get("owner", {}).get("login", ""),
|
|
"avatar_url": repository.get("owner", {}).get("avatar_url", ""),
|
|
"html_url": repository.get("owner", {}).get("html_url", ""),
|
|
},
|
|
},
|
|
"sender": {
|
|
"login": sender.get("login", ""),
|
|
"avatar_url": sender.get("avatar_url", ""),
|
|
"html_url": sender.get("html_url", ""),
|
|
"type": sender.get("type", ""),
|
|
},
|
|
}
|
|
|
|
return Event(variables=variables) |