♻️(convert) reuse existing convert yprovider endpoint for content API

reuse convert service instead of renaming it in content
This commit is contained in:
Sylvain Zimmer
2025-07-24 14:08:18 +02:00
committed by Manuel Raynaud
parent 8a8a1460e5
commit ede0a77665
14 changed files with 296 additions and 421 deletions

View File

@@ -1,6 +1,5 @@
"""Y-Provider API services."""
import json
from base64 import b64encode
from django.conf import settings
@@ -20,8 +19,8 @@ class ServiceUnavailableError(ConversionError):
"""Raised when the conversion service is unavailable."""
class YProviderAPI:
"""Service class for Y-Provider API operations."""
class YdocConverter:
"""Service class for conversion-related operations."""
@property
def auth_header(self):
@@ -29,7 +28,7 @@ class YProviderAPI:
# Note: Yprovider microservice accepts only raw token, which is not recommended
return f"Bearer {settings.Y_PROVIDER_API_KEY}"
def _request(self, url, data, content_type):
def _request(self, url, data, content_type, accept):
"""Make a request to the Y-Provider API."""
response = requests.post(
url,
@@ -37,6 +36,7 @@ class YProviderAPI:
headers={
"Authorization": self.auth_header,
"Content-Type": content_type,
"Accept": accept,
},
timeout=settings.CONVERSION_API_TIMEOUT,
verify=settings.CONVERSION_API_SECURE,
@@ -44,7 +44,9 @@ class YProviderAPI:
response.raise_for_status()
return response
def convert(self, text):
def convert(
self, text, content_type="text/markdown", accept="application/vnd.yjs.doc"
):
"""Convert a Markdown text into our internal format using an external microservice."""
if not text:
@@ -54,27 +56,17 @@ class YProviderAPI:
response = self._request(
f"{settings.Y_PROVIDER_API_BASE_URL}{settings.CONVERSION_API_ENDPOINT}/",
text,
"text/markdown",
content_type,
accept,
)
return b64encode(response.content).decode("utf-8")
if accept == "application/vnd.yjs.doc":
return b64encode(response.content).decode("utf-8")
if accept in {"text/markdown", "text/html"}:
return response.text
if accept == "application/json":
return response.json()
raise ValidationError("Unsupported format")
except requests.RequestException as err:
raise ServiceUnavailableError(
"Failed to connect to backend service",
) from err
def content(self, base64_content, format_type):
"""Convert base64 Yjs content to different formats using the y-provider service."""
if not base64_content:
raise ValidationError("Input content cannot be empty")
data = json.dumps({"content": base64_content, "format": format_type})
try:
response = self._request(
f"{settings.Y_PROVIDER_API_BASE_URL}content/", data, "application/json"
)
return response.json()
except requests.RequestException as err:
raise ServiceUnavailableError(
"Failed to connect to backend service",
"Failed to connect to conversion service",
) from err