diff --git a/FuelAccounting/FuelAccounting/Forms/FormCar.cs b/FuelAccounting/FuelAccounting/Forms/FormCar.cs index 3b8c52d..7ef1a7f 100644 --- a/FuelAccounting/FuelAccounting/Forms/FormCar.cs +++ b/FuelAccounting/FuelAccounting/Forms/FormCar.cs @@ -80,6 +80,6 @@ namespace FuelAccounting.Forms private Car CreateCar(int id) => Car.CreateEntity(id, textBoxModel.Text, (CarCategory)comboBoxCategory.SelectedItem!, - (int)comboBoxDriverId.SelectedItem!); + (int)comboBoxDriverId.SelectedValue!); } } diff --git a/FuelAccounting/FuelAccounting/Forms/FormDriver.cs b/FuelAccounting/FuelAccounting/Forms/FormDriver.cs index fc272cf..defd109 100644 --- a/FuelAccounting/FuelAccounting/Forms/FormDriver.cs +++ b/FuelAccounting/FuelAccounting/Forms/FormDriver.cs @@ -72,7 +72,7 @@ namespace FuelAccounting.Forms } else { - _driverRepository.UpdateDriver(CreateDriver(0)); + _driverRepository.CreateDriver(CreateDriver(0)); } Close(); diff --git a/FuelAccounting/FuelAccounting/Forms/FormRefueling.Designer.cs b/FuelAccounting/FuelAccounting/Forms/FormRefueling.Designer.cs index 9341c02..cae9385 100644 --- a/FuelAccounting/FuelAccounting/Forms/FormRefueling.Designer.cs +++ b/FuelAccounting/FuelAccounting/Forms/FormRefueling.Designer.cs @@ -131,7 +131,7 @@ buttonSave.TabIndex = 10; buttonSave.Text = "Сохранить"; buttonSave.UseVisualStyleBackColor = true; - buttonSave.Click += buttonSave_Click; + buttonSave.Click += ButtonSave_Click; // // FormRefueling // diff --git a/FuelAccounting/FuelAccounting/Forms/FormRefueling.cs b/FuelAccounting/FuelAccounting/Forms/FormRefueling.cs index f8f6b4b..ddb7714 100644 --- a/FuelAccounting/FuelAccounting/Forms/FormRefueling.cs +++ b/FuelAccounting/FuelAccounting/Forms/FormRefueling.cs @@ -27,7 +27,7 @@ namespace FuelAccounting.Forms comboBoxCar.ValueMember = "Id"; } - private void buttonSave_Click(object sender, EventArgs e) + private void ButtonSave_Click(object sender, EventArgs e) { try { @@ -38,7 +38,7 @@ namespace FuelAccounting.Forms } _refuelingRepository.CreateRefueling(Refueling.CreateOperation(0, (int)comboBoxCar.SelectedValue!, - Convert.ToDouble(numericUpDownKm), Convert.ToDouble(numericUpDownLiters), textBoxTypeOfFuel.Text)); + Convert.ToDouble(numericUpDownKm.Value), Convert.ToDouble(numericUpDownLiters.Value), textBoxTypeOfFuel.Text)); Close(); } diff --git a/FuelAccounting/FuelAccounting/FuelAccounting.csproj b/FuelAccounting/FuelAccounting/FuelAccounting.csproj index accbdf0..ebed082 100644 --- a/FuelAccounting/FuelAccounting/FuelAccounting.csproj +++ b/FuelAccounting/FuelAccounting/FuelAccounting.csproj @@ -9,7 +9,19 @@ + + + + + + + + + + + + @@ -27,4 +39,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/FuelAccounting/FuelAccounting/Program.cs b/FuelAccounting/FuelAccounting/Program.cs index ae085e0..ce08ee9 100644 --- a/FuelAccounting/FuelAccounting/Program.cs +++ b/FuelAccounting/FuelAccounting/Program.cs @@ -1,7 +1,11 @@ using FuelAccounting.Repositories; using FuelAccounting.Repositories.Implementations; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Serilog; using Unity; using Unity.Lifetime; +using Unity.Microsoft.Logging; namespace FuelAccounting; @@ -23,13 +27,28 @@ internal static class Program { var container = new UnityContainer(); - container.RegisterType(new TransientLifetimeManager()); - container.RegisterType(new TransientLifetimeManager()); - container.RegisterType(new TransientLifetimeManager()); - container.RegisterType(new TransientLifetimeManager()); - container.RegisterType(new TransientLifetimeManager()); - container.RegisterType(new TransientLifetimeManager()); + container.AddExtension(new LoggingExtension(CreateLoggerFactory())); + + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); 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/FuelAccounting/FuelAccounting/Repositories/IConnectionString.cs b/FuelAccounting/FuelAccounting/Repositories/IConnectionString.cs new file mode 100644 index 0000000..52da1f4 --- /dev/null +++ b/FuelAccounting/FuelAccounting/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FuelAccounting.Repositories; + +public interface IConnectionString +{ + public string ConnectionString { get; } +} diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/CarRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/CarRepository.cs index 8ad2c7e..879bf1f 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/CarRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/CarRepository.cs @@ -1,29 +1,130 @@ -using FuelAccounting.Entities; -using FuelAccounting.Entities.Enums; +using Dapper; +using FuelAccounting.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class CarRepository : ICarsRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public CarRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateCar(Car car) { - } - - public void DeleteCar(int id) - { - } - - public Car ReadCarById(int id) - { - return Car.CreateEntity(0, string.Empty, CarCategory.None, 0); - } - - public IEnumerable ReadCars() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(car)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Cars (model, category, driver_id) +VALUES (@Model, @Category, @DriverID)"; + connection.Execute(queryInsert, car); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateCar(Car car) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(car)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Cars +SET + model = @model, + category = @category, + driver_id = @DriverID +WHERE id = @id"; + connection.Execute(queryUpdate, car); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + + public void DeleteCar(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Cars +WHERE id = @id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Car ReadCarById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + model, + category, + driver_id AS DriverID +FROM Cars +WHERE id = @id"; + var car = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(car)); + return car; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadCars() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + id, + model, + category, + driver_id AS DriverID +FROM Cars"; + var cars = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(cars)); + return cars; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } } diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/ConnectionString.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..2defd79 --- /dev/null +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/ConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FuelAccounting.Repositories.Implementations; + +internal class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "host=localhost;port=5432;database=postgres;username=postgres;password=postgres"; +} diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/DriverRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/DriverRepository.cs index 0bbf6b0..f94d5d3 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/DriverRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/DriverRepository.cs @@ -1,29 +1,131 @@ -using FuelAccounting.Entities; +using Dapper; +using FuelAccounting.Entities; using FuelAccounting.Entities.Enums; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class DriverRepository : IDriversRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public DriverRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateDriver(Driver driver) { - } - - public void DeleteDriver(int id) - { - } - - public Driver ReadDriverById(int id) - { - return Driver.CreateEntity(0, string.Empty, string.Empty, DriverLicenceCategory.None); - } - - public IEnumerable ReadDrivers() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(driver)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Drivers (first_name, last_name, driver_licence_category) +VALUES (@FirstName, @LastName, @DriverLicenceCategory)"; + connection.Execute(queryInsert, driver); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateDriver(Driver driver) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(driver)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Drivers +SET + first_name = @FirstName, + last_name = @LastName, + driver_licence_category = @DriverLicenceCategory +WHERE id = @Id"; + connection.Execute(queryUpdate, driver); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } + + public void DeleteDriver(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Drivers +WHERE id = @id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Driver ReadDriverById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + first_name AS FirstName, + last_name AS LastName, + driver_licence_category AS DriverLicenceCategory +FROM Drivers +WHERE id = @Id"; + var driver = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(driver)); + return driver; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadDrivers() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + id, + first_name AS FirstName, + last_name AS LastName, + driver_licence_category AS DriverLicenceCategory +FROM Drivers"; + var drivers = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(drivers)); + return drivers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } } diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/EquipageRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/EquipageRepository.cs index 29051af..29c6682 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/EquipageRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/EquipageRepository.cs @@ -1,20 +1,101 @@ -using FuelAccounting.Entities; +using Dapper; +using FuelAccounting.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class EquipageRepository : IEquipageRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public EquipageRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateEquipage(Equipage equipage) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(equipage)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + + var queryInsert = @" +INSERT INTO Equipage (car_id, driver_id, shift_id, equipage_date) +VALUES (@CarId, @DriverId, @ShiftId, @EquipageDate)"; + connection.Execute(queryInsert, equipage, transaction); + + var queryGetLastId = "SELECT MAX(Id) FROM Equipage"; + var equipageId = connection.QueryFirst(queryGetLastId, transaction: transaction); + + var querySubInsert = @" +INSERT INTO RoutesEquipage (equipage_id, route_id, count) +VALUES (@EquipageId, @RouteId, @Count)"; + foreach (var elem in equipage.RoutesEqipage) + { + connection.Execute(querySubInsert, new { EquipageId = equipageId, elem.RouteID, elem.Count }, transaction); + } + + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } + public void DeleteEquipage(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Equipage +WHERE id = @id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public IEnumerable ReadEquipages(DateTime? dateForm = null, DateTime? dateTo = null, int? carId = null, int? driverId = null, int? shiftId = null, int? routeId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + id, + car_id AS CarId, + driver_id AS DriverId, + shift_id AS ShiftId, + equipage_date AS EquipageDate +FROM Equipage"; + var equipages = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(equipages)); + return equipages; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } } diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/RefuelingRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/RefuelingRepository.cs index 56e7729..0bf9e53 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/RefuelingRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/RefuelingRepository.cs @@ -1,15 +1,65 @@ -using FuelAccounting.Entities; +using Dapper; +using FuelAccounting.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class RefuelingRepository : IRefuelingRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public RefuelingRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateRefueling(Refueling refueling) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(refueling)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Refueling (car_id, km, liters_spent, type_of_fuel, refueling_date) +VALUES (@CarId, @Kilometers, @LitersSpent, @TypeOfFuel, @RefuelingDate)"; + connection.Execute(queryInsert, refueling); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadRefuelings(DateTime? dateForm = null, DateTime? dateTo = null, int? carId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + id, + car_id AS CarId, + km AS Kilometers, + liters_spent AS LitersSpent, + type_of_fuel AS TypeOfFuel, + refueling_date AS RefuelingDate +FROM Refueling"; + var refuelings = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(refuelings)); + return refuelings; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } } diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/RouteRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/RouteRepository.cs index c03d03e..844c557 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/RouteRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/RouteRepository.cs @@ -1,28 +1,119 @@ -using FuelAccounting.Entities; +using Dapper; +using FuelAccounting.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class RouteRepository : IRouteRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public RouteRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateRoute(Route route) - { - } - - public void DeleteRoute(int id) { - } - - public Route ReadRouteById(int id) - { - return Route.CreateEntity(0, string.Empty); - } - - public IEnumerable ReadRoutes() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(route)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Routes (description) +VALUES (@description)"; + connection.Execute(queryInsert, route); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateRoute(Route route) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(route)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Routes +SET + description = @description +WHERE id = @Id"; + connection.Execute(queryUpdate, route); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } + + public void DeleteRoute(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Routes +WHERE id = @id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Route ReadRouteById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Routes +WHERE id = @Id"; + var route = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(route)); + return route; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadRoutes() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Routes"; + var routes = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(routes)); + return routes; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + } diff --git a/FuelAccounting/FuelAccounting/Repositories/Implementations/ShiftRepository.cs b/FuelAccounting/FuelAccounting/Repositories/Implementations/ShiftRepository.cs index ead7ac3..ff37883 100644 --- a/FuelAccounting/FuelAccounting/Repositories/Implementations/ShiftRepository.cs +++ b/FuelAccounting/FuelAccounting/Repositories/Implementations/ShiftRepository.cs @@ -1,28 +1,128 @@ -using FuelAccounting.Entities; +using Dapper; +using FuelAccounting.Entities; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; namespace FuelAccounting.Repositories.Implementations; internal class ShiftRepository : IShiftRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public ShiftRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateShift(Shift shift) { - } - - public void DeleteShift(int id) - { - } - - public Shift ReadShiftById(int id) - { - return Shift.CreateEntity(0, 0, string.Empty); - } - - public IEnumerable ReadShifts() - { - return []; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(shift)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Shift (amount_of_hours, description) +VALUES (@AmountOfHours, @Description)"; + connection.Execute(queryInsert, shift); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void UpdateShift(Shift shift) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(shift)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Shift +SET + amount_of_hours = @AmountOfHours, + description = @Description +WHERE id = @Id"; + connection.Execute(queryUpdate, shift); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } + + public void DeleteShift(int id) + { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Shift +WHERE id = @id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } + + public Shift ReadShiftById(int id) + { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + amount_of_hours AS AmountOfHours, + description +FROM Shift +WHERE id = @Id"; + var shift = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(shift)); + return shift; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + + public IEnumerable ReadShifts() + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT + id, + amount_of_hours AS AmountOfHours, + description +FROM Shift"; + var shift = connection.Query(querySelect); + _logger.LogDebug("Найденные объекты: {json}", JsonConvert.SerializeObject(shift)); + return shift; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + } diff --git a/FuelAccounting/FuelAccounting/appsettings.json b/FuelAccounting/FuelAccounting/appsettings.json new file mode 100644 index 0000000..74929ba --- /dev/null +++ b/FuelAccounting/FuelAccounting/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/fuel_log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file