From 0c99f0f1f2455aca19fda3f2b91a2a88aef22e16 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Mon, 12 Jan 2026 22:56:27 +0100 Subject: [PATCH 01/11] Moved sout to display properly --- src/main/java/org/example/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index a7c8b166..16e5a8a0 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -56,12 +56,12 @@ static void main(String[] args) { if (SessionManager.isLoggedIn()) userCli.logout(); } case "4" -> { - System.out.println("Dina aktiva lån:"); List loans = loanServices.activeLoans(SessionManager.getCurrentUser()); boolean running = true; while (running) { if (!loans.isEmpty()) { + System.out.println("Dina aktiva lån:"); int counter = 0; for (Loan loan : loans) { counter += 1; From 3e9cad9fcc65c7a7db8ddd308730642f05fa4c19 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Mon, 12 Jan 2026 23:27:44 +0100 Subject: [PATCH 02/11] `SearchCli` to instance-based `EntityManager` auto-closure with try-with-resources. --- src/main/java/org/example/SearchCli.java | 106 ++++++++++------------- 1 file changed, 48 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/example/SearchCli.java b/src/main/java/org/example/SearchCli.java index 7f9d952d..f427fcd9 100644 --- a/src/main/java/org/example/SearchCli.java +++ b/src/main/java/org/example/SearchCli.java @@ -10,64 +10,63 @@ import java.util.stream.Collectors; public class SearchCli { - static EntityManager em; - static BookSearch searchService = new BookSearch(); - static Scanner sc; + private final BookSearch searchService = new BookSearch(); + private final Scanner sc; // Constructor? - public SearchCli(Scanner sc, EntityManager em) { + public SearchCli(Scanner sc) { this.sc = sc; - this.em = em; } - public static void bookSearchCli() { - boolean running = true; - - while (running) { - System.out.println("\n Bibliotekssystem – Sök"); - System.out.println("1) Sök på titel"); - System.out.println("2) Sök på författare"); - System.out.println("3) Sök på genre"); - System.out.println("0) Tillbaka"); - System.out.print("Välj: "); - - String choice = sc.nextLine().trim(); - - switch (choice) { - case "1" -> { - System.out.print("Skriv titel (eller del av titel): "); - String q = sc.nextLine(); - List results = searchService.searchByTitle(em, q); - handleSearchFlow(sc, results); - } - case "2" -> { - System.out.print("Skriv författare (för- eller efternamn): "); - String q = sc.nextLine(); - List results = searchService.searchByAuthor(em, q); - handleSearchFlow(sc, results); - } - case "3" -> { - System.out.print("Skriv genre: "); - String q = sc.nextLine(); - List results = searchService.searchByGenre(em, q); - handleSearchFlow(sc, results); + public void bookSearchCli() { + // Try-with to force em to auto-close + try (EntityManager em = EMFactory.getEntityManager()) { + boolean running = true; + + while (running) { + System.out.println("\n Bibliotekssystem – Sök"); + System.out.println("1) Sök på titel"); + System.out.println("2) Sök på författare"); + System.out.println("3) Sök på genre"); + System.out.println("0) Tillbaka"); + System.out.print("Välj: "); + + String choice = sc.nextLine().trim(); + + switch (choice) { + case "1" -> { + System.out.print("Skriv titel (eller del av titel): "); + String q = sc.nextLine(); + List results = searchService.searchByTitle(em, q); + handleSearchFlow(results, em); + } + case "2" -> { + System.out.print("Skriv författare (för- eller efternamn): "); + String q = sc.nextLine(); + List results = searchService.searchByAuthor(em, q); + handleSearchFlow(results, em); + } + case "3" -> { + System.out.print("Skriv genre: "); + String q = sc.nextLine(); + List results = searchService.searchByGenre(em, q); + handleSearchFlow(results, em); + } + case "0" -> running = false; + default -> System.out.println("Ogiltigt val, försök igen."); } - case "0" -> running = false; - default -> System.out.println("Ogiltigt val, försök igen."); } } } - - // Flöde: lista -> välj -> detalj - private static void handleSearchFlow(Scanner sc, List results) { + private void handleSearchFlow(List results, EntityManager em) { printSearchResults(results); - chooseAndShowBookDetails(sc, results); + chooseAndShowBookDetails(results, em); } - private static void printSearchResults(List results) { + private void printSearchResults(List results) { if (results.isEmpty()) { System.out.println("Inga träffar."); return; @@ -80,7 +79,7 @@ private static void printSearchResults(List results) { } } - private static void chooseAndShowBookDetails(Scanner sc, List results) { + private void chooseAndShowBookDetails(List results, EntityManager em) { if (results.isEmpty()) return; while (true) { @@ -103,7 +102,7 @@ private static void chooseAndShowBookDetails(Scanner sc, List results) { } Book selected = results.get(n - 1); - printBookDetails(selected); + printBookDetails(selected, em); System.out.print("Tryck Enter för att gå tillbaka till sök"); sc.nextLine(); @@ -111,7 +110,7 @@ private static void chooseAndShowBookDetails(Scanner sc, List results) { } } - private static void printBookDetails(Book b) { + private void printBookDetails(Book b, EntityManager em) { LoanServices loanServices = new LoanServices(em); System.out.println("\n=============================="); System.out.println(" " + b.getTitle()); @@ -152,32 +151,23 @@ private static void printBookDetails(Book b) { } } } - -// boolean isLoggedIn = SessionManager.isLoggedIn(); -// User user = SessionManager.getCurrentUser(); -// user.getUserId(); - - //todo: - // om tillgänglig och inloggad - låna bok - // om ej inloggad - skicka till logga in sidan. - System.out.println("=============================="); } // ===== Format helpers ===== - private static String formatListRow(Book b) { + private String formatListRow(Book b) { return b.getTitle() + " — " + formatAuthors(b); } - private static String formatAuthors(Book b) { + private String formatAuthors(Book b) { if (b.getAuthors() == null || b.getAuthors().isEmpty()) return "Okänd författare"; return b.getAuthors().stream() .map(a -> (a.getFirstName() + " " + a.getLastName()).trim()) .collect(Collectors.joining(", ")); } - private static String formatGenres(Book b) { + private String formatGenres(Book b) { if (b.getGenres() == null || b.getGenres().isEmpty()) return "Okänd genre"; return b.getGenres().stream() .map(g -> g.getGenre().trim()) // <-- byt till getGenreName() om det är din getter From 30e9fb5e6775b7211dcdf35a761f5f042ce003fb Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Mon, 12 Jan 2026 23:30:32 +0100 Subject: [PATCH 03/11] Removed static EntityManager dependency from SearchCli --- src/main/java/org/example/App.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 16e5a8a0..e7d0e791 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -1,6 +1,5 @@ package org.example; -import org.example.EMFactory; import org.example.user.SessionManager; import org.example.user.UserCLI; import org.example.user.UserService; @@ -19,13 +18,12 @@ static void main(String[] args) { final UserService userService = new UserService(userRepository); Scanner scanner = new Scanner(System.in); final UserCLI userCli = new UserCLI(userService, scanner); - SearchCli searchCli = new SearchCli(scanner, EMFactory.getEntityManager()); - DateTimeFormatter formatter = - DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SearchCli searchCli = new SearchCli(scanner); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - // ####################### - // Application starts here - // ####################### + /*################################# \ + | ---- Application starts here ---- | + \ #################################*/ boolean appRunning = true; while (appRunning) { System.out.println("\n\nBIBLIOTEKSSYSTEMET"); From f7f06755adc34a5f7e84b6257d47ffd91efeb739 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 00:16:18 +0100 Subject: [PATCH 04/11] Refactored LoanServices ems Changed to instead of constructor inject EntityManager as method parameters. Added exception handling for transaction rollback and streamlined query logic --- src/main/java/org/example/LoanServices.java | 103 +++++++++++--------- 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index 2dda1a57..c5230081 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -6,15 +6,8 @@ public class LoanServices { - private final EntityManager em; - - public LoanServices(EntityManager em) { - this.em = em; - } - // Kolla om en bok är utlånad - public boolean isBookLoaned(Long bookId) { - + public boolean isBookLoaned(Long bookId, EntityManager em) { List loans = em.createQuery( "SELECT l FROM Loan l WHERE l.book.bookId = :bookId AND l.returnDate IS NOT NULL", Loan.class @@ -22,65 +15,79 @@ public boolean isBookLoaned(Long bookId) { .setParameter("bookId", bookId) .getResultList(); - if (loans.isEmpty()) { - return false; - } else { - return true; - } + return !loans.isEmpty(); } // Låna en bok - public boolean loanBook(User user, Book book) { + public boolean loanBook(User user, Book book, EntityManager em) { - if (isBookLoaned(book.getId())) { + if (isBookLoaned(book.getId(), em)) { return false; } - em.getTransaction().begin(); + try { + em.getTransaction().begin(); + // Makes sure JPA knows about the user + User managedUser = em.merge(user); + Book managedBook = em.merge(book); - Book managedBook = em.merge(book); + Loan loan = new Loan(); + loan.setUser(managedUser); + loan.setLoanDate(ZonedDateTime.now()); + loan.setReturnDate(ZonedDateTime.now().plusDays(7)); + loan.setBook(managedBook); - Loan loan = new Loan(); + managedBook.setLoan(loan); - loan.setUser(user); - loan.setLoanDate(ZonedDateTime.now()); - loan.setReturnDate(ZonedDateTime.now().plusDays((7))); + em.persist(loan); + em.getTransaction().commit(); - loan.setBook(managedBook); - managedBook.setLoan(loan); - em.persist(loan); - em.getTransaction().commit(); - - return true; + return true; + } catch (Exception e) { + // If transactions fail but are still active, rollback + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } + return false; + } } // Lämna tillbaka en bok - public boolean returnBook(User user, Book book) { - - Loan loan = em.createQuery( - "SELECT l FROM Loan l WHERE l.user = :user AND l.book = :book AND l.returnDate IS NOT NULL", - Loan.class - ) - .setParameter("user", user) - .setParameter("book", book) - .getResultStream() - .findFirst() - .orElse(null); + public boolean returnBook(User user, Book book, EntityManager em) { + + try{ + Loan loan = em.createQuery( + "SELECT l FROM Loan l WHERE l.user = :user AND l.book = :book AND l.returnDate IS NOT NULL", + Loan.class + ) + .setParameter("user", user) + .setParameter("book", book) + .getResultStream() + .findFirst() + .orElse(null); + + if (loan == null) { + return false; + } + + em.getTransaction().begin(); + Book managedBook = loan.getBook(); + managedBook.setLoan(null); + em.remove(loan); + + em.getTransaction().commit(); + return true; - if (loan == null) { + } catch (Exception e) { + // If transactions fail but are still active, rollback + if (em.getTransaction().isActive()) { + em.getTransaction().rollback(); + } return false; } - - em.getTransaction().begin(); - - Book managedBook = loan.getBook(); - managedBook.setLoan(null); - em.remove(loan); - em.getTransaction().commit(); - return true; } - public List activeLoans(User user) { + public List activeLoans(User user, EntityManager em) { return em.createQuery( "SELECT l FROM Loan l WHERE l.user = :user", From d27458dc6de35cbd0f12728497f1754c275beb08 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 00:22:53 +0100 Subject: [PATCH 05/11] Fixed LoanServices injection --- src/main/java/org/example/SearchCli.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/example/SearchCli.java b/src/main/java/org/example/SearchCli.java index f427fcd9..da959fd6 100644 --- a/src/main/java/org/example/SearchCli.java +++ b/src/main/java/org/example/SearchCli.java @@ -1,8 +1,6 @@ package org.example; import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; -import jakarta.persistence.Persistence; import org.example.user.SessionManager; import java.util.List; @@ -111,7 +109,7 @@ private void chooseAndShowBookDetails(List results, EntityManager em) { } private void printBookDetails(Book b, EntityManager em) { - LoanServices loanServices = new LoanServices(em); + LoanServices loanServices = new LoanServices(); System.out.println("\n=============================="); System.out.println(" " + b.getTitle()); System.out.println("------------------------------"); @@ -123,7 +121,7 @@ private void printBookDetails(Book b, EntityManager em) { if (desc == null || desc.isBlank()) desc = "(Ingen beskrivning)"; System.out.println("\nBeskrivning:\n" + desc); - if (loanServices.isBookLoaned(b.getId())){ + if (loanServices.isBookLoaned(b.getId(), em)){ System.out.println("Status: Utlånad"); } else { System.out.println("Status: Tillgänglig"); @@ -138,14 +136,11 @@ private void printBookDetails(Book b, EntityManager em) { switch (choice) { case "1" -> { - loanServices.loanBook(SessionManager.getCurrentUser(), b); + loanServices.loanBook(SessionManager.getCurrentUser(), b, em); isRunning = false; System.out.println("Du har nu lånat boken!"); } - - case "2" -> { - isRunning = false; - } + case "2" -> isRunning = false; default -> System.out.println("Ogiltigt val, försök igen."); } } From 6786830281cc59641ac246d4d8c4abceefec4da1 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 00:50:11 +0100 Subject: [PATCH 06/11] Changed LoanServices injection and added exception handling for loan return. Added a check to block guests from accessing loans. --- src/main/java/org/example/App.java | 70 +++++++++++++++++------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index e7d0e791..0049ad52 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -1,5 +1,6 @@ package org.example; +import jakarta.persistence.EntityManager; import org.example.user.SessionManager; import org.example.user.UserCLI; import org.example.user.UserService; @@ -35,10 +36,10 @@ static void main(String[] args) { } else { System.out.println("1. Sök bok | 2. Logga in/Skapa konto | 0. Avsluta"); } - System.out.print("Menyval: "); String choice = scanner.nextLine(); - LoanServices loanServices = new LoanServices(EMFactory.getEntityManager()); + + LoanServices loanServices = new LoanServices(); switch (choice) { case "1" -> { searchCli.bookSearchCli(); @@ -54,37 +55,46 @@ static void main(String[] args) { if (SessionManager.isLoggedIn()) userCli.logout(); } case "4" -> { - List loans = loanServices.activeLoans(SessionManager.getCurrentUser()); + // Block guests from accessing loans + if (!SessionManager.isLoggedIn()) { + System.out.println("Du måste vara inloggad för att se lån."); + continue; + } + + try (EntityManager em = EMFactory.getEntityManager()) { + List loans = loanServices.activeLoans(SessionManager.getCurrentUser(), em); + + boolean running = true; + while (running) { + if (!loans.isEmpty()) { + System.out.println("Dina aktiva lån:"); + int counter = 0; + for (Loan loan : loans) { + counter += 1; + System.out.println(counter + ". Titel: " + loan.getBook().getTitle() + " - Åter: " + loan.getReturnDate() + .format(formatter)); + } + System.out.println("Välj nummer för den bok du vill lämna tillbaka (0 = tillbaka): "); + String inputString = scanner.nextLine(); + Integer input = Integer.parseInt(inputString); + if (input >= 1 && input <= loans.size()) { + loanServices.returnBook( + SessionManager.getCurrentUser(), + loans.get(input - 1).getBook(), + em + ); + loans.remove(input - 1); + System.out.println("Du har lämnat tillbaka din bok!"); + } else if (input == 0) { + running = false; + } else { + System.out.println("ogiltigt val."); + } - boolean running = true; - while (running) { - if (!loans.isEmpty()) { - System.out.println("Dina aktiva lån:"); - int counter = 0; - for (Loan loan : loans) { - counter += 1; - System.out.println(counter + ". Titel: " + loan.getBook().getTitle() + " - Åter: " + loan.getReturnDate() - .format(formatter)); - } - System.out.println("Välj nummer för den bok du vill lämna tillbaka (0 = tillbaka): "); - String inputString = scanner.nextLine(); - Integer input = Integer.parseInt(inputString); - if (input >= 1 && input <= loans.size()) { - loanServices.returnBook( - SessionManager.getCurrentUser(), - loans.get(input - 1).getBook() - ); - loans.remove(input - 1); - System.out.println("Du har lämnat tillbaka din bok!"); - } else if (input == 0) { - running = false; } else { - System.out.println("ogiltigt val."); + System.out.println("Inga aktiva lån."); + running = false; } - - } else { - System.out.println("Inga aktiva lån."); - running = false; } } } From 32df676805bae8b7a74328017df29b2471bcf20b Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 01:44:20 +0100 Subject: [PATCH 07/11] removed unused testclass --- .../java/org/example/user/testUserCli.java | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 src/main/java/org/example/user/testUserCli.java diff --git a/src/main/java/org/example/user/testUserCli.java b/src/main/java/org/example/user/testUserCli.java deleted file mode 100644 index af5ee46b..00000000 --- a/src/main/java/org/example/user/testUserCli.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.example.user; - -import org.example.EMFactory; -import org.example.user.repository.JpaUserRepository; -import org.example.user.repository.UserRepository; - -import java.util.Scanner; - -public class testUserCli { - private static final Scanner scanner = new Scanner(System.in); - - static void main(String[] args) { - initialize(); // "Warm up" the factory - - final UserRepository userRepository = new JpaUserRepository(); - final UserService userService = new UserService(userRepository); - final UserCLI userCli = new UserCLI(userService, scanner); - - // ####################### - // Application starts here - // ####################### - boolean appRunning = true; - while (appRunning) { - System.out.println("\n\nBIBLIOTEKSSYSTEMET"); - System.out.println("Startsida Inloggad som: " + SessionManager.loggedInDisplayName()); - System.out.println("========================================================"); - - if (SessionManager.isLoggedIn()) { - System.out.println("1. Hantera användare | 2. Logga ut | 0. Avsluta"); - } else { - System.out.println("1. Logga in/Skapa konto | 0. Avsluta"); - } - - System.out.print("Menyval: "); - String choice = scanner.nextLine(); - switch (choice) { - case "1" -> { - if (SessionManager.isLoggedIn()) userCli.manageUserMenu(); - else userCli.userMenu(); - } - case "2" -> { - if (SessionManager.isLoggedIn()) userCli.logout(); - } - case "0" -> appRunning = false; - default -> System.out.println("Ogiltigt val."); - } - } - terminate(); -} - - private static void terminate() { - System.out.println("Bibliotekssystemet avslutat. Välkommen åter!"); - EMFactory.close(); - } - - public static void initialize() { - // Turn off Hibernate logging - System.setProperty("org.jboss.logging.provider", "jdk"); - java.util.logging.Logger hibernateLogger = java.util.logging.Logger.getLogger("org.hibernate"); - hibernateLogger.setLevel(java.util.logging.Level.SEVERE); - - // Initialize EntityManagerFactory - EMFactory.init(); - } -} From 4ba37a196a86354e6eba535e860c8596dc301f26 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 01:45:21 +0100 Subject: [PATCH 08/11] Refactored CLI menu logic and extracted functionalities into helper methods for improved readability. Also added more robust error handling. --- src/main/java/org/example/App.java | 228 +++++++++++++++++++++-------- 1 file changed, 164 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 0049ad52..38d97e7e 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -17,86 +17,46 @@ static void main(String[] args) { final UserRepository userRepository = new JpaUserRepository(); final UserService userService = new UserService(userRepository); - Scanner scanner = new Scanner(System.in); - final UserCLI userCli = new UserCLI(userService, scanner); - SearchCli searchCli = new SearchCli(scanner); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + Scanner sc = new Scanner(System.in); + final UserCLI userCli = new UserCLI(userService, sc); + SearchCli searchCli = new SearchCli(sc); /*################################# \ | ---- Application starts here ---- | \ #################################*/ boolean appRunning = true; while (appRunning) { - System.out.println("\n\nBIBLIOTEKSSYSTEMET"); - System.out.println("Startsida Inloggad som: " + SessionManager.loggedInDisplayName()); - System.out.println("========================================================"); - - if (SessionManager.isLoggedIn()) { - System.out.println("1. Sök bok | 2. Hantera användare | 3. Logga ut | 4. Mina lån | 0. Avsluta"); - } else { - System.out.println("1. Sök bok | 2. Logga in/Skapa konto | 0. Avsluta"); - } + // Print main menu and get user input + printMainMenu(); System.out.print("Menyval: "); - String choice = scanner.nextLine(); + String choice = sc.nextLine(); - LoanServices loanServices = new LoanServices(); switch (choice) { - case "1" -> { - searchCli.bookSearchCli(); - } + case "1" -> searchCli.bookSearchCli(); case "2" -> { if (SessionManager.isLoggedIn()) { - userCli.manageUserMenu(); - } else { - userCli.userMenu(); + // Print loans + loanMenu(sc); + } + else { + // Login / Create user + userMenu(userCli); } } case "3" -> { - if (SessionManager.isLoggedIn()) userCli.logout(); - } - case "4" -> { - // Block guests from accessing loans - if (!SessionManager.isLoggedIn()) { - System.out.println("Du måste vara inloggad för att se lån."); - continue; + if (SessionManager.isLoggedIn()) { + // Manage user + userMenu(userCli); } - - try (EntityManager em = EMFactory.getEntityManager()) { - List loans = loanServices.activeLoans(SessionManager.getCurrentUser(), em); - - boolean running = true; - while (running) { - if (!loans.isEmpty()) { - System.out.println("Dina aktiva lån:"); - int counter = 0; - for (Loan loan : loans) { - counter += 1; - System.out.println(counter + ". Titel: " + loan.getBook().getTitle() + " - Åter: " + loan.getReturnDate() - .format(formatter)); - } - System.out.println("Välj nummer för den bok du vill lämna tillbaka (0 = tillbaka): "); - String inputString = scanner.nextLine(); - Integer input = Integer.parseInt(inputString); - if (input >= 1 && input <= loans.size()) { - loanServices.returnBook( - SessionManager.getCurrentUser(), - loans.get(input - 1).getBook(), - em - ); - loans.remove(input - 1); - System.out.println("Du har lämnat tillbaka din bok!"); - } else if (input == 0) { - running = false; - } else { - System.out.println("ogiltigt val."); - } - - } else { - System.out.println("Inga aktiva lån."); - running = false; - } - } + else { + System.out.println("Ogiltigt val."); + } + } + case "9" -> { + if (SessionManager.isLoggedIn()) { + logOut(userCli); } + else System.out.println("Ogiltigt val."); } case "0" -> appRunning = false; default -> System.out.println("Ogiltigt val."); @@ -104,6 +64,146 @@ static void main(String[] args) { } terminate(); } +// LoanServices loanServices = new LoanServices(); +// switch (choice) { +// case "1" -> { +// searchCli.bookSearchCli(); +// } +// case "2" -> { +// if (SessionManager.isLoggedIn()) { +// userCli.manageUserMenu(); +// } else { +// userCli.userMenu(); +// } +// } +// case "3" -> { +// if (SessionManager.isLoggedIn()) userCli.logout(); +// } +// case "4" -> { +// // Block guests from accessing loans +// if (!SessionManager.isLoggedIn()) { +// System.out.println("Du måste vara inloggad för att se lån."); +// continue; +// } +// +// try (EntityManager em = EMFactory.getEntityManager()) { +// List loans = loanServices.activeLoans(SessionManager.getCurrentUser(), em); +// +// boolean running = true; +// while (running) { +// if (!loans.isEmpty()) { +// System.out.println("Dina aktiva lån:"); +// int counter = 0; +// for (Loan loan : loans) { +// counter += 1; +// System.out.println(counter + ". Titel: " + loan.getBook().getTitle() + " - Åter: " + loan.getReturnDate() +// .format(formatter)); +// } +// System.out.println("Välj nummer för den bok du vill lämna tillbaka (0 = tillbaka): "); +// String inputString = sc.nextLine(); +// Integer input = Integer.parseInt(inputString); +// if (input >= 1 && input <= loans.size()) { +// loanServices.returnBook( +// SessionManager.getCurrentUser(), +// loans.get(input - 1).getBook(), +// em +// ); +// loans.remove(input - 1); +// System.out.println("Du har lämnat tillbaka din bok!"); +// } else if (input == 0) { +// running = false; +// } else { +// System.out.println("ogiltigt val."); +// } +// +// } else { +// System.out.println("Inga aktiva lån."); +// running = false; +// } +// } +// } +// } +// case "0" -> appRunning = false; +// default -> System.out.println("Ogiltigt val."); +// } +// } +// terminate(); +// } + + private static void printMainMenu() { + System.out.println("\n\nCLIBRARY"); + System.out.println("Startsida Inloggad som: " + SessionManager.loggedInDisplayName()); + System.out.println("========================================================"); + + if (SessionManager.isLoggedIn()) { + System.out.println("1. Sök bok | 2. Mina lån | 3. Hantera användare | 9. Logga ut | 0. Avsluta"); + } else { + System.out.println("1. Sök bok | 2. Logga in/Skapa konto | 0. Avsluta"); + } + } + + private static void userMenu(UserCLI userCli) { + userCli.userMenu(); + } + + private static void logOut(UserCLI userCli) { + if(SessionManager.isLoggedIn()) { + userCli.logout(); + } + else { + System.out.println("Inte inloggad."); + } + } + + private static void loanMenu(Scanner sc) { + if (!SessionManager.isLoggedIn()) { + System.out.println("Logga in för att se dina lån."); + return; + } + + LoanServices loanServices = new LoanServices(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + try (EntityManager em = EMFactory.getEntityManager()) { + List loans = loanServices.activeLoans(SessionManager.getCurrentUser(), em); + + if (loans.isEmpty()) { + System.out.println("Inga aktiva lån."); + return; + } + + System.out.println("Aktiva lån:"); + for (int i = 0; i < loans.size(); i++) { + Loan loan = loans.get(i); + System.out.println((i + 1) + ". " + loan.getBook().getTitle() + " - Återlämnas: " + loan.getReturnDate().format(formatter)); + } + + System.out.print("Välj nummer att lämna tillbaka (8 = tillbaka): "); + try { + int input = Integer.parseInt(sc.nextLine()); + if (input > 0 && input <= loans.size()) { + boolean success = loanServices.returnBook( + SessionManager.getCurrentUser(), + loans.get(input - 1).getBook(), + em + ); + if (success) { + System.out.println("Boken har lämnats tillbaka!"); + } + else { + System.out.println("Kunde inte lämna tillbaka boken."); + } + } + } + // Catch invalid input + catch (NumberFormatException e) { + System.out.println("Ogiltigt val, skriv en siffra."); + } + + } + } + + private static void terminate() { System.out.println("Bibliotekssystemet avslutat. Välkommen åter!"); From ea12f45767dff0c7b09190419a449409bc57d17b Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 01:46:39 +0100 Subject: [PATCH 09/11] Removed commented-out code --- src/main/java/org/example/App.java | 67 ------------------------------ 1 file changed, 67 deletions(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 38d97e7e..5c6a6830 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -64,71 +64,6 @@ static void main(String[] args) { } terminate(); } -// LoanServices loanServices = new LoanServices(); -// switch (choice) { -// case "1" -> { -// searchCli.bookSearchCli(); -// } -// case "2" -> { -// if (SessionManager.isLoggedIn()) { -// userCli.manageUserMenu(); -// } else { -// userCli.userMenu(); -// } -// } -// case "3" -> { -// if (SessionManager.isLoggedIn()) userCli.logout(); -// } -// case "4" -> { -// // Block guests from accessing loans -// if (!SessionManager.isLoggedIn()) { -// System.out.println("Du måste vara inloggad för att se lån."); -// continue; -// } -// -// try (EntityManager em = EMFactory.getEntityManager()) { -// List loans = loanServices.activeLoans(SessionManager.getCurrentUser(), em); -// -// boolean running = true; -// while (running) { -// if (!loans.isEmpty()) { -// System.out.println("Dina aktiva lån:"); -// int counter = 0; -// for (Loan loan : loans) { -// counter += 1; -// System.out.println(counter + ". Titel: " + loan.getBook().getTitle() + " - Åter: " + loan.getReturnDate() -// .format(formatter)); -// } -// System.out.println("Välj nummer för den bok du vill lämna tillbaka (0 = tillbaka): "); -// String inputString = sc.nextLine(); -// Integer input = Integer.parseInt(inputString); -// if (input >= 1 && input <= loans.size()) { -// loanServices.returnBook( -// SessionManager.getCurrentUser(), -// loans.get(input - 1).getBook(), -// em -// ); -// loans.remove(input - 1); -// System.out.println("Du har lämnat tillbaka din bok!"); -// } else if (input == 0) { -// running = false; -// } else { -// System.out.println("ogiltigt val."); -// } -// -// } else { -// System.out.println("Inga aktiva lån."); -// running = false; -// } -// } -// } -// } -// case "0" -> appRunning = false; -// default -> System.out.println("Ogiltigt val."); -// } -// } -// terminate(); -// } private static void printMainMenu() { System.out.println("\n\nCLIBRARY"); @@ -203,8 +138,6 @@ private static void loanMenu(Scanner sc) { } } - - private static void terminate() { System.out.println("Bibliotekssystemet avslutat. Välkommen åter!"); EMFactory.close(); From 67acb822e6d2caaeee90a8bff373ac7e7279bc22 Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 09:49:00 +0100 Subject: [PATCH 10/11] Removed commented-out code --- src/main/java/org/example/user/UserCLI.java | 2 +- src/main/java/org/example/user/UserService.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/example/user/UserCLI.java b/src/main/java/org/example/user/UserCLI.java index 791e6811..9e00f0bd 100644 --- a/src/main/java/org/example/user/UserCLI.java +++ b/src/main/java/org/example/user/UserCLI.java @@ -216,7 +216,7 @@ private String prompt(String message) { } private String appName() { - return "\n\nBIBLIOTEKSSYSTEMET"; + return "\n\nCLIBRARY"; } } diff --git a/src/main/java/org/example/user/UserService.java b/src/main/java/org/example/user/UserService.java index 56de7abd..ee2e8f14 100644 --- a/src/main/java/org/example/user/UserService.java +++ b/src/main/java/org/example/user/UserService.java @@ -30,6 +30,7 @@ public User login(String username, String password) { throw new IllegalArgumentException("Ogiltigt lösenord"); } + SessionManager.login(user); return user; } From f3071b64bdab2b1d01e78f3a8fc999019b18bfdf Mon Sep 17 00:00:00 2001 From: Dennis Selden <111012436+DennSel@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:15:55 +0100 Subject: [PATCH 11/11] Updated `userMenu` logic to handle logged-in state and removed unnecessary `SessionManager.login` call. --- src/main/java/org/example/App.java | 7 ++++++- src/main/java/org/example/user/UserService.java | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 5c6a6830..c60c106a 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -78,7 +78,12 @@ private static void printMainMenu() { } private static void userMenu(UserCLI userCli) { - userCli.userMenu(); + if (SessionManager.isLoggedIn()) { + userCli.manageUserMenu(); + } + else { + userCli.userMenu(); + } } private static void logOut(UserCLI userCli) { diff --git a/src/main/java/org/example/user/UserService.java b/src/main/java/org/example/user/UserService.java index ee2e8f14..56de7abd 100644 --- a/src/main/java/org/example/user/UserService.java +++ b/src/main/java/org/example/user/UserService.java @@ -30,7 +30,6 @@ public User login(String username, String password) { throw new IllegalArgumentException("Ogiltigt lösenord"); } - SessionManager.login(user); return user; }