Refactored container helper service. Cleaned up event models. Implemented version changing. Added security questions before rebuild
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
using System.Text.Json;
|
||||
using Moonlight.Shared.Http;
|
||||
using Moonlight.Shared.Http.Events;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
using Moonlight.Api.Http.Services.ContainerHelper;
|
||||
using Moonlight.Api.Http.Services.ContainerHelper.Requests;
|
||||
using Moonlight.Api.Http.Services.ContainerHelper.Events;
|
||||
|
||||
namespace Moonlight.Api.Services;
|
||||
|
||||
@@ -30,61 +32,73 @@ public class ContainerHelperService
|
||||
}
|
||||
}
|
||||
|
||||
public async IAsyncEnumerable<RebuildEvent> RebuildAsync()
|
||||
public async IAsyncEnumerable<RebuildEventDto> RebuildAsync()
|
||||
{
|
||||
var options = new JsonSerializerOptions()
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
options.TypeInfoResolverChain.Add(SerializationContext.Default);
|
||||
|
||||
var client = HttpClientFactory.CreateClient("ContainerHelper");
|
||||
|
||||
|
||||
var response = await client.GetAsync("api/rebuild", HttpCompletionOption.ResponseHeadersRead);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
var responseText = await response.Content.ReadAsStringAsync();
|
||||
|
||||
yield return new RebuildEvent()
|
||||
|
||||
yield return new RebuildEventDto()
|
||||
{
|
||||
Type = RebuildEventType.Failed,
|
||||
Type = RebuildEventType.Failed,
|
||||
Data = responseText
|
||||
};
|
||||
|
||||
|
||||
yield break;
|
||||
}
|
||||
|
||||
await using var responseStream = await response.Content.ReadAsStreamAsync();
|
||||
using var streamReader = new StreamReader(responseStream);
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
var line = await streamReader.ReadLineAsync();
|
||||
|
||||
if(line == null)
|
||||
|
||||
if (line == null)
|
||||
break;
|
||||
|
||||
if(string.IsNullOrWhiteSpace(line))
|
||||
|
||||
if (string.IsNullOrWhiteSpace(line))
|
||||
continue;
|
||||
|
||||
|
||||
var data = line.Trim("data: ");
|
||||
|
||||
var deserializedData = JsonSerializer.Deserialize<RebuildEvent>(data, options);
|
||||
|
||||
var deserializedData = JsonSerializer.Deserialize<RebuildEventDto>(data, SerializationContext.TunedOptions);
|
||||
|
||||
yield return deserializedData;
|
||||
|
||||
|
||||
// Exit if service will go down for a clean exit
|
||||
if(deserializedData is {Type: RebuildEventType.Step, Data: "ServiceDown"})
|
||||
if (deserializedData is { Type: RebuildEventType.Step, Data: "ServiceDown" })
|
||||
yield break;
|
||||
|
||||
} while (true);
|
||||
|
||||
yield return new RebuildEvent()
|
||||
|
||||
yield return new RebuildEventDto()
|
||||
{
|
||||
Type = RebuildEventType.Succeeded,
|
||||
Data = string.Empty
|
||||
};
|
||||
}
|
||||
|
||||
public async Task SetVersionAsync(string version)
|
||||
{
|
||||
var client = HttpClientFactory.CreateClient("ContainerHelper");
|
||||
|
||||
var response = await client.PostAsJsonAsync(
|
||||
"api/configuration/version",
|
||||
new SetVersionDto(version),
|
||||
SerializationContext.TunedOptions
|
||||
);
|
||||
|
||||
if(response.IsSuccessStatusCode)
|
||||
return;
|
||||
|
||||
var problemDetails = await response.Content.ReadFromJsonAsync<ProblemDetails>(SerializationContext.TunedOptions);
|
||||
|
||||
if(problemDetails == null)
|
||||
throw new HttpRequestException($"Failed to set version: {response.ReasonPhrase}");
|
||||
|
||||
throw new HttpRequestException($"Failed to set version: {problemDetails.Detail ?? problemDetails.Title}");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user