diff --git a/ProjectLibrary/ProjectLibrary/Entities/BookIssue.cs b/ProjectLibrary/ProjectLibrary/Entities/BookIssue.cs index 5cd53ef..91344eb 100644 --- a/ProjectLibrary/ProjectLibrary/Entities/BookIssue.cs +++ b/ProjectLibrary/ProjectLibrary/Entities/BookIssue.cs @@ -8,14 +8,17 @@ namespace ProjectLibrary.Entities; public class BookIssue { + public int IssueId { get; private set; } + public string Description { get; private set; } public int BookId { get;private set; } - public static BookIssue CreateElement(string description, int bookId) + public static BookIssue CreateElement(int issueId, string description, int bookId) { return new BookIssue { + IssueId = issueId, Description = description, BookId = bookId }; diff --git a/ProjectLibrary/ProjectLibrary/Entities/BookRestoration.cs b/ProjectLibrary/ProjectLibrary/Entities/BookRestoration.cs index d5fb8ff..a75696c 100644 --- a/ProjectLibrary/ProjectLibrary/Entities/BookRestoration.cs +++ b/ProjectLibrary/ProjectLibrary/Entities/BookRestoration.cs @@ -8,18 +8,19 @@ namespace ProjectLibrary.Entities; public class BookRestoration { + public int Id { get; private set; } public int LibrarianId { get; private set; } public int BookId { get; private set; } - public DateTime RestorationDate { get; private set; } public string Description { get; private set; } = string.Empty; - public static BookRestoration CreateOperation(int librarianId, int bookId, string description) + public static BookRestoration CreateOperation(int id, int librarianId, int bookId, string description) { return new BookRestoration { + Id = id, LibrarianId = librarianId, BookId = bookId, RestorationDate = DateTime.Now, diff --git a/ProjectLibrary/ProjectLibrary/Forms/FormBookRestoration.cs b/ProjectLibrary/ProjectLibrary/Forms/FormBookRestoration.cs index 2dd9a12..7ebd068 100644 --- a/ProjectLibrary/ProjectLibrary/Forms/FormBookRestoration.cs +++ b/ProjectLibrary/ProjectLibrary/Forms/FormBookRestoration.cs @@ -30,8 +30,6 @@ namespace ProjectLibrary.Forms comboBoxSelectLibrarian.DataSource = librarianRepository.ReadLibrarians(); comboBoxSelectLibrarian.DisplayMember = "Name"; comboBoxSelectLibrarian.ValueMember = "Id"; - - } private void ButtonSave_Click(object sender, EventArgs e) @@ -42,7 +40,7 @@ namespace ProjectLibrary.Forms { throw new Exception("Имеются незаполненные поля"); } - _bookRestorationRepository.CreateBookRestoration(BookRestoration.CreateOperation((int)comboBoxSelectLibrarian.SelectedValue!, (int)comboBoxSelectBook.SelectedValue!, textBoxDescription.Text)); + _bookRestorationRepository.CreateBookRestoration(BookRestoration.CreateOperation(Convert.ToInt32(0),(int)comboBoxSelectLibrarian.SelectedValue!, (int)comboBoxSelectBook.SelectedValue!, textBoxDescription.Text)); Close(); } catch (Exception ex) diff --git a/ProjectLibrary/ProjectLibrary/Forms/FormBookRestorations.Designer.cs b/ProjectLibrary/ProjectLibrary/Forms/FormBookRestorations.Designer.cs index 66f0fb4..555db07 100644 --- a/ProjectLibrary/ProjectLibrary/Forms/FormBookRestorations.Designer.cs +++ b/ProjectLibrary/ProjectLibrary/Forms/FormBookRestorations.Designer.cs @@ -30,8 +30,8 @@ { dataGridView = new DataGridView(); panel1 = new Panel(); - buttonDel = new Button(); buttonAdd = new Button(); + ButtonDel = new Button(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); panel1.SuspendLayout(); SuspendLayout(); @@ -56,7 +56,7 @@ // // panel1 // - panel1.Controls.Add(buttonDel); + panel1.Controls.Add(ButtonDel); panel1.Controls.Add(buttonAdd); panel1.Dock = DockStyle.Right; panel1.Location = new Point(656, 0); @@ -64,17 +64,6 @@ panel1.Size = new Size(144, 450); panel1.TabIndex = 2; // - // buttonDel - // - buttonDel.BackgroundImage = Properties.Resources.minus; - buttonDel.BackgroundImageLayout = ImageLayout.Stretch; - buttonDel.Location = new Point(33, 119); - buttonDel.Name = "buttonDel"; - buttonDel.Size = new Size(75, 60); - buttonDel.TabIndex = 1; - buttonDel.UseVisualStyleBackColor = true; - buttonDel.Click += ButtonDel_Click; - // // buttonAdd // buttonAdd.BackgroundImage = Properties.Resources.plus; @@ -86,6 +75,17 @@ buttonAdd.UseVisualStyleBackColor = true; buttonAdd.Click += ButtonAdd_Click; // + // ButtonDel + // + ButtonDel.BackgroundImage = Properties.Resources.minus; + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(33, 119); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(75, 60); + ButtonDel.TabIndex = 1; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // // FormBookRestorations // AutoScaleDimensions = new SizeF(7F, 15F); @@ -105,7 +105,7 @@ private DataGridView dataGridView; private Panel panel1; - private Button buttonDel; private Button buttonAdd; + private Button ButtonDel; } } \ No newline at end of file diff --git a/ProjectLibrary/ProjectLibrary/Forms/FormIssue.cs b/ProjectLibrary/ProjectLibrary/Forms/FormIssue.cs index f6cd79d..431037f 100644 --- a/ProjectLibrary/ProjectLibrary/Forms/FormIssue.cs +++ b/ProjectLibrary/ProjectLibrary/Forms/FormIssue.cs @@ -27,9 +27,9 @@ namespace ProjectLibrary.Forms comboBoxSelectReader.DataSource = readerRepository.ReadReaders(); comboBoxSelectReader.DisplayMember = "Name"; comboBoxSelectReader.ValueMember = "Id"; - ColumnBook.DataSource = bookRepository.ReadBooks(); - ColumnBook.DisplayMember = "Title"; ColumnBook.ValueMember = "Id"; + ColumnBook.DisplayMember = "Title"; + ColumnBook.DataSource = bookRepository.ReadBooks(); } private void ButtonSave_Click(object sender, EventArgs e) @@ -41,7 +41,7 @@ namespace ProjectLibrary.Forms { throw new Exception("Имеются незаполненные поля"); } - _issueRepository.CreateIssue(Issue.CreateOperation(0, (int)comboBoxSelectLibrarian.SelectedValue!, (int)comboBoxSelectReader.SelectedValue!, + _issueRepository.CreateIssue(Issue.CreateOperation(Convert.ToInt32(0), (int)comboBoxSelectLibrarian.SelectedValue!, (int)comboBoxSelectReader.SelectedValue!, CreateListBookIssueFromDataGrid())); Close(); } @@ -63,7 +63,7 @@ namespace ProjectLibrary.Forms { continue; } - list.Add(BookIssue.CreateElement(string.Empty, + list.Add(BookIssue.CreateElement(Convert.ToInt32(comboBoxSelectLibrarian.SelectedValue),string.Empty, Convert.ToInt32(row.Cells["ColumnBook"].Value))); } return list; diff --git a/ProjectLibrary/ProjectLibrary/Forms/FormIssues.Designer.cs b/ProjectLibrary/ProjectLibrary/Forms/FormIssues.Designer.cs index 8b629f2..72f146f 100644 --- a/ProjectLibrary/ProjectLibrary/Forms/FormIssues.Designer.cs +++ b/ProjectLibrary/ProjectLibrary/Forms/FormIssues.Designer.cs @@ -30,8 +30,8 @@ { dataGridView = new DataGridView(); panel1 = new Panel(); - buttonDel = new Button(); buttonAdd = new Button(); + ButtonDel = new Button(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); panel1.SuspendLayout(); SuspendLayout(); @@ -56,7 +56,7 @@ // // panel1 // - panel1.Controls.Add(buttonDel); + panel1.Controls.Add(ButtonDel); panel1.Controls.Add(buttonAdd); panel1.Dock = DockStyle.Right; panel1.Location = new Point(656, 0); @@ -64,17 +64,6 @@ panel1.Size = new Size(144, 450); panel1.TabIndex = 2; // - // buttonDel - // - buttonDel.BackgroundImage = Properties.Resources.minus; - buttonDel.BackgroundImageLayout = ImageLayout.Stretch; - buttonDel.Location = new Point(33, 119); - buttonDel.Name = "buttonDel"; - buttonDel.Size = new Size(75, 60); - buttonDel.TabIndex = 1; - buttonDel.UseVisualStyleBackColor = true; - buttonDel.Click += ButtonDel_Click; - // // buttonAdd // buttonAdd.BackgroundImage = Properties.Resources.plus; @@ -86,6 +75,17 @@ buttonAdd.UseVisualStyleBackColor = true; buttonAdd.Click += ButtonAdd_Click; // + // ButtonDel + // + ButtonDel.BackgroundImage = Properties.Resources.minus; + ButtonDel.BackgroundImageLayout = ImageLayout.Stretch; + ButtonDel.Location = new Point(33, 119); + ButtonDel.Name = "ButtonDel"; + ButtonDel.Size = new Size(75, 60); + ButtonDel.TabIndex = 2; + ButtonDel.UseVisualStyleBackColor = true; + ButtonDel.Click += ButtonDel_Click; + // // FormIssues // AutoScaleDimensions = new SizeF(7F, 15F); @@ -105,7 +105,7 @@ private DataGridView dataGridView; private Panel panel1; - private Button buttonDel; private Button buttonAdd; + private Button ButtonDel; } } \ No newline at end of file diff --git a/ProjectLibrary/ProjectLibrary/Program.cs b/ProjectLibrary/ProjectLibrary/Program.cs index b699bb0..63de25c 100644 --- a/ProjectLibrary/ProjectLibrary/Program.cs +++ b/ProjectLibrary/ProjectLibrary/Program.cs @@ -2,6 +2,10 @@ using Unity.Lifetime; using Unity; using ProjectLibrary.Repositories; using ProjectLibrary.Repositories.Implementations; +using Microsoft.Extensions.Logging; +using Serilog; +using Microsoft.Extensions.Configuration; +using Unity.Microsoft.Logging; namespace ProjectLibrary { @@ -22,12 +26,26 @@ namespace ProjectLibrary private static IUnityContainer CreateContainer() { var container = new UnityContainer(); + 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()); + 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/ProjectLibrary/ProjectLibrary/ProjectLibrary.csproj b/ProjectLibrary/ProjectLibrary/ProjectLibrary.csproj index accbdf0..0307ec6 100644 --- a/ProjectLibrary/ProjectLibrary/ProjectLibrary.csproj +++ b/ProjectLibrary/ProjectLibrary/ProjectLibrary.csproj @@ -9,7 +9,19 @@ + + + + + + + + + + + + diff --git a/ProjectLibrary/ProjectLibrary/Repositories/IBookRestorationRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/IBookRestorationRepository.cs index fdb3771..682a31b 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/IBookRestorationRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/IBookRestorationRepository.cs @@ -9,7 +9,9 @@ namespace ProjectLibrary.Repositories; public interface IBookRestorationRepository { - IEnumerable ReadBookRestorations(int? librarianId = null, int? bookId=null, string? description = null, DateTime? dateFrom = null, DateTime? dateTo = null); + IEnumerable ReadBookRestorations(int? id = null, int? librarianId = null, int? bookId=null, string? description = null, DateTime? dateFrom = null, DateTime? dateTo = null); + void CreateBookRestoration(BookRestoration bookRestoration); + void DeleteBookRestoration(int id); } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/IConnectionString.cs b/ProjectLibrary/ProjectLibrary/Repositories/IConnectionString.cs new file mode 100644 index 0000000..6be1b28 --- /dev/null +++ b/ProjectLibrary/ProjectLibrary/Repositories/IConnectionString.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectLibrary.Repositories; + +public interface IConnectionString +{ + string ConnectionString { get; } +} diff --git a/ProjectLibrary/ProjectLibrary/Repositories/IIssueRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/IIssueRepository.cs index 46437b2..8204a88 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/IIssueRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/IIssueRepository.cs @@ -10,6 +10,8 @@ namespace ProjectLibrary.Repositories; public interface IIssueRepository { IEnumerable ReadIssue(int? id=null, int? librarianId = null, int? readerId = null, DateTime? dateFrom = null, DateTime? dateTo = null); + void CreateIssue(Issue issue); + void DeleteIssue(int id); } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRepository.cs index ff34501..6286a73 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRepository.cs @@ -1,33 +1,138 @@ -using ProjectLibrary.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectLibrary.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; + namespace ProjectLibrary.Repositories.Implementations; public class BookRepository : IBookRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public BookRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateBook(Book book) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(book)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" INSERT INTO Book (Title, Topic, IsIssued) VALUES (@Title, @Topic, @IsIssued)"; + connection.Execute(queryInsert, book); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteBook(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Book + WHERE Id=@id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } public Book ReadBookById(int id) { - return Book.CreateEntity(0, string.Empty, 0, false); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Book + WHERE Id=@id"; + var book = connection.QueryFirst(querySelect, new { id }); + + + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(book)); + return book; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadBooks() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Book"; + var books = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(books)); + return books; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } public void UpdateBook(Book book) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(book)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Book + SET + Title=@Title, + Topic=@Topic, + IsIssued=@IsIssued + WHERE Id=@Id"; + connection.Execute(queryUpdate, book); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRestorationRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRestorationRepository.cs index c9900db..3c68ed8 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRestorationRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/BookRestorationRepository.cs @@ -1,6 +1,11 @@ -using ProjectLibrary.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectLibrary.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,16 +14,76 @@ namespace ProjectLibrary.Repositories.Implementations; public class BookRestorationRepository : IBookRestorationRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public BookRestorationRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateBookRestoration(BookRestoration bookRestoration) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(bookRestoration)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO BookRestoration (LibrarianId, BookId, RestorationDate, Description) + VALUES (@LibrarianId, @BookId, @RestorationDate, @Description)"; + connection.Execute(queryInsert, bookRestoration); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } public void DeleteBookRestoration(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM BookRestoration + WHERE Id=@Id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } - public IEnumerable ReadBookRestorations(int? librarianId, int? bookId, string? description, DateTime? dateFrom = null, DateTime? dateTo = null) + public IEnumerable ReadBookRestorations(int? id, int? librarianId, int? bookId, string? description, DateTime? dateFrom = null, DateTime? dateTo = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM BookRestoration"; + var bookRestoration = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(bookRestoration)); + return bookRestoration; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ConnectionString.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ConnectionString.cs new file mode 100644 index 0000000..1e8d29a --- /dev/null +++ b/ProjectLibrary/ProjectLibrary/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 ProjectLibrary.Repositories.Implementations; + +public class ConnectionString : IConnectionString +{ + string IConnectionString.ConnectionString => "Server=localhost;Port=5432;Username=postgres;Password=postgres;Database=library"; +} diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/IssueRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/IssueRepository.cs index 13eb810..8be084c 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/IssueRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/IssueRepository.cs @@ -1,6 +1,11 @@ -using ProjectLibrary.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectLibrary.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,16 +14,99 @@ namespace ProjectLibrary.Repositories.Implementations; public class IssueRepository : IIssueRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public IssueRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateIssue(Issue issue) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(issue)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" + INSERT INTO Issue (IssueDate, DueDate, ReturnDate, LibrarianId, ReaderId) + VALUES (@IssueDate, @DueDate, @ReturnDate, @LibrarianId, @ReaderId) + Returning Id"; + var issueId = + connection.QueryFirst(queryInsert, new + { + issue.IssueDate, issue.DueDate,issue.ReturnDate,issue.LibrarianId, issue.ReaderId + }, transaction); + var querySubInsert = @" + INSERT INTO BookIssue (Description, BookId, IssueId) + VALUES (@Description,@BookId, @IssueId)"; + foreach (var elem in issue.BookIssue) + { + connection.Execute(querySubInsert, new + { + IssueId = issueId, + elem.Description, + elem.BookId + }, transaction); ; + } + transaction.Commit(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteIssue(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM BookIssue + WHERE IssueId=@Id"; + connection.Execute(queryDelete, new { id }); + + var queryDeleteIssue = @" + DELETE FROM Issue WHERE Id = @Id"; + connection.Execute(queryDeleteIssue, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public IEnumerable ReadIssue(int? id, int? librarianId, int? readerId, DateTime? dateFrom = null, DateTime? dateTo = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT * FROM Issue"; + var issue = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(issue)); + return issue; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/LibrarianRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/LibrarianRepository.cs index 36439ab..3a33e7c 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/LibrarianRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/LibrarianRepository.cs @@ -1,6 +1,11 @@ -using ProjectLibrary.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectLibrary.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 ProjectLibrary.Repositories.Implementations; public class LibrarianRepository : ILibrarianRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public LibrarianRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateLibrarian(Librarian librarian) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(librarian)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" INSERT INTO Librarian (Name, AllowedTopic) VALUES (@Name, @AllowedTopic)"; + connection.Execute(queryInsert, librarian); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteLibrarian(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Librarian + WHERE Id=@Id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } public Librarian ReadLibrarianById(int id) { - return Librarian.CreateEntity(0,string.Empty,0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Librarian + WHERE Id=@Id"; + var librarian = connection.QueryFirst(querySelect, new { id }); + + + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(librarian)); + return librarian; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadLibrarians() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Librarian"; + var librarians = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(librarians)); + return librarians; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } public void UpdateLibrarian(Librarian librarian) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(librarian)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Librarian + SET + Name=@Name, + AllowedTopic=@AllowedTopic + WHERE Id=@Id"; + connection.Execute(queryUpdate, librarian); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } } diff --git a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ReaderRepository.cs b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ReaderRepository.cs index 7a8e857..79b566e 100644 --- a/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ReaderRepository.cs +++ b/ProjectLibrary/ProjectLibrary/Repositories/Implementations/ReaderRepository.cs @@ -1,6 +1,11 @@ -using ProjectLibrary.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectLibrary.Entities; using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,25 +14,124 @@ namespace ProjectLibrary.Repositories.Implementations; public class ReaderRepository : IReaderRepository { + private readonly IConnectionString _connectionString; + + private readonly ILogger _logger; + + public ReaderRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateReader(Reader reader) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(reader)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" INSERT INTO Reader (Name, LibraryCard, CardValidity) VALUES (@Name, @LibraryCard, @CardValidity)"; + connection.Execute(queryInsert, reader); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } + } public void DeleteReader(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Reader + WHERE Id=@Id"; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } + } public Reader ReadReaderById(int id) { - return Reader.CreateEntity(0,string.Empty,0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Reader + WHERE Id=@Id"; + var reader = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", + JsonConvert.SerializeObject(reader)); + return reader; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } public IEnumerable ReadReaders() { - return []; + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM Reader"; + var readers = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(readers)); + return readers; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdateReader(Reader reader) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", + JsonConvert.SerializeObject(reader)); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Reader + SET + Name=@Name, + LibraryCard=@LibraryCard, + CardValidity=@CardValidity + WHERE Id=@Id"; + connection.Execute(queryUpdate, reader); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } + } } diff --git a/ProjectLibrary/ProjectLibrary/appsettings.json b/ProjectLibrary/ProjectLibrary/appsettings.json new file mode 100644 index 0000000..e90c1f4 --- /dev/null +++ b/ProjectLibrary/ProjectLibrary/appsettings.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "F:\\OTP2\\ProjectLibrary\\ProjectLibrary\\library_log.txt", + "rollingInterval": "Day" + } + } + ] + } +} \ No newline at end of file