diff --git a/Workshop/Program.cs b/Workshop/Program.cs index 7337a0e..abc4cda 100644 --- a/Workshop/Program.cs +++ b/Workshop/Program.cs @@ -1,11 +1,18 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Serilog; using Unity; using Unity.Lifetime; +using Unity.Microsoft.Logging; using Workshop.Repositories; using Workshop.Repositories.Implementations; namespace Workshop { internal static class Program { + //TODO: 1. , sql ? + //TODO: 2. - ? + //TODO: 3. Update /// /// The main entry point for the application. /// @@ -20,12 +27,26 @@ namespace Workshop 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(new SingletonLifetimeManager()); + return container; } + private static LoggerFactory CreateLoggerFactory() + { + var loggerFactory = new LoggerFactory(); + loggerFactory.AddSerilog(new LoggerConfiguration() + .ReadFrom.Configuration(new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsetings.json") + .Build()) + .CreateLogger()); + return loggerFactory; + } } } \ No newline at end of file diff --git a/Workshop/Repositories/IChequeRepository.cs b/Workshop/Repositories/IChequeRepository.cs index 0da2c72..6ed982b 100644 --- a/Workshop/Repositories/IChequeRepository.cs +++ b/Workshop/Repositories/IChequeRepository.cs @@ -11,5 +11,4 @@ public interface IChequeRepository { IEnumerable ReadCheques(DateTime? dateFrom = null, DateTime? dateTo = null, int? chequeId = null); void CreateCheque(Cheque cheque); - void DeleteCheque(int id); } diff --git a/Workshop/Repositories/IConnectionString.cs b/Workshop/Repositories/IConnectionString.cs new file mode 100644 index 0000000..1805094 --- /dev/null +++ b/Workshop/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Workshop.Repositories; + +public interface IConnectionString +{ + public string ConnectionString { get; } +} diff --git a/Workshop/Repositories/Implementations/ChequeRepository.cs b/Workshop/Repositories/Implementations/ChequeRepository.cs index fda192f..5453fbe 100644 --- a/Workshop/Repositories/Implementations/ChequeRepository.cs +++ b/Workshop/Repositories/Implementations/ChequeRepository.cs @@ -1,5 +1,10 @@ -using System; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,16 +15,54 @@ namespace Workshop.Repositories.Implementations; internal class ChequeRepository : IChequeRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ChequeRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateCheque(Cheque cheque) { - } - - public void DeleteCheque(int id) - { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", +JsonConvert.SerializeObject(cheque)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @""; + var chequeId = connection.QueryFirst(queryInsert, cheque, transaction); + var querySubInsert = @""; + foreach (var elem in cheque.ChequeProduct) + { + connection.Execute(querySubInsert, new {chequeId, elem.ProductId, elem.Amount}); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadCheques(DateTime? dateFrom = null, DateTime? dateTo = null, int? chequeId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = ""; + var productCreatings = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(productCreatings)); + return productCreatings; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/Workshop/Repositories/Implementations/ConnectionString.cs b/Workshop/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..5ebf385 --- /dev/null +++ b/Workshop/Repositories/Implementations/ConnectionString.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Workshop.Repositories.Implementations; + + +public class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Server=localhost;Port=5432;Database=grishazagidulin;User Id=grishazagidulin;Password=;"; +} diff --git a/Workshop/Repositories/Implementations/MasterRepository.cs b/Workshop/Repositories/Implementations/MasterRepository.cs index 7b6f2ea..a7cf357 100644 --- a/Workshop/Repositories/Implementations/MasterRepository.cs +++ b/Workshop/Repositories/Implementations/MasterRepository.cs @@ -1,5 +1,10 @@ -using System; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,25 +15,103 @@ namespace Workshop.Repositories.Implementations; internal class MasterRepository : IMasterRepository { - public void CreateMaster(Master Master) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public MasterRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; + } + public void CreateMaster(Master master) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(master)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @""; + connection.Execute(queryInsert, master); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteMaster(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @""; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Master ReadMasterById(int id) { - return Master.CreateEntity(0, string.Empty, string.Empty, 0, Entities.Enums.MasterPosition.None); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @""; + var master = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(master)); + return master; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadMasters() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = ""; + var masters = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(masters)); + return masters; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + + } } - public void UpdateMaster(Master Master) + public void UpdateMaster(Master master) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(master)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @""; + connection.Execute(queryUpdate, master); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/Workshop/Repositories/Implementations/MaterialRepository.cs b/Workshop/Repositories/Implementations/MaterialRepository.cs index ba9f8b1..7e3d4a5 100644 --- a/Workshop/Repositories/Implementations/MaterialRepository.cs +++ b/Workshop/Repositories/Implementations/MaterialRepository.cs @@ -1,5 +1,10 @@ -using System; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,25 +15,103 @@ namespace Workshop.Repositories.Implementations; internal class MaterialRepository : IMaterialRepository { - public void CreateMaterial(Material Material) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public MaterialRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; + } + public void CreateMaterial(Material material) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(material)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @""; + connection.Execute(queryInsert, material); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteMaterial(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @""; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Material ReadMaterialById(int id) { - return Material.CreateEntity(0, string.Empty, 0, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @""; + var material = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(material)); + return material; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadMaterials() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = ""; + var materials = connection.Query (querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(materials)); + return materials; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + + } } - public void UpdateMaterial(Material Material) + public void UpdateMaterial(Material material) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(material)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @""; + connection.Execute(queryUpdate, material); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/Workshop/Repositories/Implementations/ProductCreateRepository.cs b/Workshop/Repositories/Implementations/ProductCreateRepository.cs index 2d1d094..95da4e0 100644 --- a/Workshop/Repositories/Implementations/ProductCreateRepository.cs +++ b/Workshop/Repositories/Implementations/ProductCreateRepository.cs @@ -1,5 +1,10 @@ -using System; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,16 +15,65 @@ namespace Workshop.Repositories.Implementations; internal class ProductCreateRepository : IProductCreateRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ProductCreateRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateProductCreate(ProductCreate productCreate) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", +JsonConvert.SerializeObject(productCreate)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @""; + connection.Execute(queryInsert, productCreate); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteProductCreate(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @""; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public IEnumerable ReadProductCreates(DateTime? dateFrom = null, DateTime? dateTo = null, int? productId = null, int? masterId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = ""; + var productCreatings = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(productCreatings)); + return productCreatings; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + + } } } diff --git a/Workshop/Repositories/Implementations/ProductRepository.cs b/Workshop/Repositories/Implementations/ProductRepository.cs index 492f597..b44feab 100644 --- a/Workshop/Repositories/Implementations/ProductRepository.cs +++ b/Workshop/Repositories/Implementations/ProductRepository.cs @@ -1,33 +1,124 @@ -using System; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; +using Workshop.Entities; using Workshop.Repositories; namespace Workshop.Repositories.Implementations; internal class ProductRepository : IProductRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ProductRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateProduct(Product product) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", +JsonConvert.SerializeObject(product)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @""; + var productId = connection.QueryFirst(queryInsert, product, transaction); + var querySubInsert = @""; + foreach (var elem in product.Materials) + { + connection.Execute(querySubInsert, new { productId, elem.ProductId, elem.Count }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteProduct(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @""; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } + public Product ReadProductById(int id) { - return Product.CreateEntity(0, string.Empty, 0, 0, Entities.Enums.ProductCategory.None, []); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @""; + var product = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(product)); + return product; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadProducts() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = ""; + var products = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(products)); + return products; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } - public void UpdateProduct(Product product) + public void UpdateProduct(Product product) //TODO: Спросить про реализацию Update со связью МкМ { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(product)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @""; + connection.Execute(queryUpdate, product); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/Workshop/Workshop.csproj b/Workshop/Workshop.csproj index accbdf0..7c6a178 100644 --- a/Workshop/Workshop.csproj +++ b/Workshop/Workshop.csproj @@ -9,7 +9,19 @@ + + + + + + + + + + + + @@ -27,4 +39,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/Workshop/appsetings.json b/Workshop/appsetings.json new file mode 100644 index 0000000..896603a --- /dev/null +++ b/Workshop/appsetings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file