diff --git a/ProjectGSM/Program.cs b/ProjectGSM/Program.cs index 35a4988..c6cdc22 100644 --- a/ProjectGSM/Program.cs +++ b/ProjectGSM/Program.cs @@ -1,8 +1,13 @@ +using System.Data.SqlClient; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using ProjectGSM.Forms; using ProjectGSM.Repositories; using ProjectGSM.Repositories.Implementations; +using Serilog; using Unity; using Unity.Lifetime; +using Unity.Microsoft.Logging; namespace ProjectGSM { @@ -23,12 +28,29 @@ namespace ProjectGSM private static IUnityContainer CreateContainer() { var container = new UnityContainer(); - container.RegisterType(new TransientLifetimeManager()); + container.AddExtension(new + LoggingExtension(CreateLoggerFactory())); + + container.RegisterType(new SingletonLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); return container; } + + private static LoggerFactory CreateLoggerFactory() + { + var loggerFactory = new LoggerFactory(); + loggerFactory.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json") + .Build()) + .CreateLogger()); + return loggerFactory; + } } } \ No newline at end of file diff --git a/ProjectGSM/ProjectGSM.csproj b/ProjectGSM/ProjectGSM.csproj index 461f231..dbf4ddf 100644 --- a/ProjectGSM/ProjectGSM.csproj +++ b/ProjectGSM/ProjectGSM.csproj @@ -50,9 +50,7 @@ - - diff --git a/ProjectGSM/Repositories/IConnectionString.cs b/ProjectGSM/Repositories/IConnectionString.cs new file mode 100644 index 0000000..4965561 --- /dev/null +++ b/ProjectGSM/Repositories/IConnectionString.cs @@ -0,0 +1,9 @@ +using System.Data.SqlClient; + +namespace ProjectGSM.Repositories +{ + public interface IConnectionString + { + string ConnectionString { get; } + } +} diff --git a/ProjectGSM/Repositories/Implementations/AdvocateRepository.cs b/ProjectGSM/Repositories/Implementations/AdvocateRepository.cs index 820f12f..0811e3e 100644 --- a/ProjectGSM/Repositories/Implementations/AdvocateRepository.cs +++ b/ProjectGSM/Repositories/Implementations/AdvocateRepository.cs @@ -1,29 +1,133 @@ -using ProjectGSM.Entities; +using System.Data.SqlClient; +using System.Text.Json; +using Dapper; +using Microsoft.Extensions.Logging; +using Npgsql; +using ProjectGSM.Entities; namespace ProjectGSM.Repositories.Implementations; public class AdvocateRepository : IAdvocateRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public AdvocateRepository(IConnectionString connectionString, + ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public IEnumerable ReadAdvocates() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM advocates"; + var advocates = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonSerializer.Serialize(advocates)); + return advocates; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public Advocate ReadAdvocateById(int id) { - return Advocate.CreateEntity(0, String.Empty, false, DateTime.UtcNow, 0, 0, 0, String.Empty, String.Empty, - String.Empty, Entities.Enums.LicenseType.None); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM advocates WHERE Id=@id"; + var advocate = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", + JsonSerializer.Serialize(advocate)); + return advocate; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public void CreateAdvocate(Advocate advocate) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(advocate)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO advocates (name, sex, dateofbirth, experience, completed_tasks, rating, email, phonenumber, address, licensetype, createdat) +VALUES (@Name, @Sex, @DateOfBirth, @Experience, @CompletedTasks, @Rating, @Email, @PhoneNumber, @Address, @LicenseType, @CreatedAt)"; + connection.Execute(queryInsert, advocate); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateAdvocate(Advocate advocate) { + _logger.LogInformation("Обновление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(advocate)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE advocates + SET id = @Id, + name = @Name, + sex = @Sex, + dateofbirth = @DateOfBirth, + experience = @Experience, + completed_tasks = @CompletedTasks, + rating = @Rating, + email = @Email, + phonenumber = @PhoneNumber, + address = @Address, + licensetype = @LicenseType, + createdat = @CreatedAt + WHERE id = @Id;"; + connection.Execute(queryUpdate, advocate); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при обновлении объекта"); + throw; + } } public void DeleteAdvocate(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM advocates WHERE id = @Id;"; + connection.Execute(queryDelete, new { Id = id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } } \ No newline at end of file diff --git a/ProjectGSM/Repositories/Implementations/CaseRepository.cs b/ProjectGSM/Repositories/Implementations/CaseRepository.cs index af99bfd..757ae74 100644 --- a/ProjectGSM/Repositories/Implementations/CaseRepository.cs +++ b/ProjectGSM/Repositories/Implementations/CaseRepository.cs @@ -1,28 +1,112 @@ -using ProjectGSM.Entities; +using System.Data.SqlClient; +using System.Text.Json; +using Dapper; +using Microsoft.Extensions.Logging; +using Npgsql; +using ProjectGSM.Entities; 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() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM cases"; + var cases = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonSerializer.Serialize(cases)); + return cases; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public Case ReadCaseById(int id) { - return Case.CreateEntity(0, 0, false, 0, 0, false, 0, 0, String.Empty); + _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) { - } - - public void UpdateCase(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; + } } } \ No newline at end of file diff --git a/ProjectGSM/Repositories/Implementations/ClientRepository.cs b/ProjectGSM/Repositories/Implementations/ClientRepository.cs index 9e478e0..0ae59f1 100644 --- a/ProjectGSM/Repositories/Implementations/ClientRepository.cs +++ b/ProjectGSM/Repositories/Implementations/ClientRepository.cs @@ -1,21 +1,126 @@ -using ProjectGSM.Entities; +using System.Data.SqlClient; +using System.Text.Json; +using Dapper; +using Microsoft.Extensions.Logging; +using Npgsql; +using ProjectGSM.Entities; namespace ProjectGSM.Repositories.Implementations; public class ClientRepository : IClientRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ClientRepository(IConnectionString connectionString, + ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public IEnumerable ReadClients() { - return [];} + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM clients"; + var clients = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonSerializer.Serialize(clients)); + return clients; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } public Client ReadClientById(int id) { - return Client.CreateEntity(0, String.Empty, false, DateTime.UtcNow, String.Empty, String.Empty, String.Empty); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM clients WHERE Id=@id"; + var client = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", + JsonSerializer.Serialize(client)); + return client; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } - public void CreateClient(Client client) { } + public void CreateClient(Client client) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(client)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO clients (name, sex, dateOfBirth, email, phonenumber, address, createdAt) + VALUES (@Name, @Sex, @DateOfBirth, @Email, @PhoneNumber, @Address, @CreatedAt);"; + connection.Execute(queryInsert, client); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } - public void UpdateClient(Client client) { } + public void UpdateClient(Client client) + { + _logger.LogInformation("Обновление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(client)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE clients + SET name = @Name, + sex = @Sex, + dateofbirth = @DateOfBirth, + email = @Email, + phonenumber = @PhoneNumber, + address = @Address + WHERE id = @Id;"; + connection.Execute(queryUpdate, client); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при обновлении объекта"); + throw; + } + } - public void DeleteClient(int id) { } + public void DeleteClient(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM clients WHERE id = @Id;"; + connection.Execute(queryDelete, new { Id = id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } } \ No newline at end of file diff --git a/ProjectGSM/Repositories/Implementations/CourtRepository.cs b/ProjectGSM/Repositories/Implementations/CourtRepository.cs index 4183b02..cdf8284 100644 --- a/ProjectGSM/Repositories/Implementations/CourtRepository.cs +++ b/ProjectGSM/Repositories/Implementations/CourtRepository.cs @@ -1,28 +1,122 @@ -using ProjectGSM.Entities; +using System.Data.SqlClient; +using System.Text.Json; +using Dapper; +using Microsoft.Extensions.Logging; +using Npgsql; +using ProjectGSM.Entities; namespace ProjectGSM.Repositories.Implementations; public class CourtRepository : ICourtRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public CourtRepository(IConnectionString connectionString, + ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public IEnumerable ReadCourts() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM courts"; + var courts = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonSerializer.Serialize(courts)); + return courts; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public Court ReadCourtById(int id) { - return Court.CreateEntity(0, String.Empty, String.Empty); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM courts WHERE Id = @Id"; + var court = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Полученный объект: {json}", + JsonSerializer.Serialize(court)); + return court; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объекта"); + throw; + } } public void CreateCourt(Court court) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(court)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO courts (name, address, createdat) + VALUES (@Name, @Address, @CreatedAt);"; + connection.Execute(queryInsert, court); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateCourt(Court court) { + _logger.LogInformation("Обновление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(court)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE courts + SET name = @Name, + address = @Address + WHERE id = @Id;"; + connection.Execute(queryUpdate, court); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при обновлении объекта"); + throw; + } } public void DeleteCourt(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM courts WHERE id = @Id;"; + connection.Execute(queryDelete, new { Id = id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } } \ No newline at end of file diff --git a/ProjectGSM/Repositories/Implementations/PSQLConnectionString.cs b/ProjectGSM/Repositories/Implementations/PSQLConnectionString.cs new file mode 100644 index 0000000..f14a74b --- /dev/null +++ b/ProjectGSM/Repositories/Implementations/PSQLConnectionString.cs @@ -0,0 +1,9 @@ +namespace ProjectGSM.Repositories.Implementations; + +public class PSQLConnectionString : IConnectionString +{ + private readonly string _connectionString = + "User Id=postgres; Password=postgres; Host=localhost; Port=5432; Database=egovdb;"; + + public string ConnectionString => _connectionString; +} \ No newline at end of file diff --git a/ProjectGSM/Repositories/Implementations/StatusHistoryRepository.cs b/ProjectGSM/Repositories/Implementations/StatusHistoryRepository.cs index 6401d8e..c5fb035 100644 --- a/ProjectGSM/Repositories/Implementations/StatusHistoryRepository.cs +++ b/ProjectGSM/Repositories/Implementations/StatusHistoryRepository.cs @@ -1,20 +1,82 @@ -using ProjectGSM.Entities; +using System.Data.SqlClient; +using System.Text.Json; +using Dapper; +using Microsoft.Extensions.Logging; +using Npgsql; +using ProjectGSM.Entities; namespace ProjectGSM.Repositories.Implementations; public class StatusHistoryRepository : IStatusHistoryRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + public StatusHistoryRepository(IConnectionString connectionString, + ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public IEnumerable ReadStatusHistories(DateTime? dateForm = null, DateTime? dateTo = null, int? caseId = null, int? statusId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM status_histories"; + var statusHistories = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonSerializer.Serialize(statusHistories)); + return statusHistories; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } public void CreateStatusHistory(StatusHistory statusHistory) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonSerializer.Serialize(statusHistory)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO status_histories (caseid, status, price, createdat) + VALUES (@CaseId, @Status, @Price, @CreatedAt)"; + connection.Execute(queryInsert, statusHistory); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } public void DeleteStatusHistory(int statusId, int caseId) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Идентификаторы: {statusId}, {caseId}", statusId, caseId); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM status_histories WHERE status = @Status AND caseid = @CaseId"; + connection.Execute(queryDelete, new { StatusId = statusId, CaseId = caseId }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } } \ No newline at end of file diff --git a/ProjectGSM/appsettings.json b/ProjectGSM/appsettings.json new file mode 100644 index 0000000..82b6e34 --- /dev/null +++ b/ProjectGSM/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/advocates_log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file