feat: dev snippet backend (#36804)

This commit is contained in:
FFXN
2026-05-29 11:00:26 +08:00
committed by GitHub
parent 5730ede96f
commit e7afd1e596
7 changed files with 165 additions and 34 deletions

View File

@ -84,6 +84,8 @@ def _check_version_compatibility(imported_version: str) -> ImportStatus:
class SnippetPendingData(BaseModel):
import_mode: str
yaml_content: str
name: str | None = None
description: str | None = None
snippet_id: str | None
@ -255,6 +257,8 @@ class SnippetDslService:
pending_data = SnippetPendingData(
import_mode=import_mode,
yaml_content=content,
name=name,
description=description,
snippet_id=snippet_id,
)
redis_client.setex(
@ -333,12 +337,37 @@ class SnippetDslService:
pending_data_str = pending_data.decode("utf-8") if isinstance(pending_data, bytes) else pending_data
pending = SnippetPendingData.model_validate_json(pending_data_str)
# Re-import with the pending data
return self.import_snippet(
data = yaml.safe_load(pending.yaml_content)
if not isinstance(data, dict):
return SnippetImportInfo(
id=import_id,
status=ImportStatus.FAILED,
error="Invalid YAML format: expected a dictionary",
)
snippet = None
if pending.snippet_id:
stmt = select(CustomizedSnippet).where(
CustomizedSnippet.id == pending.snippet_id,
CustomizedSnippet.tenant_id == account.current_tenant_id,
)
snippet = self._session.scalar(stmt)
snippet = self._create_or_update_snippet(
snippet=snippet,
data=data,
account=account,
import_mode=pending.import_mode,
yaml_content=pending.yaml_content,
snippet_id=pending.snippet_id,
name=pending.name,
description=pending.description,
)
redis_client.delete(redis_key)
return SnippetImportInfo(
id=import_id,
status=ImportStatus.COMPLETED,
snippet_id=snippet.id,
imported_dsl_version=data.get("version", "0.1.0"),
)
except Exception as e:

View File

@ -178,27 +178,14 @@ class SnippetService:
Create a new snippet.
:param tenant_id: Tenant ID
:param name: Snippet name (must be unique per tenant)
:param name: Snippet name
:param description: Snippet description
:param snippet_type: Type of snippet (node or group)
:param icon_info: Icon information
:param input_fields: Input field definitions
:param account: Creator account
:return: Created CustomizedSnippet
:raises ValueError: If name already exists
"""
# Check if name already exists for this tenant
existing = (
db.session.query(CustomizedSnippet)
.where(
CustomizedSnippet.tenant_id == tenant_id,
CustomizedSnippet.name == name,
)
.first()
)
if existing:
raise ValueError(f"Snippet with name '{name}' already exists")
snippet = CustomizedSnippet(
tenant_id=tenant_id,
name=name,
@ -232,18 +219,6 @@ class SnippetService:
:return: Updated CustomizedSnippet
"""
if "name" in data:
# Check if new name already exists for this tenant
existing = (
session.query(CustomizedSnippet)
.where(
CustomizedSnippet.tenant_id == snippet.tenant_id,
CustomizedSnippet.name == data["name"],
CustomizedSnippet.id != snippet.id,
)
.first()
)
if existing:
raise ValueError(f"Snippet with name '{data['name']}' already exists")
snippet.name = data["name"]
if "description" in data: