using Dapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; using ProjectFamilyBudget.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProjectFamilyBudget.Repositories.Implementations; public class PeopleExpenseRepository : IPeopleExpense { private readonly IConnectionString _connectionString; private readonly ILogger _logger; public PeopleExpenseRepository(IConnectionString connectionString, ILogger logger) { _connectionString = connectionString; _logger = logger; } public void CreatePeopleExpense(PeopleExpense peopleExpense) { _logger.LogInformation("Добавление объекта"); _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(peopleExpense)); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); var queryInsert = @" INSERT INTO PeopleExpense (PeopleId, DataReciept) VALUES (@PeopleId, @DataReciept); SELECT MAX(Id) FROM PeopleExpense"; var peopleExpenseId = connection.QueryFirst(queryInsert, peopleExpense, transaction); var querySubInsert = @" INSERT INTO ExpensePeopleExpense (ExpenseId, PeopleExpenseId, Sum) VALUES (@ExpenseId, @PeopleExpenseId, @Sum)"; foreach (var elem in peopleExpense.ExpensePeopleExpenses) { connection.Execute(querySubInsert, new { peopleExpenseId, elem.ExpenseId, elem.Sum }, transaction); } transaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при добавлении объекта"); throw; } } public void DeletPeopleExpense(int id) { _logger.LogInformation("Удаление объекта"); _logger.LogDebug("Объект: {id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); var queryDeleteSub = @" DELETE FROM ExpensePeopleExpense WHERE PeopleExpenseId = @id"; connection.Execute(queryDeleteSub, new { id }, transaction); var queryDelete = @" DELETE FROM PeopleExpense WHERE Id = @id"; connection.Execute(queryDelete, new { id }, transaction); transaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при удалении объекта"); throw; } } public IEnumerable ReadPeopleExpense(DateTime? dateForm = null, DateTime? dateTo = null, int? peopleId = null, int? expenseId = null) { _logger.LogInformation("Получение всех объектов"); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = "SELECT * FROM PeopleExpense"; var peopleExpenses = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(peopleExpenses)); return peopleExpenses; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } } }