44
55use App \Auth \Principal ;
66use Workflow \V2 \Contracts \ServiceBoundaryPolicy ;
7+ use Workflow \V2 \Enums \ServiceCallBindingKind ;
78use Workflow \V2 \Enums \ServiceCallOperationMode ;
9+ use Workflow \V2 \Enums \ServiceCallOutcome ;
810use Workflow \V2 \Models \WorkflowServiceOperation ;
911use Workflow \V2 \Support \DefaultServiceBoundaryPolicy ;
1012use Workflow \V2 \Support \ServiceBoundaryAuditRecorder ;
13+ use Workflow \V2 \Support \ServiceBoundaryDecision ;
1114use Workflow \V2 \Support \ServiceBoundaryRequest ;
1215use Workflow \V2 \Support \ServiceCallPrincipal ;
1316
@@ -81,6 +84,8 @@ public function admitFor(
8184 ?array $ cancellationPolicy = null ,
8285 ?array $ retryPolicy = null ,
8386 ): ServiceCallAdmission {
87+ $ resolvedBindingKind = self ::resolvedBindingKind ($ operation );
88+
8489 $ request = new ServiceBoundaryRequest (
8590 principal: self ::principalFromAuth ($ principal ),
8691 callerNamespace: $ callerNamespace ,
@@ -91,8 +96,8 @@ public function admitFor(
9196 operationMode: ServiceCallOperationMode::tryFromCatalog ($ operationModeOverride )
9297 ?? ServiceCallOperationMode::tryFromCatalog ($ operation ->operation_mode )
9398 ?? ServiceCallOperationMode::Async,
94- resolvedBindingKind: ( string ) $ operation -> handler_binding_kind ,
95- resolvedTargetReference: $ operation ->handler_target_reference ,
99+ resolvedBindingKind: $ resolvedBindingKind ,
100+ resolvedTargetReference: $ resolvedBindingKind === null ? null : $ operation ->handler_target_reference ,
96101 callerWorkflowInstanceId: $ callerWorkflowInstanceId ,
97102 callerWorkflowRunId: $ callerWorkflowRunId ,
98103 linkedWorkflowInstanceId: $ linkedWorkflowInstanceId ,
@@ -108,6 +113,27 @@ public function admitFor(
108113 retryPolicy: $ retryPolicy ,
109114 );
110115
116+ if ($ resolvedBindingKind === null ) {
117+ $ decision = new ServiceBoundaryDecision (
118+ outcome: ServiceCallOutcome::RejectedNotFound,
119+ reason: 'unknown_binding_kind ' ,
120+ message: sprintf (
121+ 'Service operation [%s] has unknown handler binding kind [%s]. ' ,
122+ $ operation ->operation_name ,
123+ $ operation ->handler_binding_kind ,
124+ ),
125+ policyName: 'default ' ,
126+ metadata: [
127+ 'failure_reason ' => 'resolution_failure ' ,
128+ 'resolution_failed_at ' => 'handler_binding_kind ' ,
129+ 'handler_binding_kind ' => (string ) $ operation ->handler_binding_kind ,
130+ ],
131+ );
132+ $ call = $ this ->recorder ->record ($ request , $ decision );
133+
134+ return new ServiceCallAdmission ($ decision , $ call , $ request );
135+ }
136+
111137 return $ this ->admit ($ request );
112138 }
113139
@@ -133,4 +159,23 @@ private static function principalFromAuth(Principal $principal): ServiceCallPrin
133159 claims: $ principal ->claims (),
134160 );
135161 }
162+
163+ private static function resolvedBindingKind (WorkflowServiceOperation $ operation ): ?string
164+ {
165+ return match (strtolower (trim ((string ) $ operation ->handler_binding_kind ))) {
166+ ServiceCallBindingKind::WorkflowRun->value ,
167+ 'start_workflow ' ,
168+ 'workflow_class ' => ServiceCallBindingKind::WorkflowRun->value ,
169+ ServiceCallBindingKind::WorkflowUpdate->value ,
170+ 'update_workflow ' => ServiceCallBindingKind::WorkflowUpdate->value ,
171+ ServiceCallBindingKind::WorkflowSignal->value ,
172+ 'signal_workflow ' => ServiceCallBindingKind::WorkflowSignal->value ,
173+ ServiceCallBindingKind::WorkflowQuery->value ,
174+ 'query_workflow ' => ServiceCallBindingKind::WorkflowQuery->value ,
175+ ServiceCallBindingKind::ActivityExecution->value => ServiceCallBindingKind::ActivityExecution->value ,
176+ ServiceCallBindingKind::InvocableCarrierRequest->value ,
177+ 'invocable_http ' => ServiceCallBindingKind::InvocableCarrierRequest->value ,
178+ default => null ,
179+ };
180+ }
136181}
0 commit comments