From c687ee163caeabc12aa49dc04560395d12acf0e4 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 20 Aug 2026 05:46:31 -0700 Subject: [PATCH 1/2] Added searchbooks functionality --- .../src/Library.Console/CommonActions.cs | 3 +- .../src/Library.Console/ConsoleApp.cs | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/CommonActions.cs b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/CommonActions.cs index 681f95c..1ab7436 100644 --- a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/CommonActions.cs +++ b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/CommonActions.cs @@ -9,5 +9,6 @@ public enum CommonActions SearchPatrons = 4, RenewPatronMembership = 8, ReturnLoanedBook = 16, - ExtendLoanedBook = 32 + ExtendLoanedBook = 32, + SearchBooks = 64, } diff --git a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs index 9fc9750..946f6a0 100644 --- a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs +++ b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs @@ -139,6 +139,7 @@ static CommonActions ReadInputOptions(CommonActions options, out int optionNumbe "m" when options.HasFlag(CommonActions.RenewPatronMembership) => CommonActions.RenewPatronMembership, "e" when options.HasFlag(CommonActions.ExtendLoanedBook) => CommonActions.ExtendLoanedBook, "r" when options.HasFlag(CommonActions.ReturnLoanedBook) => CommonActions.ReturnLoanedBook, + "b" when options.HasFlag(CommonActions.SearchBooks) => CommonActions.SearchBooks, _ when int.TryParse(userInput, out optionNumber) => CommonActions.Select, _ => CommonActions.Repeat }; @@ -178,6 +179,10 @@ static void WriteInputOptions(CommonActions options) { Console.WriteLine("Or type a number to select a list item."); } + if (options.HasFlag(CommonActions.SearchBooks)) + { + Console.WriteLine(" - \"b\" to search for books"); + } } async Task PatronDetails() @@ -193,7 +198,7 @@ async Task PatronDetails() loanNumber++; } - CommonActions options = CommonActions.SearchPatrons | CommonActions.Quit | CommonActions.Select | CommonActions.RenewPatronMembership; + CommonActions options = CommonActions.SearchPatrons | CommonActions.Quit | CommonActions.Select | CommonActions.RenewPatronMembership | CommonActions.SearchBooks; CommonActions action = ReadInputOptions(options, out int selectedLoanNumber); if (action == CommonActions.Select) { @@ -225,10 +230,47 @@ async Task PatronDetails() selectedPatronDetails = (await _patronRepository.GetPatron(selectedPatronDetails.Id))!; return ConsoleState.PatronDetails; } + else if (action == CommonActions.SearchBooks) + { + return await SearchBooks(); + } throw new InvalidOperationException("An input option is not handled."); } + async Task SearchBooks() + { + string searchInput = ReadBookTitle(); + List patrons = await _patronRepository.SearchPatrons(string.Empty); + Loan? loan = patrons + .SelectMany(patron => patron.Loans) + .FirstOrDefault(loan => + loan.ReturnDate == null && + string.Equals(loan.BookItem?.Book?.Title, searchInput, StringComparison.OrdinalIgnoreCase)); + + if (loan == null) + { + Console.WriteLine($"{searchInput} is available for loan"); + } + else + { + Console.WriteLine($"{loan.BookItem!.Book!.Title} is on loan to another patron. The return due date is {loan.DueDate}."); + } + + return ConsoleState.PatronDetails; + } + + static string ReadBookTitle() + { + string? searchInput = null; + while (String.IsNullOrWhiteSpace(searchInput)) + { + Console.Write("Enter a book title to search for: "); + searchInput = Console.ReadLine(); + } + return searchInput; + } + async Task LoanDetails() { Console.WriteLine($"Book title: {selectedLoanDetails.BookItem!.Book!.Title}"); From 75bdc66f0f2c77aa18ab4b11dfc3300e60eda651 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 20 Aug 2026 06:34:53 -0700 Subject: [PATCH 2/2] Improve and enhance SearchBook Functionality --- .../src/Library.Console/ConsoleApp.cs | 74 ++++++++++++------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs index 946f6a0..4e1db30 100644 --- a/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs +++ b/LabFiles/03-develop-code-features/AccelerateDevGHCopilot/src/Library.Console/ConsoleApp.cs @@ -2,6 +2,8 @@ using Library.ApplicationCore.Entities; using Library.ApplicationCore.Enums; using Library.Console; +using Library.Infrastructure.Data; +using Library.Infrastructure.Data; public class ConsoleApp { @@ -17,12 +19,20 @@ public class ConsoleApp ILoanService _loanService; IPatronService _patronService; - public ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository) + JsonData _jsonData; + + public ConsoleApp( + ILoanService loanService, + IPatronService patronService, + IPatronRepository patronRepository, + ILoanRepository loanRepository, + JsonData jsonData) { _patronRepository = patronRepository; _loanRepository = loanRepository; _loanService = loanService; _patronService = patronService; + _jsonData = jsonData; } public async Task Run() @@ -136,10 +146,10 @@ static CommonActions ReadInputOptions(CommonActions options, out int optionNumbe { "q" when options.HasFlag(CommonActions.Quit) => CommonActions.Quit, "s" when options.HasFlag(CommonActions.SearchPatrons) => CommonActions.SearchPatrons, + "b" when options.HasFlag(CommonActions.SearchBooks) => CommonActions.SearchBooks, "m" when options.HasFlag(CommonActions.RenewPatronMembership) => CommonActions.RenewPatronMembership, "e" when options.HasFlag(CommonActions.ExtendLoanedBook) => CommonActions.ExtendLoanedBook, "r" when options.HasFlag(CommonActions.ReturnLoanedBook) => CommonActions.ReturnLoanedBook, - "b" when options.HasFlag(CommonActions.SearchBooks) => CommonActions.SearchBooks, _ when int.TryParse(userInput, out optionNumber) => CommonActions.Select, _ => CommonActions.Repeat }; @@ -171,6 +181,10 @@ static void WriteInputOptions(CommonActions options) { Console.WriteLine(" - \"s\" for new search"); } + if (options.HasFlag(CommonActions.SearchBooks)) + { + Console.WriteLine(" - \"b\" to check for book availability"); + } if (options.HasFlag(CommonActions.Quit)) { Console.WriteLine(" - \"q\" to quit"); @@ -179,10 +193,6 @@ static void WriteInputOptions(CommonActions options) { Console.WriteLine("Or type a number to select a list item."); } - if (options.HasFlag(CommonActions.SearchBooks)) - { - Console.WriteLine(" - \"b\" to search for books"); - } } async Task PatronDetails() @@ -240,37 +250,51 @@ async Task PatronDetails() async Task SearchBooks() { - string searchInput = ReadBookTitle(); - List patrons = await _patronRepository.SearchPatrons(string.Empty); - Loan? loan = patrons - .SelectMany(patron => patron.Loans) + string? bookTitle = null; + + while (String.IsNullOrWhiteSpace(bookTitle)) + { + Console.Write("Enter a book title to search for: "); + bookTitle = Console.ReadLine(); + } + + await _jsonData.EnsureDataLoaded(); + + Book? book = _jsonData.Books! + .FirstOrDefault(book => + string.Equals( + book.Title, + bookTitle, + StringComparison.OrdinalIgnoreCase)); + + if (book == null) + { + Console.WriteLine("No matching book found."); + return ConsoleState.PatronDetails; + } + + BookItem? bookItem = _jsonData.BookItems! + .FirstOrDefault(bookItem => bookItem.BookId == book.Id); + + Loan? loan = _jsonData.Loans! .FirstOrDefault(loan => - loan.ReturnDate == null && - string.Equals(loan.BookItem?.Book?.Title, searchInput, StringComparison.OrdinalIgnoreCase)); + loan.BookItemId == bookItem?.Id && + loan.ReturnDate == null); if (loan == null) { - Console.WriteLine($"{searchInput} is available for loan"); + Console.WriteLine($"{book.Title} is available for loan"); } else { - Console.WriteLine($"{loan.BookItem!.Book!.Title} is on loan to another patron. The return due date is {loan.DueDate}."); + Console.WriteLine( + $"{book.Title} is on loan to another patron. " + + $"The return due date is {loan.DueDate}."); } return ConsoleState.PatronDetails; } - static string ReadBookTitle() - { - string? searchInput = null; - while (String.IsNullOrWhiteSpace(searchInput)) - { - Console.Write("Enter a book title to search for: "); - searchInput = Console.ReadLine(); - } - return searchInput; - } - async Task LoanDetails() { Console.WriteLine($"Book title: {selectedLoanDetails.BookItem!.Book!.Title}");