Skip to content

Commit

Permalink
Merge pull request #2789 from SolidProgramming/Issue_2783
Browse files Browse the repository at this point in the history
Merge #2783 into Develop
  • Loading branch information
tpurschke authored Jan 8, 2025
2 parents ab4e565 + f3af71d commit a31b299
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 19 deletions.
1 change: 1 addition & 0 deletions roles/lib/files/FWO.Api.Client/APIConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public abstract GraphQlApiSubscription<SubscriptionResponseType> GetSubscription
GraphQlApiSubscription<SubscriptionResponseType>.SubscriptionUpdate subscriptionUpdateHandler, string subscription, object? variables = null, string? operationName = null);

protected abstract void Dispose(bool disposing);
public abstract void DisposeSubscriptions<T>();

~ ApiConnection()
{
Expand Down
33 changes: 22 additions & 11 deletions roles/lib/files/FWO.Api.Client/GraphQlApiConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private void Initialize(string ApiServerUri)
graphQlClient = new GraphQLHttpClient(new GraphQLHttpClientOptions()
{
EndPoint = new Uri(this.ApiServerUri),
HttpMessageHandler = Handler,
HttpMessageHandler = Handler,
UseWebSocketForQueriesAndMutations = false, // TODO: Use websockets for performance reasons
ConfigureWebsocketOptions = webSocketOptions => webSocketOptions.RemoteCertificateValidationCallback += (message, cert, chain, errors) => true
}, ApiConstants.UseSystemTextJsonSerializer ? new SystemTextJsonSerializer() : new NewtonsoftJsonSerializer());
Expand Down Expand Up @@ -73,9 +73,9 @@ public bool IsActRole(string role)

public string GetActRole()
{
if(graphQlClient.HttpClient.DefaultRequestHeaders.TryGetValues("x-hasura-role", out IEnumerable<string>? roles))
if (graphQlClient.HttpClient.DefaultRequestHeaders.TryGetValues("x-hasura-role", out IEnumerable<string>? roles))
{
if(roles.Count() > 1)
if (roles.Count() > 1)
{
Log.WriteDebug("API call", $"More than one role in x-hasura-role: {roles}");
}
Expand All @@ -87,9 +87,9 @@ public string GetActRole()
public override void SetBestRole(System.Security.Claims.ClaimsPrincipal user, List<string> targetRoleList)
{
prevRole = GetActRole();
foreach(string role in targetRoleList)
foreach (string role in targetRoleList)
{
if(user.Claims.FirstOrDefault(claim => claim.Type == "x-hasura-allowed-roles" && claim.Value == role) != null)
if (user.Claims.FirstOrDefault(claim => claim.Type == "x-hasura-allowed-roles" && claim.Value == role) != null)
{
SetRole(role);
return;
Expand All @@ -102,7 +102,7 @@ public override void SetProperRole(System.Security.Claims.ClaimsPrincipal user,
prevRole = GetActRole();

// first look if user is already in one of the target roles
if(targetRoleList.Contains(prevRole))
if (targetRoleList.Contains(prevRole))
{
return;
}
Expand All @@ -112,7 +112,7 @@ public override void SetProperRole(System.Security.Claims.ClaimsPrincipal user,

public override void SwitchBack()
{
if(prevRole != "")
if (prevRole != "")
{
SetRole(prevRole);
}
Expand All @@ -132,7 +132,7 @@ public override async Task<QueryResponseType> SendQueryAsync<QueryResponseType>(
try
{
Log.WriteDebug("API call", $"Sending API call {operationName} in role {GetActRole()}: {query.Substring(0, Math.Min(query.Length, 70)).Replace(Environment.NewLine, "")}... " +
(variables != null ? $"with variables: { JsonSerializer.Serialize(variables).Substring(0, Math.Min(JsonSerializer.Serialize(variables).Length, 50)).Replace(Environment.NewLine, "")}..." : ""));
( variables != null ? $"with variables: {JsonSerializer.Serialize(variables).Substring(0, Math.Min(JsonSerializer.Serialize(variables).Length, 50)).Replace(Environment.NewLine, "")}..." : "" ));
GraphQLResponse<dynamic> response = await graphQlClient.SendQueryAsync<dynamic>(query, variables, operationName);
// Log.WriteDebug("API call", "API response received.");

Expand Down Expand Up @@ -171,7 +171,7 @@ public override async Task<QueryResponseType> SendQueryAsync<QueryResponseType>(
else
{
JObject data = (JObject)response.Data;
JProperty prop = (JProperty)(data.First ?? throw new Exception($"Could not retrieve unique result attribute from Json.\nJson: {response.Data}"));
JProperty prop = (JProperty)( data.First ?? throw new Exception($"Could not retrieve unique result attribute from Json.\nJson: {response.Data}") );
JToken result = prop.Value;
QueryResponseType returnValue = result.ToObject<QueryResponseType>() ??
throw new Exception($"Could not convert result from Json to {typeof(QueryResponseType)}.\nJson: {response.Data}");
Expand All @@ -182,7 +182,7 @@ public override async Task<QueryResponseType> SendQueryAsync<QueryResponseType>(

catch (Exception exception)
{
Log.WriteError("API Connection", $"Error while sending query to GraphQL API. Query: {(query != null ? query : "")}, variables: {(variables != null ? JsonSerializer.Serialize(variables) : "")}", exception);
Log.WriteError("API Connection", $"Error while sending query to GraphQL API. Query: {( query != null ? query : "" )}, variables: {( variables != null ? JsonSerializer.Serialize(variables) : "" )}", exception);
throw;
}
}
Expand All @@ -192,9 +192,10 @@ public override GraphQlApiSubscription<SubscriptionResponseType> GetSubscription
try
{
GraphQLRequest request = new GraphQLRequest(subscription, variables, operationName);
GraphQlApiSubscription<SubscriptionResponseType> newSub =
GraphQlApiSubscription<SubscriptionResponseType> newSub =
new GraphQlApiSubscription<SubscriptionResponseType>(this, graphQlClient, request, exceptionHandler, subscriptionUpdateHandler);
subscriptions.Add(newSub);

return newSub;
}
catch (Exception exception)
Expand All @@ -215,5 +216,15 @@ protected override void Dispose(bool disposing)
}
}
}

public override void DisposeSubscriptions<T>()
{
foreach (ApiSubscription subscription in subscriptions.Where(_ => _.GetType() == typeof(T)))
{
subscription.Dispose();
}

subscriptions.RemoveAll(_ => _.GetType() == typeof(T));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,11 @@
private bool WorkInProgress = false;
private bool FirstTry = true;
private bool RequestInProcess = false;
private bool SubscriptionsSetupComplete = false;
private WfStateDict states = new();
private ExtStateHandler extStateHandler;
private List<GraphQlApiSubscription<List<WfReqTask>>> actTaskSubscriptions = [];


protected override async Task OnInitializedAsync()
{
extStateHandler = new(apiConnection);
Expand Down Expand Up @@ -133,7 +133,7 @@
{
ModellingAppZoneHandler appZoneHandler = new(apiConnection, userConfig, SelectedApp, DisplayMessageInUi);
await appZoneHandler.UpsertAppZone();
ModellingVarianceAnalysis varianceAnalysis = new(apiConnection, extStateHandler, userConfig, SelectedApp, DisplayMessageInUi);
ModellingVarianceAnalysis varianceAnalysis = new(apiConnection, extStateHandler, userConfig, SelectedApp, DisplayMessageInUi);
TaskList = await varianceAnalysis.AnalyseModelledConnections(Connections);
}
}
Expand All @@ -152,7 +152,7 @@
if (intTicket != null)
{
SetActTicketStatus(intTicket);
if(RequestInProcess)
if (RequestInProcess)
{
SubscribeTaskChanges();
}
Expand Down Expand Up @@ -278,7 +278,7 @@
TaskList = intTicket.Tasks;
await SaveTicketId(intTicket.Id);
await ModellingHandlerBase.LogChange(ModellingTypes.ChangeType.InitRequests, ModellingTypes.ModObjectType.CommunicationProfile,
0, $"Initialized Rollout Requests", apiConnection, userConfig,
0, $"Initialized Rollout Requests", apiConnection, userConfig,
intTicket.Tasks.FirstOrDefault()?.Owners.FirstOrDefault()?.Owner.Id, DefaultInit.DoNothing, intTicket.Requester?.Name);
SubscribeTaskChanges();
await CreateExtRequests(intTicket);
Expand Down Expand Up @@ -332,10 +332,14 @@

private void SubscribeTaskChanges()
{
foreach(var task in TaskList)
SubscriptionsSetupComplete = false;

foreach (var task in TaskList)
{
actTaskSubscriptions.Add(apiConnection.GetSubscription<List<WfReqTask>>(HandleSubscriptionError, OnTaskUpdate, RequestQueries.subscribeTaskChanges, new {task.Id}));
actTaskSubscriptions.Add(apiConnection.GetSubscription<List<WfReqTask>>(HandleSubscriptionError, OnTaskUpdate, RequestQueries.subscribeTaskChanges, new { task.Id }));
}

SubscriptionsSetupComplete = true;
}

private async void HandleSubscriptionError(Exception exception)
Expand All @@ -347,11 +351,12 @@
{
try
{
foreach(var sub in actTaskSubscriptions)
foreach (var sub in actTaskSubscriptions)
{
sub.Dispose();
}
actTaskSubscriptions = [];
apiConnection.DisposeSubscriptions<GraphQlApiSubscription<List<FWO.Api.Data.WfReqTask>>>();
}
catch (Exception exception)
{
Expand All @@ -364,16 +369,20 @@
try
{
SetActTaskStatus(tasks.First());
await InvokeAsync(StateHasChanged);
}
catch (Exception exception)
{
DisplayMessageInUi(exception, userConfig.GetText("request_fw_change"), "", true);
}

await InvokeAsync(StateHasChanged);
}

private void SetActTaskStatus(WfReqTask task)
{
if (!SubscriptionsSetupComplete)
return;

TaskList[TaskList.FindIndex(t => t.Id == task.Id)] = task;
}

Expand Down

0 comments on commit a31b299

Please sign in to comment.