diff --git a/WebAPI/AppDbContext.cs b/WebAPI/AppDbContext.cs index 9ad081e..9aaaa15 100644 --- a/WebAPI/AppDbContext.cs +++ b/WebAPI/AppDbContext.cs @@ -1,37 +1,35 @@ using Microsoft.EntityFrameworkCore; -using System.Collections.Generic; using WebAPI.Models; -namespace WebAPI +namespace WebAPI; + +public class AppDbContext : DbContext { - public class AppDbContext : DbContext + public DbSet Users { get; init; } + public DbSet Layers { get; init; } + public DbSet Records { get; init; } + public DbSet ProcessSources { get; init; } + + public AppDbContext(DbContextOptions options) : base(options) { - public DbSet Users { get; init; } - public DbSet Layers { get; init; } - public DbSet Records { get; init; } - public DbSet ProcessSources { get; init; } + } - public AppDbContext(DbContextOptions options) : base(options) + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasKey(x => new { - } + x.LayerId, + x.SourceId + }); + } - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity().HasKey(x => new - { - x.LayerId, - x.SourceId - }); - } - - private static readonly LoggerFactory MyLoggerFactory = - new(new[] { - new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() + private static readonly LoggerFactory MyLoggerFactory = + new(new[] { + new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }); - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseLoggerFactory(MyLoggerFactory); - } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseLoggerFactory(MyLoggerFactory); } -} +} \ No newline at end of file diff --git a/WebAPI/Calculators/BaseCalc.cs b/WebAPI/Calculators/BaseCalc.cs index 94e7927..1946122 100644 --- a/WebAPI/Calculators/BaseCalc.cs +++ b/WebAPI/Calculators/BaseCalc.cs @@ -69,7 +69,7 @@ public class BaseCalc } Entity expr = formula; - ProcessHelper.setValue(result, i, (double)expr.EvalNumerical()); + ProcessHelper.SetValue(result, i, (double)expr.EvalNumerical()); } return result; } diff --git a/WebAPI/Controllers/AdminController.cs b/WebAPI/Controllers/AdminController.cs index 1471af8..24c0f63 100644 --- a/WebAPI/Controllers/AdminController.cs +++ b/WebAPI/Controllers/AdminController.cs @@ -3,105 +3,105 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using WebAPI.Models; -using static Google.Apis.Drive.v3.FilesResource; -namespace WebAPI.Controllers +namespace WebAPI.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class AdminController : Controller { - [ApiController] - [Route("api/[controller]")] - public class AdminController : Controller - { - private readonly GoogleDriveHelper _googleDriveHelper; - private readonly IConfiguration _configuration; - private readonly LogsController _logsController; + private readonly GoogleDriveHelper _googleDriveHelper; + private readonly IConfiguration _configuration; + private readonly LogsController _logsController; - public AdminController( - GoogleDriveHelper googleDriveHelper, - IConfiguration configuration, - LogsController logsController) + public AdminController( + GoogleDriveHelper googleDriveHelper, + IConfiguration configuration, + LogsController logsController) + { + _googleDriveHelper = googleDriveHelper; + _configuration = configuration; + _logsController = logsController; + } + + [HttpGet] + [Route("BackupDatabase/{apiKey}")] + [AllowAnonymous] + public IActionResult BackupDatabase(string apiKey) + { + if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) { - _googleDriveHelper = googleDriveHelper; - _configuration = configuration; - _logsController = logsController; + return Unauthorized(); } - [HttpGet] - [Route("BackupDatabase/{apiKey}")] - [AllowAnonymous] - public IActionResult BackupDatabase(string apiKey) + try { - if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) + const string databaseName = "diunabi-morska"; + var localDatabasePath = $"{_configuration["dbBackupFile"]}-{DateTime.UtcNow.Day}.bak"; + const string formatMediaName = $"DatabaseToolkitBackup_{databaseName}"; + const string formatName = $"Full Backup of {databaseName}"; + + var connection = new SqlConnection(_configuration.GetConnectionString("SQLDatabase")); + + const string sql = """ + BACKUP DATABASE @databaseName + TO DISK = @localDatabasePath + WITH FORMAT, + MEDIANAME = @formatMediaName, + NAME = @formatName + """; + + connection.Open(); + var command = new SqlCommand(sql, connection); + + command.CommandType = CommandType.Text; + command.CommandTimeout = 7200; + command.Parameters.AddWithValue("@databaseName", databaseName); + command.Parameters.AddWithValue("@localDatabasePath", localDatabasePath); + command.Parameters.AddWithValue("@formatMediaName", formatMediaName); + command.Parameters.AddWithValue("@formatName", formatName); + + command.ExecuteNonQuery(); + + var body = new Google.Apis.Drive.v3.Data.File { - return Unauthorized(); + Name = Path.GetFileName(localDatabasePath), + Parents = new List { _configuration["GDriveBackupDirectory"] }, + MimeType = "application/octet-stream" + }; + + var fsSource = new FileStream(localDatabasePath, FileMode.Open, FileAccess.Read); + + if (_googleDriveHelper.Service is null) + { + throw new Exception("Google Drive API not initialized"); } - try - { - var databaseName = "diunabi-morska"; - var localDatabasePath = $"{_configuration["dbBackupFile"]}-{DateTime.UtcNow.Day}.bak"; - var formatMediaName = $"DatabaseToolkitBackup_{databaseName}"; - var formatName = $"Full Backup of {databaseName}"; + var request = _googleDriveHelper.Service.Files.Create(body, fsSource, body.MimeType); + request.Fields = "id"; - var connection = new SqlConnection(_configuration.GetConnectionString("SQLDatabase")); - - var sql = @"BACKUP DATABASE @databaseName - TO DISK = @localDatabasePath - WITH FORMAT, - MEDIANAME = @formatMediaName, - NAME = @formatName"; - - connection.Open(); - var command = new SqlCommand(sql, connection); - - command.CommandType = CommandType.Text; - command.CommandTimeout = 7200; - command.Parameters.AddWithValue("@databaseName", databaseName); - command.Parameters.AddWithValue("@localDatabasePath", localDatabasePath); - command.Parameters.AddWithValue("@formatMediaName", formatMediaName); - command.Parameters.AddWithValue("@formatName", formatName); - - command.ExecuteNonQuery(); - - Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File - { - Name = Path.GetFileName(localDatabasePath), - Parents = new List { _configuration["GDriveBackupDirectory"] }, - MimeType = "application/octet-stream" - }; - - var fsSource = new FileStream(localDatabasePath, FileMode.Open, FileAccess.Read); - - if (_googleDriveHelper.Service is null) - { - throw new Exception("Google Drive API not initialized"); - } - - var request = _googleDriveHelper.Service.Files.Create(body, fsSource, body.MimeType); - request.Fields = "id"; - - request.Upload(); + request.Upload(); - _logsController.AddEntry(new LogEntry - { - Title = "Backup success", - Type = LogEntryType.info, - LogType = LogType.backup, - CreatedAt = DateTime.UtcNow - }); - return Ok(); - } - catch (Exception e) + _logsController.AddEntry(new LogEntry { - _logsController.AddEntry(new LogEntry - { - Title = "Backup error", - Type = LogEntryType.error, - LogType = LogType.backup, - Message = e.ToString(), - CreatedAt = DateTime.UtcNow - }); - return BadRequest(e.ToString()); - } + Title = "Backup success", + Type = LogEntryType.info, + LogType = LogType.backup, + CreatedAt = DateTime.UtcNow + }); + return Ok(); + } + catch (Exception e) + { + _logsController.AddEntry(new LogEntry + { + Title = "Backup error", + Type = LogEntryType.error, + LogType = LogType.backup, + Message = e.ToString(), + CreatedAt = DateTime.UtcNow + }); + return BadRequest(e.ToString()); } } } \ No newline at end of file diff --git a/WebAPI/Controllers/AuthController.cs b/WebAPI/Controllers/AuthController.cs index 778055e..ad0e4d7 100644 --- a/WebAPI/Controllers/AuthController.cs +++ b/WebAPI/Controllers/AuthController.cs @@ -1,72 +1,58 @@ using Google.Apis.Auth; -using Google.Apis.Http; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Configuration; -using Microsoft.Identity.Client.Platforms.Features.DesktopOs.Kerberos; using Microsoft.IdentityModel.Tokens; -using System.Configuration; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using WebAPI.Models; -namespace WebAPI.Controllers +namespace WebAPI.Controllers; + +[ApiController] +[Route("api/[controller]")] +// [Authorize] +public class AuthController : Controller { - [ApiController] - [Route("api/[controller]")] - // [Authorize] - public class AuthController : Controller + private readonly AppDbContext _db; + private readonly IConfiguration _configuration; + public AuthController( + AppDbContext db, IConfiguration configuration) + { _db = db; _configuration = configuration; } + + [HttpPost] + [Route("apiToken")] + public async Task ApiToken([FromBody] string credential) { - private readonly AppDbContext db; - private readonly IConfiguration configuration; - public AuthController( - AppDbContext _db, IConfiguration _configuration) - { db = _db; configuration = _configuration; } - - [HttpPost] - [Route("apiToken")] - public async Task apiToken([FromBody] string credential) + var settings = new GoogleJsonWebSignature.ValidationSettings { - var settings = new GoogleJsonWebSignature.ValidationSettings() - { - Audience = new List { configuration.GetValue("GoogleClientId")! } - }; - var payload = await GoogleJsonWebSignature.ValidateAsync(credential, settings); - var user = db.Users.Where(x => x.Email == payload.Email).FirstOrDefault(); - if (user != null) - { - return Ok(JWTGenerator(user)); - } - else - { - return Unauthorized(); - } - } + Audience = new List { _configuration.GetValue("GoogleClientId")! } + }; + var payload = await GoogleJsonWebSignature.ValidateAsync(credential, settings); + var user = _db.Users.FirstOrDefault(x => x.Email == payload.Email); + return user != null ? (IActionResult)Ok(JwtGenerator(user)) : Unauthorized(); + } - private dynamic JWTGenerator(User user) + private dynamic JwtGenerator(User user) + { + var key = Encoding.ASCII.GetBytes(_configuration.GetValue("Secret")!); + var expirationTime = DateTime.UtcNow.AddMinutes(5); + var tokenDescriptor = new SecurityTokenDescriptor { - var key = Encoding.ASCII.GetBytes(configuration.GetValue("Secret")!); - var expirationTime = DateTime.UtcNow.AddMinutes(5); - var tokenDescriptor = new SecurityTokenDescriptor + Subject = new ClaimsIdentity(new[] { - Subject = new ClaimsIdentity(new[] - { new Claim("Id", Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()), new Claim(JwtRegisteredClaimNames.Jti, - Guid.NewGuid().ToString()) - }), - Expires = expirationTime, - SigningCredentials = new SigningCredentials - (new SymmetricSecurityKey(key), + Guid.NewGuid().ToString()) + }), + Expires = expirationTime, + SigningCredentials = new SigningCredentials + (new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature) - }; - var tokenHandler = new JwtSecurityTokenHandler(); - var token = tokenHandler.CreateToken(tokenDescriptor); - var jwtToken = tokenHandler.WriteToken(token); - var stringToken = tokenHandler.WriteToken(token); - return new { token = stringToken, id = user.Id, expirationTime }; - } + }; + var tokenHandler = new JwtSecurityTokenHandler(); + var token = tokenHandler.CreateToken(tokenDescriptor); + var stringToken = tokenHandler.WriteToken(token); + return new { token = stringToken, id = user.Id, expirationTime }; } } \ No newline at end of file diff --git a/WebAPI/Controllers/LayersController.cs b/WebAPI/Controllers/LayersController.cs index c657d5e..d084439 100644 --- a/WebAPI/Controllers/LayersController.cs +++ b/WebAPI/Controllers/LayersController.cs @@ -9,229 +9,260 @@ using WebAPI.dataProcessors; using WebAPI.Exports; using WebAPI.Models; -namespace WebAPI.Controllers +namespace WebAPI.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class LayersController : Controller { - [ApiController] - [Route("api/[controller]")] - public class LayersController : Controller + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource? _googleSheetValues; + private readonly GoogleDriveHelper _googleDriveHelper; + private readonly IConfiguration _configuration; + private readonly LogsController _logsController; + + public LayersController( + AppDbContext db, + GoogleSheetsHelper googleSheetsHelper, + GoogleDriveHelper googleDriveHelper, + IConfiguration configuration + ) { - private readonly AppDbContext _db; - private readonly SpreadsheetsResource.ValuesResource? _googleSheetValues; - private readonly GoogleDriveHelper _googleDriveHelper; - // private GoogleSheetsHelper _googleSheetsHelper; - private readonly IConfiguration _configuration; - private readonly LogsController _logsController; - - public LayersController( - AppDbContext db, - GoogleSheetsHelper googleSheetsHelper, - GoogleDriveHelper googleDriveHelper, - IConfiguration configuration) + _db = db; + if (googleSheetsHelper.Service is not null) { - _db = db; - if (googleSheetsHelper.Service is not null) - { - _googleSheetValues = googleSheetsHelper.Service.Spreadsheets.Values; - } - - //_googleSheetsHelper = googleSheetsHelper; - _googleDriveHelper = googleDriveHelper; - _configuration = configuration; - _logsController = new LogsController(googleSheetsHelper, googleDriveHelper, configuration); + _googleSheetValues = googleSheetsHelper.Service.Spreadsheets.Values; } - [HttpGet] - public IActionResult GetAll(int start, int limit, string? name, LayerType? type) + _googleDriveHelper = googleDriveHelper; + _configuration = configuration; + _logsController = new LogsController(googleSheetsHelper, _configuration); + } + + [HttpGet] + public IActionResult GetAll(int start, int limit, string? name, LayerType? type) + { + try { - try + var response = _db.Layers.Where(x => !x.IsDeleted); + if (name != null) { - var response = _db.Layers.Where(x => !x.IsDeleted); - if (name != null) - { - response = response.Where(x => x.Name != null && x.Name.Contains(name)); - } - - if (type != null) - { - response = response.Where(x => x.Type == type); - } - - return Ok(response - .OrderByDescending(x => x.Number) - .Skip(start).Take(limit).ToList()); + response = response.Where(x => x.Name != null && x.Name.Contains(name)); } - catch (Exception e) + + if (type != null) { - return BadRequest(e.ToString()); + response = response.Where(x => x.Type == type); } + + return Ok(response + .OrderByDescending(x => x.Number) + .Skip(start).Take(limit).ToList()); + } + catch (Exception e) + { + return BadRequest(e.ToString()); + } + } + + [HttpGet] + [Route("{id:guid}")] + public IActionResult Get(Guid id) + { + try + { + return Ok(_db.Layers + .Include(x => x.CreatedBy) + .Include(x => x.Records).First(x => x.Id == id && !x.IsDeleted)); + } + catch (Exception e) + { + return BadRequest(e.ToString()); + } + } + + [HttpGet] + [Route("getForPowerBI/{apiKey}/{number:int}")] + public IActionResult GetByNumber(string apiKey, int number) + { + if (apiKey != _configuration["apiKey"]) + { + _logsController.AddEntry(new LogEntry + { + Title = $"Unauthorized request - wrong apiKey ({number})", + Type = LogEntryType.warning, + LogType = LogType.powerBI, + CreatedAt = DateTime.UtcNow + }); + return Unauthorized(); } - [HttpGet] - [Route("{id}")] - public IActionResult Get(Guid id) + try { - try - { - return Ok(_db.Layers - .Include(x => x.CreatedBy) - .Include(x => x.Records).First(x => x.Id == id && !x.IsDeleted)); - } - catch (Exception e) - { - return BadRequest(e.ToString()); - } - } - - [HttpGet] - [Route("getForPowerBI/{apiKey}/{number}")] - public IActionResult GetByNumber(string apiKey, int number) - { - if (apiKey != _configuration["apiKey"]) + if ( + !Request.Headers.TryGetValue("Authorization", out var authHeader)) { _logsController.AddEntry(new LogEntry { - Title = $"Unauthorized request - wrong apiKey ({number})", + Title = $"Unauthorized request - no authorization header ({number})", Type = LogEntryType.warning, LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, + CreatedAt = DateTime.UtcNow }); return Unauthorized(); } - try + var credentialsArr = authHeader.ToString().Split(" "); + if (credentialsArr.Length != 2) { - if ( - !Request.Headers.TryGetValue("Authorization", out var authHeader)) - { - _logsController.AddEntry(new LogEntry - { - Title = $"Unauthorized request - no authorization header ({number})", - Type = LogEntryType.warning, - LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, - }); - return Unauthorized(); - } - - var credentialsArr = authHeader.ToString().Split(" "); - if (credentialsArr.Length != 2) - { - _logsController.AddEntry(new LogEntry - { - Title = $"Unauthorized request - wrong auth header format ({number})", - Type = LogEntryType.warning, - LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, - }); - return Unauthorized(); - } - - var authValue = Encoding.UTF8.GetString(Convert.FromBase64String(credentialsArr[1])); - var username = authValue.Split(':')[0]; - var password = authValue.Split(':')[1]; - if (username != _configuration["powerBI-user"] || password != _configuration["powerBI-pass"]) - { - _logsController.AddEntry(new LogEntry - { - Title = $"Unauthorized request - bad credentials ({number})", - Type = LogEntryType.warning, - LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, - }); - return Unauthorized(); - } - _logsController.AddEntry(new LogEntry { - Title = $"Sending data for layer {number}", + Title = $"Unauthorized request - wrong auth header format ({number})", + Type = LogEntryType.warning, + LogType = LogType.powerBI, + CreatedAt = DateTime.UtcNow + }); + return Unauthorized(); + } + + var authValue = Encoding.UTF8.GetString(Convert.FromBase64String(credentialsArr[1])); + var username = authValue.Split(':')[0]; + var password = authValue.Split(':')[1]; + if (username != _configuration["powerBI-user"] || password != _configuration["powerBI-pass"]) + { + _logsController.AddEntry(new LogEntry + { + Title = $"Unauthorized request - bad credentials ({number})", + Type = LogEntryType.warning, + LogType = LogType.powerBI, + CreatedAt = DateTime.UtcNow + }); + return Unauthorized(); + } + + _logsController.AddEntry(new LogEntry + { + Title = $"Sending data for layer {number}", + Type = LogEntryType.info, + LogType = LogType.powerBI, + CreatedAt = DateTime.UtcNow + }); + + return Ok(_db.Layers + .Include(x => x.CreatedBy) + .Include(x => x.Records).First(x => x.Number == number && !x.IsDeleted)); + } + catch (Exception e) + { + _logsController.AddEntry(new LogEntry + { + Title = e.ToString(), + Type = LogEntryType.error, + LogType = LogType.powerBI, + CreatedAt = DateTime.UtcNow + }); + return BadRequest(e.ToString()); + } + } + + [HttpGet] + [Route("exportToGoogleSheet/{id:guid}")] + public IActionResult ExportToGoogleSheet(Guid id) + { + if (_googleSheetValues is null) + { + throw new Exception("Google Sheets API not initialized"); + } + + var layer = _db.Layers + .Include(x => x.Records!.OrderByDescending(y => y.Code)).First(x => x.Id == id && !x.IsDeleted); + + var export = new GoogleSheetExport(_googleDriveHelper, _googleSheetValues, _configuration); + export.Export(layer); + return Ok(true); + } + + [HttpGet] + [Route("AutoImport/{apiKey}")] + [AllowAnonymous] + public IActionResult AutoImport(string apiKey) + { + if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) + { + return Unauthorized(); + } + + if (_googleSheetValues is null) + { + throw new Exception("Google Sheets API not initialized"); + } + + var importWorkerLayers = _db.Layers + .Include(x => x.Records) + .Where(x => + x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ImportWorker") && + x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") + //&& x.Records!.Any(x => x.Code == "ImportType" && x.Desc1 == "FK2") + ) + .OrderBy(x => x.CreatedAt) + .ToList(); + try + { + if (!importWorkerLayers.Any()) + { + _logsController.AddEntry(new LogEntry + { + Title = "No Layers to import.", Type = LogEntryType.info, - LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, + LogType = LogType.import, + CreatedAt = DateTime.UtcNow }); - - return Ok(_db.Layers - .Include(x => x.CreatedBy) - .Include(x => x.Records).First(x => x.Number == number && !x.IsDeleted)); + return Ok(); } - catch (Exception e) + + foreach (var importWorker in importWorkerLayers) { - _logsController.AddEntry(new LogEntry + try { - Title = e.ToString(), - Type = LogEntryType.error, - LogType = LogType.powerBI, - CreatedAt = DateTime.UtcNow, - }); - return BadRequest(e.ToString()); - } - } + var type = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportType")?.Desc1 ?? + "Standard"; - [HttpGet] - [Route("exportToGoogleSheet/{id}")] - public IActionResult ExportToGoogleSheet(Guid id) - { - if (_googleSheetValues is null) - { - throw new Exception("Google Sheets API not initialized"); - } - - var layer = _db.Layers - .Include(x => x.Records!.OrderByDescending(y => y.Code)).First(x => x.Id == id && !x.IsDeleted); - - var export = new googleSheetExport(_googleDriveHelper, _googleSheetValues, _configuration); - export.export(layer); - return Ok(true); - } - - [HttpGet] - [Route("AutoImport/{apiKey}")] - [AllowAnonymous] - public IActionResult AutoImport(string apiKey) - { - if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) - { - return Unauthorized(); - } - - if (_googleSheetValues is null) - { - throw new Exception("Google Sheets API not initialized"); - } - - var importWorkerLayers = _db.Layers - .Include(x => x.Records) - .Where(x => - x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ImportWorker") && - x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") - //&& x.Records!.Any(x => x.Code == "ImportType" && x.Desc1 == "FK2") - ) - .OrderBy(x => x.CreatedAt) - .ToList(); - try - { - if (!importWorkerLayers.Any()) - { - _logsController.AddEntry(new LogEntry + if (type == "FK2") { - Title = "No Layers to import.", - Type = LogEntryType.info, - LogType = LogType.import, - CreatedAt = DateTime.UtcNow, - }); - return Ok(); - } + var importer = new MorskaFk2Importer(_db, _googleSheetValues, this); + importer.Import(importWorker); - foreach (var importWorker in importWorkerLayers) - { - try - { - var type = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportType")?.Desc1 ?? - "Standard"; - - if (type == "FK2") + _logsController.AddEntry(new LogEntry { - var importer = new MorskaFk2Importer(_db, _googleSheetValues, this); - importer.import(importWorker); + Title = $"{importWorker.Name}, {importWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.import, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + } + else + { + var startDate = importWorker.Records!.FirstOrDefault(x => x.Code == "StartDate")?.Desc1; + if (startDate == null) + { + throw new Exception("StartDate record nod found"); + } + + var endDate = importWorker.Records!.First(x => x.Code == "EndDate").Desc1; + if (endDate == null) + { + throw new Exception("EndDate record nod found"); + } + + var startDateParsed = DateTime.ParseExact(startDate, "yyyy.MM.dd", null); + var endDateParsed = DateTime.ParseExact(endDate, "yyyy.MM.dd", null); + if (startDateParsed.Date <= DateTime.UtcNow.Date && + endDateParsed.Date >= DateTime.UtcNow.Date) + { + var importer = new MorskaImporter(_db, _googleSheetValues, this); + importer.Import(importWorker); + Thread.Sleep(5000); // be aware of GSheet API quota _logsController.AddEntry(new LogEntry { @@ -242,168 +273,29 @@ namespace WebAPI.Controllers CreatedAt = DateTime.UtcNow }); } + else if (IsImportedLayerUpToDate(importWorker) == false) + { + var importer = new MorskaImporter(_db, _googleSheetValues, this); + importer.Import(importWorker); + Thread.Sleep(5000); // be aware of GSheet API quota + + _logsController.AddEntry(new LogEntry + { + Title = $"{importWorker.Name}, {importWorker.Id}", + Type = LogEntryType.warning, + LogType = LogType.import, + Message = "Success (reimported)", + CreatedAt = DateTime.UtcNow + }); + } else - { - var startDate = importWorker.Records!.FirstOrDefault(x => x.Code == "StartDate")?.Desc1; - if (startDate == null) - { - throw new Exception("StartDate record nod found"); - } - - var endDate = importWorker.Records!.First(x => x.Code == "EndDate").Desc1; - if (endDate == null) - { - throw new Exception("EndDate record nod found"); - } - - var startDateParsed = DateTime.ParseExact(startDate, "yyyy.MM.dd", null); - var endDateParsed = DateTime.ParseExact(endDate, "yyyy.MM.dd", null); - if (startDateParsed.Date <= DateTime.UtcNow.Date && - endDateParsed.Date >= DateTime.UtcNow.Date) - { - var importer = new MorskaImporter(_db, _googleSheetValues, this); - importer.import(importWorker); - Thread.Sleep(5000); // be aware of GSheet API quota - - _logsController.AddEntry(new LogEntry - { - Title = $"{importWorker.Name}, {importWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.import, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - } - else if (IsImportedLayerUpToDate(importWorker) == false) - { - MorskaImporter importer = new MorskaImporter(_db, _googleSheetValues, this); - importer.import(importWorker); - Thread.Sleep(5000); // be aware of GSheet API quota - - _logsController.AddEntry(new LogEntry - { - Title = $"{importWorker.Name}, {importWorker.Id}", - Type = LogEntryType.warning, - LogType = LogType.import, - Message = "Success (reimported)", - CreatedAt = DateTime.UtcNow - }); - } - else - { - _logsController.AddEntry(new LogEntry - { - Title = $"{importWorker.Name}, {importWorker.Id}", - Type = LogEntryType.warning, - LogType = LogType.import, - Message = "importLayer records are up of date. Not processed.", - CreatedAt = DateTime.UtcNow - }); - } - } - } - catch (Exception e) - { - _logsController.AddEntry(new LogEntry - { - Title = $"{importWorker.Name}, {importWorker.Id}", - Type = LogEntryType.error, - LogType = LogType.import, - Message = e.ToString(), - CreatedAt = DateTime.UtcNow - }); - } - } - - return Ok(); - } - catch (Exception e) - { - _logsController.AddEntry(new LogEntry - { - Title = "Process error", - Type = LogEntryType.error, - LogType = LogType.import, - Message = e.ToString(), - CreatedAt = DateTime.UtcNow - }); - return BadRequest(e.ToString()); - } - } - - [HttpGet] - [Route("AutoProcess/{apiKey}")] - [AllowAnonymous] - public IActionResult AutoProcess(string apiKey) - { - if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) - { - return Unauthorized(); - } - - if (_googleSheetValues is null) - { - throw new Exception("Google Sheets API not initialized"); - } - - string[] processTypes = - { - "T3-SingleSource", - "T3-SourceYearSummary", - "T3-MultiSourceSummary", // AA - "T3-MultiSourceYearSummary", // AA/13 - "T4-SingleSource", - "T1-R1", - "T4-R2" - }; - - foreach (string type in processTypes) - { - try - { - _logsController.AddEntry(new LogEntry - { - Title = $"Processing: {type}", - Type = LogEntryType.info, - LogType = LogType.process, - CreatedAt = DateTime.UtcNow, - }); - - List processWorkerLayers = _db.Layers - .Include(x => x.Records) - .Where(x => - x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ProcessWorker") && - x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") && - x.Records!.Any(y => y.Code == "ProcessType" && y.Desc1 == type) - ) - .OrderBy(x => x.CreatedAt) - .ToList(); - - if (!processWorkerLayers.Any()) - { - _logsController.AddEntry(new LogEntry - { - Title = "No Layers to process.", - Type = LogEntryType.info, - LogType = LogType.process, - CreatedAt = DateTime.UtcNow, - }); - } - - foreach (Layer processWorker in processWorkerLayers) - { - try - { - ProcessLayer(processWorker); - } - catch (Exception e) { _logsController.AddEntry(new LogEntry { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.error, - LogType = LogType.process, - Message = e.ToString(), + Title = $"{importWorker.Name}, {importWorker.Id}", + Type = LogEntryType.warning, + LogType = LogType.import, + Message = "importLayer records are up of date. Not processed.", CreatedAt = DateTime.UtcNow }); } @@ -413,9 +305,9 @@ namespace WebAPI.Controllers { _logsController.AddEntry(new LogEntry { - Title = "Process error", + Title = $"{importWorker.Name}, {importWorker.Id}", Type = LogEntryType.error, - LogType = LogType.process, + LogType = LogType.import, Message = e.ToString(), CreatedAt = DateTime.UtcNow }); @@ -424,248 +316,354 @@ namespace WebAPI.Controllers return Ok(); } - - private void ProcessLayer(Layer processWorker) + catch (Exception e) { - if (_googleSheetValues == null) - { - throw new Exception("Google Sheets API not initialized"); - } - - var year = processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1; - if (year == null) - { - throw new Exception("Year record nod found"); - } - - var processType = processWorker.Records?.SingleOrDefault(x => x.Code == "ProcessType")?.Desc1; - switch (processType) - { - case null: - throw new Exception("ProcessType record not found"); - case "T3-SourceYearSummary": - { - T3SourceYearSummaryProcessor processor = - new T3SourceYearSummaryProcessor(_db, _googleSheetValues, this); - processor.process(processWorker); - - _logsController.AddEntry(new LogEntry - { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - return; - } - case "T3-MultiSourceYearSummary": - { - T3MultiSourceYearSummaryProcessor processor = - new T3MultiSourceYearSummaryProcessor(_db, _googleSheetValues, this, _logsController); - processor.process(processWorker); - - _logsController.AddEntry(new LogEntry - { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - return; - } - case "T3-MultiSourceCopySelectedCodesYearSummary": - { - T3MultiSourceCopySelectedCodesYearSummaryProcessor processor = - new T3MultiSourceCopySelectedCodesYearSummaryProcessor(_db, _googleSheetValues, this); - processor.process(processWorker); - - _logsController.AddEntry(new LogEntry - { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - return; - } - case "T1-R1": - { - T1R1Processor processor = new T1R1Processor(_db, _googleSheetValues, this, _logsController); - processor.process(processWorker); - - _logsController.AddEntry(new LogEntry - { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - return; - } - case "T4-R2": - { - var processor = new T4R2Processor(_db, _googleSheetValues, this, _logsController); - processor.process(processWorker); - - _logsController.AddEntry(new LogEntry - { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", - CreatedAt = DateTime.UtcNow - }); - return; - } - } - - var month = processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1; - if (month == null) - { - throw new Exception("Month record not found"); - } - - switch (processType!) - { - case "T3-SingleSource": - { - T3SingleSourceProcessor processor = new T3SingleSourceProcessor(_db, _googleSheetValues, this); - processor.process(processWorker); - break; - } - case "T4-SingleSource": - { - T4SingleSourceProcessor processor = new T4SingleSourceProcessor(_db, _googleSheetValues, this); - processor.process(processWorker); - break; - } - case "T3-MultiSourceSummary": - { - T3MultiSourceSummaryProcessor processor = - new T3MultiSourceSummaryProcessor(_db, _googleSheetValues, this, _logsController); - processor.process(processWorker); - break; - } - case "T3-MultiSourceCopySelectedCodes": - { - T3MultiSourceCopySelectedCodesProcessor processor = - new T3MultiSourceCopySelectedCodesProcessor(_db, _googleSheetValues, this); - processor.process(processWorker); - break; - } - } - _logsController.AddEntry(new LogEntry { - Title = $"{processWorker.Name}, {processWorker.Id}", - Type = LogEntryType.info, - LogType = LogType.process, - Message = "Success", + Title = "Process error", + Type = LogEntryType.error, + LogType = LogType.import, + Message = e.ToString(), CreatedAt = DateTime.UtcNow }); - } - - internal void SaveRecords(Guid id, ICollection records, Guid currentUserId) - { - List toDelete = _db.Records.Where(x => x.LayerId == id).ToList(); - if (toDelete.Count > 0) - { - _db.Records.RemoveRange(toDelete); - } - - foreach (Record record in records) - { - record.CreatedById = currentUserId; - record.CreatedAt = DateTime.UtcNow; - record.ModifiedById = currentUserId; - record.ModifiedAt = DateTime.UtcNow; - record.LayerId = id; - _db.Records.Add(record); - } - } - - private void WriteToConsole(params string[] messages) - { - foreach (var message in messages) - { - Console.WriteLine($"DiunaLog: {message}"); - } - } - - private bool IsImportedLayerUpToDate(Layer importWorker) - { - if (_googleSheetValues is null) - { - throw new Exception("Google Sheets API not initialized"); - } - - var newestLayer = _db.Layers - .Include(x => x.Records) - .Where(x => x.ParentId == importWorker.Id) - .OrderByDescending(x => x.CreatedAt) - .FirstOrDefault(); - - if (newestLayer is null) - { - return true; // importWorker is not active yet, no check needed - } - - var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; - if (sheetId == null) - { - throw new Exception($"SheetId not found, {importWorker.Name}"); - } - - var sheetTabName = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetTabName")?.Desc1; - if (sheetTabName == null) - { - throw new Exception($"SheetTabName not found, {importWorker.Name}"); - } - - var dataRange = importWorker.Records!.FirstOrDefault(x => x.Code == "DataRange")?.Desc1; - if (dataRange == null) - { - throw new Exception($"DataRange not found, {importWorker.Name}"); - } - - var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); - var data = dataRangeResponse.Values; - - var isUpToDate = true; - - for (var i = 0; i < data[1].Count; i++) - { - if (data[0][i].ToString() == "") continue; - var record = newestLayer.Records!.FirstOrDefault(x => x.Code == data[0][i].ToString()); - if (record == null) - { - WriteToConsole("Code not found in DiunaBI", data[0][i].ToString()!); - isUpToDate = false; - continue; - } - - if ((!double.TryParse(data[1][i].ToString(), CultureInfo.GetCultureInfo("pl-PL"), - out var value) || - double.Abs((double)(record.Value1-value)!) > 0.01)) continue; - WriteToConsole( - $"Code: {data[0][i]}. DiunaBI: {record.Value1:N2}. GoogleSheet: {data[1][i]}"); - isUpToDate = false; - } - foreach (var record in newestLayer.Records!) - { - if (data[0].Contains(record.Code)) - { - continue; - } - - WriteToConsole($"Code not found in GoogleSheet: {record.Code}"); - isUpToDate = false; - } - return isUpToDate; + return BadRequest(e.ToString()); } } + + [HttpGet] + [Route("AutoProcess/{apiKey}")] + [AllowAnonymous] + public IActionResult AutoProcess(string apiKey) + { + if (Request.Host.Value != _configuration["apiLocalUrl"] || apiKey != _configuration["apiKey"]) + { + return Unauthorized(); + } + + if (_googleSheetValues is null) + { + throw new Exception("Google Sheets API not initialized"); + } + + string[] processTypes = + { + "T3-SingleSource", + "T3-SourceYearSummary", + "T3-MultiSourceSummary", // AA + "T3-MultiSourceYearSummary", // AA/13 + "T4-SingleSource", + "T1-R1", + "T4-R2" + }; + + foreach (var type in processTypes) + { + try + { + _logsController.AddEntry(new LogEntry + { + Title = $"Processing: {type}", + Type = LogEntryType.info, + LogType = LogType.process, + CreatedAt = DateTime.UtcNow + }); + + var processWorkerLayers = _db.Layers + .Include(x => x.Records) + .Where(x => + x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ProcessWorker") && + x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") && + x.Records!.Any(y => y.Code == "ProcessType" && y.Desc1 == type) + ) + .OrderBy(x => x.CreatedAt) + .ToList(); + + if (!processWorkerLayers.Any()) + { + _logsController.AddEntry(new LogEntry + { + Title = "No Layers to process.", + Type = LogEntryType.info, + LogType = LogType.process, + CreatedAt = DateTime.UtcNow + }); + } + + foreach (var processWorker in processWorkerLayers) + { + try + { + ProcessLayer(processWorker); + } + catch (Exception e) + { + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.error, + LogType = LogType.process, + Message = e.ToString(), + CreatedAt = DateTime.UtcNow + }); + } + } + } + catch (Exception e) + { + _logsController.AddEntry(new LogEntry + { + Title = "Process error", + Type = LogEntryType.error, + LogType = LogType.process, + Message = e.ToString(), + CreatedAt = DateTime.UtcNow + }); + } + } + + return Ok(); + } + + private void ProcessLayer(Layer processWorker) + { + if (_googleSheetValues == null) + { + throw new Exception("Google Sheets API not initialized"); + } + + var year = processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1; + if (year == null) + { + throw new Exception("Year record nod found"); + } + + var processType = processWorker.Records?.SingleOrDefault(x => x.Code == "ProcessType")?.Desc1; + switch (processType) + { + case null: + throw new Exception("ProcessType record not found"); + case "T3-SourceYearSummary": + { + var processor = + new T3SourceYearSummaryProcessor(_db, _googleSheetValues, this); + processor.process(processWorker); + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + return; + } + case "T3-MultiSourceYearSummary": + { + var processor = + new T3MultiSourceYearSummaryProcessor(_db, _googleSheetValues, this, _logsController); + processor.process(processWorker); + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + return; + } + case "T3-MultiSourceCopySelectedCodesYearSummary": + { + var processor = + new T3MultiSourceCopySelectedCodesYearSummaryProcessor(_db, _googleSheetValues, this); + processor.process(processWorker); + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + return; + } + case "T1-R1": + { + var processor = new T1R1Processor(_db, _googleSheetValues, this, _logsController); + processor.process(processWorker); + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + return; + } + case "T4-R2": + { + var processor = new T4R2Processor(_db, _googleSheetValues, this, _logsController); + processor.Process(processWorker); + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + return; + } + } + + var month = processWorker.Records?.SingleOrDefault(x => x.Code == "Month")?.Desc1; + if (month == null) + { + throw new Exception("Month record not found"); + } + + switch (processType!) + { + case "T3-SingleSource": + var t3SingleSource = new T3SingleSourceProcessor(_db, _googleSheetValues, this); + { + t3SingleSource.process(processWorker); + break; + } + case "T4-SingleSource": + { + var t4SingleSource = new T4SingleSourceProcessor(_db, _googleSheetValues, this); + t4SingleSource.process(processWorker); + break; + } + case "T3-MultiSourceSummary": + { + var t3MultiSourceSummary = + new T3MultiSourceSummaryProcessor(_db, _googleSheetValues, this, _logsController); + t3MultiSourceSummary.process(processWorker); + break; + } + case "T3-MultiSourceCopySelectedCodes": + { + var t3MultiSourceCopySelectedCode = + new T3MultiSourceCopySelectedCodesProcessor(_db, _googleSheetValues, this); + t3MultiSourceCopySelectedCode.process(processWorker); + break; + } + } + + _logsController.AddEntry(new LogEntry + { + Title = $"{processWorker.Name}, {processWorker.Id}", + Type = LogEntryType.info, + LogType = LogType.process, + Message = "Success", + CreatedAt = DateTime.UtcNow + }); + } + + internal void SaveRecords(Guid id, ICollection records, Guid currentUserId) + { + var toDelete = _db.Records.Where(x => x.LayerId == id).ToList(); + if (toDelete.Count > 0) + { + _db.Records.RemoveRange(toDelete); + } + + foreach (var record in records) + { + record.CreatedById = currentUserId; + record.CreatedAt = DateTime.UtcNow; + record.ModifiedById = currentUserId; + record.ModifiedAt = DateTime.UtcNow; + record.LayerId = id; + _db.Records.Add(record); + } + } + + private static void WriteToConsole(params string[] messages) + { + foreach (var message in messages) + { + Console.WriteLine($"DiunaLog: {message}"); + } + } + + private bool IsImportedLayerUpToDate(Layer importWorker) + { + if (_googleSheetValues is null) + { + throw new Exception("Google Sheets API not initialized"); + } + + var newestLayer = _db.Layers + .Include(x => x.Records) + .Where(x => x.ParentId == importWorker.Id) + .OrderByDescending(x => x.CreatedAt) + .FirstOrDefault(); + + if (newestLayer is null) + { + return true; // importWorker is not active yet, no check needed + } + + var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; + if (sheetId == null) + { + throw new Exception($"SheetId not found, {importWorker.Name}"); + } + + var sheetTabName = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetTabName")?.Desc1; + if (sheetTabName == null) + { + throw new Exception($"SheetTabName not found, {importWorker.Name}"); + } + + var dataRange = importWorker.Records!.FirstOrDefault(x => x.Code == "DataRange")?.Desc1; + if (dataRange == null) + { + throw new Exception($"DataRange not found, {importWorker.Name}"); + } + + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var data = dataRangeResponse.Values; + + var isUpToDate = true; + + for (var i = 0; i < data[1].Count; i++) + { + if (data[0][i].ToString() == "") continue; + var record = newestLayer.Records!.FirstOrDefault(x => x.Code == data[0][i].ToString()); + if (record == null) + { + WriteToConsole("Code not found in DiunaBI", data[0][i].ToString()!); + isUpToDate = false; + continue; + } + + if (!double.TryParse(data[1][i].ToString(), CultureInfo.GetCultureInfo("pl-PL"), + out var value) || + double.Abs((double)(record.Value1-value)!) > 0.01) continue; + WriteToConsole( + $"Code: {data[0][i]}. DiunaBI: {record.Value1:N2}. GoogleSheet: {data[1][i]}"); + isUpToDate = false; + } + foreach (var record in newestLayer.Records!) + { + if (data[0].Contains(record.Code)) + { + continue; + } + + WriteToConsole($"Code not found in GoogleSheet: {record.Code}"); + isUpToDate = false; + } + return isUpToDate; + } } \ No newline at end of file diff --git a/WebAPI/Controllers/LogsController.cs b/WebAPI/Controllers/LogsController.cs index d96e7ba..df0cc4c 100644 --- a/WebAPI/Controllers/LogsController.cs +++ b/WebAPI/Controllers/LogsController.cs @@ -2,72 +2,58 @@ using System.Globalization; using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; using WebAPI.Models; -namespace WebAPI.Controllers +namespace WebAPI.Controllers; + +public class LogsController : Controller { - public class LogsController : Controller + private readonly SpreadsheetsResource.ValuesResource? _googleSheetValues; + private readonly IConfiguration _configuration; + public LogsController( + GoogleSheetsHelper googleSheetsHelper, + IConfiguration configuration) { - private SpreadsheetsResource.ValuesResource? googleSheetValues; - private GoogleDriveHelper googleDriveHelper; - private readonly IConfiguration configuration; - public LogsController( - GoogleSheetsHelper _googleSheetsHelper, - GoogleDriveHelper _googleDriveHelper, - IConfiguration _configuration) - { - if (_googleSheetsHelper.Service is not null) { - googleSheetValues = _googleSheetsHelper.Service.Spreadsheets.Values; - } - googleDriveHelper = _googleDriveHelper; - configuration = _configuration; + if (googleSheetsHelper.Service is not null) { + _googleSheetValues = googleSheetsHelper.Service.Spreadsheets.Values; + } + _configuration = configuration; + } + + public void AddEntry(LogEntry entry) + { + if (_googleSheetValues is null) { + throw new Exception("Google Sheets API not initialized"); } - public void AddEntry(LogEntry entry) + var type = entry.LogType switch { - if (googleSheetValues is null) { - throw new Exception("Google Sheets API not initialized"); - } - String type; - switch (entry.LogType) { - case LogType.import: - type = "Import"; - break; - case LogType.backup: - type = "Backup"; - break; - case LogType.process: - type = "Process"; - break; - case LogType.powerBI: - type = "PowerBIAccess"; - break; - default: - type = "Other"; // should never happen - break; - } - var response = googleSheetValues.Get(configuration["appLogsFile"], $"{type}!A:A").Execute(); - var data = response.Values; - int row = 1; - if (data != null) { - row = data.Count + 1; - } - var range = $"{type}!A{row}:D{row}"; - - List logRow = new List - { - entry.CreatedAt.ToString(new CultureInfo("pl-PL")), - entry.Type.ToString(), - entry.Title!, - entry.Message! - }; - - ValueRange valueRange = new ValueRange() { Values = new IList[] { logRow }}; - - var updateRequest = googleSheetValues.Update(valueRange, configuration["appLogsFile"], range); - updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; - updateRequest.Execute(); + LogType.import => "Import", + LogType.backup => "Backup", + LogType.process => "Process", + LogType.powerBI => "PowerBIAccess", + _ => "Other" + }; + var response = _googleSheetValues.Get(_configuration["appLogsFile"], $"{type}!A:A").Execute(); + var data = response.Values; + var row = 1; + if (data != null) { + row = data.Count + 1; } + var range = $"{type}!A{row}:D{row}"; + + var logRow = new List + { + entry.CreatedAt.ToString(new CultureInfo("pl-PL")), + entry.Type.ToString(), + entry.Title!, + entry.Message! + }; + + var valueRange = new ValueRange { Values = new IList[] { logRow }}; + + var updateRequest = _googleSheetValues.Update(valueRange, _configuration["appLogsFile"], range); + updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; + updateRequest.Execute(); } } \ No newline at end of file diff --git a/WebAPI/Controllers/PingController.cs b/WebAPI/Controllers/PingController.cs index 2d8ff70..d50f2c0 100644 --- a/WebAPI/Controllers/PingController.cs +++ b/WebAPI/Controllers/PingController.cs @@ -1,26 +1,25 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace WebAPI.Controllers -{ - [ApiController] - [Route("api/[controller]")] - [Authorize] - public class PingController : Controller - { - private readonly IConfiguration _configuration; - public PingController( - IConfiguration configuration) - { - _configuration = configuration; - } +namespace WebAPI.Controllers; - [HttpGet] - [Route("Ping")] - [AllowAnonymous] - public IActionResult Ping() - { - return Ok(_configuration["PONG"]); - } +[ApiController] +[Route("api/[controller]")] +[Authorize] +public class PingController : Controller +{ + private readonly IConfiguration _configuration; + public PingController( + IConfiguration configuration) + { + _configuration = configuration; + } + + [HttpGet] + [Route("Ping")] + [AllowAnonymous] + public IActionResult Ping() + { + return Ok(_configuration["PONG"]); } } \ No newline at end of file diff --git a/WebAPI/Exports/googleSheet.export.cs b/WebAPI/Exports/googleSheet.export.cs index ed94859..fa1ef72 100644 --- a/WebAPI/Exports/googleSheet.export.cs +++ b/WebAPI/Exports/googleSheet.export.cs @@ -1,99 +1,121 @@ using System.Globalization; -using Google.Apis.Drive.v3.Data; using Google.Apis.Sheets.v4; using Google.Apis.Sheets.v4.Data; using WebAPI.Models; -using static Google.Apis.Drive.v3.FilesResource; -namespace WebAPI.Exports +namespace WebAPI.Exports; + +public class GoogleSheetExport { - public class googleSheetExport + private readonly GoogleDriveHelper _googleDriveHelper; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + private readonly IConfiguration _configuration; + public GoogleSheetExport( + GoogleDriveHelper googleDriveHelper, + SpreadsheetsResource.ValuesResource googleSheetValues, + IConfiguration configuration) { - private GoogleDriveHelper googleDriveHelper; - private SpreadsheetsResource.ValuesResource googleSheetValues; - private readonly IConfiguration configuration; - public googleSheetExport( - GoogleDriveHelper _googleDriveHelper, - SpreadsheetsResource.ValuesResource _googleSheetValues, - IConfiguration _configuration) + _googleDriveHelper = googleDriveHelper; + _googleSheetValues = googleSheetValues; + _configuration = configuration; + } + public void Export(Layer layer) + { + if (_googleDriveHelper.Service is null) { - googleDriveHelper = _googleDriveHelper; - googleSheetValues = _googleSheetValues; - configuration = _configuration; + throw new Exception("Google Drive API not initialized"); } - public void export(Layer layer) + try { - if (googleDriveHelper.Service is null) - { - throw new Exception("Google Drive API not initialized"); - } - try - { - List> data = new List>() { new List() { layer.Name! } }; - - switch (layer.Type) + var data = new List> { new List { layer.Name! } }; + + switch (layer.Type) + { + case LayerType.import: { - case LayerType.import: - { - data.Add(new List { "Code", "Value1" }); - foreach (Record record in layer.Records!) - { - data.Add(new List { record.Code!, record.Value1! }); - } - break; - } - case LayerType.administration: - { - data.Add(new List { "Code", "Desc1"}); - foreach (Record record in layer.Records!) - { - data.Add(new List { record.Code!, record.Desc1!}); - } - break; - } - 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"}); - - foreach (Record record in layer.Records!) - { - data.Add(new List { record.Code!, record.Value1!, record.Value2!, record.Value3!, record.Value4!, - record.Value5!, record.Value6!, record.Value7!, record.Value8!, record.Value9!, record.Value10!, - record.Value11!, record.Value12!, record.Value13!, record.Value14!, record.Value15!, record.Value16!, - record.Value17!, record.Value18!, record.Value19!, record.Value20!, record.Value21!, record.Value22!, - record.Value23!, record.Value24!, record.Value25!, record.Value26!, record.Value27!, record.Value28!, - record.Value29!, record.Value30!, record.Value31!, record.Value32!}); - } - break; - } + 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.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"}); - Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File(); - body.Name = $"{DateTime.Now.ToString(new CultureInfo("pl-PL"))}"; - body.MimeType = "application/vnd.google-apps.spreadsheet"; - body.Parents = new List { configuration["exportDirectory"] }; - CreateRequest request = googleDriveHelper.Service.Files.Create(body); - var file = request.Execute(); - - string sheetId = file.Id; - var range = $"Sheet1!A1:AG${data.Count}"; - - ValueRange valueRange = new ValueRange() { Values = data}; - - var updateRequest = googleSheetValues.Update(valueRange, sheetId, range); - updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; - updateRequest.Execute(); - - } catch (Exception e) - { - Console.WriteLine(e.ToString()); + data.AddRange(layer.Records!.Select(record => new List + { + record.Code!, + record.Value1!, + record.Value2!, + record.Value3!, + record.Value4!, + record.Value5!, + record.Value6!, + record.Value7!, + record.Value8!, + record.Value9!, + record.Value10!, + record.Value11!, + record.Value12!, + record.Value13!, + record.Value14!, + record.Value15!, + record.Value16!, + record.Value17!, + record.Value18!, + record.Value19!, + record.Value20!, + record.Value21!, + record.Value22!, + record.Value23!, + record.Value24!, + record.Value25!, + record.Value26!, + record.Value27!, + record.Value28!, + record.Value29!, + record.Value30!, + record.Value31!, + record.Value32! + })); + break; + } + default: + throw new Exception("Wrong LayerType"); } + + var body = new Google.Apis.Drive.v3.Data.File + { + Name = $"{DateTime.Now.ToString(new CultureInfo("pl-PL"))}", + MimeType = "application/vnd.google-apps.spreadsheet", + Parents = new List { _configuration["exportDirectory"] } + }; + var request = _googleDriveHelper.Service.Files.Create(body); + var file = request.Execute(); + + var sheetId = file.Id; + var range = $"Sheet1!A1:AG${data.Count}"; + + var valueRange = new ValueRange { Values = data}; + + var updateRequest = _googleSheetValues.Update(valueRange, sheetId, range); + updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; + updateRequest.Execute(); + + } catch (Exception e) + { + Console.WriteLine(e.ToString()); } } -} +} \ No newline at end of file diff --git a/WebAPI/GoogleDriveHelper.cs b/WebAPI/GoogleDriveHelper.cs index 580338e..4e2d3b4 100644 --- a/WebAPI/GoogleDriveHelper.cs +++ b/WebAPI/GoogleDriveHelper.cs @@ -6,7 +6,7 @@ namespace WebAPI; public class GoogleDriveHelper { - public DriveService? Service { get; set; } + public DriveService? Service { get; private set; } private const string ApplicationName = "Diuna"; private static readonly string[] Scopes = { DriveService.Scope.Drive }; public GoogleDriveHelper() diff --git a/WebAPI/Models/Record.cs b/WebAPI/Models/Record.cs index ccbf766..dc085c9 100644 --- a/WebAPI/Models/Record.cs +++ b/WebAPI/Models/Record.cs @@ -1,64 +1,70 @@ using System.ComponentModel.DataAnnotations; -namespace WebAPI.Models +namespace WebAPI.Models; + +public class Record { - public class Record - { - #region Properties - [Key] - public Guid Id { get; set; } - [Required] - public string? Code { get; set; } - public double? Value1 { get; set; } - public double? Value2 { get; set; } - public double? Value3 { get; set; } - public double? Value4 { get; set; } - public double? Value5 { get; set; } - public double? Value6 { get; set; } - public double? Value7 { get; set; } - public double? Value8 { get; set; } - public double? Value9 { get; set; } - public double? Value10 { get; set; } - public double? Value11 { get; set; } - public double? Value12 { get; set; } - public double? Value13 { get; set; } - public double? Value14 { get; set; } - public double? Value15 { get; set; } - public double? Value16 { get; set; } - public double? Value17 { get; set; } - public double? Value18 { get; set; } - public double? Value19 { get; set; } - public double? Value20 { get; set; } - public double? Value21 { get; set; } - public double? Value22 { get; set; } - public double? Value23 { get; set; } - public double? Value24 { get; set; } - public double? Value25 { get; set; } - public double? Value26 { get; set; } - public double? Value27 { get; set; } - public double? Value28 { get; set; } - public double? Value29 { get; set; } - public double? Value30 { get; set; } - public double? Value31 { get; set; } - public double? Value32 { get; set; } - //Description fields - public string? Desc1 { get; set; } - public string? Desc2 { get; set; } - public string? Desc3 { get; set; } - public string? Desc4 { get; set; } - public string? Desc5 { get; set; } - public DateTime CreatedAt { get; set; } - public DateTime ModifiedAt { get; set; } - public bool IsDeleted { get; set; } - #endregion - #region Relations - [Required] - public Guid CreatedById { get; set; } - public User? CreatedBy { get; set; } - [Required] - public Guid ModifiedById { get; set; } - public User? ModifiedBy { get; set; } - public Guid LayerId { get; set; } - #endregion - } -} + #region Properties + [Key] + public Guid Id { get; set; } + [Required] + [StringLength(50)] + public string? Code { get; set; } + public double? Value1 { get; set; } + public double? Value2 { get; set; } + public double? Value3 { get; set; } + public double? Value4 { get; set; } + public double? Value5 { get; set; } + public double? Value6 { get; set; } + public double? Value7 { get; set; } + public double? Value8 { get; set; } + public double? Value9 { get; set; } + public double? Value10 { get; set; } + public double? Value11 { get; set; } + public double? Value12 { get; set; } + public double? Value13 { get; set; } + public double? Value14 { get; set; } + public double? Value15 { get; set; } + public double? Value16 { get; set; } + public double? Value17 { get; set; } + public double? Value18 { get; set; } + public double? Value19 { get; set; } + public double? Value20 { get; set; } + public double? Value21 { get; set; } + public double? Value22 { get; set; } + public double? Value23 { get; set; } + public double? Value24 { get; set; } + public double? Value25 { get; set; } + public double? Value26 { get; set; } + public double? Value27 { get; set; } + public double? Value28 { get; set; } + public double? Value29 { get; set; } + public double? Value30 { get; set; } + public double? Value31 { get; set; } + public double? Value32 { get; set; } + //Description fields + [StringLength(50)] + public string? Desc1 { get; set; } + [StringLength(50)] + public string? Desc2 { get; set; } + [StringLength(50)] + public string? Desc3 { get; set; } + [StringLength(50)] + public string? Desc4 { get; set; } + [StringLength(50)] + public string? Desc5 { get; set; } + [StringLength(50)] + public DateTime CreatedAt { get; set; } + public DateTime ModifiedAt { get; set; } + public bool IsDeleted { get; init; } + #endregion + #region Relations + [Required] + public Guid CreatedById { get; set; } + public User? CreatedBy { get; init; } + [Required] + public Guid ModifiedById { get; set; } + public User? ModifiedBy { get; init; } + public Guid LayerId { get; set; } + #endregion +} \ No newline at end of file diff --git a/WebAPI/Models/User.cs b/WebAPI/Models/User.cs index cf3ccfc..fc795d7 100644 --- a/WebAPI/Models/User.cs +++ b/WebAPI/Models/User.cs @@ -1,16 +1,16 @@ using System.ComponentModel.DataAnnotations; -namespace WebAPI.Models +namespace WebAPI.Models; + +public class User { - public class User - { - #region Properties - [Key] - public Guid Id { get; set; } - public string? Email { get; set; } - [StringLength(50)] - public string? UserName { get; set; } - public DateTime CreatedAt { get; set; } - #endregion - } -} + #region Properties + [Key] + public Guid Id { get; init; } + [StringLength(50)] + public string? Email { get; init; } + [StringLength(50)] + public string? UserName { get; init; } + public DateTime CreatedAt { get; init; } + #endregion +} \ No newline at end of file diff --git a/WebAPI/dataImporters/morska.fk2.importer.cs b/WebAPI/dataImporters/morska.fk2.importer.cs index 5fb70f8..d232c38 100644 --- a/WebAPI/dataImporters/morska.fk2.importer.cs +++ b/WebAPI/dataImporters/morska.fk2.importer.cs @@ -1,136 +1,127 @@ -using System; -using System.Globalization; +using System.Globalization; using Google.Apis.Sheets.v4; using WebAPI; using WebAPI.Controllers; using WebAPI.Models; -namespace DiunaBIWebAPI.dataImporters +namespace DiunaBIWebAPI.dataImporters; + +public class MorskaFk2Importer { - public class MorskaFk2Importer - { - private readonly AppDbContext db; - private readonly SpreadsheetsResource.ValuesResource googleSheetValues; - private readonly LayersController controller; + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + private readonly LayersController _controller; - public MorskaFk2Importer( - AppDbContext _db, - SpreadsheetsResource.ValuesResource _googleSheetValues, - LayersController _controller) - { - db = _db; - googleSheetValues = _googleSheetValues; - controller = _controller; - } + public MorskaFk2Importer( + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues, + LayersController controller) + { + _db = db; + _googleSheetValues = googleSheetValues; + _controller = controller; + } - public void import(Layer importWorker) - { - string? sheetId = importWorker.Records!.Where(x => x.Code == "SheetId").FirstOrDefault()?.Desc1; - if (sheetId == null) + public void Import(Layer importWorker) + { + var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; + if (sheetId == null) + { + throw new Exception($"SheetId not found, {importWorker.Name}"); + } + var sheetTabName = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetTabName")?.Desc1; + if (sheetTabName == null) + { + throw new Exception($"SheetTabName not found, {importWorker.Name}"); + } + var importYearCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1; + if (importYearCell == null) + { + throw new Exception($"ImportYear not found, {importWorker.Name}"); + } + var importMonthCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportMonth")?.Desc1; + if (importMonthCell == null) + { + throw new Exception($"ImportMonth not found, {importWorker.Name}"); + } + var importNameCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportName")?.Desc1; + if (importNameCell == null) + { + throw new Exception($"ImportName not found, {importWorker.Name}"); + } + var checkSumCell = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; + if (checkSumCell == null) + { + throw new Exception($"SheetId not found, {importWorker.Name}"); + } + var dataRange = importWorker.Records!.FirstOrDefault(x => x.Code == "DataRange")?.Desc1; + if (dataRange == null) + { + throw new Exception($"DataRange not found, {importWorker.Name}"); + } + + var nameResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importNameCell}:{importNameCell}").Execute(); + var name = nameResponse.Values?[0][0].ToString(); + if (name == null) + { + throw new Exception($"ImportName cell is empty, {importWorker.Name}"); + } + var yearResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importYearCell}:{importYearCell}").Execute(); + var year = yearResponse.Values[0][0].ToString(); + if (year == null) + { + throw new Exception($"ImportYear cell is empty, {importWorker.Name}"); + } + var monthResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importMonthCell}:{importMonthCell}").Execute(); + var month = monthResponse.Values[0][0].ToString(); + if (month == null) + { + throw new Exception($"ImportMonth cell is empty, {importWorker.Name}"); + } + var layer = new Layer + { + Source = "GoogleSheet", + Number = _db.Layers.Count() + 1, + ParentId = importWorker.Id, + Type = LayerType.import, + CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + CreatedAt = DateTime.UtcNow, + ModifiedAt = DateTime.UtcNow + }; + layer.Name = $"L{layer.Number}-I-{name}2-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; + + var newRecords = new List(); + + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var data = dataRangeResponse.Values; + for (var i = 0; i < data.Count; i++) + { + if (data[i].Count <= 8 || (string)data[i][2] == string.Empty) continue; + var dateArr = data[i][0].ToString()!.Split("."); + if (dateArr.Length != 3) { - throw new Exception($"SheetId not found, {importWorker.Name}"); - } - string? sheetTabName = importWorker.Records!.Where(x => x.Code == "SheetTabName").FirstOrDefault()?.Desc1; - if (sheetTabName == null) - { - throw new Exception($"SheetTabName not found, {importWorker.Name}"); - } - string? importYearCell = importWorker.Records!.Where(x => x.Code == "ImportYear").FirstOrDefault()?.Desc1; - if (importYearCell == null) - { - throw new Exception($"ImportYear not found, {importWorker.Name}"); - } - string? importMonthCell = importWorker.Records!.Where(x => x.Code == "ImportMonth").FirstOrDefault()?.Desc1; - if (importMonthCell == null) - { - throw new Exception($"ImportMonth not found, {importWorker.Name}"); - } - string? importNameCell = importWorker.Records!.Where(x => x.Code == "ImportName").FirstOrDefault()?.Desc1; - if (importNameCell == null) - { - throw new Exception($"ImportName not found, {importWorker.Name}"); - } - string? checkSumCell = importWorker.Records!.Where(x => x.Code == "SheetId").FirstOrDefault()?.Desc1; - if (checkSumCell == null) - { - throw new Exception($"SheetId not found, {importWorker.Name}"); - } - string? dataRange = importWorker.Records!.Where(x => x.Code == "DataRange").FirstOrDefault()?.Desc1; - if (dataRange == null) - { - throw new Exception($"DataRange not found, {importWorker.Name}"); + throw new Exception($"Invalid date in row {i}"); } - var nameResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importNameCell}:{importNameCell}").Execute(); - string? name = nameResponse.Values?[0][0].ToString(); - if (name == null) + var number = data[i][1].ToString()!; + if (number.Length == 1) number = $"0{number}"; + var code = dateArr[2] + dateArr[1] + dateArr[0] + number; + if (!(data[i][8].ToString()?.Length > 0) || + !double.TryParse(data[i][8].ToString(), CultureInfo.GetCultureInfo("pl-PL"), out var value)) continue; + var record = new Record { - throw new Exception($"ImportName cell is empty, {importWorker.Name}"); - } - var yearResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importYearCell}:{importYearCell}").Execute(); - string? year = yearResponse.Values[0][0].ToString(); - if (year == null) - { - throw new Exception($"ImportYear cell is empty, {importWorker.Name}"); - } - var monthResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importMonthCell}:{importMonthCell}").Execute(); - string? month = monthResponse.Values[0][0].ToString(); - if (month == null) - { - throw new Exception($"ImportMonth cell is empty, {importWorker.Name}"); - } - Layer layer = new Layer - { - Source = "GoogleSheet", - Number = db.Layers.Count() + 1, - ParentId = importWorker.Id, - Type = LayerType.import, - CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), - ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + Id = Guid.NewGuid(), + Code = code, + Desc1 = data[i][2].ToString(), + Value1 = value, CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow }; - layer.Name = $"L{layer.Number}-I-{name}2-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm", CultureInfo.InvariantCulture)}"; - - List newRecords = new List(); - - var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); - var data = dataRangeResponse.Values; - for (int i = 0; i < data.Count; i++) - { - if (data[i].Count > 8 && (string)data[i][2] != String.Empty) - { - string[] dateArr = data[i][0].ToString()!.Split("."); - if (dateArr.Length != 3) - { - throw new Exception($"Invalid date in row {i}"); - } - - string number = data[i][1].ToString()!; - if (number.Length == 1) number = $"0{number}"; - string code = dateArr[2] + dateArr[1] + dateArr[0] + number; - double value; - if ( - data[i][8].ToString()?.Length > 0 && - double.TryParse(data[i][8].ToString(), CultureInfo.GetCultureInfo("pl-PL"), out value)) - { - Record record = new Record - { - Id = Guid.NewGuid(), - Code = code, - Desc1 = data[i][2].ToString(), - Value1 = value, - CreatedAt = DateTime.UtcNow, - ModifiedAt = DateTime.UtcNow - }; - newRecords.Add(record); - }; - } - } - db.Layers.Add(layer); - controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + newRecords.Add(record); } - } -} - + _db.Layers.Add(layer); + _controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); + _db.SaveChanges(); + } +} \ No newline at end of file diff --git a/WebAPI/dataImporters/morska.importer.cs b/WebAPI/dataImporters/morska.importer.cs index 6344674..34c02d9 100644 --- a/WebAPI/dataImporters/morska.importer.cs +++ b/WebAPI/dataImporters/morska.importer.cs @@ -1,123 +1,116 @@ -using System; -using System.Globalization; +using System.Globalization; using Google.Apis.Sheets.v4; using WebAPI; using WebAPI.Controllers; using WebAPI.Models; -namespace DiunaBIWebAPI.dataImporters +namespace DiunaBIWebAPI.dataImporters; + +public class MorskaImporter { - public class MorskaImporter - { - private readonly AppDbContext db; - private readonly SpreadsheetsResource.ValuesResource googleSheetValues; - private readonly LayersController controller; + private readonly AppDbContext _db; + private readonly SpreadsheetsResource.ValuesResource _googleSheetValues; + private readonly LayersController _controller; - public MorskaImporter( - AppDbContext _db, - SpreadsheetsResource.ValuesResource _googleSheetValues, - LayersController _controller) - { - db = _db; - googleSheetValues = _googleSheetValues; - controller = _controller; - } + public MorskaImporter( + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues, + LayersController controller) + { + _db = db; + _googleSheetValues = googleSheetValues; + _controller = controller; + } - public void import(Layer importWorker) - { - string? sheetId = importWorker.Records!.Where(x => x.Code == "SheetId").FirstOrDefault()?.Desc1; - if (sheetId == null) - { - throw new Exception($"SheetId not found, {importWorker.Name}"); - } - string? sheetTabName = importWorker.Records!.Where(x => x.Code == "SheetTabName").FirstOrDefault()?.Desc1; - if (sheetTabName == null) - { - throw new Exception($"SheetTabName not found, {importWorker.Name}"); - } - string? importYearCell = importWorker.Records!.Where(x => x.Code == "ImportYear").FirstOrDefault()?.Desc1; - if (importYearCell == null) - { - throw new Exception($"ImportYear not found, {importWorker.Name}"); - } - string? importMonthCell = importWorker.Records!.Where(x => x.Code == "ImportMonth").FirstOrDefault()?.Desc1; - if (importMonthCell == null) - { - throw new Exception($"ImportMonth not found, {importWorker.Name}"); - } - string? importNameCell = importWorker.Records!.Where(x => x.Code == "ImportName").FirstOrDefault()?.Desc1; - if (importNameCell == null) - { - throw new Exception($"ImportName not found, {importWorker.Name}"); - } - string? checkSumCell = importWorker.Records!.Where(x => x.Code == "SheetId").FirstOrDefault()?.Desc1; - if (checkSumCell == null) - { - throw new Exception($"SheetId not found, {importWorker.Name}"); - } - string? dataRange = importWorker.Records!.Where(x => x.Code == "DataRange").FirstOrDefault()?.Desc1; - if (dataRange == null) - { - throw new Exception($"DataRange not found, {importWorker.Name}"); - } + public void Import(Layer importWorker) + { + var sheetId = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; + if (sheetId == null) + { + throw new Exception($"SheetId not found, {importWorker.Name}"); + } + var sheetTabName = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetTabName")?.Desc1; + if (sheetTabName == null) + { + throw new Exception($"SheetTabName not found, {importWorker.Name}"); + } + var importYearCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportYear")?.Desc1; + if (importYearCell == null) + { + throw new Exception($"ImportYear not found, {importWorker.Name}"); + } + var importMonthCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportMonth")?.Desc1; + if (importMonthCell == null) + { + throw new Exception($"ImportMonth not found, {importWorker.Name}"); + } + var importNameCell = importWorker.Records!.FirstOrDefault(x => x.Code == "ImportName")?.Desc1; + if (importNameCell == null) + { + throw new Exception($"ImportName not found, {importWorker.Name}"); + } + var checkSumCell = importWorker.Records!.FirstOrDefault(x => x.Code == "SheetId")?.Desc1; + if (checkSumCell == null) + { + throw new Exception($"SheetId not found, {importWorker.Name}"); + } + var dataRange = importWorker.Records!.FirstOrDefault(x => x.Code == "DataRange")?.Desc1; + if (dataRange == null) + { + throw new Exception($"DataRange not found, {importWorker.Name}"); + } - var nameResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importNameCell}:{importNameCell}").Execute(); - string? name = nameResponse.Values?[0][0].ToString(); - if (name == null) + var nameResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importNameCell}:{importNameCell}").Execute(); + var name = nameResponse.Values?[0][0].ToString(); + if (name == null) + { + throw new Exception($"ImportName cell is empty, {importWorker.Name}"); + } + var yearResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importYearCell}:{importYearCell}").Execute(); + var year = yearResponse.Values[0][0].ToString(); + if (year == null) + { + throw new Exception($"ImportYear cell is empty, {importWorker.Name}"); + } + var monthResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{importMonthCell}:{importMonthCell}").Execute(); + var month = monthResponse.Values[0][0].ToString(); + if (month == null) + { + throw new Exception($"ImportMonth cell is empty, {importWorker.Name}"); + } + var layer = new Layer + { + Source = "GoogleSheet", + Number = _db.Layers.Count() + 1, + ParentId = importWorker.Id, + Type = LayerType.import, + CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + CreatedAt = DateTime.UtcNow, + ModifiedAt = DateTime.UtcNow + }; + layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now:yyyyMMddHHmm}"; + + var newRecords = new List(); + + var dataRangeResponse = _googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); + var data = dataRangeResponse.Values; + for (var i = 0; i < data[1].Count; i++) + { + if (!(data[0][i].ToString()?.Length > 0) || + !double.TryParse(data[1][i].ToString(), CultureInfo.GetCultureInfo("pl-PL"), out var value)) continue; + var record = new Record { - throw new Exception($"ImportName cell is empty, {importWorker.Name}"); - } - var yearResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importYearCell}:{importYearCell}").Execute(); - string? year = yearResponse.Values[0][0].ToString(); - if (year == null) - { - throw new Exception($"ImportYear cell is empty, {importWorker.Name}"); - } - var monthResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{importMonthCell}:{importMonthCell}").Execute(); - string? month = monthResponse.Values[0][0].ToString(); - if (month == null) - { - throw new Exception($"ImportMonth cell is empty, {importWorker.Name}"); - } - Layer layer = new Layer - { - Source = "GoogleSheet", - Number = db.Layers.Count() + 1, - ParentId = importWorker.Id, - Type = LayerType.import, - CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), - ModifiedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"), + Id = Guid.NewGuid(), + Code = data[0][i].ToString(), + Value1 = value, CreatedAt = DateTime.UtcNow, ModifiedAt = DateTime.UtcNow }; - layer.Name = $"L{layer.Number}-I-{name}-{year}/{month}-{DateTime.Now.ToString("yyyyMMddHHmm")}"; - - List newRecords = new List(); - - var dataRangeResponse = googleSheetValues.Get(sheetId, $"{sheetTabName}!{dataRange}").Execute(); - var data = dataRangeResponse.Values; - for (int i = 0; i < data[1].Count; i++) - { - double value; - if ( - data[0][i].ToString()?.Length > 0 && - double.TryParse(data[1][i].ToString(), CultureInfo.GetCultureInfo("pl-PL"), out value)) - { - Record record = new Record - { - Id = Guid.NewGuid(), - Code = data[0][i].ToString(), - Value1 = value, - CreatedAt = DateTime.UtcNow, - ModifiedAt = DateTime.UtcNow - }; - newRecords.Add(record); - }; - } - db.Layers.Add(layer); - controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + newRecords.Add(record); } - } -} - + _db.Layers.Add(layer); + _controller.SaveRecords(layer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); + _db.SaveChanges(); + } +} \ No newline at end of file diff --git a/WebAPI/dataParsers/csv.parser.cs b/WebAPI/dataParsers/csv.parser.cs deleted file mode 100644 index 16f3f6d..0000000 --- a/WebAPI/dataParsers/csv.parser.cs +++ /dev/null @@ -1,53 +0,0 @@ -using CsvHelper; -using CsvHelper.Configuration; -using Microsoft.EntityFrameworkCore.Metadata.Internal; -using System.Formats.Asn1; -using System.Globalization; -using System.Text; -using WebAPI.Models; - -namespace WebAPI.dataParsers -{ - public class csvParser - { - public List parse(IFormFile file) - { - var info = CultureInfo.CurrentCulture; - - List records = new List(); - - var stream = new StreamReader(file.OpenReadStream()); - string content = stream.ReadToEnd(); - - List lines = content.Split("\n").ToList(); - List> data = new List>(); - foreach (string line in lines) - { - data.Add(line.Split(";").ToList()); - } - - for (int i = 1; i < data[0].Count; i++) - { - for (int j = 1; j < data.Count; j++) { - if (data[j][0].Length > 0) - { - double value = double.Parse(data[j][i], CultureInfo.GetCultureInfo("pl-PL")); - if (value > 0) - { - Record record = new Record(); - record.Id = Guid.NewGuid(); - record.Code = data[0][i]; - record.Desc1 = data[j][0]; - record.Value1 = value; - record.CreatedAt = DateTime.UtcNow; - record.ModifiedAt= DateTime.UtcNow; - records.Add(record); - } - } - }; - } - - return records; - } - } -} diff --git a/WebAPI/dataParsers/morskaK5.parser.cs b/WebAPI/dataParsers/morskaK5.parser.cs deleted file mode 100644 index 05b73ad..0000000 --- a/WebAPI/dataParsers/morskaK5.parser.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Google.Apis.Sheets.v4; -using System.Globalization; -using WebAPI.Models; - -namespace WebAPI.dataParsers -{ - public class morskaK5Parser - { - private SpreadsheetsResource.ValuesResource googleSheetValues; - private AppDbContext db; - - public morskaK5Parser( - SpreadsheetsResource.ValuesResource _googleSheetValues, - AppDbContext _db) - { - googleSheetValues = _googleSheetValues; - db = _db; - } - - public Layer parse() - { - Layer layer = new Layer(); - layer.Source = "GoogleSheet"; - - string sheetId = "1ZzndU8HjYqz5VKCcrVHBOFW8fqpYfwquclznX9q39Yk"; - - var range = "Sierpien_2023!B3:AR5"; - - var request = googleSheetValues.Get(sheetId, range); - var response = request.Execute(); - var data = response.Values; - - layer.Source = "GoogleSheet"; - layer.Number = db.Layers.Count() + 1; - layer.Name = $"L{layer.Number}-I-{data[0][1]}-{data[0][2]}/{data[0][3]}-{DateTime.Now.ToString("yyyyMMddHHmm")}"; - layer.Type = LayerType.import; - - List records = new List(); - - for (int i = 1; i < data[1].Count; i++) - { - double value; - - if ( - data[1][i].ToString()?.Length > 0 && - double.TryParse(data[2][i].ToString(), CultureInfo.GetCultureInfo("pl-PL"), out value)) - { - Record record = new Record(); - record.Id = Guid.NewGuid(); - record.Code = data[1][i].ToString(); - record.Value1 = value; - record.CreatedAt = DateTime.UtcNow; - record.ModifiedAt = DateTime.UtcNow; - records.Add(record); - }; - - } - layer.Records = records; - return layer; - } - } -} diff --git a/WebAPI/dataProcessors/ProcessHelper.cs b/WebAPI/dataProcessors/ProcessHelper.cs index 996b880..f2d9cd2 100644 --- a/WebAPI/dataProcessors/ProcessHelper.cs +++ b/WebAPI/dataProcessors/ProcessHelper.cs @@ -1,209 +1,175 @@ -using System; -using WebAPI.Models; +using WebAPI.Models; -namespace DiunaBIWebAPI.dataProcessors +namespace DiunaBIWebAPI.dataProcessors; + +public static class ProcessHelper { - public static class ProcessHelper - { - public static void setValue(Record record, int number, double? value) + public static void SetValue(Record record, int number, double? value) + { + value = (double)Math.Round((decimal)(value ?? 0), 2); + switch (number) { - value = (double)Math.Round((decimal)(value ?? 0), 2); - switch (number) + case 1: + record.Value1 = value; + break; + case 2: + record.Value2 = value; + break; + case 3: + record.Value3 = value; + break; + case 4: + record.Value4 = value; + break; + case 5: + record.Value5 = value; + break; + case 6: + record.Value6 = value; + break; + case 7: + record.Value7 = value; + break; + case 8: + record.Value8 = value; + break; + case 9: + record.Value9 = value; + break; + case 10: + record.Value10 = value; + break; + case 11: + record.Value11 = value; + break; + case 12: + record.Value12 = value; + break; + case 13: + record.Value13 = value; + break; + case 14: + record.Value14 = value; + break; + case 15: + record.Value15 = value; + break; + case 16: + record.Value16 = value; + break; + case 17: + record.Value17 = value; + break; + case 18: + record.Value18 = value; + break; + case 19: + record.Value19 = value; + break; + case 20: + record.Value20 = value; + break; + case 21: + record.Value21 = value; + break; + case 22: + record.Value22 = value; + break; + case 23: + record.Value23 = value; + break; + case 24: + record.Value24 = value; + break; + case 25: + record.Value25 = value; + break; + case 26: + record.Value26 = value; + break; + case 27: + record.Value27 = value; + break; + case 28: + record.Value28 = value; + break; + case 29: + record.Value29 = value; + break; + case 30: + record.Value30 = value; + break; + case 31: + record.Value31 = value; + break; + case 32: + record.Value32 = value; + break; + } + } + public static double? getValue(Record record, int number) + { + return number switch + { + 1 => record.Value1, + 2 => record.Value2, + 3 => record.Value3, + 4 => record.Value4, + 5 => record.Value5, + 6 => record.Value6, + 7 => record.Value7, + 8 => record.Value8, + 9 => record.Value9, + 10 => record.Value10, + 11 => record.Value11, + 12 => record.Value12, + 13 => record.Value13, + 14 => record.Value14, + 15 => record.Value15, + 16 => record.Value16, + 17 => record.Value17, + 18 => record.Value18, + 19 => record.Value19, + 20 => record.Value20, + 21 => record.Value21, + 22 => record.Value22, + 23 => record.Value23, + 24 => record.Value24, + 25 => record.Value25, + 26 => record.Value26, + 27 => record.Value27, + 28 => record.Value28, + 29 => record.Value29, + 30 => record.Value30, + 31 => record.Value31, + 32 => record.Value32, + _ => null + }; + } + public static List ParseCodes(string codes) + { + var codesList = new List(); + foreach (var code in codes.Split(';')) + { + var range = code.Split('-'); + switch (range.Length) { case 1: - record.Value1 = value; - break; - case 2: - record.Value2 = value; - break; - case 3: - record.Value3 = value; - break; - case 4: - record.Value4 = value; - break; - case 5: - record.Value5 = value; - break; - case 6: - record.Value6 = value; - break; - case 7: - record.Value7 = value; - break; - case 8: - record.Value8 = value; - break; - case 9: - record.Value9 = value; - break; - case 10: - record.Value10 = value; - break; - case 11: - record.Value11 = value; - break; - case 12: - record.Value12 = value; - break; - case 13: - record.Value13 = value; - break; - case 14: - record.Value14 = value; - break; - case 15: - record.Value15 = value; - break; - case 16: - record.Value16 = value; - break; - case 17: - record.Value17 = value; - break; - case 18: - record.Value18 = value; - break; - case 19: - record.Value19 = value; - break; - case 20: - record.Value20 = value; - break; - case 21: - record.Value21 = value; - break; - case 22: - record.Value22 = value; - break; - case 23: - record.Value23 = value; - break; - case 24: - record.Value24 = value; - break; - case 25: - record.Value25 = value; - break; - case 26: - record.Value26 = value; - break; - case 27: - record.Value27 = value; - break; - case 28: - record.Value28 = value; - break; - case 29: - record.Value29 = value; - break; - case 30: - record.Value30 = value; - break; - case 31: - record.Value31 = value; - break; - case 32: - record.Value32 = value; - break; - } - } - public static double? getValue(Record record, int number) - { - switch (number) - { - case 1: - return record.Value1; - case 2: - return record.Value2; - case 3: - return record.Value3; - case 4: - return record.Value4; - case 5: - return record.Value5; - case 6: - return record.Value6; - case 7: - return record.Value7; - case 8: - return record.Value8; - case 9: - return record.Value9; - case 10: - return record.Value10; - case 11: - return record.Value11; - case 12: - return record.Value12; - case 13: - return record.Value13; - case 14: - return record.Value14; - case 15: - return record.Value15; - case 16: - return record.Value16; - case 17: - return record.Value17; - case 18: - return record.Value18; - case 19: - return record.Value19; - case 20: - return record.Value20; - case 21: - return record.Value21; - case 22: - return record.Value22; - case 23: - return record.Value23; - case 24: - return record.Value24; - case 25: - return record.Value25; - case 26: - return record.Value26; - case 27: - return record.Value27; - case 28: - return record.Value28; - case 29: - return record.Value29; - case 30: - return record.Value30; - case 31: - return record.Value31; - case 32: - return record.Value32; - default: - return null; - } - } - public static List parseCodes(string codes) - { - List codesList = new List(); - foreach (string code in codes.Split(';')) - { - string[] range = code.Split('-'); - if (range.Length == 1) - { codesList.Add(int.Parse(range[0])); - } - else if (range.Length == 2) + break; + case 2: { for (int i = int.Parse(range[0]); i <= int.Parse(range[1]); i++) { codesList.Add(i); } - } - else - { - throw new Exception($"Invalid code range: {code}"); - } - } - return codesList; - } - } -} + break; + } + default: + throw new Exception($"Invalid code range: {code}"); + } + } + return codesList; + } +} \ No newline at end of file diff --git a/WebAPI/dataProcessors/t1.r1.processor.cs b/WebAPI/dataProcessors/t1.r1.processor.cs index 77aef91..b51750b 100644 --- a/WebAPI/dataProcessors/t1.r1.processor.cs +++ b/WebAPI/dataProcessors/t1.r1.processor.cs @@ -40,7 +40,7 @@ namespace WebAPI.dataProcessors { throw new Exception("Codes record not found"); } - List codesList = ProcessHelper.parseCodes(codes); + List codesList = ProcessHelper.ParseCodes(codes); Layer? processedLayer = db.Layers .Where(x => x.ParentId == processWorker!.Id diff --git a/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodes.processor.cs b/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodes.processor.cs index 84b6b0e..f53ee03 100644 --- a/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodes.processor.cs +++ b/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodes.processor.cs @@ -38,7 +38,7 @@ namespace WebAPI.dataProcessors throw new Exception("Codes record not found"); } // create array of integers from string codes where: '501-503;505-505;510-512' -> [501,502,503,505,510,511,512] - List codesList = ProcessHelper.parseCodes(codes); + List codesList = ProcessHelper.ParseCodes(codes); Layer? processedLayer = db.Layers .Where(x => x.ParentId == processWorker!.Id @@ -103,7 +103,7 @@ namespace WebAPI.dataProcessors }; for (var i = 1; i < 33; i++) { - ProcessHelper.setValue(newRecord, i, ProcessHelper.getValue(x, i)); + ProcessHelper.SetValue(newRecord, i, ProcessHelper.getValue(x, i)); } return newRecord; }) diff --git a/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs b/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs index 6e1d26f..18caaaa 100644 --- a/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs +++ b/WebAPI/dataProcessors/t3.MultiSourceCopySelectedCodesYearSummary.processor.cs @@ -93,7 +93,7 @@ namespace WebAPI.dataProcessors }; for (var i = 1; i < 33; i++) { - ProcessHelper.setValue(processedRecord, i, + ProcessHelper.SetValue(processedRecord, i, codeRecords.Sum(x => ProcessHelper.getValue(x, i))); } diff --git a/WebAPI/dataProcessors/t3.MultiSourceSummary.processor.cs b/WebAPI/dataProcessors/t3.MultiSourceSummary.processor.cs index 067c248..864e69b 100644 --- a/WebAPI/dataProcessors/t3.MultiSourceSummary.processor.cs +++ b/WebAPI/dataProcessors/t3.MultiSourceSummary.processor.cs @@ -106,7 +106,7 @@ namespace WebAPI.dataProcessors }; for (var i = 1; i<33; i++) { - ProcessHelper.setValue(processedRecord, i, + ProcessHelper.SetValue(processedRecord, i, codeRecords.Sum(x => ProcessHelper.getValue(x, i))); } newRecords.Add(processedRecord); diff --git a/WebAPI/dataProcessors/t3.MultiSourceYearSummary.processor.cs b/WebAPI/dataProcessors/t3.MultiSourceYearSummary.processor.cs index 09734d2..a27a0e3 100644 --- a/WebAPI/dataProcessors/t3.MultiSourceYearSummary.processor.cs +++ b/WebAPI/dataProcessors/t3.MultiSourceYearSummary.processor.cs @@ -128,10 +128,10 @@ namespace WebAPI.dataProcessors Record validationRecord = new Record(); for (var i = 1; i < 33; i++) { - ProcessHelper.setValue(processedRecord, i, + ProcessHelper.SetValue(processedRecord, i, codeRecords.Sum(x => ProcessHelper.getValue(x, i))); - ProcessHelper.setValue(validationRecord, i, + ProcessHelper.SetValue(validationRecord, i, codeRecordsValidation.Sum(x => ProcessHelper.getValue(x, i))); if ( diff --git a/WebAPI/dataProcessors/t3.SingleSource.processor.cs b/WebAPI/dataProcessors/t3.SingleSource.processor.cs index 9c0901c..13e64a1 100644 --- a/WebAPI/dataProcessors/t3.SingleSource.processor.cs +++ b/WebAPI/dataProcessors/t3.SingleSource.processor.cs @@ -108,7 +108,7 @@ namespace WebAPI.dataProcessors .Where(x => x.CreatedAt.Date <= new DateTime(year, month, 1)) .OrderByDescending(x => x.CreatedAt) .FirstOrDefault()?.Value1 ?? 0; - ProcessHelper.setValue(processedRecord, 1, firstVal); + ProcessHelper.SetValue(processedRecord, 1, firstVal); previousValue = firstVal; //days 2-29/30 for (int i=2; i x.CreatedAt) .FirstOrDefault()?.Value1; - ProcessHelper.setValue(processedRecord, 32, valueToCopy); + ProcessHelper.SetValue(processedRecord, 32, valueToCopy); newRecords.Add(processedRecord); } diff --git a/WebAPI/dataProcessors/t3.SourceYearSummary.processor.cs b/WebAPI/dataProcessors/t3.SourceYearSummary.processor.cs index 5f38da7..8f57315 100644 --- a/WebAPI/dataProcessors/t3.SourceYearSummary.processor.cs +++ b/WebAPI/dataProcessors/t3.SourceYearSummary.processor.cs @@ -95,7 +95,7 @@ namespace WebAPI.dataProcessors }; for (var i = 1; i < 33; i++) { - ProcessHelper.setValue(processedRecord, i, + ProcessHelper.SetValue(processedRecord, i, codeRecords.Sum(x => ProcessHelper.getValue(x, i))); } newRecords.Add(processedRecord); diff --git a/WebAPI/dataProcessors/t4.r2.processor.cs b/WebAPI/dataProcessors/t4.r2.processor.cs index 23d5bb2..c7ff298 100644 --- a/WebAPI/dataProcessors/t4.r2.processor.cs +++ b/WebAPI/dataProcessors/t4.r2.processor.cs @@ -1,8 +1,5 @@ -using System.Globalization; -using DiunaBIWebAPI.dataProcessors; +using DiunaBIWebAPI.dataProcessors; using Google.Apis.Sheets.v4; -using Google.Apis.Sheets.v4.Data; -using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.EntityFrameworkCore; using WebAPI.Controllers; using WebAPI.Models; @@ -12,46 +9,44 @@ namespace WebAPI.dataProcessors { public class T4R2Processor { - private readonly AppDbContext db; - private readonly SpreadsheetsResource.ValuesResource googleSheetValues; - private readonly LayersController controller; - private readonly LogsController logsController; + private readonly AppDbContext _db; + private readonly LayersController _controller; + private readonly LogsController _logsController; public T4R2Processor( - AppDbContext _db, - SpreadsheetsResource.ValuesResource _googleSheetValues, - LayersController _controller, - LogsController _logsController) + AppDbContext db, + SpreadsheetsResource.ValuesResource googleSheetValues, + LayersController controller, + LogsController logsController) { - db = _db; - googleSheetValues = _googleSheetValues; - controller = _controller; - logsController = _logsController; + _db = db; + _controller = controller; + _logsController = logsController; } - public void process(Layer processWorker) + public void Process(Layer processWorker) { - int year = int.Parse(processWorker!.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); - List? sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); - if (sources!.Count() == 0) + var year = int.Parse(processWorker.Records?.SingleOrDefault(x => x.Code == "Year")?.Desc1!); + var sources = processWorker.Records?.Where(x => x.Code == "Source").ToList(); + if (!sources!.Any()) { throw new Exception("Source record not found"); } - string? layerName = processWorker.Records?.SingleOrDefault(x => x.Code == "LayerName")?.Desc1; + var layerName = processWorker.Records?.SingleOrDefault(x => x.Code == "LayerName")?.Desc1; if (layerName == null) { throw new Exception("LayerName record not found"); } - Layer? processedLayer = db.Layers - .Where(x => x.ParentId == processWorker!.Id + var processedLayer = _db.Layers + .Where(x => x.ParentId == processWorker.Id && !x.IsDeleted) .OrderByDescending(x => x.CreatedAt) .FirstOrDefault(); - bool isNew = false; + var isNew = false; if (processedLayer == null) { isNew = true; @@ -60,8 +55,8 @@ namespace WebAPI.dataProcessors Id = Guid.NewGuid(), Source = "", Type = LayerType.processed, - ParentId = processWorker!.Id, - Number = db.Layers.Count() + 1, + ParentId = processWorker.Id, + Number = _db.Layers.Count() + 1 }; processedLayer.Name = $"L{processedLayer.Number}-{layerName}"; processedLayer.CreatedById = Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D"); @@ -75,42 +70,35 @@ namespace WebAPI.dataProcessors processedLayer.ModifiedAt = DateTime.UtcNow; - List newRecords = new List(); + var newRecords = new List(); - foreach (Record source in sources!) + foreach (var source in sources!) { - string? rawSourceCodes = processWorker.Records?.SingleOrDefault(x => x.Code == $"Codes-{source.Desc1}") + var rawSourceCodes = processWorker.Records?.SingleOrDefault(x => x.Code == $"Codes-{source.Desc1}") ?.Desc1; - List sourceCodes = new List(); + var sourceCodes = new List(); if (rawSourceCodes != null) { - sourceCodes = ProcessHelper.parseCodes(rawSourceCodes); + sourceCodes = ProcessHelper.ParseCodes(rawSourceCodes); } - for (int month = 1; month <= DateTime.UtcNow.Month; month++) + for (var month = 1; month <= DateTime.UtcNow.Month; month++) { - Layer? dataSource = db.Layers.Where(x => + var monthCopy = month; + var dataSource = _db.Layers.Where(x => x.Type == LayerType.processed && !x.IsDeleted && - x.Name != null && x.Name.Contains($"{year}/{month}-{source.Desc1}-T") + x.Name != null && x.Name.Contains($"{year}/{monthCopy}-{source.Desc1}-T") ) .Include(x => x.Records) .FirstOrDefault(); if (dataSource != null) { List news = dataSource.Records! - .Where(x => - { - if (sourceCodes.Count > 0) - { - return sourceCodes.Contains(int.Parse(x.Code!)); - } - - return true; // get all - }) + .Where(x => sourceCodes.Count <= 0 || sourceCodes.Contains(int.Parse(x.Code!))) .Select(x => { - Record newRecord = new Record + var newRecord = new Record { Id = Guid.NewGuid(), Code = x.Code + month.ToString("D2"), @@ -126,9 +114,9 @@ namespace WebAPI.dataProcessors } else { - logsController.AddEntry(new LogEntry + _logsController.AddEntry(new LogEntry { - Title = $"{processWorker!.Name}, {processWorker.Id}", + Title = $"{processWorker.Name}, {processWorker.Id}", Type = LogEntryType.warning, LogType = LogType.process, Message = $"Data source {year}/{month}-{source.Desc1}-T3 not found", @@ -138,7 +126,7 @@ namespace WebAPI.dataProcessors } // year summery - Layer? dataSourceSum = db.Layers.Where(x => + var dataSourceSum = _db.Layers.Where(x => x.Type == LayerType.processed && !x.IsDeleted && x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T") @@ -147,7 +135,7 @@ namespace WebAPI.dataProcessors .FirstOrDefault(); if (dataSourceSum != null) { - List news = dataSourceSum.Records! + var news = dataSourceSum.Records! .Where(x => { if (sourceCodes.Count > 0) @@ -174,9 +162,9 @@ namespace WebAPI.dataProcessors } else { - logsController.AddEntry(new LogEntry + _logsController.AddEntry(new LogEntry { - Title = $"{processWorker!.Name}, {processWorker.Id}", + Title = $"{processWorker.Name}, {processWorker.Id}", Type = LogEntryType.warning, LogType = LogType.process, Message = $"Data source {year}/13-{source.Desc1}-T3 not found", @@ -184,75 +172,18 @@ namespace WebAPI.dataProcessors }); } } - - /* - // year summary - Layer? dataSourceSum = db.Layers.Where(x => - x.Type == LayerType.processed && - !x.IsDeleted && - x.Name != null && x.Name.Contains($"{year}/13-{source.Desc1}-T3") - ) - .Include(x => x.Records) - .FirstOrDefault(); - if (dataSourceSum != null) - { - dataSources.Add(dataSourceSum); - } - else - { - logsController.AddEntry(new LogEntry - { - Title = $"{processWorker!.Name}, {processWorker.Id}", - Type = LogEntryType.warning, - LogType = LogType.process, - Message = $"Data source {year}/13-{source.Desc1}-T3 not found", - CreatedAt = DateTime.UtcNow - }); - } - } - - /* - if (dataSources.Count == 0) - { - throw new Exception($"DataSources are empty"); - } - - List newRecords = dataSources - .SelectMany(x => x.Records!) - .Where(x => codesList.Contains(int.Parse(x.Code!))) - .Select(x => - { - Layer? layer = dataSources.SingleOrDefault(y => y.Id == x.LayerId); - string postFix = layer!.Name!.Split("/")[1].Split("-")[0]; - if (postFix.Length == 1) - { - postFix = "0" + postFix; - } - - Record newRecord = new Record - { - Id = Guid.NewGuid(), - Code = x.Code + postFix, - CreatedAt = DateTime.UtcNow, - ModifiedAt = DateTime.UtcNow, - Value1 = x.Value32 - }; - - return newRecord; - }) - .ToList(); - */ + if (isNew) { - db.Layers.Add(processedLayer); + _db.Layers.Add(processedLayer); } else { - db.Layers.Update(processedLayer); + _db.Layers.Update(processedLayer); } - controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); - db.SaveChanges(); + _controller.SaveRecords(processedLayer.Id, newRecords, Guid.Parse("F392209E-123E-4651-A5A4-0B1D6CF9FF9D")); + _db.SaveChanges(); } } } \ No newline at end of file