using ProjectLibrary.Entities; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; using Dapper; using System.Collections.Generic; using ProjectLibrary.Repositories; using System.Transactions; using System.Data.Common; using ProjectLibrary.Entites; using ProjectLibrary.Repositores; using Unity; namespace ProjectLibrary.Repositories.Implementations { public class OrderRepository : IOrderRepository { private readonly IConnectionString _connectionString; private readonly ILogger _logger; public OrderRepository(IConnectionString connectionString, ILogger logger) { _connectionString = connectionString; _logger = logger; } // Добавление нового заказа public void CreateOrder(Orders order) { _logger.LogInformation("Добавление нового заказа"); _logger.LogDebug("Заказ: {json}", JsonConvert.SerializeObject(order)); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); // Вставляем сам заказ в таблицу Orders var queryInsertOrder = @" INSERT INTO Orders (OrderDate, ReturnDate, ReaderID) VALUES (@OrderDate, @ReturnDate, @ReaderID); SELECT MAX(Id) FROM Orders"; // Возвращаем ID вставленного заказа var orderId = connection.QueryFirst(queryInsertOrder, order, transaction); // Вставляем ассоциации книг с заказом в таблицу Book_Orders foreach (var bookId in order.BookOrders) // Предполагается, что Order.BookOrders содержит список ID книг { var queryInsertBookOrder = @" INSERT INTO Book_Orders (BookID, OrderID, Count) VALUES (@BookID, @OrderID, @Count)"; connection.Execute(queryInsertBookOrder, new { bookId.BookID, orderId, bookId.Count }, transaction); } transaction.Commit(); _logger.LogInformation("Заказ успешно добавлен с ID={OrderId}", orderId); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при добавлении заказа"); throw; } } // Удаление заказа public void DeleteOrder(int id) { _logger.LogInformation("Удаление объекта"); _logger.LogDebug("Объект: {id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); var querySubDelete = @" DELETE FROM Book_Orders WHERE OrderId=@id"; connection.Execute(querySubDelete, new { id }, transaction); var queryDelete = @" DELETE FROM Orders WHERE Id=@id"; connection.Execute(queryDelete, new { id }, transaction); transaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при удалении объекта"); throw; } } // Получение заказа по ID public Orders ReadOrderById(int id) { _logger.LogInformation("Получение заказа по ID={id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelectOrder = "SELECT * FROM Orders WHERE ID = @id"; var order = connection.QueryFirstOrDefault(querySelectOrder, new { id }); _logger.LogDebug("Найден заказ: {json}", JsonConvert.SerializeObject(order)); return order; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при получении заказа с ID={id}", id); throw; } } // Получение всех заказов public IEnumerable ReadOrders() { _logger.LogInformation("Получение всех объектов"); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = @"SELECT ord.*, bo.BookId, bo.Count FROM Orders ord INNER JOIN Book_Orders bo ON bo.orderId = ord.Id"; var order = connection.Query(querySelect); _logger.LogDebug("Получ енные объекты: {json}", JsonConvert.SerializeObject(order)); return order.GroupBy(x => x.Id, y => y, (key, value) => Orders.CreateEntity(value.First(), value.Select(z => Book_Orders.CreateEntity(z.Id, z.BookID, z.Count)))).ToList(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } } } }