feat(api): implement test form delivery & submission logic (vibe-kanban 89cd6a22)

This ensures that user can receive & submit form while using email
delivery test.
This commit is contained in:
QuantumGhost
2026-01-19 09:49:05 +08:00
parent 2db638b992
commit 6bf6bf6a2a
13 changed files with 224 additions and 28 deletions

View File

@ -17,7 +17,11 @@ from core.workflow.nodes.human_input.entities import (
MemberRecipient,
WebAppDeliveryMethod,
)
from core.workflow.nodes.human_input.enums import DeliveryMethodType, HumanInputFormStatus
from core.workflow.nodes.human_input.enums import (
DeliveryMethodType,
HumanInputFormKind,
HumanInputFormStatus,
)
from core.workflow.repositories.human_input_form_repository import (
FormCreateParams,
FormNotFoundError,
@ -132,10 +136,11 @@ class _HumanInputFormEntityImpl(HumanInputFormEntity):
@dataclasses.dataclass(frozen=True)
class HumanInputFormRecord:
form_id: str
workflow_run_id: str
workflow_run_id: str | None
node_id: str
tenant_id: str
app_id: str
form_kind: HumanInputFormKind
definition: FormDefinition
rendered_content: str
expiration_time: datetime
@ -164,6 +169,7 @@ class HumanInputFormRecord:
node_id=form_model.node_id,
tenant_id=form_model.tenant_id,
app_id=form_model.app_id,
form_kind=form_model.form_kind,
definition=FormDefinition.model_validate_json(form_model.form_definition),
rendered_content=form_model.rendered_content,
expiration_time=form_model.expiration_time,
@ -340,6 +346,7 @@ class HumanInputFormRepositoryImpl:
tenant_id=self._tenant_id,
app_id=params.app_id,
workflow_run_id=params.workflow_execution_id,
form_kind=params.form_kind,
node_id=params.node_id,
form_definition=form_definition.model_dump_json(),
rendered_content=params.rendered_content,

View File

@ -10,6 +10,13 @@ class HumanInputFormStatus(enum.StrEnum):
TIMEOUT = enum.auto()
class HumanInputFormKind(enum.StrEnum):
"""Kind of a human input form."""
RUNTIME = enum.auto() # Form created during workflow execution.
DELIVERY_TEST = enum.auto() # Form created for delivery tests.
class DeliveryMethodType(enum.StrEnum):
"""Delivery method types for human input forms."""

View File

@ -5,7 +5,7 @@ from datetime import datetime
from typing import Any, Protocol
from core.workflow.nodes.human_input.entities import DeliveryChannelConfig, HumanInputNodeData
from core.workflow.nodes.human_input.enums import HumanInputFormStatus
from core.workflow.nodes.human_input.enums import HumanInputFormKind, HumanInputFormStatus
class HumanInputError(Exception):
@ -19,7 +19,8 @@ class FormNotFoundError(HumanInputError):
@dataclasses.dataclass
class FormCreateParams:
app_id: str
workflow_execution_id: str
# None when creating a delivery test form; set for runtime forms.
workflow_execution_id: str | None
# node_id is the identifier for a specific
# node in the graph.
@ -40,6 +41,7 @@ class FormCreateParams:
#
# For type = CONSTANT, the value is not stored inside `resolved_placeholder_values`
resolved_placeholder_values: Mapping[str, Any]
form_kind: HumanInputFormKind = HumanInputFormKind.RUNTIME
# Force creating a console-only recipient for submission in Console.
console_recipient_required: bool = False