Skip to content
170 changes: 108 additions & 62 deletions src/main/java/org/example/App.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.example;

import org.example.EMFactory;
import jakarta.persistence.EntityManager;
import org.example.user.SessionManager;
import org.example.user.UserCLI;
import org.example.user.UserService;
Expand All @@ -17,78 +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, EMFactory.getEntityManager());
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd");

// #######################
// Application starts here
// #######################
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();
LoanServices loanServices = new LoanServices(EMFactory.getEntityManager());
String choice = sc.nextLine();

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();
if (SessionManager.isLoggedIn()) {
// Manage user
userMenu(userCli);
}
else {
System.out.println("Ogiltigt val.");
}
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
case "4" -> {
System.out.println("Dina aktiva lån:");
List<Loan> 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 "9" -> {
if (SessionManager.isLoggedIn()) {
logOut(userCli);
}
else System.out.println("Ogiltigt val.");
}
case "0" -> appRunning = false;
default -> System.out.println("Ogiltigt val.");
Expand All @@ -97,6 +65,84 @@ static void main(String[] args) {
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) {
if (SessionManager.isLoggedIn()) {
userCli.manageUserMenu();
}
else {
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<Loan> 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!");
EMFactory.close();
Expand Down
103 changes: 55 additions & 48 deletions src/main/java/org/example/LoanServices.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,81 +6,88 @@

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<Loan> loans = em.createQuery(
"SELECT l FROM Loan l WHERE l.book.bookId = :bookId AND l.returnDate IS NOT NULL",
Loan.class
)
.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<Loan> activeLoans(User user) {
public List<Loan> activeLoans(User user, EntityManager em) {

return em.createQuery(
"SELECT l FROM Loan l WHERE l.user = :user",
Expand Down
Loading