diff --git a/DbFirst.API/Dashboards/DashboardConfiguratorFactory.cs b/DbFirst.API/Dashboards/DashboardConfiguratorFactory.cs new file mode 100644 index 0000000..abf97b4 --- /dev/null +++ b/DbFirst.API/Dashboards/DashboardConfiguratorFactory.cs @@ -0,0 +1,115 @@ +using DbFirst.Domain.Entities; +using DevExpress.DashboardCommon; +using DevExpress.DashboardWeb; +using DevExpress.DataAccess.Json; +using System.Xml.Linq; + +namespace DbFirst.API.Dashboards; + +public static class DashboardConfiguratorFactory +{ + public static DashboardConfigurator Create( + IServiceProvider serviceProvider, + IConfiguration configuration, + IWebHostEnvironment environment) + { + // Den gesamten Inhalt des Lambdas hierher verschieben + // serviceProvider, configuration, environment statt builder.* verwenden + + var dashboardsPath = Path.Combine(environment.ContentRootPath, "Data", "Dashboards"); + Directory.CreateDirectory(dashboardsPath); + + var defaultDashboardPath = Path.Combine(dashboardsPath, "DefaultDashboard.xml"); + if (!File.Exists(defaultDashboardPath)) + { + var defaultDashboard = new Dashboard(); + defaultDashboard.Title.Text = "Default Dashboard"; + defaultDashboard.SaveToXml(defaultDashboardPath); + } + + var dashboardBaseUrl = configuration["Dashboard:BaseUrl"] + ?? configuration["ApiBaseUrl"] + ?? configuration["ASPNETCORE_URLS"]?.Split(';', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() + ?? "https://localhost:7204"; + + dashboardBaseUrl = dashboardBaseUrl.TrimEnd('/'); + + var catalogsGridDashboardPath = Path.Combine(dashboardsPath, "CatalogsGrid.xml"); + if (!File.Exists(catalogsGridDashboardPath)) + { + var dashboard = new Dashboard(); + dashboard.Title.Text = "Catalogs (Dashboard Grid)"; + + var catalogDataSource = new DashboardJsonDataSource("Catalogs (API)") + { + ComponentName = "catalogsDataSource", + JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs")) + }; + + dashboard.DataSources.Add(catalogDataSource); + + var grid = new GridDashboardItem + { + DataSource = catalogDataSource, + Name = "Catalogs" + }; + + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.Guid))) { Name = "Id" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatTitle))) { Name = "Titel" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatString))) { Name = "String" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWho))) { Name = "Angelegt von" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWhen))) { Name = "Angelegt am" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWho))) { Name = "Geändert von" }); + grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWhen))) { Name = "Geändert am" }); + + dashboard.Items.Add(grid); + + var layoutGroup = new DashboardLayoutGroup { Orientation = DashboardLayoutGroupOrientation.Vertical }; + layoutGroup.ChildNodes.Add(new DashboardLayoutItem(grid)); + dashboard.LayoutRoot = layoutGroup; + + dashboard.SaveToXml(catalogsGridDashboardPath); + } + + DashboardConfigurator configurator = new DashboardConfigurator(); + + var connectionString = configuration.GetConnectionString("DefaultConnection") ?? string.Empty; + var notifier = serviceProvider.GetRequiredService(); + var dashboardStorage = new SqlDashboardStorage(connectionString, "TBDD_SMF_CONFIG", notifier: notifier); + configurator.SetDashboardStorage(dashboardStorage); + + DataSourceInMemoryStorage dataSourceStorage = new DataSourceInMemoryStorage(); + DashboardJsonDataSource jsonDataSourceUrl = new DashboardJsonDataSource("JSON Data Source (URL)"); + jsonDataSourceUrl.JsonSource = new UriJsonSource( + new Uri("https://raw.githubusercontent.com/DevExpress-Examples/DataSources/master/JSON/customers.json")); + jsonDataSourceUrl.RootElement = "Customers"; + dataSourceStorage.RegisterDataSource("jsonDataSourceUrl", jsonDataSourceUrl.SaveToXml()); + + var catalogsJsonDataSource = new DashboardJsonDataSource("Catalogs (API)") + { + ComponentName = "catalogsDataSource", + JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs")) + }; + dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.ComponentName, catalogsJsonDataSource.SaveToXml()); + dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.Name, catalogsJsonDataSource.SaveToXml()); + + configurator.SetDataSourceStorage(dataSourceStorage); + + EnsureDashboardInStorage(dashboardStorage, "DefaultDashboard", defaultDashboardPath); + EnsureDashboardInStorage(dashboardStorage, "CatalogsGrid", catalogsGridDashboardPath); + + return configurator; + } + + private static void EnsureDashboardInStorage(IEditableDashboardStorage storage, string id, string filePath) + { + var exists = storage.GetAvailableDashboardsInfo().Any(info => string.Equals(info.ID, id, StringComparison.OrdinalIgnoreCase)); + if (exists || !File.Exists(filePath)) + { + return; + } + + var doc = XDocument.Load(filePath); + storage.AddDashboard(doc, id); + } +} \ No newline at end of file diff --git a/DbFirst.API/Program.cs b/DbFirst.API/Program.cs index 4dfca6e..3fd04b7 100644 --- a/DbFirst.API/Program.cs +++ b/DbFirst.API/Program.cs @@ -1,16 +1,11 @@ -using DbFirst.API.Middleware; using DbFirst.API.Dashboards; using DbFirst.API.Hubs; +using DbFirst.API.Middleware; using DbFirst.Application; -using DbFirst.Domain; -using DbFirst.Domain.Entities; using DbFirst.Infrastructure; using DevExpress.AspNetCore; using DevExpress.DashboardAspNetCore; -using DevExpress.DashboardCommon; using DevExpress.DashboardWeb; -using DevExpress.DataAccess.Json; -using System.Xml.Linq; var builder = WebApplication.CreateBuilder(args); @@ -52,91 +47,8 @@ builder.Services.AddApplication(); builder.Services.AddDevExpressControls(); builder.Services.AddSignalR(); builder.Services.AddSingleton(); -builder.Services.AddScoped((IServiceProvider serviceProvider) => { - var dashboardsPath = Path.Combine(builder.Environment.ContentRootPath, "Data", "Dashboards"); - Directory.CreateDirectory(dashboardsPath); - - var defaultDashboardPath = Path.Combine(dashboardsPath, "DefaultDashboard.xml"); - if (!File.Exists(defaultDashboardPath)) - { - var defaultDashboard = new Dashboard(); - defaultDashboard.Title.Text = "Default Dashboard"; - defaultDashboard.SaveToXml(defaultDashboardPath); - } - - var dashboardBaseUrl = builder.Configuration["Dashboard:BaseUrl"] - ?? builder.Configuration["ApiBaseUrl"] - ?? builder.Configuration["ASPNETCORE_URLS"]?.Split(';', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() - ?? "https://localhost:7204"; - - dashboardBaseUrl = dashboardBaseUrl.TrimEnd('/'); - - var catalogsGridDashboardPath = Path.Combine(dashboardsPath, "CatalogsGrid.xml"); - if (!File.Exists(catalogsGridDashboardPath)) - { - var dashboard = new Dashboard(); - dashboard.Title.Text = "Catalogs (Dashboard Grid)"; - - var catalogDataSource = new DashboardJsonDataSource("Catalogs (API)") - { - ComponentName = "catalogsDataSource", - JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs")) - }; - - dashboard.DataSources.Add(catalogDataSource); - - var grid = new GridDashboardItem - { - DataSource = catalogDataSource, - Name = "Catalogs" - }; - - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.Guid))) { Name = "Id" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatTitle))) { Name = "Titel" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatString))) { Name = "String" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWho))) { Name = "Angelegt von" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWhen))) { Name = "Angelegt am" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWho))) { Name = "Geändert von" }); - grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWhen))) { Name = "Geändert am" }); - - dashboard.Items.Add(grid); - - var layoutGroup = new DashboardLayoutGroup { Orientation = DashboardLayoutGroupOrientation.Vertical }; - layoutGroup.ChildNodes.Add(new DashboardLayoutItem(grid)); - dashboard.LayoutRoot = layoutGroup; - - dashboard.SaveToXml(catalogsGridDashboardPath); - } - - DashboardConfigurator configurator = new DashboardConfigurator(); - - var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? string.Empty; - var notifier = serviceProvider.GetRequiredService(); - var dashboardStorage = new SqlDashboardStorage(connectionString, "TBDD_SMF_CONFIG", notifier: notifier); - configurator.SetDashboardStorage(dashboardStorage); - - DataSourceInMemoryStorage dataSourceStorage = new DataSourceInMemoryStorage(); - DashboardJsonDataSource jsonDataSourceUrl = new DashboardJsonDataSource("JSON Data Source (URL)"); - jsonDataSourceUrl.JsonSource = new UriJsonSource( - new Uri("https://raw.githubusercontent.com/DevExpress-Examples/DataSources/master/JSON/customers.json")); - jsonDataSourceUrl.RootElement = "Customers"; - dataSourceStorage.RegisterDataSource("jsonDataSourceUrl", jsonDataSourceUrl.SaveToXml()); - - var catalogsJsonDataSource = new DashboardJsonDataSource("Catalogs (API)") - { - ComponentName = "catalogsDataSource", - JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs")) - }; - dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.ComponentName, catalogsJsonDataSource.SaveToXml()); - dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.Name, catalogsJsonDataSource.SaveToXml()); - - configurator.SetDataSourceStorage(dataSourceStorage); - - EnsureDashboardInStorage(dashboardStorage, "DefaultDashboard", defaultDashboardPath); - EnsureDashboardInStorage(dashboardStorage, "CatalogsGrid", catalogsGridDashboardPath); - - return configurator; -}); +builder.Services.AddScoped(sp => + DashboardConfiguratorFactory.Create(sp, builder.Configuration, builder.Environment)); var app = builder.Build(); @@ -158,16 +70,4 @@ app.MapDashboardRoute("api/dashboard", "DefaultDashboard"); app.MapHub("/hubs/dashboards"); app.MapControllers(); -app.Run(); - -static void EnsureDashboardInStorage(IEditableDashboardStorage storage, string id, string filePath) -{ - var exists = storage.GetAvailableDashboardsInfo().Any(info => string.Equals(info.ID, id, StringComparison.OrdinalIgnoreCase)); - if (exists || !File.Exists(filePath)) - { - return; - } - - var doc = XDocument.Load(filePath); - storage.AddDashboard(doc, id); -} +app.Run(); \ No newline at end of file