diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java index 0d94276e..a7c8b166 100644 --- a/src/main/java/org/example/App.java +++ b/src/main/java/org/example/App.java @@ -7,6 +7,8 @@ import org.example.user.repository.JpaUserRepository; import org.example.user.repository.UserRepository; +import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.Scanner; public class App { @@ -18,6 +20,8 @@ static void main(String[] args) { 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"); // ####################### // Application starts here @@ -29,24 +33,63 @@ static void main(String[] args) { System.out.println("========================================================"); if (SessionManager.isLoggedIn()) { - System.out.println("1. Sök bok | 2. Hantera användare | 3. Logga ut | 0. Avsluta"); + 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"); } System.out.print("Menyval: "); String choice = scanner.nextLine(); + LoanServices loanServices = new LoanServices(EMFactory.getEntityManager()); switch (choice) { case "1" -> { searchCli.bookSearchCli(); } case "2" -> { - if (SessionManager.isLoggedIn()) userCli.manageUserMenu(); - else userCli.userMenu(); + if (SessionManager.isLoggedIn()) { + userCli.manageUserMenu(); + } else { + userCli.userMenu(); + } } case "3" -> { 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()) { + 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."); + } + + } else { + System.out.println("Inga aktiva lån."); + running = false; + } + } + } case "0" -> appRunning = false; default -> System.out.println("Ogiltigt val."); } diff --git a/src/main/java/org/example/Book.java b/src/main/java/org/example/Book.java index da932078..ad821b31 100644 --- a/src/main/java/org/example/Book.java +++ b/src/main/java/org/example/Book.java @@ -81,7 +81,7 @@ public void setLoan(Loan loan) { @ManyToMany(mappedBy = "books") private Set genres = new HashSet<>(); - @OneToOne @JoinColumn(name = "loaned_book") + @OneToOne (mappedBy = "book") private Loan loan; public Set getAuthors() { diff --git a/src/main/java/org/example/Loan.java b/src/main/java/org/example/Loan.java index 94d23e27..ee28f15a 100644 --- a/src/main/java/org/example/Loan.java +++ b/src/main/java/org/example/Loan.java @@ -55,6 +55,7 @@ public Long getLoanId() { @ManyToOne @JoinColumn (name = "loan_user") private User user; - @OneToOne(mappedBy = "loan") + @OneToOne + @JoinColumn(name = "bookID") private Book book; } diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index 567e34d4..2dda1a57 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -6,7 +6,7 @@ public class LoanServices { - final private EntityManager em; + private final EntityManager em; public LoanServices(EntityManager em) { this.em = em; @@ -16,7 +16,7 @@ public LoanServices(EntityManager em) { public boolean isBookLoaned(Long bookId) { List loans = em.createQuery( - "SELECT l FROM Loan l WHERE l.book.bookId = :bookId AND l.returnDate IS NULL", + "SELECT l FROM Loan l WHERE l.book.bookId = :bookId AND l.returnDate IS NOT NULL", Loan.class ) .setParameter("bookId", bookId) @@ -30,30 +30,35 @@ public boolean isBookLoaned(Long bookId) { } // Låna en bok - public boolean loanBook(Long bookId, Long userId) { + public boolean loanBook(User user, Book book) { - if (isBookLoaned(bookId)) { + if (isBookLoaned(book.getId())) { return false; } - User user = em.find(User.class, userId); - Book book = em.find(Book.class, bookId); + em.getTransaction().begin(); + + Book managedBook = em.merge(book); Loan loan = new Loan(); loan.setUser(user); - loan.setBook(book); loan.setLoanDate(ZonedDateTime.now()); - loan.setReturnDate(null); + loan.setReturnDate(ZonedDateTime.now().plusDays((7))); + + loan.setBook(managedBook); + managedBook.setLoan(loan); em.persist(loan); + em.getTransaction().commit(); + return true; } - // Lämna tillbak en bok + // 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 NULL", + "SELECT l FROM Loan l WHERE l.user = :user AND l.book = :book AND l.returnDate IS NOT NULL", Loan.class ) .setParameter("user", user) @@ -68,9 +73,20 @@ public boolean returnBook(User user, Book book) { em.getTransaction().begin(); - loan.setReturnDate(ZonedDateTime.now()); - book.setLoan(null); + Book managedBook = loan.getBook(); + managedBook.setLoan(null); + em.remove(loan); em.getTransaction().commit(); return true; } + + public List activeLoans(User user) { + + return em.createQuery( + "SELECT l FROM Loan l WHERE l.user = :user", + Loan.class + ) + .setParameter("user", user) + .getResultList(); + } } diff --git a/src/main/java/org/example/SearchCli.java b/src/main/java/org/example/SearchCli.java index ba7aad57..7f9d952d 100644 --- a/src/main/java/org/example/SearchCli.java +++ b/src/main/java/org/example/SearchCli.java @@ -3,6 +3,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; +import org.example.user.SessionManager; import java.util.List; import java.util.Scanner; @@ -104,13 +105,14 @@ private static void chooseAndShowBookDetails(Scanner sc, List results) { Book selected = results.get(n - 1); printBookDetails(selected); - System.out.print("Tryck Enter för att gå tillbaka til sök"); + System.out.print("Tryck Enter för att gå tillbaka till sök"); sc.nextLine(); return; } } private static void printBookDetails(Book b) { + LoanServices loanServices = new LoanServices(em); System.out.println("\n=============================="); System.out.println(" " + b.getTitle()); System.out.println("------------------------------"); @@ -121,6 +123,44 @@ private static void printBookDetails(Book b) { String desc = b.getDescription(); if (desc == null || desc.isBlank()) desc = "(Ingen beskrivning)"; System.out.println("\nBeskrivning:\n" + desc); + + if (loanServices.isBookLoaned(b.getId())){ + System.out.println("Status: Utlånad"); + } else { + System.out.println("Status: Tillgänglig"); + + boolean isLoggedIn = SessionManager.isLoggedIn(); + boolean isRunning = true; + + if (isLoggedIn){ + while (isRunning) { + System.out.println("1. Låna bok | 2. Tillbaka"); + String choice = sc.nextLine(); + + switch (choice) { + case "1" -> { + loanServices.loanBook(SessionManager.getCurrentUser(), b); + isRunning = false; + System.out.println("Du har nu lånat boken!"); + } + + case "2" -> { + isRunning = false; + } + default -> System.out.println("Ogiltigt val, försök igen."); + } + } + } + } + +// 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("=============================="); }