Skip to content

Commit c9db9d1

Browse files
refactor: modify both service and model classes to support unit tests
1 parent 0a7177d commit c9db9d1

14 files changed

Lines changed: 195 additions & 65 deletions

src/main/java/com/vianavitor/simplelibrarygame/model/BookReadHistory.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.vianavitor.simplelibrarygame.model;
22

33
import jakarta.persistence.*;
4+
import org.springframework.beans.factory.annotation.Autowired;
45

56
import java.time.LocalDate;
67

@@ -24,6 +25,15 @@ public class BookReadHistory {
2425
@Column(nullable = false)
2526
private LocalDate lastUpdate = LocalDate.now();
2627

28+
@Autowired
29+
public BookReadHistory() {}
30+
31+
public BookReadHistory(Book book, Student student) {
32+
this.book = book;
33+
this.student = student;
34+
this.lastUpdate = LocalDate.now();
35+
}
36+
2737
public Long getId() {
2838
return id;
2939
}

src/main/java/com/vianavitor/simplelibrarygame/model/Classroom.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ public class Classroom {
1313
@GeneratedValue(strategy = GenerationType.IDENTITY)
1414
private Long id;
1515

16-
@ManyToMany(mappedBy = "classrooms")
17-
private Set<UserClassroom> users = new HashSet<>();
16+
@ManyToMany()
17+
@JoinTable(
18+
name = "user_classroom",
19+
joinColumns = @JoinColumn(name = "user_id"),
20+
inverseJoinColumns = @JoinColumn(name = "classroom_id")
21+
)
22+
private Set<UserClassroom> usersInClassroom = new HashSet<>();
1823

1924
@Column(unique = true)
2025
private String name;
@@ -31,11 +36,11 @@ public void setId(Long id) {
3136
}
3237

3338
public Set<UserClassroom> getUsers() {
34-
return users;
39+
return usersInClassroom;
3540
}
3641

37-
public void setUsers(Set<UserClassroom> users) {
38-
this.users = users;
42+
public void setUsers(Set<UserClassroom> usersInClassroom) {
43+
this.usersInClassroom = usersInClassroom;
3944
}
4045

4146
public String getName() {

src/main/java/com/vianavitor/simplelibrarygame/model/Student.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@Entity
1111
@DiscriminatorValue("student")
1212
public class Student extends UserClassroom {
13-
@OneToOne(mappedBy = "student", cascade = CascadeType.ALL)
13+
@OneToOne(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
1414
private StudentStats stats;
1515

1616
@ManyToMany

src/main/java/com/vianavitor/simplelibrarygame/model/StudentStats.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class StudentStats {
1313
@JoinColumn(name = "book_read_hisory_id")
1414
private BookReadHistory currentBook; // it saves only the history of the last book read by the user
1515

16-
@OneToOne
16+
@OneToOne(cascade = CascadeType.PERSIST)
1717
@MapsId
1818
@JoinColumn(name = "user_id")
1919
private Student student;

src/main/java/com/vianavitor/simplelibrarygame/model/utils/classes/UserClassroom.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,7 @@
1212

1313
@Entity
1414
public abstract class UserClassroom extends User {
15-
@ManyToMany
16-
@JoinTable(
17-
name = "user_classroom",
18-
joinColumns = @JoinColumn(name = "user_id"),
19-
inverseJoinColumns = @JoinColumn(name = "classroom_id")
20-
)
15+
@ManyToMany(mappedBy = "usersInClassroom")
2116
private Set<Classroom> classrooms = new HashSet<>();
2217

2318
@Autowired

src/main/java/com/vianavitor/simplelibrarygame/service/AuthorService.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,32 @@
33
import com.vianavitor.simplelibrarygame.model.Author;
44
import com.vianavitor.simplelibrarygame.model.Book;
55
import com.vianavitor.simplelibrarygame.repository.AuthorRepository;
6+
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.stereotype.Service;
78

89
import java.util.List;
910

1011
@Service
1112
public class AuthorService {
13+
@Autowired
1214
private AuthorRepository repository;
1315

16+
private Author author;
17+
18+
@Autowired
19+
public AuthorService() {}
20+
21+
public AuthorService(AuthorRepository repository, Author author) {
22+
this.repository = repository;
23+
this.author = author;
24+
}
25+
1426
public void add(String name) {
1527
repository.findByName(name)
1628
.ifPresent((a) -> {
1729
throw new RuntimeException("author already registered");
1830
});
1931

20-
Author author = new Author();
2132
author.setName(name);
2233

2334
repository.save(author);

src/main/java/com/vianavitor/simplelibrarygame/service/BookReadHistoryService.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
import com.vianavitor.simplelibrarygame.repository.BookReadHistoryRepository;
77
import com.vianavitor.simplelibrarygame.repository.BookRepository;
88
import com.vianavitor.simplelibrarygame.repository.StudentRepository;
9+
import com.vianavitor.simplelibrarygame.repository.StudentStatsRepository;
910
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.stereotype.Service;
1112

1213
import java.time.LocalDate;
1314
import java.util.List;
1415
import java.util.Objects;
1516
import java.util.Optional;
17+
import java.util.concurrent.atomic.AtomicReference;
1618

1719
@Service
1820
public class BookReadHistoryService {
@@ -25,6 +27,9 @@ public class BookReadHistoryService {
2527
@Autowired
2628
private StudentRepository studentRepository;
2729

30+
@Autowired
31+
private StudentStatsRepository statsRepository;
32+
2833
public void register(BookReadHistory data) {
2934
Book book = bookRepository.findById(data.getBook().getId())
3035
.orElseThrow(() -> new RuntimeException("not found book"));
@@ -43,13 +48,18 @@ public void register(BookReadHistory data) {
4348
data.setBook(book);
4449
data.setUser(student);
4550
} else {
51+
int page = data.getLastPageRead();
52+
4653
data = result.get();
54+
data.setLastPageRead(page);
4755
}
4856

49-
LocalDate now = LocalDate.now();
50-
data.setLastUpdate(now);
51-
52-
repository.save(data);
57+
data.setLastUpdate(LocalDate.now());
58+
59+
BookReadHistory current = repository.save(data);
60+
student.getStats().setCurrentBook(current);
61+
62+
statsRepository.save(student.getStats());
5363
}
5464

5565
public List<BookReadHistory> getByStudent(Long studentId) {
@@ -70,9 +80,10 @@ public BookReadHistory getByStudentTheLastOne(Long studentId) {
7080
Student student = studentRepository.findById(studentId)
7181
.orElseThrow(() -> new RuntimeException("not found student"));
7282

73-
return repository.findByStudent(student)
74-
.stream()
75-
.findFirst()
76-
.orElseGet(BookReadHistory::new);
83+
AtomicReference<BookReadHistory> lastOne = new AtomicReference<>();
84+
repository.findByStudent(student)
85+
.forEach(lastOne::set);
86+
87+
return lastOne.get();
7788
}
7889
}

src/main/java/com/vianavitor/simplelibrarygame/service/BookService.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ public class BookService {
2424
@Autowired
2525
private GenreRepository genreRepository;
2626

27-
private static final Map<Long, Book> cache = new HashMap<>();
27+
private static final double maxRateValue = 5;
28+
private static final double minRateValue = 0;
29+
30+
// private static final Map<Long, Book> cache = new HashMap<>();
2831

2932
public void add(Book newBook, boolean confirmed) {
3033
if (!confirmed) {
@@ -74,7 +77,7 @@ public void setAvailable(Long id, boolean value) {
7477
repository.save(book);
7578
}
7679

77-
public void modify(Long id, Book data, boolean confirmed) {
80+
public Book modify(Long id, Book data, boolean confirmed, Map<Long, Book> cache) {
7881
// TODO: implement a more efficient way to stores a cache to deal with no long accessed data
7982
Book book = cache.containsKey(id)
8083
? cache.remove(id)
@@ -87,20 +90,18 @@ public void modify(Long id, Book data, boolean confirmed) {
8790

8891
boolean isTitleFilledIn = data.getTitle() != null && !data.getTitle().isBlank();
8992

90-
// check if the title is duplicate and the librarian hadn't confirmed the action
93+
// check if the title is a duplicate
9194
if (isTitleFilledIn && !confirmed) {
9295
List<Book> results = repository.findByTitle(data.getTitle());
9396

9497
if (!results.isEmpty()) {
95-
// if the search returns something it means that this tittle already belongs to another book registered
98+
// if the search returns something it means that this title already belongs to another book registered
9699
Optional<Book> duplicateBookTitle = results.stream()
97-
.filter(b -> !Objects.equals(b.getId(), id))
100+
.filter(b -> Objects.equals(b.getId(), id))
98101
.findFirst();
99102

100103
if (duplicateBookTitle.isPresent()) {
101-
throw new RuntimeException("""
102-
there is a book with the same title registered, even so do you wish to proceed?
103-
""");
104+
throw new RuntimeException("there is a book with the same title registered, even so do you wish to proceed?");
104105
}
105106
}
106107
}
@@ -126,7 +127,7 @@ public void modify(Long id, Book data, boolean confirmed) {
126127
book.setBookGenres(bookGenres);
127128
}
128129

129-
repository.save(book);
130+
return repository.save(book);
130131
}
131132

132133
private Set<Author> getBookAuthorsHelper(Set<Author> bookAuthors) {

src/main/java/com/vianavitor/simplelibrarygame/service/ClassroomService.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.vianavitor.simplelibrarygame.service;
22

3+
import com.vianavitor.simplelibrarygame.model.Book;
34
import com.vianavitor.simplelibrarygame.model.Classroom;
45
import com.vianavitor.simplelibrarygame.model.Professor;
56
import com.vianavitor.simplelibrarygame.model.Student;
@@ -26,6 +27,21 @@ public class ClassroomService {
2627
@Autowired
2728
private StudentRepository studentRepository;
2829

30+
private Classroom classroom;
31+
32+
@Autowired
33+
public ClassroomService() { }
34+
35+
public ClassroomService(
36+
ClassroomRepository repository, ProfessorRepository professorRepository,
37+
StudentRepository studentRepository, Classroom classroom
38+
) {
39+
this.repository = repository;
40+
this.professorRepository = professorRepository;
41+
this.studentRepository = studentRepository;
42+
this.classroom = classroom;
43+
}
44+
2945
private String generatePublicCode() {
3046
return UUID.randomUUID().toString().replaceAll("-", "");
3147
}
@@ -36,23 +52,22 @@ public void create(String name) {
3652
throw new RuntimeException("this classroom already exists");
3753
}
3854

39-
Classroom classroom = new Classroom();
4055
classroom.setPublicCode(this.generatePublicCode());
4156
classroom.setName(name);
4257

4358
repository.save(classroom);
4459
}
4560

4661
public Set<UserClassroom> modifyUsersInClassroom(Long id, Set<UserClassroom> students) {
47-
Classroom classroom = repository.findById(id)
62+
classroom = repository.findById(id)
4863
.orElseThrow(() -> new RuntimeException("classroom not found"));
4964

5065
classroom.setUsers(students);
5166
return repository.save(classroom).getUsers();
5267
}
5368

54-
public boolean changeName(Long id, String name) {
55-
Classroom classroom = repository.findById(id)
69+
public Classroom changeName(Long id, String name) {
70+
classroom = repository.findById(id)
5671
.orElseThrow(() -> new RuntimeException("classroom not found"));
5772

5873
boolean exists = repository.findByName(name).isPresent();
@@ -62,28 +77,13 @@ public boolean changeName(Long id, String name) {
6277

6378
classroom.setName(name);
6479

65-
repository.save(classroom);
66-
return true;
80+
return repository.save(classroom);
6781
}
6882

6983
public void delete(Long id) {
70-
Classroom classroom = repository.findById(id)
84+
classroom = repository.findById(id)
7185
.orElseThrow(() -> new RuntimeException("classroom not found"));
7286

73-
classroom.getUsers().forEach(user -> {
74-
Set<Classroom> userClasses = user.getClassrooms();
75-
userClasses.remove(classroom);
76-
77-
if (user instanceof Student) {
78-
studentRepository.save((Student) user);
79-
}
80-
if (user instanceof Professor) {
81-
professorRepository.save((Professor) user);
82-
}
83-
84-
user.setClassrooms(userClasses);
85-
});
86-
8787
repository.delete(classroom);
8888
}
8989
}

src/main/java/com/vianavitor/simplelibrarygame/service/GroupOfBookService.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.stereotype.Service;
1212

13+
import java.time.LocalDate;
14+
1315
@Service
1416
public class GroupOfBookService {
1517
@Autowired
@@ -21,6 +23,21 @@ public class GroupOfBookService {
2123
@Autowired
2224
private GroupRepository groupRepository;
2325

26+
private GroupOfBook groupOfBook;
27+
28+
@Autowired
29+
public GroupOfBookService() {}
30+
31+
public GroupOfBookService(
32+
GroupOfBookRepository repository, BookRepository bookRepository,
33+
GroupRepository groupRepository, GroupOfBook groupOfBook
34+
) {
35+
this.repository = repository;
36+
this.bookRepository = bookRepository;
37+
this.groupRepository = groupRepository;
38+
this.groupOfBook = groupOfBook;
39+
}
40+
2441
public void addBookToGroup(Long groupId, Long bookId) {
2542
Group group = groupRepository.findById(groupId)
2643
.orElseThrow(() -> new RuntimeException("not found group"));
@@ -34,9 +51,9 @@ public void addBookToGroup(Long groupId, Long bookId) {
3451
throw new RuntimeException("book already saved into the group");
3552
});
3653

37-
GroupOfBook groupOfBook = new GroupOfBook();
3854
groupOfBook.setBook(book);
3955
groupOfBook.setGroup(group);
56+
groupOfBook.setCreatedAt(LocalDate.now());
4057

4158
repository.save(groupOfBook);
4259
}

0 commit comments

Comments
 (0)