diff --git a/global.json b/global.json new file mode 100644 index 0000000..3b1d787 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "8.0.0", + "rollForward": "latestFeature" + } +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/DiunaBI.Core.csproj b/src/Backend/DiunaBI.Core/DiunaBI.Core.csproj index cbf3eab..1920750 100644 --- a/src/Backend/DiunaBI.Core/DiunaBI.Core.csproj +++ b/src/Backend/DiunaBI.Core/DiunaBI.Core.csproj @@ -10,5 +10,6 @@ + \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/Interfaces/IDataExporter.cs b/src/Backend/DiunaBI.Core/Interfaces/IDataExporter.cs new file mode 100644 index 0000000..869a2b5 --- /dev/null +++ b/src/Backend/DiunaBI.Core/Interfaces/IDataExporter.cs @@ -0,0 +1,10 @@ +using DiunaBI.Core.Models; + +namespace DiunaBI.Core.Interfaces; + +public interface IDataExporter +{ + string ExporterType { get; } + bool CanExport(string exporterType); + void Export(Layer layer); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/Interfaces/IDataImporter.cs b/src/Backend/DiunaBI.Core/Interfaces/IDataImporter.cs new file mode 100644 index 0000000..4c77890 --- /dev/null +++ b/src/Backend/DiunaBI.Core/Interfaces/IDataImporter.cs @@ -0,0 +1,11 @@ +using DiunaBI.Core.Models; + +namespace DiunaBI.Core.Interfaces; + +public interface IDataImporter +{ + string ImporterType { get; } + + bool CanImport(string importerType); + void Import(Layer importWorker); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/Interfaces/IDataProcessor.cs b/src/Backend/DiunaBI.Core/Interfaces/IDataProcessor.cs new file mode 100644 index 0000000..d48cd85 --- /dev/null +++ b/src/Backend/DiunaBI.Core/Interfaces/IDataProcessor.cs @@ -0,0 +1,11 @@ +using DiunaBI.Core.Models; + +namespace DiunaBI.Core.Interfaces; + +public interface IDataProcessor +{ + string ProcessorType { get; } + + bool CanProcess(string processorType); + void Process(Layer processWorker); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/Interfaces/IPlugin.cs b/src/Backend/DiunaBI.Core/Interfaces/IPlugin.cs new file mode 100644 index 0000000..a4f2ed4 --- /dev/null +++ b/src/Backend/DiunaBI.Core/Interfaces/IPlugin.cs @@ -0,0 +1,12 @@ +namespace DiunaBI.Core.Interfaces; + +public interface IPlugin +{ + string Name { get; } + string Version { get; } + string Author { get; } + string Description { get; } + + void Initialize(); + void Dispose(); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Core/Services/PluginManager.cs b/src/Backend/DiunaBI.Core/Services/PluginManager.cs new file mode 100644 index 0000000..a9119a6 --- /dev/null +++ b/src/Backend/DiunaBI.Core/Services/PluginManager.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using DiunaBI.Core.Interfaces; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace DiunaBI.Core.Services; + +public class PluginManager +{ + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private readonly List _processorTypes = new(); + private readonly List _importerTypes = new(); + private readonly List _exporters = new(); + private readonly List _plugins = new(); + + public PluginManager(ILogger logger, IServiceProvider serviceProvider) + { + _logger = logger; + _serviceProvider = serviceProvider; + } + + public void LoadPluginsFromDirectory(string pluginsPath) + { + if (!Directory.Exists(pluginsPath)) + { + _logger.LogWarning("Plugins directory not found: {Path}", pluginsPath); + return; + } + + var dllFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories); + + foreach (var dllFile in dllFiles) + { + try + { + LoadPluginFromAssembly(dllFile); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to load plugin from {File}", dllFile); + } + } + + _logger.LogInformation("Loaded {ProcessorCount} processors and {ImporterCount} importers from {PluginCount} plugins", + _processorTypes.Count, _importerTypes.Count, _plugins.Count); + } + + private void LoadPluginFromAssembly(string assemblyPath) + { + _logger.LogDebug("Loading assembly from: {Path}", assemblyPath); // Information -> Debug + + try + { + var assembly = Assembly.LoadFrom(assemblyPath); + _logger.LogDebug("Assembly loaded successfully: {Name}", assembly.FullName); // Information -> Debug + + foreach (var type in assembly.GetTypes()) + { + if (typeof(IDataProcessor).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) + { + _processorTypes.Add(type); + _logger.LogDebug("Registered processor: {Type}", type.Name); // Information -> Debug + } + + if (typeof(IDataImporter).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) + { + _importerTypes.Add(type); + _logger.LogDebug("Registered importer: {Type}", type.Name); // Information -> Debug + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to load assembly from {Path}", assemblyPath); // ZOSTAW jako Error + } + } + + public IDataProcessor? GetProcessor(string processorType) + { + foreach (var type in _processorTypes) + { + try + { + using var scope = _serviceProvider.CreateScope(); + var instance = (IDataProcessor)ActivatorUtilities.CreateInstance(scope.ServiceProvider, type); + + if (instance.CanProcess(processorType)) + { + var scopedProvider = _serviceProvider.CreateScope().ServiceProvider; + return (IDataProcessor)ActivatorUtilities.CreateInstance(scopedProvider, type); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to create processor instance of type {Type}", type.Name); + } + } + return null; + } + + public IDataImporter? GetImporter(string importerType) + { + foreach (var type in _importerTypes) + { + try + { + using var scope = _serviceProvider.CreateScope(); + var instance = (IDataImporter)ActivatorUtilities.CreateInstance(scope.ServiceProvider, type); + + if (instance.CanImport(importerType)) + { + var scopedProvider = _serviceProvider.CreateScope().ServiceProvider; + return (IDataImporter)ActivatorUtilities.CreateInstance(scopedProvider, type); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to create importer instance of type {Type}", type.Name); + } + } + return null; + } + + public IDataExporter? GetExporter(string exporterType) + { + return _exporters.FirstOrDefault(e => e.CanExport(exporterType)); + } + + public IEnumerable GetAllExporters() => _exporters.AsReadOnly(); + public IEnumerable GetAllPlugins() => _plugins.AsReadOnly(); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Exporters/MorskaBaseExporter.cs b/src/Backend/DiunaBI.Plugins.Morska/Exporters/MorskaBaseExporter.cs new file mode 100644 index 0000000..841be69 --- /dev/null +++ b/src/Backend/DiunaBI.Plugins.Morska/Exporters/MorskaBaseExporter.cs @@ -0,0 +1,11 @@ +using DiunaBI.Core.Interfaces; +using DiunaBI.Core.Models; + +namespace DiunaBI.Plugins.Morska.Exporters; + +public abstract class MorskaBaseExporter : IDataExporter +{ + public abstract string ExporterType { get; } + public virtual bool CanExport(string exporterType) => ExporterType == exporterType; + public abstract void Export(Layer layer); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Exporters/googleSheet.export.cs b/src/Backend/DiunaBI.Plugins.Morska/Exporters/googleSheet.export.cs index c0cd123..ceaf99d 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Exporters/googleSheet.export.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Exporters/googleSheet.export.cs @@ -3,11 +3,13 @@ using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using DiunaBI.Core.Models; using Microsoft.Extensions.Configuration; +using DiunaBI.Plugins.Morska.Exporters; namespace DiunaBI.Core.Services.Exports; -public class GoogleSheetExport +public class GoogleSheetExport : MorskaBaseExporter { + public override string ExporterType => "GoogleSheet"; private readonly GoogleDriveHelper _googleDriveHelper; private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; private readonly IConfiguration _configuration; @@ -20,7 +22,7 @@ public class GoogleSheetExport _googleSheetValues = googleSheetValues; _configuration = configuration; } - public void Export(Layer layer) + public override void Export(Layer layer) { if (_googleDriveHelper.Service is null) { @@ -29,31 +31,31 @@ public class GoogleSheetExport try { - var data = new List> { new List { layer.Name! } }; - + var data = new List> { new List { layer.Name! } }; + switch (layer.Type) { - case LayerType.Import: - { - data.Add(new List { "Code", "Value1" }); - data.AddRange(layer.Records!.Select(record => new List { record.Code!, record.Value1! })); - break; + case LayerType.Import: + { + data.Add(new List { "Code", "Value1" }); + data.AddRange(layer.Records!.Select(record => new List { record.Code!, record.Value1! })); + break; } - case LayerType.Administration: - { - data.Add(new List { "Code", "Desc1" }); - data.AddRange(layer.Records!.Select(record => new List { record.Code!, record.Desc1! })); - break; + case LayerType.Administration: + { + data.Add(new List { "Code", "Desc1" }); + data.AddRange(layer.Records!.Select(record => new List { record.Code!, record.Desc1! })); + break; } - case LayerType.Processed: - { + case LayerType.Processed: + { data.Add(new List { "Code", "Value1", "Value2", "Value3", "Value3", "Value5", "Value6", "Value7", "Value8", "Value9", "Value10", "Value11", "Value12", "Value13", "Value14", "Value15", "Value16", "Value17", "Value18", "Value19", "Value20", "Value21", "Value22", "Value23", "Value24", "Value25", "Value26", "Value27", "Value28", - "Value29", "Value30", "Value31", "Value32"}); - + "Value29", "Value30", "Value31", "Value32"}); + data.AddRange(layer.Records!.Select(record => new List { record.Code!, @@ -89,8 +91,8 @@ public class GoogleSheetExport record.Value30!, record.Value31!, record.Value32! - })); - break; + })); + break; } default: throw new Exception("Wrong LayerType"); @@ -114,7 +116,7 @@ public class GoogleSheetExport updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; updateRequest.Execute(); - } + } catch (Exception e) { Console.WriteLine(e.ToString()); diff --git a/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaBaseImporter.cs b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaBaseImporter.cs new file mode 100644 index 0000000..c70f0d8 --- /dev/null +++ b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaBaseImporter.cs @@ -0,0 +1,13 @@ +using DiunaBI.Core.Interfaces; +using DiunaBI.Core.Models; + +namespace DiunaBI.Plugins.Morska.Importers; + +public abstract class MorskaBaseImporter : IDataImporter +{ + public abstract string ImporterType { get; } + + public virtual bool CanImport(string importerType) => ImporterType == importerType; + + public abstract void Import(Layer importWorker); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d1.importer.cs b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD1Importer.cs similarity index 53% rename from src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d1.importer.cs rename to src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD1Importer.cs index b8f2964..23d987e 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d1.importer.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD1Importer.cs @@ -5,11 +5,22 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Importers; -public class MorskaD1Importer( - AppDbContext db, - SpreadsheetsResource.ValuesResource googleSheetValues) +public class MorskaD1Importer : MorskaBaseImporter { - public void Import(Layer importWorker) + public override string ImporterType => "MorskaD1"; + + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + + public MorskaD1Importer( + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + + public override void Import(Layer importWorker) { var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; if (sheetId == null) @@ -45,7 +56,7 @@ public class MorskaD1Importer( var layer = new Layer { - Number = db.Layers.Count() + 1, + Number = _db.Layers.Count() + 1, ParentId = importWorker.Id, Type = LayerType.Import, CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), @@ -55,36 +66,36 @@ public class MorskaD1Importer( }; layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; - var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var data = dataRangeResponse.Values; var newRecords = (from t in data - where t.Count > 1 && (string)t[0] != string.Empty - select new Record - { - Id = Guid.NewGuid(), - Code = t[0].ToString(), - Value1 = IndexExists(t, 3) ? ParseValue(t[3]?.ToString()) : null, - Value2 = IndexExists(t, 4) ? ParseValue(t[4]?.ToString()) : null, - Value3 = IndexExists(t, 5) ? ParseValue(t[5]?.ToString()) : null, - Value4 = IndexExists(t, 6) ? ParseValue(t[6]?.ToString()) : null, - Value5 = IndexExists(t, 7) ? ParseValue(t[7]?.ToString()) : null, - Value6 = IndexExists(t, 8) ? ParseValue(t[8]?.ToString()) : null, - Value7 = IndexExists(t, 9) ? ParseValue(t[9]?.ToString()) : null, - Value8 = IndexExists(t, 10) ? ParseValue(t[10]?.ToString()) : null, - Value9 = IndexExists(t, 11) ? ParseValue(t[11]?.ToString()) : null, - Value10 = IndexExists(t, 12) ? ParseValue(t[12]?.ToString()) : null, - Value11 = IndexExists(t, 13) ? ParseValue(t[13]?.ToString()) : null, - Value12 = IndexExists(t, 14) ? ParseValue(t[14]?.ToString()) : null, - Value13 = IndexExists(t, 15) ? ParseValue(t[15]?.ToString()) : null, - Value14 = IndexExists(t, 16) ? ParseValue(t[16]?.ToString()) : null, - Value15 = IndexExists(t, 17) ? ParseValue(t[17]?.ToString()) : null, - CreatedAt = DateTime.UtcNow, - ModifiedAt = DateTime.UtcNow - }).ToList(); - db.Layers.Add(layer); + where t.Count > 1 && (string)t[0] != string.Empty + select new Record + { + Id = Guid.NewGuid(), + Code = t[0].ToString(), + Value1 = IndexExists(t, 3) ? ParseValue(t[3]?.ToString()) : null, + Value2 = IndexExists(t, 4) ? ParseValue(t[4]?.ToString()) : null, + Value3 = IndexExists(t, 5) ? ParseValue(t[5]?.ToString()) : null, + Value4 = IndexExists(t, 6) ? ParseValue(t[6]?.ToString()) : null, + Value5 = IndexExists(t, 7) ? ParseValue(t[7]?.ToString()) : null, + Value6 = IndexExists(t, 8) ? ParseValue(t[8]?.ToString()) : null, + Value7 = IndexExists(t, 9) ? ParseValue(t[9]?.ToString()) : null, + Value8 = IndexExists(t, 10) ? ParseValue(t[10]?.ToString()) : null, + Value9 = IndexExists(t, 11) ? ParseValue(t[11]?.ToString()) : null, + Value10 = IndexExists(t, 12) ? ParseValue(t[12]?.ToString()) : null, + Value11 = IndexExists(t, 13) ? ParseValue(t[13]?.ToString()) : null, + Value12 = IndexExists(t, 14) ? ParseValue(t[14]?.ToString()) : null, + Value13 = IndexExists(t, 15) ? ParseValue(t[15]?.ToString()) : null, + Value14 = IndexExists(t, 16) ? ParseValue(t[16]?.ToString()) : null, + Value15 = IndexExists(t, 17) ? ParseValue(t[17]?.ToString()) : null, + CreatedAt = DateTime.UtcNow, + ModifiedAt = DateTime.UtcNow + }).ToList(); + _db.Layers.Add(layer); // TODO: Save records to the layer //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } private double? ParseValue(string? value) diff --git a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d3.importer.cs b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD3Importer.cs similarity index 83% rename from src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d3.importer.cs rename to src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD3Importer.cs index 4da9229..19877bc 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.d3.importer.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaD3Importer.cs @@ -6,10 +6,17 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Importers; -public class MorskaD3Importer( - AppDbContext db) +public class MorskaD3Importer : MorskaBaseImporter { - public void Import(Layer importWorker) + public override string ImporterType => "MorskaD3"; + private readonly AppDbContext _db; + + public MorskaD3Importer( + AppDbContext db) + { + _db = db; + } + public override void Import(Layer importWorker) { var year = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1; if (year == null) @@ -31,7 +38,7 @@ public class MorskaD3Importer( { throw new Exception($"ImportType not found, {importWorker.Name}"); } - var dataInbox = db.DataInbox.OrderByDescending(x => x.CreatedAt).FirstOrDefault(x => x.Name == type); + var dataInbox = _db.DataInbox.OrderByDescending(x => x.CreatedAt).FirstOrDefault(x => x.Name == type); if (dataInbox == null) { throw new Exception($"DataInbox not found, {type}"); @@ -57,7 +64,7 @@ public class MorskaD3Importer( }).ToList(); var layer = new Layer { - Number = db.Layers.Count() + 1, + Number = _db.Layers.Count() + 1, ParentId = importWorker.Id, Type = LayerType.Import, CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), @@ -67,9 +74,9 @@ public class MorskaD3Importer( }; layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; - db.Layers.Add(layer); + _db.Layers.Add(layer); // TODO: Save records to the layer //controller.SaveRecords(layer.Id, records, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.fk2.importer.cs b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaFK2Importer.cs similarity index 82% rename from src/Backend/DiunaBI.Plugins.Morska/Importers/morska.fk2.importer.cs rename to src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaFK2Importer.cs index 79c8d66..9bac27d 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.fk2.importer.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaFK2Importer.cs @@ -5,11 +5,20 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Importers; -public class MorskaFk2Importer( - AppDbContext db, - SpreadsheetsResource.ValuesResource googleSheetValues) +public class MorskaFk2Importer : MorskaBaseImporter { - public void Import(Layer importWorker) + public override string ImporterType => "MorskaFK2"; + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + public MorskaFk2Importer( + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + + public override void Import(Layer importWorker) { var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; if (sheetId == null) @@ -45,7 +54,7 @@ public class MorskaFk2Importer( var layer = new Layer { - Number = db.Layers.Count() + 1, + Number = _db.Layers.Count() + 1, ParentId = importWorker.Id, Type = LayerType.Import, CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), @@ -57,7 +66,7 @@ public class MorskaFk2Importer( var newRecords = new List(); - var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var data = dataRangeResponse.Values; for (var i = 0; i < data.Count; i++) { @@ -84,9 +93,9 @@ public class MorskaFk2Importer( }; newRecords.Add(record); } - db.Layers.Add(layer); + _db.Layers.Add(layer); // TODO: Save records to the layer //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.importer.cs b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaImporter.cs similarity index 80% rename from src/Backend/DiunaBI.Plugins.Morska/Importers/morska.importer.cs rename to src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaImporter.cs index 146701c..73c4de7 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Importers/morska.importer.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Importers/MorskaImporter.cs @@ -5,11 +5,20 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Importers; -public class MorskaImporter( - AppDbContext db, - SpreadsheetsResource.ValuesResource googleSheetValues) +public class MorskaImporter : MorskaBaseImporter { - public void Import(Layer importWorker) + public override string ImporterType => "MorskaImporter"; + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + public MorskaImporter( + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + + public override void Import(Layer importWorker) { var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; if (sheetId == null) @@ -45,7 +54,7 @@ public class MorskaImporter( var layer = new Layer { - Number = db.Layers.Count() + 1, + Number = _db.Layers.Count() + 1, ParentId = importWorker.Id, Type = LayerType.Import, CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), @@ -57,7 +66,7 @@ public class MorskaImporter( var newRecords = new List(); - var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); var data = dataRangeResponse.Values; for (var i = 0; i < data[1].Count; i++) { @@ -73,9 +82,9 @@ public class MorskaImporter( }; newRecords.Add(record); } - db.Layers.Add(layer); + _db.Layers.Add(layer); // TODO: Save records to the layer //controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/MorskaBaseProcessor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/MorskaBaseProcessor.cs new file mode 100644 index 0000000..da60532 --- /dev/null +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/MorskaBaseProcessor.cs @@ -0,0 +1,13 @@ +using DiunaBI.Core.Interfaces; +using DiunaBI.Core.Models; + +namespace DiunaBI.Plugins.Morska.Processors; + +public abstract class MorskaBaseProcessor : IDataProcessor +{ + public abstract string ProcessorType { get; } + + public virtual bool CanProcess(string processorType) => ProcessorType == processorType; + + public abstract void Process(Layer processWorker); +} \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r1.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T1R1Processor.cs similarity index 91% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r1.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T1R1Processor.cs index 05d7726..61589e2 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r1.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T1R1Processor.cs @@ -9,11 +9,20 @@ using DiunaBI.Core.Services.Calculations; namespace DiunaBI.Plugins.Morska.Processors; -public class T1R1Processor( +public class T1R1Processor : MorskaBaseProcessor +{ + public override string ProcessorType => "T1.R1"; + + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + public T1R1Processor( AppDbContext db, SpreadsheetsResource.ValuesResource googleSheetValues) -{ - public void Process(Layer processWorker) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); @@ -22,7 +31,7 @@ public class T1R1Processor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -37,7 +46,7 @@ public class T1R1Processor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R1-T1"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -66,7 +75,7 @@ public class T1R1Processor( foreach (var source in sources) { var monthCopy = month; - var dataSource = db.Layers.Where(x => + var dataSource = _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T3") @@ -180,15 +189,15 @@ public class T1R1Processor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: Save records to the layer //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); var sheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1; if (sheetName == null) @@ -202,10 +211,10 @@ public class T1R1Processor( private void UpdateReport(Guid sourceId, string sheetName) { const string sheetId = "1pph-XowjlK5CIaCEV_A5buK4ceJ0Z0YoUlDI4VMkhhA"; - var request = googleSheetValues.Get(sheetId, $"{sheetName}!C4:DA4"); + var request = _googleSheetValues.Get(sheetId, $"{sheetName}!C4:DA4"); var response = request.Execute(); - var r1 = db.Layers + var r1 = _db.Layers .Where(x => x.Id == sourceId) .Include(x => x.Records) .AsNoTracking() @@ -256,7 +265,7 @@ public class T1R1Processor( valueRange.Values.Add(emptyRow); valueRange.Values.Add(valuesSum); - var update = googleSheetValues.Update(valueRange, sheetId, $"{sheetName}!C7:DA20"); + var update = _googleSheetValues.Update(valueRange, sheetId, $"{sheetName}!C7:DA20"); update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.Execute(); @@ -279,7 +288,7 @@ public class T1R1Processor( valueRangeTime.Values.Add(timeUtc); valueRangeTime.Values.Add(timeWarsaw); - var updateTimeUtc = googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); + var updateTimeUtc = _googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.Execute(); diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r3.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T1R3Processor.cs similarity index 86% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r3.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T1R3Processor.cs index 95ad917..4d5139f 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t1.r3.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T1R3Processor.cs @@ -9,11 +9,20 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Processors; -public class T1R3Processor( +public class T1R3Processor : MorskaBaseProcessor +{ + public override string ProcessorType => "T1.R3"; + + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + public T1R3Processor( AppDbContext db, SpreadsheetsResource.ValuesResource googleSheetValues) -{ - public void Process(Layer processWorker) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var source = processWorker.Records?.Where(x => x.Code == "Source").First().Desc1; @@ -22,7 +31,7 @@ public class T1R3Processor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -37,7 +46,7 @@ public class T1R3Processor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}-R3-T1"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -53,7 +62,7 @@ public class T1R3Processor( var newRecords = new List(); string pattern = @$"^L\d+-P-{year}/\d+-{source}-T5$"; - var dataSources = db.Layers + var dataSources = _db.Layers .Where(x => !x.IsDeleted && !x.IsCancelled) .Include(layer => layer.Records!) .AsNoTracking() @@ -93,15 +102,15 @@ public class T1R3Processor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); UpdateReport(processedLayer.Id, year); } @@ -110,7 +119,7 @@ public class T1R3Processor( { const string sheetId = "10Xo8BBF92nM7_JzzeOuWp49Gz8OsYuCxLDOeChqpW_8"; - var r3 = db.Layers + var r3 = _db.Layers .Where(x => x.Id == sourceId) .Include(x => x.Records) .AsNoTracking() @@ -122,7 +131,7 @@ public class T1R3Processor( ValueRange? dataRangeResponse; try { - dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetName}!A7:A200").Execute(); + dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetName}!A7:A200").Execute(); } catch { @@ -161,7 +170,7 @@ public class T1R3Processor( } dataRangeResponse.Values = data; - var update = googleSheetValues.Update(updateValueRange, sheetId, $"{sheetName}!C7:Q200"); + var update = _googleSheetValues.Update(updateValueRange, sheetId, $"{sheetName}!C7:Q200"); update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.Execute(); @@ -183,7 +192,7 @@ public class T1R3Processor( valueRangeTime.Values.Add(timeUtc); valueRangeTime.Values.Add(timeWarsaw); - var updateTimeUtc = googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); + var updateTimeUtc = _googleSheetValues.Update(valueRangeTime, sheetId, $"{sheetName}!G1:G2"); updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.Execute(); diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodes.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesProcessor.cs similarity index 83% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodes.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesProcessor.cs index 7387d10..bc998ca 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodes.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesProcessor.cs @@ -5,10 +5,17 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Processors; -public class T3MultiSourceCopySelectedCodesProcessor( - AppDbContext db) +public class T3MultiSourceCopySelectedCodesProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.MultiSourceCopySelectedCodes"; + + private readonly AppDbContext _db; + public T3MultiSourceCopySelectedCodesProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); @@ -25,7 +32,7 @@ public class T3MultiSourceCopySelectedCodesProcessor( var codesList = ProcessHelper.ParseCodes(codes); - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -40,7 +47,7 @@ public class T3MultiSourceCopySelectedCodesProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AB-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -52,7 +59,7 @@ public class T3MultiSourceCopySelectedCodesProcessor( processedLayer.ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); processedLayer.ModifiedAt = DateTime.UtcNow; - var dataSources = sources.Select(source => db.Layers + var dataSources = sources.Select(source => _db.Layers .Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3")) .Include(x => x.Records).AsNoTracking() .FirstOrDefault()) @@ -85,14 +92,14 @@ public class T3MultiSourceCopySelectedCodesProcessor( .ToList(); if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: Save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesYearSummaryProcessor.cs similarity index 82% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesYearSummaryProcessor.cs index ea9ad52..4eb87a6 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceCopySelectedCodesYearSummaryProcessor.cs @@ -5,14 +5,21 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Processors; -public class T3MultiSourceCopySelectedCodesYearSummaryProcessor( - AppDbContext db) +public class T3MultiSourceCopySelectedCodesYearSummaryProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.MultiSourceCopySelectedCodesYearSummary"; + private readonly AppDbContext _db; + + public T3MultiSourceCopySelectedCodesYearSummaryProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -27,7 +34,7 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AB-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -46,7 +53,7 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor( for (var i = 1; i < 13; i++) { var j = i; - var dataSource = db.Layers.Where(x => + var dataSource = _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{j:D2}-AB-T3")) @@ -87,14 +94,14 @@ public class T3MultiSourceCopySelectedCodesYearSummaryProcessor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceSummary.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceSummaryProcessor.cs similarity index 89% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceSummary.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceSummaryProcessor.cs index 506fd75..2eba5ff 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceSummary.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceSummaryProcessor.cs @@ -6,10 +6,17 @@ using DiunaBI.Core.Services.Calculations; namespace DiunaBI.Plugins.Morska.Processors; -public class T3MultiSourceSummaryProcessor( - AppDbContext db) +public class T3MultiSourceSummaryProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.MultiSourceSummary"; + private readonly AppDbContext _db; + + T3MultiSourceSummaryProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); @@ -19,7 +26,7 @@ public class T3MultiSourceSummaryProcessor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -34,7 +41,7 @@ public class T3MultiSourceSummaryProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-AA-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -48,7 +55,7 @@ public class T3MultiSourceSummaryProcessor( var newRecords = new List(); - var dataSources = sources.Select(source => db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3")) + var dataSources = sources.Select(source => _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{month:D2}-{source.Desc1}-T3")) .Include(x => x.Records) .AsNoTracking() .FirstOrDefault()) @@ -165,14 +172,14 @@ public class T3MultiSourceSummaryProcessor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceYearSummary.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceYearSummaryProcessor.cs similarity index 90% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceYearSummary.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceYearSummaryProcessor.cs index e95e037..8f98381 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.MultiSourceYearSummary.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3MultiSourceYearSummaryProcessor.cs @@ -6,10 +6,16 @@ using DiunaBI.Core.Services.Calculations; namespace DiunaBI.Plugins.Morska.Processors; -public class T3MultiSourceYearSummaryProcessor( - AppDbContext db) +public class T3MultiSourceYearSummaryProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.MultiSourceYearSummary"; + private readonly AppDbContext _db; + T3MultiSourceYearSummaryProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); @@ -18,7 +24,7 @@ public class T3MultiSourceYearSummaryProcessor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -33,7 +39,7 @@ public class T3MultiSourceYearSummaryProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-AA-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -47,7 +53,7 @@ public class T3MultiSourceYearSummaryProcessor( var newRecords = new List(); - var dataSources = sources.Select(source => db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3")) + var dataSources = sources.Select(source => _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3")) .Include(x => x.Records) .AsNoTracking() .FirstOrDefault()) @@ -185,14 +191,14 @@ public class T3MultiSourceYearSummaryProcessor( } if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SingleSource.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3SingleSourceProcessor.cs similarity index 88% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SingleSource.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3SingleSourceProcessor.cs index 4f8bfdb..0de1bef 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SingleSource.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3SingleSourceProcessor.cs @@ -5,10 +5,16 @@ using DiunaBI.Core.Services; namespace DiunaBI.Plugins.Morska.Processors; -public class T3SingleSourceProcessor( - AppDbContext db) +public class T3SingleSourceProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.SingleSource"; + private readonly AppDbContext _db; + public T3SingleSourceProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); @@ -17,7 +23,7 @@ public class T3SingleSourceProcessor( { throw new Exception("SourceLayer record not found"); } - var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); + var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); if (sourceImportWorker == null) { throw new Exception("SourceImportWorkerL layer not found"); @@ -28,7 +34,7 @@ public class T3SingleSourceProcessor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id) .OrderByDescending(x => x.CreatedAt) .FirstOrDefault(); @@ -42,7 +48,7 @@ public class T3SingleSourceProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -57,7 +63,7 @@ public class T3SingleSourceProcessor( var newRecords = new List(); - var dataSources = db.Layers + var dataSources = _db.Layers .Include(x => x.Records) .Where(x => x.ParentId == sourceImportWorker.Id && !x.IsDeleted && !x.IsCancelled) @@ -127,15 +133,15 @@ public class T3SingleSourceProcessor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SourceYearSummary.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3SourceYearSummaryProcessor.cs similarity index 85% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SourceYearSummary.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T3SourceYearSummaryProcessor.cs index 3bf207c..88d1e08 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t3.SourceYearSummary.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T3SourceYearSummaryProcessor.cs @@ -5,10 +5,16 @@ using DiunaBI.Core.Services; namespace DiunaBI.Plugins.Morska.Processors; -public class T3SourceYearSummaryProcessor( - AppDbContext db) +public class T3SourceYearSummaryProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T3.SourceYearSummary"; + private readonly AppDbContext _db; + public T3SourceYearSummaryProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1; var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1; @@ -16,7 +22,7 @@ public class T3SourceYearSummaryProcessor( { throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -31,7 +37,7 @@ public class T3SourceYearSummaryProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/13-{source}-T3"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -49,7 +55,7 @@ public class T3SourceYearSummaryProcessor( for (var i = 1; i < 13; i++) { var j = i; - var dataSource = db.Layers.Where(x => + var dataSource = _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{j:D2}-{source}-T3")) @@ -89,14 +95,14 @@ public class T3SourceYearSummaryProcessor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } //TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t4.r2.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T4R2Processor.cs similarity index 89% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t4.r2.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T4R2Processor.cs index b4d93e5..10246fd 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t4.r2.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T4R2Processor.cs @@ -9,11 +9,20 @@ using DiunaBI.Core.Services; namespace DiunaBI.Plugins.Morska.Processors; -public class T4R2Processor( +public class T4R2Processor : MorskaBaseProcessor +{ + public override string ProcessorType => "T4.R2"; + + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + public T4R2Processor( AppDbContext db, SpreadsheetsResource.ValuesResource googleSheetValues) -{ - public void Process(Layer processWorker) + { + _db = db; + _googleSheetValues = googleSheetValues; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); @@ -29,7 +38,7 @@ public class T4R2Processor( } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -44,7 +53,7 @@ public class T4R2Processor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-{layerName}"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -76,7 +85,7 @@ public class T4R2Processor( if ((year == DateTime.UtcNow.Year && month <= DateTime.UtcNow.Month) || year < DateTime.UtcNow.Year) { var monthCopy = month; - var dataSource = db.Layers.Where(x => + var dataSource = _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/{monthCopy:D2}-{source.Desc1}-T") @@ -144,7 +153,7 @@ public class T4R2Processor( } // year summary - var dataSourceSum = db.Layers.Where(x => + var dataSourceSum = _db.Layers.Where(x => x.Type == LayerType.Processed && !x.IsDeleted && !x.IsCancelled && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T") @@ -189,15 +198,15 @@ public class T4R2Processor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } // TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); var reportSheetName = processWorker.Records?.SingleOrDefault(x => x.Code == "GoogleSheetName")?.Desc1; if (reportSheetName == null) @@ -216,10 +225,10 @@ public class T4R2Processor( private void UpdateReport(Guid sourceId, string reportSheetName, string invoicesSheetName) { const string sheetId = "1FsUmk_YRIeeGzFCX9tuUJCaLyRtjutX2ZGAEU1DMfJQ"; - var request = googleSheetValues.Get(sheetId, "C4:Z4"); + var request = _googleSheetValues.Get(sheetId, "C4:Z4"); var response = request.Execute(); - var r2 = db.Layers + var r2 = _db.Layers .Where(x => x.Id == sourceId && !x.IsDeleted && !x.IsCancelled) .Include(x => x.Records) .AsNoTracking() @@ -249,7 +258,7 @@ public class T4R2Processor( { Values = new List> { values } }; - var update = googleSheetValues.Update(valueRange, sheetId, $"{reportSheetName}!C{row}:XZ{row}"); + var update = _googleSheetValues.Update(valueRange, sheetId, $"{reportSheetName}!C{row}:XZ{row}"); update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; update.Execute(); } @@ -277,7 +286,7 @@ public class T4R2Processor( { Values = new List> { emptyRow } }; - var updateEmpty = googleSheetValues.Update(valueRangeEmpty, sheetId, $"{reportSheetName}!C{rowEmpty}:XZ{rowEmpty}"); + var updateEmpty = _googleSheetValues.Update(valueRangeEmpty, sheetId, $"{reportSheetName}!C{rowEmpty}:XZ{rowEmpty}"); updateEmpty.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateEmpty.Execute(); @@ -285,7 +294,7 @@ public class T4R2Processor( { Values = new List> { valuesSum } }; - var updateSum = googleSheetValues.Update(valueRangeSum, sheetId, $"{reportSheetName}!C{rowSum}:XZ{rowSum}"); + var updateSum = _googleSheetValues.Update(valueRangeSum, sheetId, $"{reportSheetName}!C{rowSum}:XZ{rowSum}"); updateSum.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateSum.Execute(); @@ -298,7 +307,7 @@ public class T4R2Processor( { Values = new List> { timeUtc } }; - var updateTimeUtc = googleSheetValues.Update(valueRangeUtcTime, sheetId, $"{reportSheetName}!G1"); + var updateTimeUtc = _googleSheetValues.Update(valueRangeUtcTime, sheetId, $"{reportSheetName}!G1"); updateTimeUtc.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeUtc.Execute(); @@ -312,7 +321,7 @@ public class T4R2Processor( { Values = new List> { timeWarsaw } }; - var updateTimeWarsaw = googleSheetValues.Update(valueRangeWarsawTime, sheetId, $"{reportSheetName}!G2"); + var updateTimeWarsaw = _googleSheetValues.Update(valueRangeWarsawTime, sheetId, $"{reportSheetName}!G2"); updateTimeWarsaw.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateTimeWarsaw.Execute(); @@ -346,14 +355,14 @@ public class T4R2Processor( var cleanupValueRange = new ValueRange { Values = cleanUpValues }; - var cleanupInvoices = googleSheetValues.Update(cleanupValueRange, sheetId, $"{invoicesSheetName}!A6:E"); + var cleanupInvoices = _googleSheetValues.Update(cleanupValueRange, sheetId, $"{invoicesSheetName}!A6:E"); cleanupInvoices.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; cleanupInvoices.Execute(); var invoicesValueRange = new ValueRange { Values = invoicesValues }; - var updateInvoices = googleSheetValues.Update(invoicesValueRange, sheetId, $"{invoicesSheetName}!A6:E"); + var updateInvoices = _googleSheetValues.Update(invoicesValueRange, sheetId, $"{invoicesSheetName}!A6:E"); updateInvoices.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED; updateInvoices.Execute(); diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t4.SingleSource.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T4SingleSourceProcessor.cs similarity index 81% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t4.SingleSource.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T4SingleSourceProcessor.cs index c881323..f7c0c12 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t4.SingleSource.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T4SingleSourceProcessor.cs @@ -4,10 +4,17 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Processors; -public class T4SingleSourceProcessor( - AppDbContext db) +public class T4SingleSourceProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T4.SingleSource"; + + private readonly AppDbContext _db; + public T4SingleSourceProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); @@ -16,7 +23,7 @@ public class T4SingleSourceProcessor( { throw new Exception("SourceLayer record not found"); } - var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); + var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); if (sourceImportWorker == null) { throw new Exception("SourceImportWorkerL layer not found"); @@ -27,7 +34,7 @@ public class T4SingleSourceProcessor( throw new Exception("Source record not found"); } - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -42,7 +49,7 @@ public class T4SingleSourceProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T4"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -55,7 +62,7 @@ public class T4SingleSourceProcessor( processedLayer.ModifiedAt = DateTime.UtcNow; - var dataSource = db.Layers + var dataSource = _db.Layers .Include(x => x.Records) .Where(x => x.ParentId == sourceImportWorker.Id && !x.IsDeleted && !x.IsCancelled) @@ -81,15 +88,15 @@ public class T4SingleSourceProcessor( if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } // TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.Plugins.Morska/Processors/t5.LastValues.processor.cs b/src/Backend/DiunaBI.Plugins.Morska/Processors/T5LastValuesProcessor.cs similarity index 84% rename from src/Backend/DiunaBI.Plugins.Morska/Processors/t5.LastValues.processor.cs rename to src/Backend/DiunaBI.Plugins.Morska/Processors/T5LastValuesProcessor.cs index 2095ea5..56a78d6 100644 --- a/src/Backend/DiunaBI.Plugins.Morska/Processors/t5.LastValues.processor.cs +++ b/src/Backend/DiunaBI.Plugins.Morska/Processors/T5LastValuesProcessor.cs @@ -5,21 +5,28 @@ using DiunaBI.Database.Context; namespace DiunaBI.Plugins.Morska.Processors; -public class T5LastValuesProcessor( - AppDbContext db) +public class T5LastValuesProcessor : MorskaBaseProcessor { - public void Process(Layer processWorker) + public override string ProcessorType => "T5.LastValues"; + + private readonly AppDbContext _db; + public T5LastValuesProcessor( + AppDbContext db) + { + _db = db; + } + public override void Process(Layer processWorker) { var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); var month = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1!); var sourceLayer = processWorker.Records?.SingleOrDefault(x => x.Code == "SourceLayer")?.Desc1; if (sourceLayer == null) throw new Exception("SourceLayer record not found"); - var sourceImportWorker = db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); + var sourceImportWorker = _db.Layers.SingleOrDefault(x => x.Name == sourceLayer && !x.IsDeleted && !x.IsCancelled); if (sourceImportWorker == null) throw new Exception("SourceImportWorker layer not found"); var source = processWorker.Records?.SingleOrDefault(x => x.Code == "Source")?.Desc1; if (sourceLayer == null) throw new Exception("Source record not found"); - var processedLayer = db.Layers + var processedLayer = _db.Layers .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted && !x.IsCancelled) .OrderByDescending(x => x.CreatedAt) @@ -34,7 +41,7 @@ public class T5LastValuesProcessor( Id = Guid.NewGuid(), Type = LayerType.Processed, ParentId = processWorker.Id, - Number = db.Layers.Count() + 1 + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-P-{year}/{month:D2}-{source}-T5"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -48,7 +55,7 @@ public class T5LastValuesProcessor( var newRecords = new List(); - var dataSources = db.Layers + var dataSources = _db.Layers .Include(x => x.Records) .Where(x => x.ParentId == sourceImportWorker.Id && !x.IsDeleted && !x.IsCancelled) @@ -85,11 +92,11 @@ public class T5LastValuesProcessor( } if (isNew) - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); else - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); // TODO: save records //controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _db.SaveChanges(); } } \ No newline at end of file diff --git a/src/Backend/DiunaBI.WebAPI/Controllers/LayersController.cs b/src/Backend/DiunaBI.WebAPI/Controllers/LayersController.cs index 612e5e5..19c6edf 100644 --- a/src/Backend/DiunaBI.WebAPI/Controllers/LayersController.cs +++ b/src/Backend/DiunaBI.WebAPI/Controllers/LayersController.cs @@ -8,9 +8,6 @@ using DiunaBI.Core.Models; using DiunaBI.Database.Context; using DiunaBI.Core.Services; using Google.Cloud.Firestore; -using DiunaBI.Plugins.Morska.Importers; -using DiunaBI.Plugins.Morska.Processors; -using DiunaBI.Core.Services.Exports; namespace DiunaBI.WebAPI.Controllers; @@ -23,13 +20,15 @@ public class LayersController : Controller private readonly GoogleDriveHelper _googleDriveHelper; private readonly IConfiguration _configuration; private readonly LogsController _logsController; + private readonly PluginManager _pluginManager; public LayersController( AppDbContext db, GoogleSheetsHelper googleSheetsHelper, GoogleDriveHelper googleDriveHelper, IConfiguration configuration, - FirestoreDb firestoreDb + FirestoreDb firestoreDb, + PluginManager pluginManager ) { _db = db; @@ -41,6 +40,7 @@ public class LayersController : Controller _googleDriveHelper = googleDriveHelper; _configuration = configuration; _logsController = new LogsController(firestoreDb); + _pluginManager = pluginManager; } [HttpGet] @@ -237,7 +237,11 @@ public class LayersController : Controller var layer = _db.Layers .Include(x => x.Records!.OrderByDescending(y => y.Code)).AsNoTracking().First(x => x.Id == id && !x.IsDeleted); - var export = new GoogleSheetExport(_googleDriveHelper, _googleSheetValues, _configuration); + var export = _pluginManager.GetExporter("GoogleSheet"); + if (export == null) + { + throw new Exception("GoogleSheet exporter not found"); + } export.Export(layer); return Ok(true); } @@ -376,8 +380,13 @@ public class LayersController : Controller "GoogleSheet"; if (source == "DataInbox" && type == "Import-D3") { - var d3Importer = new MorskaD3Importer(_db); + var d3Importer = _pluginManager.GetImporter("MorskaD3"); + if (d3Importer == null) + { + throw new Exception("MorskaD3 importer not found"); + } d3Importer.Import(importWorker); + _logsController.AddEntry(new LogEntry { Title = $"{importWorker.Name}, {importWorker.Id}", @@ -391,8 +400,13 @@ public class LayersController : Controller switch (type) { case "D1": - var d1Importer = new MorskaD1Importer(_db, _googleSheetValues); - d1Importer.Import(importWorker); + var d1importer = _pluginManager.GetImporter("MorskaD1"); + if (d1importer == null) + { + throw new Exception("MorskaD1 importer not found"); + } + d1importer.Import(importWorker); + Thread.Sleep(5000); // be aware of GSheet API quota _logsController.AddEntry(new LogEntry @@ -406,8 +420,12 @@ public class LayersController : Controller break; case "FK2": { - var fk2Importer = new MorskaFk2Importer(_db, _googleSheetValues); - fk2Importer.Import(importWorker); + var fk2importer = _pluginManager.GetImporter("MorskaFK2"); + if (fk2importer == null) + { + throw new Exception("MorskaFK2 importer not found"); + } + fk2importer.Import(importWorker); Thread.Sleep(5000); // be aware of GSheet API quota _logsController.AddEntry(new LogEntry @@ -439,7 +457,11 @@ public class LayersController : Controller if (startDateParsed.Date <= DateTime.UtcNow.Date && endDateParsed.Date >= DateTime.UtcNow.Date) { - var importer = new MorskaImporter(_db, _googleSheetValues); + var importer = _pluginManager.GetImporter("MorskaImporter"); + if (importer == null) + { + throw new Exception("MorskaImporter not found"); + } importer.Import(importWorker); Thread.Sleep(5000); // be aware of GSheet API quota @@ -454,7 +476,11 @@ public class LayersController : Controller } else if (IsImportedLayerUpToDate(importWorker) == false) { - var importer = new MorskaImporter(_db, _googleSheetValues); + var importer = _pluginManager.GetImporter("MorskaImporter"); + if (importer == null) + { + throw new Exception("MorskaImporter not found"); + } importer.Import(importWorker); Thread.Sleep(5000); // be aware of GSheet API quota @@ -610,8 +636,11 @@ public class LayersController : Controller throw new Exception("ProcessType record not found"); case "T3-SourceYearSummary": { - var processor = - new T3SourceYearSummaryProcessor(_db); + var processor = _pluginManager.GetProcessor("T3.SourceYearSummary"); + if (processor == null) + { + throw new Exception("T3.SourceYearSummary processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -626,8 +655,11 @@ public class LayersController : Controller } case "T3-MultiSourceYearSummary": { - var processor = - new T3MultiSourceYearSummaryProcessor(_db); + var processor = _pluginManager.GetProcessor("T3.MultiSourceYearSummary"); + if (processor == null) + { + throw new Exception("T3.MultiSourceYearSummary processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -642,8 +674,11 @@ public class LayersController : Controller } case "T3-MultiSourceCopySelectedCodesYearSummary": { - var processor = - new T3MultiSourceCopySelectedCodesYearSummaryProcessor(_db); + var processor = _pluginManager.GetProcessor("T3.MultiSourceCopySelectedCodesYearSummary"); + if (processor == null) + { + throw new Exception("T3.MultiSourceCopySelectedCodesYearSummary processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -658,7 +693,11 @@ public class LayersController : Controller } case "T1-R1": { - var processor = new T1R1Processor(_db, _googleSheetValues); + var processor = _pluginManager.GetProcessor("T1.R1"); + if (processor == null) + { + throw new Exception("T1.R1 processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -673,7 +712,11 @@ public class LayersController : Controller } case "T4-R2": { - var processor = new T4R2Processor(_db, _googleSheetValues); + var processor = _pluginManager.GetProcessor("T4.R2"); + if (processor == null) + { + throw new Exception("T4.R2 processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -688,7 +731,11 @@ public class LayersController : Controller } case "T1-R3": { - var processor = new T1R3Processor(_db, _googleSheetValues); + var processor = _pluginManager.GetProcessor("T1.R3"); + if (processor == null) + { + throw new Exception("T1.R3 processor not found"); + } processor.Process(processWorker); _logsController.AddEntry(new LogEntry @@ -713,33 +760,51 @@ public class LayersController : Controller { case "T3-SingleSource": { - var t3SingleSource = new T3SingleSourceProcessor(_db); + var t3SingleSource = _pluginManager.GetProcessor("T3.SingleSource"); + if (t3SingleSource == null) + { + throw new Exception("T3.SingleSource processor not found"); + } t3SingleSource.Process(processWorker); break; } case "T4-SingleSource": { - var t4SingleSource = new T4SingleSourceProcessor(_db); + var t4SingleSource = _pluginManager.GetProcessor("T4.SingleSource"); + if (t4SingleSource == null) + { + throw new Exception("T4.SingleSource processor not found"); + } t4SingleSource.Process(processWorker); break; } case "T5-LastValues": { - var t5LastValues = new T5LastValuesProcessor(_db); + var t5LastValues = _pluginManager.GetProcessor("T5.LastValues"); + if (t5LastValues == null) + { + throw new Exception("T5.LastValues processor not found"); + } t5LastValues.Process(processWorker); break; } case "T3-MultiSourceSummary": { - var t3MultiSourceSummary = - new T3MultiSourceSummaryProcessor(_db); + var t3MultiSourceSummary = _pluginManager.GetProcessor("T3.MultiSourceSummary"); + if (t3MultiSourceSummary == null) + { + throw new Exception("T3.MultiSourceSummary processor not found"); + } t3MultiSourceSummary.Process(processWorker); break; } case "T3-MultiSourceCopySelectedCodes": { - var t3MultiSourceCopySelectedCode = - new T3MultiSourceCopySelectedCodesProcessor(_db); + var t3MultiSourceCopySelectedCode = _pluginManager.GetProcessor("T3.MultiSourceCopySelectedCodes"); + if (t3MultiSourceCopySelectedCode == null) + { + throw new Exception("T3.MultiSourceCopySelectedCodes processor not found"); + } t3MultiSourceCopySelectedCode.Process(processWorker); break; } diff --git a/src/Backend/DiunaBI.WebAPI/DiunaBI.WebAPI.csproj b/src/Backend/DiunaBI.WebAPI/DiunaBI.WebAPI.csproj index a4ede7e..1e36bac 100644 --- a/src/Backend/DiunaBI.WebAPI/DiunaBI.WebAPI.csproj +++ b/src/Backend/DiunaBI.WebAPI/DiunaBI.WebAPI.csproj @@ -19,7 +19,6 @@ - @@ -33,4 +32,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Backend/DiunaBI.WebAPI/Program.cs b/src/Backend/DiunaBI.WebAPI/Program.cs index 9583526..c8d920c 100644 --- a/src/Backend/DiunaBI.WebAPI/Program.cs +++ b/src/Backend/DiunaBI.WebAPI/Program.cs @@ -5,10 +5,11 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; +using System.Reflection; using System.Text; -using DiunaBI.Core.Models; using DiunaBI.Database.Context; using DiunaBI.Core.Services; +using Google.Apis.Sheets.v4; var builder = WebApplication.CreateBuilder(args); @@ -57,8 +58,22 @@ builder.Services.AddAuthentication(options => }); builder.Services.AddAuthentication(); -builder.Services.AddSingleton(typeof(GoogleSheetsHelper)); -builder.Services.AddSingleton(typeof(GoogleDriveHelper)); +// Zarejestruj Google Sheets dependencies +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(provider => +{ + var googleSheetsHelper = provider.GetRequiredService(); + var valuesResource = googleSheetsHelper.Service?.Spreadsheets.Values; + + if (valuesResource == null) + { + throw new InvalidOperationException("Google Sheets Service is not initialized properly"); + } + + return valuesResource; +}); + var fileName = "diunabi-admin-firebase.json"; #if DEBUG @@ -72,8 +87,17 @@ FirebaseAdmin.FirebaseApp.Create(new AppOptions() }); builder.Services.AddSingleton(FirestoreDb.Create("diunabi-admin")); +builder.Services.AddSingleton(); + var app = builder.Build(); +var pluginManager = app.Services.GetRequiredService(); + +var executablePath = Assembly.GetExecutingAssembly().Location; +var executableDir = Path.GetDirectoryName(executablePath)!; +var pluginsPath = Path.Combine(executableDir, "Plugins"); + +pluginManager.LoadPluginsFromDirectory(pluginsPath); app.Use(async (context, next) => {