Files
BeWoPlaner/Service/ServiceUtils/Update/UpdatePlanResponseHelper.cs
rene 7c12915a30 Bug der langsamen Ladezeit behoben(Lädt nichtmehr unnötig herunter)
ToDo: Logik in Mvvm umschreiben -> Bessere Übersicht
- Datenlogik in Model lagern
- Logik aus Views holen
- ViewLogik in ViewModel
- Bindings
2023-01-12 13:30:29 +01:00

171 lines
5.7 KiB
C#

using BeWo.Service.ServiceUtils.Paths;
using BS.SharedLauncher.DataContract;
using BS.SharedLauncher.Enums;
using BS.SharedLauncher.Exceptions;
using BS.SharedLauncher.Extensions;
using BS.SharedLauncher.Information;
using BS.SharedLauncher.Logic;
using BS.SharedLauncher.Update;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Service.ServiceUtils.Update
{
public static class UpdatePlanResponseHelper
{
private static UpdatePlanRequest _Request;
private static UpdatePlanResponse _Response;
private static string _Version;
private static string _Tenant;
public static UpdatePlanResponse GetUpdatePlanResponse(UpdatePlanRequest request, string tenant)
{
var (default_version, tenant_version) = UpdateConfigReader.GetDefaultTenantVersion(tenant);
_Version = UpdateConfigReader.GetValidVersion(default_version, tenant_version);
_Tenant = tenant;
_Request = request;
_Response = new UpdatePlanResponse
{
CurrentPackage = new UpdatePlanDC
{
DefaultVersion = default_version,
TenantVersion = tenant_version
}
};
// Lädt komplettes Paket ohne Hash
CalcFullPackage();
// Lade Hash Werte
_Response.CurrentPackage.LoadHash();
CalcFilesToRequest();
if (!_Request.ApplyFolderIsEmpty)
CalcFilesToDeleteInApply();
if (!_Request.DownloadFolderIsEmpty)
CalcFilesToApplyInDownload();
CalcDownloadSize();
_Response.HasToDo = _Response.HasToDo();
return _Response;
}
private static void CalcFullPackage()
{
// Setze Basis
_Response.CurrentPackage.InitFiles(getVersionDefaultFiles(_Version));
// Überschreibe mit Version-Tenant Daten
_Response.CurrentPackage.OverrideOrAddFiles(getVersionTenantFiles(_Version, _Tenant));
// Überschreibe mit Special-Tenant Daten
_Response.CurrentPackage.OverrideOrAddFiles(getSpecialTenantFiles(_Tenant));
}
private static void CalcFilesToRequest()
{
foreach (var file in _Response.CurrentPackage.Files)
{
// Bereits installiert
if (_Request.ApplyPackage?.ContainsPlanerFileWithHash(file) ?? false)
continue;
// Bereits heruntergeladen
if (_Request.DownloadedFiles?.ContainsPlanerFileWithHash(file) ?? false)
continue;
if (_Response.FilesToRequest is null)
_Response.FilesToRequest = new List<UpdateFileDC>();
_Response.FilesToRequest.Add(file);
}
}
private static void CalcFilesToDeleteInApply()
{
foreach (var file in _Request.ApplyPackage.Files)
{
// Datei wird gebraucht
if (_Response.CurrentPackage.ContainsPlanerFile(file))
continue;
if (_Response.FilesToDeleteInApply is null)
_Response.FilesToDeleteInApply = new List<UpdateFileDC>();
_Response.FilesToDeleteInApply.Add(file);
}
}
private static void CalcFilesToApplyInDownload()
{
foreach (var file in _Request.DownloadedFiles)
{
// Datei wird gebraucht
if (!_Response.CurrentPackage.ContainsPlanerFile(file))
continue;
if (_Response.FilesToApply is null)
_Response.FilesToApply = new List<UpdateFileDC>();
_Response.FilesToApply.Add(file);
}
}
private static void CalcDownloadSize()
{
if (_Response.FilesToRequest is null || !_Response.FilesToRequest.Any())
return;
long count = 0;
foreach (var file in _Response.FilesToRequest)
{
var fi = new FileInfo(file.AbsolutePath);
count += fi.Length;
}
_Response.DownloadSize = count;
}
private static List<UpdateFileDC> getVersionDefaultFiles(string version) => getPlanerFiles(ServerFilePaths.GetVersionDefaultFolderPath(version), UpdateFileSource.VersionDefault, false);
private static List<UpdateFileDC> getVersionTenantFiles(string version, string tenant) => getPlanerFiles(ServerFilePaths.GetVersionTenantFolderPath(version, tenant), UpdateFileSource.VersionTenant, true);
private static List<UpdateFileDC> getSpecialTenantFiles(string tenant) => getPlanerFiles(ServerFilePaths.GetOverrideTenantFolderPath(tenant), UpdateFileSource.OverrideTenant, true);
private static List<UpdateFileDC> getPlanerFiles(string path, UpdateFileSource source, bool ignoreOnError)
{
if (!Directory.Exists(path)) {
if (ignoreOnError)
return new List<UpdateFileDC>();
else
throw new ServerConfigException($"{path} konnte nicht gefunden werden");
}
var res = FileController.GetPlanerFiles(path, true, ignorePlanerFile);
res.ForEach(x => x.Source = source);
return res;
}
private static bool ignorePlanerFile(UpdateFileDC update)
{
if (update.GetExtensionType() == ".xml")
return true;
if (update.GetExtensionType() == ".pdb")
return true;
return false;
}
}
}