diff --git a/ProjectAirline/Forms/FormTicket.Designer.cs b/ProjectAirline/Forms/FormTicket.Designer.cs index 5dc681c..3621ebb 100644 --- a/ProjectAirline/Forms/FormTicket.Designer.cs +++ b/ProjectAirline/Forms/FormTicket.Designer.cs @@ -90,7 +90,7 @@ #endregion - private Label label1; + private Label labelStatus; private CheckedListBox checkedListBoxStatus; private Button buttonSave; diff --git a/ProjectAirline/Program.cs b/ProjectAirline/Program.cs index a01a0fd..ab8f859 100644 --- a/ProjectAirline/Program.cs +++ b/ProjectAirline/Program.cs @@ -1,6 +1,10 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using ProjectAirline.Repositories; using ProjectAirline.Repositories.Implementations; +using Serilog; using Unity; +using Unity.Microsoft.Logging; namespace ProjectAirline { @@ -18,17 +22,33 @@ namespace ProjectAirline Application.Run(CreateContainer().Resolve()); } - private static IUnityContainer CreateContainer() + private static UnityContainer CreateContainer() { var container = new UnityContainer(); + container.AddExtension(new LoggingExtension(CreateLoggerFactory())); + + 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/ProjectAirline/ProjectAirline.csproj b/ProjectAirline/ProjectAirline.csproj index accbdf0..b17f4c8 100644 --- a/ProjectAirline/ProjectAirline.csproj +++ b/ProjectAirline/ProjectAirline.csproj @@ -9,7 +9,18 @@ + + + + + + + + + + + @@ -27,4 +38,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/ProjectAirline/Repositories/IConnectionString.cs b/ProjectAirline/Repositories/IConnectionString.cs new file mode 100644 index 0000000..6332ef7 --- /dev/null +++ b/ProjectAirline/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirline.Repositories; + +public interface IConnectionString +{ + public string ConnectionString { get; } +} diff --git a/ProjectAirline/Repositories/IFlightRepository.cs b/ProjectAirline/Repositories/IFlightRepository.cs index 0c7d3e7..d98b3de 100644 --- a/ProjectAirline/Repositories/IFlightRepository.cs +++ b/ProjectAirline/Repositories/IFlightRepository.cs @@ -9,13 +9,14 @@ namespace ProjectAirline.Repositories; public interface IFlightRepository { + + Flight ReadFlightById(int id); IEnumerable ReadFlights(DateTime? dateFrom = null, DateTime? dateTo = null, int? flightId = null); void CreateFlight(Flight flight); - //IEnumerable ReadFlights(); void UpdateFlight(Flight flight); diff --git a/ProjectAirline/Repositories/Implementations/ConnectionString.cs b/ProjectAirline/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..aa26c75 --- /dev/null +++ b/ProjectAirline/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 ProjectAirline.Repositories.Implementations; + +internal class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Server=localhost;User Id=postgres;Password=postgres;Database=localhost"; +} diff --git a/ProjectAirline/Repositories/Implementations/FlightRepository.cs b/ProjectAirline/Repositories/Implementations/FlightRepository.cs index 649f2e3..8975b2a 100644 --- a/ProjectAirline/Repositories/Implementations/FlightRepository.cs +++ b/ProjectAirline/Repositories/Implementations/FlightRepository.cs @@ -1,6 +1,10 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,31 +13,131 @@ namespace ProjectAirline.Repositories.Implementations; public class FlightRepository : IFlightRepository { + + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public FlightRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateFlight(Flight flight) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(flight)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Flights (DateTimeDeparture, DateTimeArrival, ArrivalLocation, TicketPrice) +VALUES (@DateTimeDeparture, @DateTimeArrival, @ArrivalLocation, @TicketPrice)"; + connection.Execute(queryInsert, flight); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } - - public IEnumerable ReadFlights(DateTime? dateFrom = null, DateTime? dateTo = null, int? flightId = null) + public void UpdateFlight(Flight flight) { - return []; + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(flight)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Flights +SET +DateTimeDeparture=@DateTimeDeparture, +DateTimeArrival=@DateTimeArrival, +ArrivalLocation=@ArrivalLocation, +TicketPrice=@TicketPrice +WHERE Id=@Id"; + connection.Execute(queryUpdate, flight); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } - - public void DeleteFlight(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Flights +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } + public IEnumerable ReadFlights(DateTime? dateFrom = null, DateTime? dateTo = null, int? flightId = null) + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Flights"; + var flights = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(flights)); + return flights; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + + } + + + public Flight ReadFlightById(int id) { - return Flight.CreateOperation(0, DateTime.Now, DateTime.Now, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Flights +WHERE [Id]=@id"; + var flight = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(flight)); + return flight; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } - //public IEnumerable ReadFlights() - //{ - // return []; - //} - public void UpdateFlight(Flight flight) - { - } + } diff --git a/ProjectAirline/Repositories/Implementations/PassangerRepository.cs b/ProjectAirline/Repositories/Implementations/PassangerRepository.cs index 8b89e60..1f23db7 100644 --- a/ProjectAirline/Repositories/Implementations/PassangerRepository.cs +++ b/ProjectAirline/Repositories/Implementations/PassangerRepository.cs @@ -1,6 +1,10 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,25 +13,122 @@ namespace ProjectAirline.Repositories.Implementations; public class PassangerRepository : IPassangerRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public PassangerRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreatePassanger(Passanger passanger) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(passanger)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Flights (FirstName, LastName) +VALUES (@FirstName, @LastName)"; + connection.Execute(queryInsert, passanger); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } + public void UpdatePassanger(Passanger passanger) + { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(passanger)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Passangers +SET +FirstName=@FirstName, +LastName=@LastName +WHERE Id=@Id"; + connection.Execute(queryUpdate, passanger); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } public void DeletePassanger(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Passangers +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } - public Passanger ReadPassangerById(int id) - { - return Passanger.CreateEntity(0, string.Empty, string.Empty); - } + public IEnumerable ReadPassangers() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Passangers"; + var passangers = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(passangers)); + return passangers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - - public void UpdatePassanger(Passanger passanger) + public Passanger ReadPassangerById(int id) { + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Passangers +WHERE [Id]=@id"; + var passanger = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(passanger)); + return passanger; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } + } diff --git a/ProjectAirline/Repositories/Implementations/PlaneRepository.cs b/ProjectAirline/Repositories/Implementations/PlaneRepository.cs index 137a948..580f061 100644 --- a/ProjectAirline/Repositories/Implementations/PlaneRepository.cs +++ b/ProjectAirline/Repositories/Implementations/PlaneRepository.cs @@ -1,6 +1,10 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,25 +12,121 @@ using System.Threading.Tasks; namespace ProjectAirline.Repositories.Implementations; public class PlaneRepository : IPlaneRepository { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public PlaneRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreatePlane(Plane plane) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(plane)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Planes (Name, Capacity) +VALUES (@Name, @Capacity)"; + connection.Execute(queryInsert, plane); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } + public void UpdatePlane(Plane plane) + { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(plane)); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Planes +SET +Name=@Name, +Capacity=@Capacity +WHERE Id=@Id"; + connection.Execute(queryUpdate, plane); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } - public void DeletePlane(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Planes +WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Plane ReadPlaneById(int id) { - return Plane.CreateEntity(0, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Planes +WHERE [Id]=@id"; + var plane = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(plane)); + return plane; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadPlanes() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + SqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Planes"; + var planes = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(planes)); + return planes; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - public void UpdatePlane(Plane plane) - { - } + } diff --git a/ProjectAirline/appsettings.json b/ProjectAirline/appsettings.json new file mode 100644 index 0000000..09a24c9 --- /dev/null +++ b/ProjectAirline/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/airline_log.txt", + "rollingInterval": "Day" + } + } + ] + } +}