import exxport settings, join over sap hana tables
This commit is contained in:
@@ -0,0 +1,317 @@
|
||||
using System.Text.Json;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using TrafagSalesExporter.Data;
|
||||
using TrafagSalesExporter.Models;
|
||||
|
||||
namespace TrafagSalesExporter.Services;
|
||||
|
||||
public class ConfigTransferService : IConfigTransferService
|
||||
{
|
||||
private readonly IDbContextFactory<AppDbContext> _dbFactory;
|
||||
private static readonly JsonSerializerOptions JsonOptions = new() { WriteIndented = true };
|
||||
|
||||
public ConfigTransferService(IDbContextFactory<AppDbContext> dbFactory)
|
||||
{
|
||||
_dbFactory = dbFactory;
|
||||
}
|
||||
|
||||
public async Task<string> ExportJsonAsync(bool includeSecrets)
|
||||
{
|
||||
using var db = await _dbFactory.CreateDbContextAsync();
|
||||
var sharePoint = await db.SharePointConfigs.FirstOrDefaultAsync();
|
||||
var exportSettings = await db.ExportSettings.FirstOrDefaultAsync();
|
||||
var hanaServers = await db.HanaServers.OrderBy(x => x.Name).ToListAsync();
|
||||
var sites = await db.Sites.OrderBy(x => x.Land).ToListAsync();
|
||||
var rules = await db.FieldTransformationRules.OrderBy(x => x.SortOrder).ThenBy(x => x.Id).ToListAsync();
|
||||
var sapSources = await db.SapSourceDefinitions.OrderBy(x => x.SortOrder).ThenBy(x => x.Id).ToListAsync();
|
||||
var sapJoins = await db.SapJoinDefinitions.OrderBy(x => x.SortOrder).ThenBy(x => x.Id).ToListAsync();
|
||||
var sapMappings = await db.SapFieldMappings.OrderBy(x => x.SortOrder).ThenBy(x => x.Id).ToListAsync();
|
||||
|
||||
var serverKeyMap = hanaServers.ToDictionary(x => x.Id, _ => Guid.NewGuid().ToString("N"));
|
||||
var siteKeyMap = sites.ToDictionary(x => x.Id, _ => Guid.NewGuid().ToString("N"));
|
||||
|
||||
var package = new ConfigTransferPackage
|
||||
{
|
||||
IncludesSecrets = includeSecrets,
|
||||
SharePointConfig = sharePoint is null ? null : new ConfigTransferSharePoint
|
||||
{
|
||||
SiteUrl = sharePoint.SiteUrl,
|
||||
ExportFolder = sharePoint.ExportFolder,
|
||||
TenantId = sharePoint.TenantId,
|
||||
ClientId = sharePoint.ClientId,
|
||||
ClientSecret = includeSecrets ? sharePoint.ClientSecret : null
|
||||
},
|
||||
ExportSettings = exportSettings is null ? null : new ConfigTransferExportSettings
|
||||
{
|
||||
DateFilter = exportSettings.DateFilter,
|
||||
TimerHour = exportSettings.TimerHour,
|
||||
TimerMinute = exportSettings.TimerMinute,
|
||||
TimerEnabled = exportSettings.TimerEnabled,
|
||||
SapUsername = includeSecrets ? exportSettings.SapUsername : null,
|
||||
SapPassword = includeSecrets ? exportSettings.SapPassword : null,
|
||||
Bi1Username = includeSecrets ? exportSettings.Bi1Username : null,
|
||||
Bi1Password = includeSecrets ? exportSettings.Bi1Password : null,
|
||||
SageUsername = includeSecrets ? exportSettings.SageUsername : null,
|
||||
SagePassword = includeSecrets ? exportSettings.SagePassword : null
|
||||
},
|
||||
HanaServers = hanaServers.Select(server => new ConfigTransferHanaServer
|
||||
{
|
||||
Key = serverKeyMap[server.Id],
|
||||
Name = server.Name,
|
||||
Host = server.Host,
|
||||
Port = server.Port,
|
||||
Username = includeSecrets ? server.Username : null,
|
||||
Password = includeSecrets ? server.Password : null,
|
||||
DatabaseName = server.DatabaseName,
|
||||
UseSsl = server.UseSsl,
|
||||
ValidateCertificate = server.ValidateCertificate,
|
||||
AdditionalParams = server.AdditionalParams
|
||||
}).ToList(),
|
||||
Sites = sites.Select(site => new ConfigTransferSite
|
||||
{
|
||||
Key = siteKeyMap[site.Id],
|
||||
HanaServerKey = site.HanaServerId.HasValue && serverKeyMap.TryGetValue(site.HanaServerId.Value, out var serverKey) ? serverKey : null,
|
||||
Schema = site.Schema,
|
||||
TSC = site.TSC,
|
||||
Land = site.Land,
|
||||
SourceSystem = site.SourceSystem,
|
||||
UsernameOverride = includeSecrets ? site.UsernameOverride : null,
|
||||
PasswordOverride = includeSecrets ? site.PasswordOverride : null,
|
||||
SapServiceUrl = site.SapServiceUrl,
|
||||
SapEntitySet = site.SapEntitySet,
|
||||
SapEntitySetsCache = site.SapEntitySetsCache,
|
||||
SapEntitySetsRefreshedAtUtc = site.SapEntitySetsRefreshedAtUtc,
|
||||
IsActive = site.IsActive
|
||||
}).ToList(),
|
||||
FieldTransformationRules = rules.Select(r => new FieldTransformationRule
|
||||
{
|
||||
SourceSystem = r.SourceSystem,
|
||||
SourceField = r.SourceField,
|
||||
TargetField = r.TargetField,
|
||||
TransformationType = r.TransformationType,
|
||||
Argument = r.Argument,
|
||||
SortOrder = r.SortOrder,
|
||||
IsActive = r.IsActive
|
||||
}).ToList(),
|
||||
SapSourceDefinitions = sapSources.Select(s => new ConfigTransferSapSourceDefinition
|
||||
{
|
||||
SiteKey = siteKeyMap[s.SiteId],
|
||||
Alias = s.Alias,
|
||||
EntitySet = s.EntitySet,
|
||||
IsPrimary = s.IsPrimary,
|
||||
IsActive = s.IsActive,
|
||||
SortOrder = s.SortOrder
|
||||
}).ToList(),
|
||||
SapJoinDefinitions = sapJoins.Select(j => new ConfigTransferSapJoinDefinition
|
||||
{
|
||||
SiteKey = siteKeyMap[j.SiteId],
|
||||
LeftAlias = j.LeftAlias,
|
||||
RightAlias = j.RightAlias,
|
||||
LeftKeys = j.LeftKeys,
|
||||
RightKeys = j.RightKeys,
|
||||
JoinType = j.JoinType,
|
||||
IsActive = j.IsActive,
|
||||
SortOrder = j.SortOrder
|
||||
}).ToList(),
|
||||
SapFieldMappings = sapMappings.Select(m => new ConfigTransferSapFieldMapping
|
||||
{
|
||||
SiteKey = siteKeyMap[m.SiteId],
|
||||
TargetField = m.TargetField,
|
||||
SourceExpression = m.SourceExpression,
|
||||
IsRequired = m.IsRequired,
|
||||
IsActive = m.IsActive,
|
||||
SortOrder = m.SortOrder
|
||||
}).ToList()
|
||||
};
|
||||
|
||||
return JsonSerializer.Serialize(package, JsonOptions);
|
||||
}
|
||||
|
||||
public async Task ImportJsonAsync(string json)
|
||||
{
|
||||
var package = JsonSerializer.Deserialize<ConfigTransferPackage>(json, JsonOptions)
|
||||
?? throw new InvalidOperationException("Konfigurationsdatei konnte nicht gelesen werden.");
|
||||
|
||||
using var db = await _dbFactory.CreateDbContextAsync();
|
||||
var existingSharePoint = await db.SharePointConfigs.FirstOrDefaultAsync();
|
||||
var existingSettings = await db.ExportSettings.FirstOrDefaultAsync();
|
||||
var existingServers = await db.HanaServers.ToListAsync();
|
||||
var existingSites = await db.Sites.ToListAsync();
|
||||
var existingRules = await db.FieldTransformationRules.ToListAsync();
|
||||
var existingSapSources = await db.SapSourceDefinitions.ToListAsync();
|
||||
var existingSapJoins = await db.SapJoinDefinitions.ToListAsync();
|
||||
var existingSapMappings = await db.SapFieldMappings.ToListAsync();
|
||||
var existingCentralRecords = await db.CentralSalesRecords.ToListAsync();
|
||||
|
||||
var preservedSharePointSecret = existingSharePoint?.ClientSecret ?? string.Empty;
|
||||
var preservedSecrets = existingSettings is null
|
||||
? new ConfigTransferExportSettings()
|
||||
: new ConfigTransferExportSettings
|
||||
{
|
||||
SapUsername = existingSettings.SapUsername,
|
||||
SapPassword = existingSettings.SapPassword,
|
||||
Bi1Username = existingSettings.Bi1Username,
|
||||
Bi1Password = existingSettings.Bi1Password,
|
||||
SageUsername = existingSettings.SageUsername,
|
||||
SagePassword = existingSettings.SagePassword
|
||||
};
|
||||
var preservedServerSecrets = existingServers.ToDictionary(
|
||||
x => BuildServerSignature(x.Name, x.Host, x.Port, x.DatabaseName),
|
||||
x => (x.Username, x.Password));
|
||||
var preservedSiteSecrets = existingSites.ToDictionary(
|
||||
x => BuildSiteSignature(x.Land, x.TSC, x.Schema, x.SourceSystem),
|
||||
x => (x.UsernameOverride, x.PasswordOverride));
|
||||
|
||||
if (existingSapMappings.Count > 0) db.SapFieldMappings.RemoveRange(existingSapMappings);
|
||||
if (existingSapJoins.Count > 0) db.SapJoinDefinitions.RemoveRange(existingSapJoins);
|
||||
if (existingSapSources.Count > 0) db.SapSourceDefinitions.RemoveRange(existingSapSources);
|
||||
if (existingRules.Count > 0) db.FieldTransformationRules.RemoveRange(existingRules);
|
||||
if (existingCentralRecords.Count > 0) db.CentralSalesRecords.RemoveRange(existingCentralRecords);
|
||||
if (existingSites.Count > 0) db.Sites.RemoveRange(existingSites);
|
||||
if (existingServers.Count > 0) db.HanaServers.RemoveRange(existingServers);
|
||||
if (existingSharePoint is not null) db.SharePointConfigs.Remove(existingSharePoint);
|
||||
if (existingSettings is not null) db.ExportSettings.Remove(existingSettings);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
var newSharePoint = package.SharePointConfig is null ? new SharePointConfig() : new SharePointConfig
|
||||
{
|
||||
SiteUrl = package.SharePointConfig.SiteUrl,
|
||||
ExportFolder = package.SharePointConfig.ExportFolder,
|
||||
TenantId = package.SharePointConfig.TenantId,
|
||||
ClientId = package.SharePointConfig.ClientId,
|
||||
ClientSecret = package.IncludesSecrets ? package.SharePointConfig.ClientSecret ?? string.Empty : preservedSharePointSecret
|
||||
};
|
||||
db.SharePointConfigs.Add(newSharePoint);
|
||||
|
||||
var importedSettings = package.ExportSettings ?? new ConfigTransferExportSettings();
|
||||
db.ExportSettings.Add(new ExportSettings
|
||||
{
|
||||
DateFilter = importedSettings.DateFilter,
|
||||
TimerHour = importedSettings.TimerHour,
|
||||
TimerMinute = importedSettings.TimerMinute,
|
||||
TimerEnabled = importedSettings.TimerEnabled,
|
||||
SapUsername = package.IncludesSecrets ? importedSettings.SapUsername ?? string.Empty : preservedSecrets.SapUsername ?? string.Empty,
|
||||
SapPassword = package.IncludesSecrets ? importedSettings.SapPassword ?? string.Empty : preservedSecrets.SapPassword ?? string.Empty,
|
||||
Bi1Username = package.IncludesSecrets ? importedSettings.Bi1Username ?? string.Empty : preservedSecrets.Bi1Username ?? string.Empty,
|
||||
Bi1Password = package.IncludesSecrets ? importedSettings.Bi1Password ?? string.Empty : preservedSecrets.Bi1Password ?? string.Empty,
|
||||
SageUsername = package.IncludesSecrets ? importedSettings.SageUsername ?? string.Empty : preservedSecrets.SageUsername ?? string.Empty,
|
||||
SagePassword = package.IncludesSecrets ? importedSettings.SagePassword ?? string.Empty : preservedSecrets.SagePassword ?? string.Empty
|
||||
});
|
||||
|
||||
var serverIdMap = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var server in package.HanaServers)
|
||||
{
|
||||
preservedServerSecrets.TryGetValue(BuildServerSignature(server.Name, server.Host, server.Port, server.DatabaseName), out var preserved);
|
||||
var entity = new HanaServer
|
||||
{
|
||||
Name = server.Name,
|
||||
Host = server.Host,
|
||||
Port = server.Port,
|
||||
Username = package.IncludesSecrets ? server.Username ?? string.Empty : preserved.Username ?? string.Empty,
|
||||
Password = package.IncludesSecrets ? server.Password ?? string.Empty : preserved.Password ?? string.Empty,
|
||||
DatabaseName = server.DatabaseName,
|
||||
UseSsl = server.UseSsl,
|
||||
ValidateCertificate = server.ValidateCertificate,
|
||||
AdditionalParams = server.AdditionalParams
|
||||
};
|
||||
db.HanaServers.Add(entity);
|
||||
await db.SaveChangesAsync();
|
||||
serverIdMap[server.Key] = entity.Id;
|
||||
}
|
||||
|
||||
var siteIdMap = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var site in package.Sites)
|
||||
{
|
||||
preservedSiteSecrets.TryGetValue(BuildSiteSignature(site.Land, site.TSC, site.Schema, site.SourceSystem), out var preserved);
|
||||
var entity = new Site
|
||||
{
|
||||
HanaServerId = !string.IsNullOrWhiteSpace(site.HanaServerKey) && serverIdMap.TryGetValue(site.HanaServerKey, out var mappedServerId)
|
||||
? mappedServerId
|
||||
: null,
|
||||
Schema = site.Schema,
|
||||
TSC = site.TSC,
|
||||
Land = site.Land,
|
||||
SourceSystem = site.SourceSystem,
|
||||
UsernameOverride = package.IncludesSecrets ? site.UsernameOverride ?? string.Empty : preserved.UsernameOverride ?? string.Empty,
|
||||
PasswordOverride = package.IncludesSecrets ? site.PasswordOverride ?? string.Empty : preserved.PasswordOverride ?? string.Empty,
|
||||
SapServiceUrl = site.SapServiceUrl,
|
||||
SapEntitySet = site.SapEntitySet,
|
||||
SapEntitySetsCache = site.SapEntitySetsCache,
|
||||
SapEntitySetsRefreshedAtUtc = site.SapEntitySetsRefreshedAtUtc,
|
||||
IsActive = site.IsActive
|
||||
};
|
||||
db.Sites.Add(entity);
|
||||
await db.SaveChangesAsync();
|
||||
siteIdMap[site.Key] = entity.Id;
|
||||
}
|
||||
|
||||
if (package.FieldTransformationRules.Count > 0)
|
||||
{
|
||||
db.FieldTransformationRules.AddRange(package.FieldTransformationRules.Select(r => new FieldTransformationRule
|
||||
{
|
||||
SourceSystem = r.SourceSystem,
|
||||
SourceField = r.SourceField,
|
||||
TargetField = r.TargetField,
|
||||
TransformationType = r.TransformationType,
|
||||
Argument = r.Argument,
|
||||
SortOrder = r.SortOrder,
|
||||
IsActive = r.IsActive
|
||||
}));
|
||||
}
|
||||
|
||||
if (package.SapSourceDefinitions.Count > 0)
|
||||
{
|
||||
db.SapSourceDefinitions.AddRange(package.SapSourceDefinitions
|
||||
.Where(x => siteIdMap.ContainsKey(x.SiteKey))
|
||||
.Select(x => new SapSourceDefinition
|
||||
{
|
||||
SiteId = siteIdMap[x.SiteKey],
|
||||
Alias = x.Alias,
|
||||
EntitySet = x.EntitySet,
|
||||
IsPrimary = x.IsPrimary,
|
||||
IsActive = x.IsActive,
|
||||
SortOrder = x.SortOrder
|
||||
}));
|
||||
}
|
||||
|
||||
if (package.SapJoinDefinitions.Count > 0)
|
||||
{
|
||||
db.SapJoinDefinitions.AddRange(package.SapJoinDefinitions
|
||||
.Where(x => siteIdMap.ContainsKey(x.SiteKey))
|
||||
.Select(x => new SapJoinDefinition
|
||||
{
|
||||
SiteId = siteIdMap[x.SiteKey],
|
||||
LeftAlias = x.LeftAlias,
|
||||
RightAlias = x.RightAlias,
|
||||
LeftKeys = x.LeftKeys,
|
||||
RightKeys = x.RightKeys,
|
||||
JoinType = x.JoinType,
|
||||
IsActive = x.IsActive,
|
||||
SortOrder = x.SortOrder
|
||||
}));
|
||||
}
|
||||
|
||||
if (package.SapFieldMappings.Count > 0)
|
||||
{
|
||||
db.SapFieldMappings.AddRange(package.SapFieldMappings
|
||||
.Where(x => siteIdMap.ContainsKey(x.SiteKey))
|
||||
.Select(x => new SapFieldMapping
|
||||
{
|
||||
SiteId = siteIdMap[x.SiteKey],
|
||||
TargetField = x.TargetField,
|
||||
SourceExpression = x.SourceExpression,
|
||||
IsRequired = x.IsRequired,
|
||||
IsActive = x.IsActive,
|
||||
SortOrder = x.SortOrder
|
||||
}));
|
||||
}
|
||||
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
private static string BuildServerSignature(string name, string host, int port, string databaseName)
|
||||
=> $"{name}|{host}|{port}|{databaseName}".ToUpperInvariant();
|
||||
|
||||
private static string BuildSiteSignature(string land, string tsc, string schema, string sourceSystem)
|
||||
=> $"{land}|{tsc}|{schema}|{sourceSystem}".ToUpperInvariant();
|
||||
}
|
||||
Reference in New Issue
Block a user