using System.Data.SqlClient; using Dapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; using ProjectGSM.Entities; using ProjectGSM.Query; using JsonSerializer = System.Text.Json.JsonSerializer; namespace ProjectGSM.Repositories.Implementations; public class CaseRepository : ICaseRepository { private readonly IConnectionString _connectionString; private readonly ILogger _logger; public CaseRepository(IConnectionString connectionString, ILogger logger) { _connectionString = connectionString; _logger = logger; } public IEnumerable ReadCases(DateTime? dateTo = null) { _logger.LogInformation("Получение всех объектов"); try { var builder = new QueryBuilder(); if (dateTo.HasValue) { builder.AddCondition("cases.CreatedAt <= @dateTo"); } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = "SELECT cases.*, courts.name as CourtName, clients.name as ClientName, ca.caseid as CaseId, a.name as AdvocateName " + "FROM cases " + "LEFT JOIN courts on courts.Id = cases.courtid " + "LEFT JOIN clients on clients.Id = cases.clientid " + "INNER JOIN case_advocates ca ON ca.caseid = cases.Id LEFT JOIN advocates a on a.Id = ca.advocateid " + $"{builder.Build()}"; // $"{builder.Build()}"; var casesDict = new Dictionary>(); ; var cases = connection.Query(querySelect, (caseEntity, caseAdvocate) => { if (!casesDict.TryGetValue(caseEntity.Id, out var ca)) { ca = new List(); casesDict.Add(caseEntity.Id, ca); } ca.Add(caseAdvocate); return caseEntity; }, splitOn: "CaseId", param: new { dateTo, }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(cases)); return casesDict.Select(x => { var caseEntity = cases.First(y => y.Id == x.Key); caseEntity.SetAdvocates(x.Value); return caseEntity; }).ToArray(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } } public Case ReadCaseById(int id) { _logger.LogInformation("Получение объекта по идентификатору"); _logger.LogDebug("Объект: {id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = @"SELECT * FROM cases WHERE Id=@id"; var caseE = connection.QueryFirst(querySelect, new { id }); _logger.LogDebug("Найденный объект: {json}", JsonSerializer.Serialize(caseE)); return caseE; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при поиске объекта"); throw; } } public void CreateCase(Case caseEntity) { _logger.LogInformation("Добавление объекта"); _logger.LogDebug("Объект: {json}", JsonSerializer.Serialize(caseEntity)); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); using var transaction = connection.BeginTransaction(); var queryInsert = @"INSERT INTO Cases (typeappeal, Payment, Price, victoryprice, Verdict, courtid, clientid, Description, createdat) VALUES (@TypeAppeal, @Payment, @Price, @VictoryPrice, @Verdict, @CourtId, @ClientId, @Description, @CreatedAt); SELECT MAX(Id) FROM cases;"; var caseId = connection.QueryFirst(queryInsert, caseEntity, transaction); var querySubInsert = @" INSERT INTO case_advocates (caseid, advocateid, post, createdat) VALUES (@CaseId, @AdvocateId, @Post, @CreatedAt)"; foreach (var elem in caseEntity.Advocates) { connection.Execute(querySubInsert, new { caseId, elem.AdvocateId, elem.Post, elem.CreatedAt }, transaction); } transaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при добавлении объекта"); throw; } } public void DeleteCase(int id) { _logger.LogInformation("Удаление объекта"); _logger.LogDebug("Объект: {id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var queryDelete = @"DELETE FROM cases WHERE id = @Id;"; connection.Execute(queryDelete, new { Id = id }); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при удалении объекта"); throw; } } }