diff --git a/ProjectAtelier/ProjectAtelier/Forms/FormModel.cs b/ProjectAtelier/ProjectAtelier/Forms/FormModel.cs index 9dffd25..4361e43 100644 --- a/ProjectAtelier/ProjectAtelier/Forms/FormModel.cs +++ b/ProjectAtelier/ProjectAtelier/Forms/FormModel.cs @@ -1,4 +1,5 @@ using ProjectAtelier.Entities; +using ProjectAtelier.Entities.Enums; using ProjectAtelier.Repositories; namespace ProjectAtelier.Forms @@ -10,10 +11,8 @@ namespace ProjectAtelier.Forms { InitializeComponent(); _modelRepository = modelRepository ?? throw new ArgumentNullException(nameof(orderRepository)); - - comboBoxModelType.DataSource = modelRepository.ReadModels(); - comboBoxModelType.DisplayMember = "ModelType"; - comboBoxModelType.ValueMember = "Id"; + + comboBoxModelType.DataSource = Enum.GetValues(typeof(ModelType)); ColumnClothType.DataSource = clothRepository.ReadCloths(); ColumnClothType.DisplayMember = "ClothType"; diff --git a/ProjectAtelier/ProjectAtelier/Program.cs b/ProjectAtelier/ProjectAtelier/Program.cs index 6130b6f..16df1d3 100644 --- a/ProjectAtelier/ProjectAtelier/Program.cs +++ b/ProjectAtelier/ProjectAtelier/Program.cs @@ -2,6 +2,10 @@ using Unity.Lifetime; using Unity; using ProjectAtelier.Repositories; using ProjectAtelier.Repositories.Implementations; +using Unity.Microsoft.Logging; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Serilog; namespace ProjectAtelier { @@ -22,12 +26,27 @@ namespace ProjectAtelier 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 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/ProjectAtelier/ProjectAtelier/ProjectAtelier.csproj b/ProjectAtelier/ProjectAtelier/ProjectAtelier.csproj index accbdf0..fc86ef6 100644 --- a/ProjectAtelier/ProjectAtelier/ProjectAtelier.csproj +++ b/ProjectAtelier/ProjectAtelier/ProjectAtelier.csproj @@ -9,7 +9,18 @@ + + + + + + + + + + + @@ -27,4 +38,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/IConnectionString.cs b/ProjectAtelier/ProjectAtelier/Repositories/IConnectionString.cs new file mode 100644 index 0000000..fe266be --- /dev/null +++ b/ProjectAtelier/ProjectAtelier/Repositories/IConnectionString.cs @@ -0,0 +1,6 @@ +namespace ProjectAtelier.Repositories; + +public interface IConnectionString +{ + string ConnectionString { get; } +} \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/IModelRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/IModelRepository.cs index 0d59028..31fc474 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/IModelRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/IModelRepository.cs @@ -7,6 +7,5 @@ public interface IModelRepository IEnumerable ReadModels(); Model ReadModelById(int id); void CreateModel(Model model); - void UpdateModel(Model model); void DeleteModel(int id); } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClientRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClientRepository.cs index a196630..32e1189 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClientRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClientRepository.cs @@ -1,24 +1,119 @@ -using ProjectAtelier.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using Dapper; +using ProjectAtelier.Entities; namespace ProjectAtelier.Repositories.Implementations; internal class ClientRepository : IClientRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + public ClientRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateClient(Client client) { - } - public void DeleteClient(int id) - { - } - public Client ReadClientById(int id) - { - return Client.CreateEntity(0, string.Empty, string.Empty); - } - public IEnumerable ReadClients() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(client)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Clients (Name, Phone) +VALUES (@Name, @Phone)"; + connection.Execute(queryInsert, client); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateClient(Client client) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(client)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Clients +SET + Name=@Name, + Phone=@Phone +WHERE Id=@Id"; + connection.Execute(queryUpdate, client); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + 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 }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + public Client ReadClientById(int id) + { + _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}", + JsonConvert.SerializeObject(client)); + return client; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + public IEnumerable ReadClients() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Clients"; + var clients = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(clients)); + return clients; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClothRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClothRepository.cs index 0aada84..54a1a75 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClothRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ClothRepository.cs @@ -1,25 +1,118 @@ -using ProjectAtelier.Entities; -using ProjectAtelier.Entities.Enums; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAtelier.Entities; namespace ProjectAtelier.Repositories.Implementations; internal class ClothRepository : IClothRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + public ClothRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateCloth(Cloth cloth) { - } - public void DeleteCloth(int id) - { - } - public Cloth ReadClothById(int id) - { - return Cloth.CreateEntity(0, ClothType.None, 0); - } - public IEnumerable ReadCloths() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(cloth)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Cloths (ClothType, Length) +VALUES (@ClothType, @Length)"; + connection.Execute(queryInsert, cloth); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateCloth(Cloth cloth) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(cloth)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Cloths +SET + ClothType=@ClothType, + Length=@Length +WHERE Id=@Id"; + connection.Execute(queryUpdate, cloth); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } + public void DeleteCloth(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Cloths +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + public Cloth ReadClothById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Cloths +WHERE Id=@id"; + var cloth = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(cloth)); + return cloth; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + public IEnumerable ReadCloths() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Cloths"; + var cloths = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(cloths)); + return cloths; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ConnectionString.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..4cf9f09 --- /dev/null +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ConnectionString.cs @@ -0,0 +1,6 @@ +namespace ProjectAtelier.Repositories.Implementations; + +internal class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Host=localhost;Port=5432;Database=atelierotp;Username=postgres;Password=postgres"; +} \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/EntranceRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/EntranceRepository.cs index 4794834..ed53211 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/EntranceRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/EntranceRepository.cs @@ -1,14 +1,55 @@ -using ProjectAtelier.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAtelier.Entities; namespace ProjectAtelier.Repositories.Implementations; internal class EntranceRepository : IEntranceRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + public EntranceRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateEntrance(Entrance entrance) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(entrance)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Entrances (ClothId, Value, Date) +VALUES (@ClothId, @Value, @Date)"; + connection.Execute(queryInsert, entrance); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadEntrances(DateTime? dateForm = null, DateTime? dateTo = null, int? clothId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Entrances"; + var entrances = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(entrances)); + return entrances; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ModelRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ModelRepository.cs index 3221160..a34f5cc 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ModelRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/ModelRepository.cs @@ -1,24 +1,113 @@ -using ProjectAtelier.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAtelier.Entities; namespace ProjectAtelier.Repositories.Implementations; internal class ModelRepository : IModelRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + public ModelRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateModel(Model model) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(model)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" +INSERT INTO Models (ModelType) +VALUES (@ModelType); +SELECT MAX(Id) FROM Models"; + var modelId = connection.QueryFirst(queryInsert, model, transaction); + var querySubInsert = @" +INSERT INTO Expenditures (modelId, ClothId, Value) +VALUES (@modelId,@ClothId, @Value)"; + foreach (var elem in model.Expenditures) + { + connection.Execute(querySubInsert, new + { + modelId, + elem.ClothId, + elem.Value + }, transaction); + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteModel(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Models +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Model ReadModelById(int id) { - return null; + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Models +WHERE Id=@id"; + var model = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(model)); + return model; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadModels() { - return []; - } - public void UpdateModel(Model model) - { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Models"; + var models = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(models)); + return models; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/OrderRepository.cs b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/OrderRepository.cs index 0e2b97e..5b41eba 100644 --- a/ProjectAtelier/ProjectAtelier/Repositories/Implementations/OrderRepository.cs +++ b/ProjectAtelier/ProjectAtelier/Repositories/Implementations/OrderRepository.cs @@ -1,17 +1,90 @@ -using ProjectAtelier.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAtelier.Entities; namespace ProjectAtelier.Repositories.Implementations; internal class OrderRepository : IOrderRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + public OrderRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateOrder(Order order) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(order)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" +INSERT INTO Orders (ClientId, Prise, Date, Prints) +VALUES (@ClientId, @Prise, @Date, @Prints); +SELECT MAX(Id) FROM Orders"; + var orderId = connection.QueryFirst(queryInsert, order, transaction); + var querySubInsert = @" +INSERT INTO ModelLists (orderId, ModelId, Count) +VALUES (@orderId,@ModelId, @Count)"; + foreach (var elem in order.ModelLists) + { + connection.Execute(querySubInsert, new + { + orderId, + elem.ModelId, + elem.Count + }, transaction); + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteOrder(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Orders +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } public IEnumerable ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, int? clientId = null, int? modelId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Orders"; + var orders = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(orders)); + return orders; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } \ No newline at end of file diff --git a/ProjectAtelier/ProjectAtelier/appsettings.json b/ProjectAtelier/ProjectAtelier/appsettings.json new file mode 100644 index 0000000..82c1d94 --- /dev/null +++ b/ProjectAtelier/ProjectAtelier/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/atelier_log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file