Files
BeWoPlaner/Service/ServiceUtils/Update/UpdatePlanResponseHelper.cs
rene 33b9874321 Kleinere Bugs (Beim Install Fail und erneute Install wird die Location nicht geupdatet) -> Größe der Festplatte wird nicht berechnet.
.xml und .pdb Dateien vom Update ausgeschlossen
UnitTests machen trotzdem zusätzlichen Stress bzgl der verschiedenen Frameworks
Fehler im Launcher werden im rootgrid2 statt rootgrid angezeigt
Logger wird vorerst aufm Server ignoriert
2023-01-06 16:55:01 +01:00

169 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();
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;
}
}
}