using Dapper; using GasStation.Entities; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; namespace GasStation.Repositories.Implementations; public class SellingRepository : ISellingRepository { private readonly IConnectionString _connectionString; private readonly ILogger _logger; public SellingRepository(IConnectionString connectionString, ILogger logger) { _connectionString = connectionString; _logger = logger; } public void CreateSelling(Selling selling) { _logger.LogInformation("Добавление объекта"); _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(selling)); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); var queryInsert = @" INSERT INTO selling (sellingDateTime, gasmanId) VALUES (@SellingDateTime, @GasmanId); SELECT MAX(Id) FROM selling"; var Id = connection.QueryFirst(queryInsert, selling, transaction); var querySubInsert = @" INSERT INTO product_selling (id, productID, count) VALUES (@Id, @ProductID, @Count)"; foreach (var elem in selling.ProdutcSellings) { connection.Execute(querySubInsert, new { Id, elem.ProductID, elem.Count }, transaction); } transaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при добавлении объекта"); throw; } } public IEnumerable ReadSelling(DateTime? dateTime = null, int? count = null, int? gasmanID = null) { _logger.LogInformation("Получение всех объектов"); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = @" SELECT s.*, ps.ProductID, ps.Count FROM selling s INNER JOIN Product_Selling ps ON ps.Id = s.Id"; var selling = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(selling)); return selling.GroupBy(x => x.Id, y => y, (key, value) => Selling.CreateSelling(value.First(), value.Select(z => ProductSelling.CreateSelling(0, z.ProductID, z.Count)))).ToList(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } } }