diff --git a/ProjectItCompany/ProjectItCompany/Program.cs b/ProjectItCompany/ProjectItCompany/Program.cs index 7928f54..c66db36 100644 --- a/ProjectItCompany/ProjectItCompany/Program.cs +++ b/ProjectItCompany/ProjectItCompany/Program.cs @@ -1,7 +1,11 @@ using Unity.Lifetime; using Unity; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using ProjectItCompany.Repositories; using ProjectItCompany.Repositories.Implementations; +using Unity.Microsoft.Logging; +using Serilog; namespace ProjectItCompany { @@ -22,13 +26,27 @@ namespace ProjectItCompany private static IUnityContainer CreateContainer() { var container = new UnityContainer(); + + container.AddExtension(new LoggingExtension(CreateLoggerFactory())); + container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(); return container; } + private static LoggerFactory CreateLoggerFactory() + { + var loggerFactory = new LoggerFactory(); + loggerFactory.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .AddJsonFile("appsettings.json") + .Build()) + .CreateLogger()); + return loggerFactory; + } } } \ No newline at end of file diff --git a/ProjectItCompany/ProjectItCompany/ProjectItCompany.csproj b/ProjectItCompany/ProjectItCompany/ProjectItCompany.csproj index 099f40b..167c0ad 100644 --- a/ProjectItCompany/ProjectItCompany/ProjectItCompany.csproj +++ b/ProjectItCompany/ProjectItCompany/ProjectItCompany.csproj @@ -10,7 +10,18 @@ + + + + + + + + + + + @@ -28,4 +39,10 @@ + + + Always + + + \ No newline at end of file diff --git a/ProjectItCompany/ProjectItCompany/Repositories/IConnectionString.cs b/ProjectItCompany/ProjectItCompany/Repositories/IConnectionString.cs new file mode 100644 index 0000000..f539c7f --- /dev/null +++ b/ProjectItCompany/ProjectItCompany/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectItCompany.Repositories; + +public interface IConnectionString +{ + string ConnectionString { get; } +} diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ConnectionString.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..a348f07 --- /dev/null +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ConnectionString.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectItCompany.Repositories.Implementations; +public class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Server=localhost, 5432;Database=furnitureotp;Uid=postgres;Pwd=postgres;"; +} diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ContractRepository.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ContractRepository.cs index 85f0f64..9fbed75 100644 --- a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ContractRepository.cs +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ContractRepository.cs @@ -1,26 +1,95 @@ -using ProjectItCompany.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectItCompany.Entities; using System; using System.Collections.Generic; +using System.Diagnostics.Contracts; using System.Linq; using System.Text; using System.Threading.Tasks; +using Unity; namespace ProjectItCompany.Repositories.Implementations; -internal class ContractRepository : IContractRepository +public class ContractRepository : IContractRepository { - public void CreateContract(Contract contract) - { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + public ContractRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + + public void CreateContract(Entities.Contract contract) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(contract)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @"INSERT INTO Contracts (Date, ProjectId) + VALUES (@Date, @ProjectId); + SELECT MAX(Id) FROM Contracts"; + var feedReplenishmentId = connection.QueryFirst(queryInsert, contract, transaction); + var querySubInsert = @"INSERT INTO CustomerOnProject (ContractId, CostomerId, Description) + VALUES (@ContractId,@CostomerId, @Description)"; + foreach (var elem in contract.CustomerId) + { + connection.Execute(querySubInsert, new + { + elem.ContractId, + elem.Description, + elem.CustomerId + }, transaction); + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteContract(int id) { - + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM Contracts + WHERE ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } - public IEnumerable ReadContract(DateTime? dateForm = null, DateTime? dateTo = null, decimal? typeProject = null, int? customerId = null) + public IEnumerable ReadContract(DateTime? dateForm = null, DateTime? dateTo = null, decimal? typeProject = null, int? customerId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Contracts"; + var contracts = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); + return contracts; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/CustomerRepository.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/CustomerRepository.cs index c7337f2..51cb915 100644 --- a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/CustomerRepository.cs +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/CustomerRepository.cs @@ -1,4 +1,8 @@ -using ProjectItCompany.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectItCompany.Entities; using System; using System.Collections.Generic; using System.Linq; @@ -7,30 +11,111 @@ using System.Threading.Tasks; namespace ProjectItCompany.Repositories.Implementations; -internal class CustomerRepository : ICustomerRepository +public class CustomerRepository : ICustomerRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public CustomerRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateCustomer(Customer customer) { - - } - - public void DeleteCustomer(int id) - { - - } - - public Customer ReadCustomerById(int id) - { - return Customer.CreateEntity(0, string.Empty, string.Empty); - } - - public IEnumerable ReadCustomers() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(customer)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Customers (NameCustomer, Description) + VALUES (@NameCustomer, @Description)"; + connection.Execute(queryInsert, customer); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateCustomer(Customer customer) { - + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(customer)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE Customers SET + NameCustomer=@NameCustomer, + Description=@Description + WHERE ID=@id"; + connection.Execute(queryUpdate, customer); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + + public void DeleteCustomer(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM Customers WHERE ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Customer ReadCustomerById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Customers WHERE ID=@id"; + var customer = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(customer)); + return customer; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadCustomers() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Customers"; + var customers = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(customers)); + return customers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ExecutorRepository.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ExecutorRepository.cs index 5c788a6..e2ec0c1 100644 --- a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ExecutorRepository.cs +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ExecutorRepository.cs @@ -1,4 +1,8 @@ -using ProjectItCompany.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectItCompany.Entities; using System; using System.Collections.Generic; using System.Linq; @@ -7,30 +11,113 @@ using System.Threading.Tasks; namespace ProjectItCompany.Repositories.Implementations; -internal class ExecutorRepository : IExecutorRepository +public class ExecutorRepository : IExecutorRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ExecutorRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateExecutor(Executor executor) { - - } - - public void DeleteExecutor(int id) - { - - } - - public Executor ReadExecutorById(int id) - { - return Executor.CreateEntity(0, string.Empty, DateTime.Today, 1000, Entities.Enums.JobTitles.Developer); - } - - public IEnumerable ReadExecutors() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(executor)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Executors (FullName, DateOfBirth, HourlyRate, JobTitles) + VALUES (@FullName, @DateOfBirth, @HourlyRate, @JobTitles)"; + connection.Execute(queryInsert, executor); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateExecutor(Executor executor) { - + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(executor)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE Executors SET + FullName=@FullName, + DateOfBirth=@DateOfBirth, + HourlyRate=@HourlyRate, + JobTitles = @JobTitles + WHERE ID=@id"; + connection.Execute(queryUpdate, executor); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + + public void DeleteExecutor(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM Executors WHERE ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Executor ReadExecutorById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Executors WHERE ID=@id"; + var executor = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(executor)); + return executor; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadExecutors() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Executors"; + var executors = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(executors)); + return executors; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ProjectRepository.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ProjectRepository.cs index f14c481..225e3df 100644 --- a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ProjectRepository.cs +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/ProjectRepository.cs @@ -1,4 +1,8 @@ -using ProjectItCompany.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectItCompany.Entities; using System; using System.Collections.Generic; using System.Linq; @@ -7,30 +11,112 @@ using System.Threading.Tasks; namespace ProjectItCompany.Repositories.Implementations; -internal class ProjectRepository : IProjectRepository +public class ProjectRepository : IProjectRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ProjectRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateProject(Project project) { - - } - - public void DeleteProject(int id) - { - - } - - public Project ReadProjectById(int id) - { - return Project.CreateEntity(1, string.Empty, 0, Entities.Enums.CompletedStages.Planning); - } - - public IEnumerable ReadProjects() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(project)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Projects (NameProject, CustomerId, CompletedStages) + VALUES (@NameProject, @CustomerId, @CompletedStages)"; + connection.Execute(queryInsert, project); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateProject(Project project) { - + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(project)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @"UPDATE Projects SET + NameProject=@NameProject, + CustomerId=@CustomerId, + CompletedStages=@CompletedStages + WHERE ID=@id"; + connection.Execute(queryUpdate, project); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + + public void DeleteProject(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @"DELETE FROM Projects WHERE ID=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Project ReadProjectById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Projects WHERE ID=@id"; + var project = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(project)); + return project; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadProjects() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Projects"; + var projects = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(projects)); + return projects; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/WageRepository.cs b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/WageRepository.cs index c3576d2..f547322 100644 --- a/ProjectItCompany/ProjectItCompany/Repositories/Implementations/WageRepository.cs +++ b/ProjectItCompany/ProjectItCompany/Repositories/Implementations/WageRepository.cs @@ -1,4 +1,8 @@ -using ProjectItCompany.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectItCompany.Entities; using System; using System.Collections.Generic; using System.Linq; @@ -7,15 +11,52 @@ using System.Threading.Tasks; namespace ProjectItCompany.Repositories.Implementations; -internal class WageRepository : IWageRepository +public class WageRepository : IWageRepository { - public void CreateWage(Wage wages) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public WageRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; + } + public void CreateWage(Wage wage) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(wage)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Wages (Month, Year, NumberOfHours, ExecutorID) + VALUES (@Month, @Year, @NumberOfHours, @ExecutorID)"; + connection.Execute(queryInsert, wage); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadWage(int? yearForm = null, int? yearTo = null, int? numberOfHoursFrom = null, int? numberOfHoursTo = null, int? executorId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Wages"; + var wages = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(wages)); + return wages; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } \ No newline at end of file diff --git a/ProjectItCompany/ProjectItCompany/appsettings.json b/ProjectItCompany/ProjectItCompany/appsettings.json new file mode 100644 index 0000000..b2d4e69 --- /dev/null +++ b/ProjectItCompany/ProjectItCompany/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/itcompany_log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file