feat(trigger): enhance trigger subscription management and processing

- Refactor trigger provider classes to improve naming consistency and clarity
- Introduce new methods for managing trigger subscriptions, including validation and dispatching
- Update API endpoints to reflect changes in subscription handling
- Implement logging and request management for endpoint interactions
- Enhance data models to support subscription attributes and lifecycle management

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Harry
2025-09-01 12:08:48 +08:00
parent 6acc77d86d
commit 2f08306695
16 changed files with 1630 additions and 101 deletions

View File

@ -4,6 +4,7 @@ import re
from collections.abc import Mapping
from typing import Any, Optional
from flask import Request, Response
from sqlalchemy import desc
from sqlalchemy.orm import Session
@ -15,7 +16,11 @@ from core.plugin.entities.plugin import TriggerProviderID
from core.plugin.entities.plugin_daemon import CredentialType
from core.plugin.impl.oauth import OAuthHandler
from core.tools.utils.system_oauth_encryption import decrypt_system_oauth_params
from core.trigger.entities.api_entities import TriggerProviderApiEntity, TriggerProviderSubscriptionApiEntity
from core.trigger.entities.api_entities import (
SubscriptionValidation,
TriggerProviderApiEntity,
TriggerProviderSubscriptionApiEntity,
)
from core.trigger.trigger_manager import TriggerManager
from core.trigger.utils.encryption import (
create_trigger_provider_encrypter_for_subscription,
@ -32,7 +37,7 @@ logger = logging.getLogger(__name__)
class TriggerProviderService:
"""Service for managing trigger providers and credentials"""
__MAX_TRIGGER_PROVIDER_COUNT__ = 100
__MAX_TRIGGER_PROVIDER_COUNT__ = 10
@classmethod
def list_trigger_providers(cls, tenant_id: str) -> list[TriggerProviderApiEntity]:
@ -553,3 +558,24 @@ class TriggerProviderService:
except Exception as e:
logger.warning("Error generating provider name")
return f"{credential_type.get_name()} 1"
@classmethod
def get_subscription_by_endpoint(cls, endpoint_id: str) -> TriggerSubscription | None:
"""
Get a trigger subscription by the endpoint ID.
"""
with Session(db.engine, autoflush=False) as session:
subscription = session.query(TriggerSubscription).filter_by(endpoint=endpoint_id).first()
return subscription
@classmethod
def get_subscription_validation(cls, endpoint_id: str) -> SubscriptionValidation | None:
"""
Get a trigger subscription by the endpoint ID.
"""
cache_key = f"trigger:subscription:validation:endpoint:{endpoint_id}"
subscription_cache = redis_client.get(cache_key)
if subscription_cache:
return SubscriptionValidation.model_validate(json.loads(subscription_cache))
return None

View File

@ -0,0 +1,48 @@
import logging
from flask import Request, Response
from core.plugin.entities.plugin import TriggerProviderID
from core.trigger.trigger_manager import TriggerManager
from services.trigger.trigger_provider_service import TriggerProviderService
logger = logging.getLogger(__name__)
class TriggerSubscriptionValidationService:
__VALIDATION_REQUEST_CACHE_COUNT__ = 10
__VALIDATION_REQUEST_CACHE_EXPIRE_MS__ = 5 * 60 * 1000
@classmethod
def append_validation_request_log(cls, endpoint_id: str, request: Request, response: Response) -> None:
"""
Append the validation request log to Redis.
"""
@classmethod
def process_validating_endpoint(cls, endpoint_id: str, request: Request) -> Response | None:
"""
Process a temporary endpoint request.
:param endpoint_id: The endpoint identifier
:param request: The Flask request object
:return: The Flask response object
"""
# check if validation endpoint exists
subscription_validation = TriggerProviderService.get_subscription_validation(endpoint_id)
if not subscription_validation:
return None
# response to validation endpoint
controller = TriggerManager.get_trigger_provider(
subscription_validation.tenant_id, TriggerProviderID(subscription_validation.provider_id)
)
response = controller.dispatch(
user_id=subscription_validation.user_id,
request=request,
subscription=subscription_validation.to_subscription(),
)
# append the request log
cls.append_validation_request_log(endpoint_id, request, response.response)
return response.response