From 31fbdfdc0283fb26f1ad6fe95917efccdf6e1065 Mon Sep 17 00:00:00 2001 From: "a.tolmachev" Date: Mon, 6 Apr 2026 21:27:19 +0300 Subject: [PATCH] feat: add soap core domain model --- TASKS.md | 15 ++-- apps/admin-api/src/service.rs | 4 + apps/ui/html/workspace-setup.html | 1 + apps/ui/index.html | 4 +- apps/ui/js/agents.js | 2 + apps/ui/js/catalog.js | 1 + apps/ui/js/i18n.js | 6 ++ apps/ui/js/usage.js | 6 ++ apps/ui/js/wizard.js | 6 +- crates/crank-core/src/lib.rs | 8 +- crates/crank-core/src/operation.rs | 88 +++++++++++++++++++++- crates/crank-core/src/protocol.rs | 15 ++++ crates/crank-core/src/soap.rs | 101 ++++++++++++++++++++++++++ crates/crank-registry/src/postgres.rs | 6 ++ crates/crank-runtime/src/executor.rs | 6 ++ crates/crank-schema/src/lib.rs | 2 +- crates/crank-schema/src/model.rs | 50 ++++++++++++- docs/data-model.md | 41 ++++++++--- docs/protocols/soap.md | 19 +++++ 19 files changed, 353 insertions(+), 28 deletions(-) create mode 100644 crates/crank-core/src/soap.rs diff --git a/TASKS.md b/TASKS.md index 7d0827b..344edfa 100644 --- a/TASKS.md +++ b/TASKS.md @@ -2,19 +2,19 @@ ## Current -### `feat/websocket-upstream-adapter` +### `feat/soap-architecture-and-core-model` Status: completed DoD: -- bounded WebSocket window execution is supported -- WebSocket protocol is exposed through capability APIs -- session mode can seed from WebSocket window collection -- runtime and adapter tests cover WebSocket collection and reconnects +- SOAP target model is defined in `crank-core` +- WSDL/XSD-derived metadata model is defined in code-level types +- capability matrix exposes SOAP as a first-class protocol +- docs and task state are synchronized ## Next -- `feat/soap-architecture-and-core-model` +- `feat/soap-adapter-foundation` ## Backlog @@ -31,9 +31,6 @@ DoD: - `feat/soap-adapter-foundation` - `feat/streaming-ui-config` - `feat/streaming-e2e` -- `feat/websocket-upstream-adapter` -- `feat/soap-architecture-and-core-model` -- `feat/soap-adapter-foundation` - `feat/auth-profile-secret-resolution` - `feat/runtime-upstream-auth` - `feat/secrets-ui` diff --git a/apps/admin-api/src/service.rs b/apps/admin-api/src/service.rs index dab277a..f0a9eec 100644 --- a/apps/admin-api/src/service.rs +++ b/apps/admin-api/src/service.rs @@ -1352,6 +1352,7 @@ impl AdminService { Protocol::Graphql, Protocol::Grpc, Protocol::Websocket, + Protocol::Soap, ] .into_iter() .map(protocol_capability_view) @@ -3607,6 +3608,7 @@ fn validate_protocol_target(protocol: Protocol, target: &Target) -> Result<(), A | (Protocol::Graphql, Target::Graphql(_)) | (Protocol::Grpc, Target::Grpc(_)) | (Protocol::Websocket, Target::Websocket(_)) + | (Protocol::Soap, Target::Soap(_)) ); if is_match { @@ -3834,6 +3836,7 @@ fn demo_grpc_operation_payload() -> OperationPayload { protocol_options: Some(crank_core::ProtocolOptions { grpc: Some(crank_core::GrpcProtocolOptions { use_tls: false }), websocket: None, + soap: None, }), streaming: None, }, @@ -4044,6 +4047,7 @@ fn protocol_capability_view(protocol: Protocol) -> ProtocolCapabilityView { let supports_upload_artifacts = match protocol { Protocol::Rest | Protocol::Graphql | Protocol::Websocket => Vec::new(), Protocol::Grpc => vec!["proto".to_owned(), "descriptor_set".to_owned()], + Protocol::Soap => vec!["wsdl".to_owned(), "xsd".to_owned()], }; ProtocolCapabilityView { diff --git a/apps/ui/html/workspace-setup.html b/apps/ui/html/workspace-setup.html index 2782632..4fa41fd 100644 --- a/apps/ui/html/workspace-setup.html +++ b/apps/ui/html/workspace-setup.html @@ -96,6 +96,7 @@ +
Pre-selected in the operation wizard.
diff --git a/apps/ui/index.html b/apps/ui/index.html index 8a04077..fd7b99f 100644 --- a/apps/ui/index.html +++ b/apps/ui/index.html @@ -181,13 +181,13 @@