80 lines
2.4 KiB
C#
80 lines
2.4 KiB
C#
using Moonlight.ApiServer.Interfaces;
|
|
using System.IO.Compression;
|
|
using MoonCore.Attributes;
|
|
using Moonlight.Shared.Http.Responses.Admin.Sys;
|
|
|
|
namespace Moonlight.ApiServer.Services;
|
|
|
|
[Scoped]
|
|
public class DiagnoseService
|
|
{
|
|
private readonly IEnumerable<IDiagnoseProvider> DiagnoseProviders;
|
|
|
|
public DiagnoseService(IEnumerable<IDiagnoseProvider> diagnoseProviders)
|
|
{
|
|
DiagnoseProviders = diagnoseProviders;
|
|
}
|
|
|
|
public async Task<DiagnoseProvideResponse[]> GetAvailable()
|
|
{
|
|
var availableProviders = new List<DiagnoseProvideResponse>();
|
|
|
|
foreach (var diagnoseProvider in DiagnoseProviders)
|
|
{
|
|
var name = diagnoseProvider.GetType().Name;
|
|
|
|
var type = diagnoseProvider.GetType().FullName;
|
|
|
|
// The type name is null if the type is a generic type, unlikely, but still could happen
|
|
if (type != null)
|
|
availableProviders.Add(new DiagnoseProvideResponse()
|
|
{
|
|
Name = name,
|
|
Type = type
|
|
});
|
|
}
|
|
|
|
return availableProviders.ToArray();
|
|
}
|
|
|
|
public async Task GenerateDiagnose(Stream outputStream, string[]? requestedProviders)
|
|
{
|
|
IDiagnoseProvider[] providers;
|
|
|
|
if (requestedProviders != null && requestedProviders.Length > 0)
|
|
{
|
|
var requesteDiagnoseProviders = new List<IDiagnoseProvider>();
|
|
|
|
foreach (var requestedProvider in requestedProviders)
|
|
{
|
|
var provider = DiagnoseProviders.FirstOrDefault(x => x.GetType().FullName == requestedProvider);
|
|
|
|
if (provider != null)
|
|
requesteDiagnoseProviders.Add(provider);
|
|
}
|
|
|
|
providers = requesteDiagnoseProviders.ToArray();
|
|
}
|
|
else
|
|
{
|
|
providers = DiagnoseProviders.ToArray();
|
|
}
|
|
|
|
try
|
|
{
|
|
using (var zip = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: true))
|
|
{
|
|
foreach (var provider in providers)
|
|
{
|
|
await provider.ModifyZipArchive(zip);
|
|
}
|
|
}
|
|
|
|
outputStream.Seek(0, SeekOrigin.Begin);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception($"An unknown error occured while building the Diagnose: {ex.Message}");
|
|
}
|
|
}
|
|
} |