dify/api/services/compliance_download_service.py

47 lines
1.4 KiB
Python

"""Application service for compliance document downloads."""
from collections.abc import Callable
from typing import Protocol, TypedDict
from machinery.context import RequestContext
from services.errors.billing import ComplianceRateLimitExceededError
class ComplianceDownloadLink(TypedDict):
url: str
class ComplianceDownloadRateLimiter(Protocol):
def is_rate_limited(self, key: str, /) -> bool: ...
def increment_rate_limit(self, key: str, /) -> None: ...
class ComplianceDownloadService:
def __init__(
self,
*,
fetch_link: Callable[[str, str, str, str, str], ComplianceDownloadLink],
rate_limiter: ComplianceDownloadRateLimiter,
) -> None:
self._fetch_link = fetch_link
self._rate_limiter = rate_limiter
def get_link(
self,
*,
request_context: RequestContext,
document_name: str,
ip_address: str,
device_info: str,
) -> ComplianceDownloadLink:
workspace_id = request_context.active_workspace_id
account_id = request_context.account_id
limiter_key = f"{account_id}:{workspace_id}"
if self._rate_limiter.is_rate_limited(limiter_key):
raise ComplianceRateLimitExceededError
link = self._fetch_link(document_name, account_id, workspace_id, ip_address, device_info)
self._rate_limiter.increment_rate_limit(limiter_key)
return link