Skip to content

Commit 74c645e

Browse files
authored
Merge pull request #1025 from code0-tech/fix-execution-issues
Fix subscription for execution results
2 parents 9cee217 + 7416bce commit 74c645e

8 files changed

Lines changed: 102 additions & 9 deletions

File tree

app/graphql/subscription_triggers.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ def self.execution_result(execution_result)
55
SagittariusSchema.subscriptions.trigger(
66
:namespaces_projects_flows_execution_result,
77
{ execution_identifier: execution_result.execution_identifier },
8-
execution_result
8+
execution_result,
9+
context: { visibility_profile: :execution }
910
)
1011
end
1112
end

app/graphql/subscriptions/base_subscription.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ class BaseSubscription < GraphQL::Schema::Subscription
66
field_class Types::BaseField
77
object_class Types::BaseObject
88

9-
def current_authentication
10-
context[:current_authentication]
9+
def self.inherited(subclass)
10+
super
11+
subclass.graphql_name subclass.name.delete_prefix('Subscriptions::').gsub('::', '')
1112
end
1213

1314
def self.generate_payload_type
1415
result = super
1516
result.graphql_name("#{graphql_name}SubscriptionPayload")
1617
result
1718
end
19+
20+
def current_authentication
21+
context[:current_authentication]
22+
end
1823
end
1924
end

app/graphql/subscriptions/namespaces/projects/flows/execution_result_subscription.rb renamed to app/graphql/subscriptions/namespaces/projects/flows/execution_result.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Subscriptions
44
module Namespaces
55
module Projects
66
module Flows
7-
class ExecutionResultSubscription < BaseSubscription
7+
class ExecutionResult < BaseSubscription
88
description 'Subscription to asynchronously receive an execution result'
99

1010
argument :execution_identifier,
@@ -18,7 +18,7 @@ class ExecutionResultSubscription < BaseSubscription
1818
description: 'The execution result of the relevant execution'
1919

2020
def subscribe(execution_identifier:)
21-
result = ExecutionResult.find_by(execution_identifier: execution_identifier)
21+
result = ::ExecutionResult.find_by(execution_identifier: execution_identifier)
2222

2323
if result.present?
2424
unsubscribe({ execution_result: result })

app/graphql/types/subscription_type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class SubscriptionType < Types::BaseObject
66

77
include Sagittarius::Graphql::MountSubscription
88

9-
mount_subscription Subscriptions::Namespaces::Projects::Flows::ExecutionResultSubscription
9+
mount_subscription Subscriptions::Namespaces::Projects::Flows::ExecutionResult
1010
mount_subscription Subscriptions::Echo
1111
end
1212
end

app/grpc/execution_handler.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def test(requests, call)
2121
end
2222

2323
Thread.new do
24-
ActiveRecord::Base.connection_pool.with_connection do
25-
requests.each do |request|
24+
requests.each do |request|
25+
ApplicationRecord.connection_pool.with_connection do
2626
case request.data
2727
when :logon
2828
logger.info(message: 'Execution runtime sent logon', runtime_id: current_runtime_id)

docs/graphql/subscription/executionresultsubscription.md renamed to docs/graphql/subscription/namespacesprojectsflowsexecutionresult.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: executionResultSubscription
2+
title: namespacesProjectsFlowsExecutionResult
33
---
44

55
Subscription to asynchronously receive an execution result
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'namespacesProjectsFlowsExecutionResult Subscription', type: :channel do
6+
include AuthenticationHelpers
7+
include ActionCable::Channel::TestCase::Behavior
8+
9+
include_context 'with graphql subscription support'
10+
11+
tests GraphqlChannel
12+
13+
let(:user) { create(:user) }
14+
let(:token) { "Session #{authorization_token(user)}" }
15+
let(:flow) { create(:flow) }
16+
let(:execution_identifier) { 'existing-execution' }
17+
18+
let(:subscription_query) do
19+
<<~GQL
20+
subscription($executionIdentifier: String!) {
21+
namespacesProjectsFlowsExecutionResult(executionIdentifier: $executionIdentifier) {
22+
executionResult { success }
23+
}
24+
}
25+
GQL
26+
end
27+
28+
before do
29+
create(:namespace_member, namespace: flow.project.namespace, user: user)
30+
stub_allowed_ability(NamespaceProjectPolicy, :read_namespace_project, user: user, subject: flow.project)
31+
32+
subscribe(token: token)
33+
end
34+
35+
context 'when the execution result already exists' do
36+
before do
37+
create(:execution_result, flow: flow, execution_identifier: execution_identifier, success: { 'done' => true })
38+
end
39+
40+
it 'immediately delivers the result in the initial subscription response' do
41+
perform :execute, query: subscription_query, variables: { executionIdentifier: execution_identifier }
42+
43+
result = transmissions.last
44+
expect(result.dig('result', 'data', 'namespacesProjectsFlowsExecutionResult', 'executionResult', 'success'))
45+
.to eq({ 'done' => true })
46+
end
47+
end
48+
end

spec/services/namespaces/projects/flows/persist_execution_result_service_spec.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,43 @@
204204
expect(service_response.payload[:error_code]).to eq(:invalid_execution_result)
205205
end
206206
end
207+
208+
context 'with subscription integration', type: :channel do
209+
include AuthenticationHelpers
210+
include ActionCable::Channel::TestCase::Behavior
211+
212+
include_context 'with graphql subscription support'
213+
214+
tests GraphqlChannel
215+
216+
let(:user) { create(:user) }
217+
let(:token) { "Session #{authorization_token(user)}" }
218+
219+
before do
220+
allow(SubscriptionTriggers).to receive(:execution_result).and_call_original
221+
222+
create(:namespace_member, namespace: flow.project.namespace, user: user)
223+
stub_allowed_ability(NamespaceProjectPolicy, :read_namespace_project, user: user, subject: flow.project)
224+
225+
subscribe(token: token)
226+
227+
perform :execute,
228+
query: <<~GQL,
229+
subscription($executionIdentifier: String!) {
230+
namespacesProjectsFlowsExecutionResult(executionIdentifier: $executionIdentifier) {
231+
executionResult { success }
232+
}
233+
}
234+
GQL
235+
variables: { executionIdentifier: 'execution-identifier' }
236+
end
237+
238+
it 'delivers the execution result to subscribers without visibility profile error' do
239+
service_response
240+
241+
result = transmissions.last
242+
expect(result.dig('result', 'data', 'namespacesProjectsFlowsExecutionResult', 'executionResult', 'success'))
243+
.to eq({ 'result' => true })
244+
end
245+
end
207246
end

0 commit comments

Comments
 (0)