mirror of
https://github.com/langgenius/dify.git
synced 2026-09-08 11:04:27 +08:00
feat(trigger): enhance trigger subscription management and cache handling
- Added `name` parameter to `TriggerSubscriptionBuilderCreateApi` for better subscription identification. - Implemented `delete_cache_for_subscription` function to clear cache associated with trigger subscriptions. - Updated `WorkflowPluginTriggerService` to check for existing subscriptions before creating new plugin triggers, improving error handling. - Refactored `TriggerProviderService` to utilize the new cache deletion method during provider deletion. This improves the overall management of trigger subscriptions and enhances cache efficiency.
This commit is contained in:
parent
81ef7343d4
commit
0371d71409
@ -82,6 +82,7 @@ class TriggerSubscriptionBuilderCreateApi(Resource):
|
|||||||
tenant_id=user.current_tenant_id,
|
tenant_id=user.current_tenant_id,
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
provider_id=TriggerProviderID(provider),
|
provider_id=TriggerProviderID(provider),
|
||||||
|
name=args.get("name", None),
|
||||||
credentials=credentials,
|
credentials=credentials,
|
||||||
credential_type=credential_type,
|
credential_type=credential_type,
|
||||||
credential_expires_at=-1,
|
credential_expires_at=-1,
|
||||||
|
|||||||
@ -65,6 +65,13 @@ def create_trigger_provider_encrypter_for_subscription(
|
|||||||
)
|
)
|
||||||
return encrypter, cache
|
return encrypter, cache
|
||||||
|
|
||||||
|
def delete_cache_for_subscription(tenant_id: str, provider_id: str, subscription_id: str):
|
||||||
|
cache = TriggerProviderCredentialsCache(
|
||||||
|
tenant_id=tenant_id,
|
||||||
|
provider_id=provider_id,
|
||||||
|
credential_id=subscription_id,
|
||||||
|
)
|
||||||
|
cache.delete()
|
||||||
|
|
||||||
def create_trigger_provider_encrypter_for_properties(
|
def create_trigger_provider_encrypter_for_properties(
|
||||||
tenant_id: str,
|
tenant_id: str,
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
from collections.abc import Mapping
|
from collections.abc import Mapping
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
import uuid
|
||||||
|
|
||||||
from sqlalchemy import desc
|
from sqlalchemy import desc
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
@ -23,6 +24,7 @@ from core.trigger.utils.encryption import (
|
|||||||
create_trigger_provider_encrypter_for_properties,
|
create_trigger_provider_encrypter_for_properties,
|
||||||
create_trigger_provider_encrypter_for_subscription,
|
create_trigger_provider_encrypter_for_subscription,
|
||||||
create_trigger_provider_oauth_encrypter,
|
create_trigger_provider_oauth_encrypter,
|
||||||
|
delete_cache_for_subscription,
|
||||||
)
|
)
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from extensions.ext_redis import redis_client
|
from extensions.ext_redis import redis_client
|
||||||
@ -82,6 +84,7 @@ class TriggerProviderService:
|
|||||||
parameters: Mapping[str, Any],
|
parameters: Mapping[str, Any],
|
||||||
properties: Mapping[str, Any],
|
properties: Mapping[str, Any],
|
||||||
credentials: Mapping[str, str],
|
credentials: Mapping[str, str],
|
||||||
|
subscription_id: Optional[str] = None,
|
||||||
credential_expires_at: int = -1,
|
credential_expires_at: int = -1,
|
||||||
expires_at: int = -1,
|
expires_at: int = -1,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
@ -139,6 +142,7 @@ class TriggerProviderService:
|
|||||||
|
|
||||||
# Create provider record
|
# Create provider record
|
||||||
db_provider = TriggerSubscription(
|
db_provider = TriggerSubscription(
|
||||||
|
id=subscription_id or str(uuid.uuid4()),
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
name=name,
|
name=name,
|
||||||
@ -175,16 +179,13 @@ class TriggerProviderService:
|
|||||||
if not db_provider:
|
if not db_provider:
|
||||||
raise ValueError(f"Trigger provider subscription {subscription_id} not found")
|
raise ValueError(f"Trigger provider subscription {subscription_id} not found")
|
||||||
|
|
||||||
provider_controller = TriggerManager.get_trigger_provider(tenant_id, TriggerProviderID(db_provider.provider_id))
|
|
||||||
# Clear cache
|
# Clear cache
|
||||||
_, cache = create_trigger_provider_encrypter_for_subscription(
|
|
||||||
tenant_id=tenant_id,
|
|
||||||
controller=provider_controller,
|
|
||||||
subscription=db_provider,
|
|
||||||
)
|
|
||||||
|
|
||||||
session.delete(db_provider)
|
session.delete(db_provider)
|
||||||
cache.delete()
|
delete_cache_for_subscription(
|
||||||
|
tenant_id=tenant_id,
|
||||||
|
provider_id=db_provider.provider_id,
|
||||||
|
subscription_id=db_provider.id,
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def refresh_oauth_token(
|
def refresh_oauth_token(
|
||||||
|
|||||||
@ -96,6 +96,7 @@ class TriggerSubscriptionBuilderService:
|
|||||||
if credential_type == CredentialType.UNAUTHORIZED:
|
if credential_type == CredentialType.UNAUTHORIZED:
|
||||||
# manually create
|
# manually create
|
||||||
TriggerProviderService.add_trigger_provider(
|
TriggerProviderService.add_trigger_provider(
|
||||||
|
subscription_id=subscription_builder.id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
name=subscription_builder.name,
|
name=subscription_builder.name,
|
||||||
@ -120,6 +121,7 @@ class TriggerSubscriptionBuilderService:
|
|||||||
)
|
)
|
||||||
|
|
||||||
TriggerProviderService.add_trigger_provider(
|
TriggerProviderService.add_trigger_provider(
|
||||||
|
subscription_id=subscription_builder.id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
name=subscription_builder.name,
|
name=subscription_builder.name,
|
||||||
@ -145,6 +147,7 @@ class TriggerSubscriptionBuilderService:
|
|||||||
credential_type: CredentialType,
|
credential_type: CredentialType,
|
||||||
credential_expires_at: int,
|
credential_expires_at: int,
|
||||||
expires_at: int,
|
expires_at: int,
|
||||||
|
name: str | None,
|
||||||
) -> SubscriptionBuilder:
|
) -> SubscriptionBuilder:
|
||||||
"""
|
"""
|
||||||
Add a new trigger subscription validation.
|
Add a new trigger subscription validation.
|
||||||
@ -157,7 +160,7 @@ class TriggerSubscriptionBuilderService:
|
|||||||
subscription_id = str(uuid.uuid4())
|
subscription_id = str(uuid.uuid4())
|
||||||
subscription_builder = SubscriptionBuilder(
|
subscription_builder = SubscriptionBuilder(
|
||||||
id=subscription_id,
|
id=subscription_id,
|
||||||
name="",
|
name=name or "",
|
||||||
endpoint_id=subscription_id,
|
endpoint_id=subscription_id,
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
|
|||||||
@ -5,6 +5,7 @@ from sqlalchemy.orm import Session
|
|||||||
from werkzeug.exceptions import BadRequest, NotFound
|
from werkzeug.exceptions import BadRequest, NotFound
|
||||||
|
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
|
from models.trigger import TriggerSubscription
|
||||||
from models.workflow import WorkflowPluginTrigger
|
from models.workflow import WorkflowPluginTrigger
|
||||||
|
|
||||||
|
|
||||||
@ -53,6 +54,16 @@ class WorkflowPluginTriggerService:
|
|||||||
if existing_trigger:
|
if existing_trigger:
|
||||||
raise BadRequest("Plugin trigger already exists for this app and node")
|
raise BadRequest("Plugin trigger already exists for this app and node")
|
||||||
|
|
||||||
|
# Check if subscription exists
|
||||||
|
subscription = session.scalar(
|
||||||
|
select(TriggerSubscription).where(
|
||||||
|
TriggerSubscription.id == subscription_id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not subscription:
|
||||||
|
raise BadRequest("Subscription not found")
|
||||||
|
|
||||||
# Create new plugin trigger
|
# Create new plugin trigger
|
||||||
plugin_trigger = WorkflowPluginTrigger(
|
plugin_trigger = WorkflowPluginTrigger(
|
||||||
app_id=app_id,
|
app_id=app_id,
|
||||||
@ -340,7 +351,7 @@ class WorkflowPluginTriggerService:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if not plugin_trigger:
|
if not plugin_trigger:
|
||||||
raise NotFound("Plugin trigger not found")
|
return
|
||||||
|
|
||||||
session.delete(plugin_trigger)
|
session.delete(plugin_trigger)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user