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