Skip to content

Commit 1b640ae

Browse files
feat: Refactor orchestration status handling and improve progress tracking in map rotations
1 parent 86f2186 commit 1b640ae

6 files changed

Lines changed: 351 additions & 140 deletions

File tree

src/XtremeIdiots.Portal.Web/Controllers/MapRotationsController.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ public async Task<IActionResult> SyncAssignment(Guid assignmentId, Guid mapRotat
608608
if (result.Success)
609609
{
610610
this.AddAlertSuccess("Sync triggered successfully.");
611-
TempData["ActiveInstanceId"] = $"maprot-sync-{assignmentId}";
611+
TempData["PendingInstanceId"] = $"maprot-sync-{assignmentId}";
612612
}
613613
else
614614
{
@@ -650,7 +650,7 @@ public async Task<IActionResult> ActivateAssignment(Guid assignmentId, Guid mapR
650650
if (result.Success)
651651
{
652652
this.AddAlertSuccess("Activation triggered successfully.");
653-
TempData["ActiveInstanceId"] = $"maprot-activate-{assignmentId}";
653+
TempData["PendingInstanceId"] = $"maprot-activate-{assignmentId}";
654654
}
655655
else
656656
{
@@ -692,7 +692,7 @@ public async Task<IActionResult> DeactivateAssignment(Guid assignmentId, Guid ma
692692
if (result.Success)
693693
{
694694
this.AddAlertSuccess("Deactivation triggered successfully.");
695-
TempData["ActiveInstanceId"] = $"maprot-deactivate-{assignmentId}";
695+
TempData["PendingInstanceId"] = $"maprot-deactivate-{assignmentId}";
696696
}
697697
else
698698
{
@@ -706,9 +706,21 @@ public async Task<IActionResult> DeactivateAssignment(Guid assignmentId, Guid ma
706706
[HttpGet]
707707
public async Task<IActionResult> GetSyncProgress(string instanceId, CancellationToken cancellationToken = default)
708708
{
709-
var result = await syncApiClient.GetOrchestrationStatus(instanceId, cancellationToken).ConfigureAwait(false);
710-
if (result == null)
711-
return Json(new { status = "unknown" });
712-
return Json(result);
709+
var queryResult = await syncApiClient.GetOrchestrationStatus(instanceId, cancellationToken).ConfigureAwait(false);
710+
return queryResult.Outcome switch
711+
{
712+
Services.OrchestrationStatusQueryOutcome.Found => Json(new
713+
{
714+
status = "found",
715+
instanceId = queryResult.Result!.InstanceId,
716+
runtimeStatus = queryResult.Result.RuntimeStatus,
717+
createdAt = queryResult.Result.CreatedAt,
718+
lastUpdatedAt = queryResult.Result.LastUpdatedAt,
719+
progress = queryResult.Result.Progress
720+
}),
721+
Services.OrchestrationStatusQueryOutcome.NotFound => Json(new { status = "not_found" }),
722+
Services.OrchestrationStatusQueryOutcome.Error => Json(new { status = "error" }),
723+
_ => Json(new { status = "error" })
724+
};
713725
}
714726
}

src/XtremeIdiots.Portal.Web/Services/ISyncApiClient.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public interface ISyncApiClient
66
Task<SyncTriggerResult> TriggerActivate(Guid assignmentId, CancellationToken cancellationToken = default);
77
Task<SyncTriggerResult> TriggerDeactivate(Guid assignmentId, CancellationToken cancellationToken = default);
88
Task<SyncTriggerResult> TriggerRemove(Guid assignmentId, CancellationToken cancellationToken = default);
9-
Task<OrchestrationStatusResult?> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default);
9+
Task<OrchestrationStatusQueryResult> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default);
1010
}
1111

1212
public record SyncTriggerResult(bool Success, string? InstanceId = null, string? Error = null);
@@ -18,6 +18,17 @@ public record OrchestrationStatusResult(
1818
DateTime LastUpdatedAt,
1919
OrchestrationProgressDto? Progress);
2020

21+
public record OrchestrationStatusQueryResult(
22+
OrchestrationStatusQueryOutcome Outcome,
23+
OrchestrationStatusResult? Result = null);
24+
25+
public enum OrchestrationStatusQueryOutcome
26+
{
27+
Found,
28+
NotFound,
29+
Error
30+
}
31+
2132
public record OrchestrationProgressDto(
2233
string Operation,
2334
int TotalMaps,

src/XtremeIdiots.Portal.Web/Services/NoOpSyncApiClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public Task<SyncTriggerResult> TriggerRemove(Guid assignmentId, CancellationToke
2222
return Task.FromResult(new SyncTriggerResult(false, Error: "Sync API not configured"));
2323
}
2424

25-
public Task<OrchestrationStatusResult?> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default)
25+
public Task<OrchestrationStatusQueryResult> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default)
2626
{
27-
return Task.FromResult<OrchestrationStatusResult?>(null);
27+
return Task.FromResult(new OrchestrationStatusQueryResult(OrchestrationStatusQueryOutcome.Error));
2828
}
2929
}

src/XtremeIdiots.Portal.Web/Services/SyncApiClient.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public Task<SyncTriggerResult> TriggerRemove(Guid assignmentId, CancellationToke
3131
return TriggerOrchestration($"/api/map-rotations/remove/{assignmentId}", cancellationToken);
3232
}
3333

34-
public async Task<OrchestrationStatusResult?> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default)
34+
public async Task<OrchestrationStatusQueryResult> GetOrchestrationStatus(string instanceId, CancellationToken cancellationToken = default)
3535
{
3636
try
3737
{
@@ -42,15 +42,24 @@ public Task<SyncTriggerResult> TriggerRemove(Guid assignmentId, CancellationToke
4242
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenResult.Token);
4343

4444
var response = await httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
45-
if (!response.IsSuccessStatusCode) return null;
45+
46+
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
47+
return new OrchestrationStatusQueryResult(OrchestrationStatusQueryOutcome.NotFound);
48+
49+
if (!response.IsSuccessStatusCode)
50+
{
51+
logger.LogWarning("Sync API returned {StatusCode} for orchestration status {InstanceId}", (int)response.StatusCode, instanceId);
52+
return new OrchestrationStatusQueryResult(OrchestrationStatusQueryOutcome.Error);
53+
}
4654

4755
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
48-
return System.Text.Json.JsonSerializer.Deserialize<OrchestrationStatusResult>(json, jsonOptions);
56+
var result = System.Text.Json.JsonSerializer.Deserialize<OrchestrationStatusResult>(json, jsonOptions);
57+
return new OrchestrationStatusQueryResult(OrchestrationStatusQueryOutcome.Found, result);
4958
}
5059
catch (Exception ex)
5160
{
5261
logger.LogError(ex, "Failed to get orchestration status for {InstanceId}", instanceId);
53-
return null;
62+
return new OrchestrationStatusQueryResult(OrchestrationStatusQueryOutcome.Error);
5463
}
5564
}
5665

0 commit comments

Comments
 (0)