diff --git a/ProjectAirline/Entities/Flight.cs b/ProjectAirline/Entities/Flight.cs index d909b99..89e2ce2 100644 --- a/ProjectAirline/Entities/Flight.cs +++ b/ProjectAirline/Entities/Flight.cs @@ -16,15 +16,15 @@ public class Flight public string DeparturePoint { get; private set; } = string.Empty; public int TicketPrice { get; private set; } public IEnumerable EmployeeFlights { get; private set; } = []; - public static Flight CreateOperation(int id, int airPlaneID, string destination, string departurePoint, int ticketPrice, + public static Flight CreateOperation(int id, int airPlaneID, DateTime dateTimeDep, DateTime dateTimeArr, string destination, string departurePoint, int ticketPrice, IEnumerable employeeFlights) { return new Flight { Id = id, AirplaneID = airPlaneID, - DepartureTime = DateTime.Now, - ArrivalTime = DateTime.Now, + DepartureTime = dateTimeDep, + ArrivalTime = dateTimeArr, Destination = destination ?? string.Empty, DeparturePoint = departurePoint ?? string.Empty, TicketPrice = ticketPrice, diff --git a/ProjectAirline/Entities/Passenger.cs b/ProjectAirline/Entities/Passenger.cs index 12bbf34..18c62af 100644 --- a/ProjectAirline/Entities/Passenger.cs +++ b/ProjectAirline/Entities/Passenger.cs @@ -14,7 +14,7 @@ public class Passenger public string FirstName { get; private set; } = string.Empty; public string LastName { get; private set; } = string.Empty; public DateTime DateBirth { get; private set; } - public static Passenger CreateEntity (int id, FoodPreferences foodPreferences, string first, string last) + public static Passenger CreateEntity (int id, FoodPreferences foodPreferences, string first, string last, DateTime dateTime) { return new Passenger { @@ -22,7 +22,7 @@ public class Passenger FoodPreferences = foodPreferences, FirstName = first ?? string.Empty, LastName = last ?? string.Empty, - DateBirth = DateTime.Now + DateBirth = dateTime }; } } diff --git a/ProjectAirline/Entities/Ticket.cs b/ProjectAirline/Entities/Ticket.cs index a95a856..cc20838 100644 --- a/ProjectAirline/Entities/Ticket.cs +++ b/ProjectAirline/Entities/Ticket.cs @@ -14,7 +14,7 @@ public class Ticket public int TicketPrice { get; private set; } public DateTime DateBuy { get; private set; } - public static Ticket CreateTicket (int id, int flightID, int passengerID, int ticketPrice) + public static Ticket CreateTicket (int id, int flightID, int passengerID, int ticketPrice, DateTime dateTimeBuy) { return new Ticket { @@ -22,7 +22,7 @@ public class Ticket FlightID = flightID, PassengerID = passengerID, TicketPrice = ticketPrice, - DateBuy = DateTime.Now + DateBuy = dateTimeBuy }; } diff --git a/ProjectAirline/Forms/FormAirplane.Designer.cs b/ProjectAirline/Forms/FormAirplane.Designer.cs index 22eb57a..9116c7f 100644 --- a/ProjectAirline/Forms/FormAirplane.Designer.cs +++ b/ProjectAirline/Forms/FormAirplane.Designer.cs @@ -83,6 +83,7 @@ // numericUpDownCapacity // numericUpDownCapacity.Location = new Point(155, 165); + numericUpDownCapacity.Maximum = new decimal(new int[] { 1000, 0, 0, 0 }); numericUpDownCapacity.Name = "numericUpDownCapacity"; numericUpDownCapacity.Size = new Size(150, 27); numericUpDownCapacity.TabIndex = 5; diff --git a/ProjectAirline/Forms/FormFlight.Designer.cs b/ProjectAirline/Forms/FormFlight.Designer.cs index 4c1ed9a..3fe8cd5 100644 --- a/ProjectAirline/Forms/FormFlight.Designer.cs +++ b/ProjectAirline/Forms/FormFlight.Designer.cs @@ -132,6 +132,7 @@ // numericUpDownPrice // numericUpDownPrice.Location = new Point(183, 274); + numericUpDownPrice.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); numericUpDownPrice.Name = "numericUpDownPrice"; numericUpDownPrice.Size = new Size(250, 27); numericUpDownPrice.TabIndex = 9; diff --git a/ProjectAirline/Forms/FormFlight.cs b/ProjectAirline/Forms/FormFlight.cs index 6b4e205..e4a1622 100644 --- a/ProjectAirline/Forms/FormFlight.cs +++ b/ProjectAirline/Forms/FormFlight.cs @@ -39,6 +39,7 @@ namespace ProjectAirline.Forms try { _flightRepository.CreateFlight(Flight.CreateOperation(0, (int)comboBoxAirplane.SelectedValue, + dateTimePickerDeparture.Value, dateTimePickerArrival.Value, textBoxDestination.Text, textBoxDeparture.Text, (int)numericUpDownPrice.Value, CreateListFlightFromDataGrid())); Close(); diff --git a/ProjectAirline/Forms/FormPassenger.cs b/ProjectAirline/Forms/FormPassenger.cs index d798951..0cfb570 100644 --- a/ProjectAirline/Forms/FormPassenger.cs +++ b/ProjectAirline/Forms/FormPassenger.cs @@ -104,6 +104,6 @@ public partial class FormPassenger : Form foodPreferences |= (FoodPreferences)elem; } - return Passenger.CreateEntity(id, foodPreferences, textBoxFirstname.Text, textBoxLastname.Text); + return Passenger.CreateEntity(id, foodPreferences, textBoxFirstname.Text, textBoxLastname.Text, dateTimePickerBorn.Value); } } diff --git a/ProjectAirline/Forms/FormTicket.Designer.cs b/ProjectAirline/Forms/FormTicket.Designer.cs index f2bc54d..be7becf 100644 --- a/ProjectAirline/Forms/FormTicket.Designer.cs +++ b/ProjectAirline/Forms/FormTicket.Designer.cs @@ -36,6 +36,8 @@ numericUpDownPrice = new NumericUpDown(); buttonAdd = new Button(); buttonCancel = new Button(); + label4 = new Label(); + dateTimePickerBuy = new DateTimePicker(); ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); SuspendLayout(); // @@ -115,11 +117,29 @@ buttonCancel.UseVisualStyleBackColor = true; buttonCancel.Click += ButtonCancel_Click; // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(34, 267); + label4.Name = "label4"; + label4.Size = new Size(102, 20); + label4.TabIndex = 8; + label4.Text = "Дата покупки"; + // + // dateTimePickerBuy + // + dateTimePickerBuy.Location = new Point(163, 267); + dateTimePickerBuy.Name = "dateTimePickerBuy"; + dateTimePickerBuy.Size = new Size(226, 27); + dateTimePickerBuy.TabIndex = 9; + // // FormTicket // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(440, 450); + Controls.Add(dateTimePickerBuy); + Controls.Add(label4); Controls.Add(buttonCancel); Controls.Add(buttonAdd); Controls.Add(numericUpDownPrice); @@ -145,5 +165,7 @@ private NumericUpDown numericUpDownPrice; private Button buttonAdd; private Button buttonCancel; + private Label label4; + private DateTimePicker dateTimePickerBuy; } } \ No newline at end of file diff --git a/ProjectAirline/Forms/FormTicket.cs b/ProjectAirline/Forms/FormTicket.cs index c6216c8..6313ac2 100644 --- a/ProjectAirline/Forms/FormTicket.cs +++ b/ProjectAirline/Forms/FormTicket.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using ProjectAirline.Repositories; using ProjectAirline.Entities; +using ProjectAirline.Repositories.Implementations; namespace ProjectAirline.Forms { @@ -16,30 +17,7 @@ namespace ProjectAirline.Forms { private readonly ITicketRepository _ticketRepository; private int? _ticketId; - public int Id - { - set - { - try - { - var appointment = - _ticketRepository.ReadTicketById(value); - if (appointment == null) - { - throw new - InvalidDataException(nameof(appointment)); - } - comboBoxFlight.SelectedIndex = appointment.FlightID; - comboBoxPassenger.SelectedIndex = appointment.PassengerID; - _ticketId = value; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - } - } + public FormTicket(ITicketRepository ticketRepository, IPassengerRepository passengerRepository, IFlightRepository flightRepository) { InitializeComponent(); @@ -64,14 +42,10 @@ namespace ProjectAirline.Forms { throw new Exception("Имеются незаполненны поля"); } - if (_ticketId.HasValue) - { - _ticketRepository.UpdateTicket(CreateTicket(_ticketId.Value)); - } - else - { - _ticketRepository.CreateTicket(CreateTicket(0)); - } + + _ticketRepository.CreateTicket(Ticket.CreateTicket(0, + (int)comboBoxFlight.SelectedValue!, (int)comboBoxPassenger.SelectedValue!, + Convert.ToInt32(numericUpDownPrice.Value), dateTimePickerBuy.Value)); Close(); } catch (Exception ex) @@ -85,7 +59,5 @@ namespace ProjectAirline.Forms { Close(); } - private Ticket CreateTicket(int id) => Ticket.CreateTicket(id, comboBoxFlight.SelectedIndex, - comboBoxPassenger.SelectedIndex, (int)numericUpDownPrice.Value); } } diff --git a/ProjectAirline/Forms/FormTickets.Designer.cs b/ProjectAirline/Forms/FormTickets.Designer.cs index 3e020e9..580719f 100644 --- a/ProjectAirline/Forms/FormTickets.Designer.cs +++ b/ProjectAirline/Forms/FormTickets.Designer.cs @@ -29,7 +29,6 @@ private void InitializeComponent() { panel1 = new Panel(); - buttonUpdate = new Button(); buttonAdd = new Button(); dataGridView = new DataGridView(); panel1.SuspendLayout(); @@ -38,7 +37,6 @@ // // panel1 // - panel1.Controls.Add(buttonUpdate); panel1.Controls.Add(buttonAdd); panel1.Dock = DockStyle.Right; panel1.Location = new Point(658, 0); @@ -46,17 +44,6 @@ panel1.Size = new Size(142, 450); panel1.TabIndex = 0; // - // buttonUpdate - // - buttonUpdate.BackgroundImage = Properties.Resources.edit; - buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; - buttonUpdate.Location = new Point(24, 148); - buttonUpdate.Name = "buttonUpdate"; - buttonUpdate.Size = new Size(91, 76); - buttonUpdate.TabIndex = 1; - buttonUpdate.UseVisualStyleBackColor = true; - buttonUpdate.Click += ButtonUpdate_Click; - // // buttonAdd // buttonAdd.BackgroundImage = Properties.Resources.plus; @@ -106,7 +93,6 @@ #endregion private Panel panel1; - private Button buttonUpdate; private Button buttonAdd; private DataGridView dataGridView; } diff --git a/ProjectAirline/Forms/FormTickets.cs b/ProjectAirline/Forms/FormTickets.cs index f3ab09a..4f083c1 100644 --- a/ProjectAirline/Forms/FormTickets.cs +++ b/ProjectAirline/Forms/FormTickets.cs @@ -48,25 +48,7 @@ namespace ProjectAirline.Forms } } - private void ButtonUpdate_Click(object sender, EventArgs e) - { - if (!TryGetIdentifierFromSelectedRow(out var findId)) - { - return; - } - try - { - var form = _container.Resolve(); - form.Id = findId; - form.ShowDialog(); - LoadList(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "Ошибка при изменении", - MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + private void LoadList() => dataGridView.DataSource = _ticketRepository.ReadTickets(); private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectAirline/Program.cs b/ProjectAirline/Program.cs index 0aff576..6a7f814 100644 --- a/ProjectAirline/Program.cs +++ b/ProjectAirline/Program.cs @@ -1,6 +1,11 @@ using ProjectAirline.Repositories.Implementations; using ProjectAirline.Repositories; using Unity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Configuration; +using Serilog; +using Unity.Microsoft.Logging; +using Unity.Lifetime; namespace ProjectAirline { internal static class Program @@ -20,14 +25,31 @@ namespace ProjectAirline private static IUnityContainer CreateContainer() { var container = new UnityContainer(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); + container.AddExtension(new LoggingExtension(CreateLoggerFactory())); + + container.RegisterType(new SingletonLifetimeManager()); + + 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/ProjectAirline/ProjectAirline.csproj b/ProjectAirline/ProjectAirline.csproj index accbdf0..ebcb39c 100644 --- a/ProjectAirline/ProjectAirline.csproj +++ b/ProjectAirline/ProjectAirline.csproj @@ -9,7 +9,19 @@ + + + + + + + + + + + + @@ -27,4 +39,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 3ed1bf3..e560bcd 100644 --- a/ProjectAirline/Repositories/IFlightRepository.cs +++ b/ProjectAirline/Repositories/IFlightRepository.cs @@ -10,7 +10,6 @@ namespace ProjectAirline.Repositories; public interface IFlightRepository { IEnumerable ReadFlights(DateTime? dateForm = null, DateTime? dateTo = null, int? flightId = null, int? airplaneId = null); - Flight ReadFlightById(int flightId); void CreateFlight(Flight flight); void DeleteFlight(int id); } diff --git a/ProjectAirline/Repositories/ITicketRepository.cs b/ProjectAirline/Repositories/ITicketRepository.cs index f79aa6c..d6230fe 100644 --- a/ProjectAirline/Repositories/ITicketRepository.cs +++ b/ProjectAirline/Repositories/ITicketRepository.cs @@ -10,7 +10,5 @@ namespace ProjectAirline.Repositories; public interface ITicketRepository { IEnumerable ReadTickets(); - Ticket ReadTicketById(int id); void CreateTicket(Ticket ticket); - void UpdateTicket(Ticket ticket); } diff --git a/ProjectAirline/Repositories/Implementations/AirplaneRepository.cs b/ProjectAirline/Repositories/Implementations/AirplaneRepository.cs index 2000b0e..c5b1e11 100644 --- a/ProjectAirline/Repositories/Implementations/AirplaneRepository.cs +++ b/ProjectAirline/Repositories/Implementations/AirplaneRepository.cs @@ -1,6 +1,11 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,26 +14,125 @@ namespace ProjectAirline.Repositories.Implementations; public class AirplaneRepository : IAirplaneRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public AirplaneRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } public void CreateAirplane(Airplane airplane) { - } + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(airplane)); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @"INSERT INTO Airplane (Country, Model, Capacity) + VALUES (@Country, @Model, @Capacity)"; + connection.Execute(queryInsert, airplane); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } + public void UpdateAirplane(Airplane airplane) + { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(airplane)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Airplane + SET + Country=@Country, + Model=@Model, + Capacity=@Capacity + WHERE Id=@Id"; + connection.Execute(queryUpdate, airplane); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } public void DeleteAirplane(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Airplane + WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } + public Airplane ReadAirplaneById(int id) { - return Airplane.CreateEntity(0, string.Empty, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Airplane + WHERE Id=@id"; + var airplane = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(airplane)); + return airplane; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } public IEnumerable ReadAirplanes() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Airplane"; + var airplanes = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(airplanes)); + return airplanes; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } - public void UpdateAirplane(Airplane airplane) - { - throw new NotImplementedException(); - } + } diff --git a/ProjectAirline/Repositories/Implementations/ConnectionString.cs b/ProjectAirline/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..2ef741b --- /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;Port=5432;Database=airlines;Username=postgres;Password=postgres;"; +} diff --git a/ProjectAirline/Repositories/Implementations/EmployeeRepository.cs b/ProjectAirline/Repositories/Implementations/EmployeeRepository.cs index 38908b2..bbf2767 100644 --- a/ProjectAirline/Repositories/Implementations/EmployeeRepository.cs +++ b/ProjectAirline/Repositories/Implementations/EmployeeRepository.cs @@ -1,7 +1,12 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAirline.Entities; using ProjectAirline.Entities.Enums; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,25 +15,125 @@ namespace ProjectAirline.Repositories.Implementations; public class EmployeeRepository : IEmployeeRepository { - public void CreateEmployee(Employee employee) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public EmployeeRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; } + public void CreateEmployee(Employee employee) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(employee)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Employee (FirstName, LastName, ContactInformation, EmployeePost) +VALUES (@FirstName, @LastName, @ContactInformation, @EmployeePost)"; + connection.Execute(queryInsert, employee); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } + public void UpdateEmployee(Employee employee) + { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(employee)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Employee +SET +FirstName=@FirstName, +LastName=@LastName, +ContactInformation=@ContactInformation, +EmployeePost=@EmployeePost +WHERE Id=@Id"; + connection.Execute(queryUpdate, employee); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + + } public void DeleteEmployee(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Employee + WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } + public Employee ReadEmployeeById(int id) { - return Employee.CreateEntity(0, string.Empty, string.Empty, string.Empty, EmployeePost.None); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Employee +WHERE Id=@id"; + var employee = connection.QueryFirst(querySelect, + new { id }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(employee)); + return employee; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadEmployees() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Employee"; + var employees = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(employees)); + return employees; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - public void UpdateEmployee(Employee employee) - { - } + } diff --git a/ProjectAirline/Repositories/Implementations/FlightRepository.cs b/ProjectAirline/Repositories/Implementations/FlightRepository.cs index abab5e2..da2ab18 100644 --- a/ProjectAirline/Repositories/Implementations/FlightRepository.cs +++ b/ProjectAirline/Repositories/Implementations/FlightRepository.cs @@ -1,6 +1,11 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,21 +14,94 @@ 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 + NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" +INSERT INTO Flight (AirplaneID, DepartureTime, ArrivalTime, Destination, DeparturePoint, TicketPrice) +VALUES (@AirplaneID, @DepartureTime, @ArrivalTime, @Destination, @DeparturePoint, @TicketPrice); +SELECT MAX(Id) FROM Flight"; + var flightId = + connection.QueryFirst(queryInsert, flight, transaction); + var querySubInsert = @" +INSERT INTO EmployeeFlights (EmployeeId, FlightId, HoursWorked) +VALUES (@EmployeeId,@FlightId, @HoursWorked)"; + foreach (var elem in flight.EmployeeFlights) + { + connection.Execute(querySubInsert, new + { + elem.EmployeeId, + flightId, + elem.HoursWorked + }, transaction); + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteFlight(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" +DELETE FROM Flight +WHERE ID = @id"; + connection.Execute(queryDelete, new { id }); + } + + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } - public Flight ReadFlightById(int flightId) - { - return null; - } public IEnumerable ReadFlights(DateTime? dateForm = null, DateTime? dateTo = null, int? flightId = null, int? airplaneId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Flight"; + var flights = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(flights)); + return flights; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectAirline/Repositories/Implementations/PassengerRepository.cs b/ProjectAirline/Repositories/Implementations/PassengerRepository.cs index 607af7a..a8d7514 100644 --- a/ProjectAirline/Repositories/Implementations/PassengerRepository.cs +++ b/ProjectAirline/Repositories/Implementations/PassengerRepository.cs @@ -1,6 +1,11 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +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 +14,126 @@ namespace ProjectAirline.Repositories.Implementations; public class PassengerRepository : IPassengerRepository { - public void CreatePassenger(Passenger passenger) + + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + public PassengerRepository(IConnectionString connectionString, + ILogger logger) { + _connectionString = connectionString; + _logger = logger; } + public void CreatePassenger(Passenger passenger) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(passenger)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Passenger (FoodPreferences, FirstName, LastName, DateBirth) +VALUES (@FoodPreferences, @FirstName, @LastName, @DateBirth)"; + connection.Execute(queryInsert, passenger); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } + public void UpdatePassenger(Passenger passenger) + { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(passenger)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" +UPDATE Passenger +SET +FoodPreferences=@FoodPreferences, +FirstName=@FirstName, +LastName=@LastName, +DateBirth=@DateBirth +WHERE Id=@Id"; + connection.Execute(queryUpdate, passenger); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } public void DeletePassenger(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Passenger + WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Passenger ReadPassengerById(int id) { - return null; + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" +SELECT * FROM Passenger +WHERE Id=@id"; + var passenger = connection.QueryFirst(querySelect, new + { + id + }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(passenger)); + return passenger; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadPassengers() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Passenger"; + var passengers = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(passengers)); + return passengers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - public void UpdatePassenger(Passenger passenger) - { - } + } diff --git a/ProjectAirline/Repositories/Implementations/TicketRepository.cs b/ProjectAirline/Repositories/Implementations/TicketRepository.cs index 4db2694..43cfb95 100644 --- a/ProjectAirline/Repositories/Implementations/TicketRepository.cs +++ b/ProjectAirline/Repositories/Implementations/TicketRepository.cs @@ -1,6 +1,11 @@ -using ProjectAirline.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectAirline.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,21 +14,55 @@ namespace ProjectAirline.Repositories.Implementations; public class TicketRepository : ITicketRepository { - public void CreateTicket(Ticket ticket) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + public TicketRepository(IConnectionString connectionString, + ILogger logger) { + _connectionString = connectionString; + _logger = logger; } - public Ticket ReadTicketById(int id) + public void CreateTicket(Ticket ticket) { - return null; + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(ticket)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" +INSERT INTO Ticket (FlightID, PassengerID, TicketPrice, DateBuy) +VALUES (@FlightID, @PassengerID, @TicketPrice, @DateBuy)"; + connection.Execute(queryInsert, ticket); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public IEnumerable ReadTickets() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Ticket"; + var tickets = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(tickets)); + return tickets; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - public void UpdateTicket(Ticket ticket) - { - } } diff --git a/ProjectAirline/appsettings.json b/ProjectAirline/appsettings.json new file mode 100644 index 0000000..d7446cc --- /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" + } + } + ] + } +} \ No newline at end of file