fix fansNumber

This commit is contained in:
Zakharov_Rostislav 2024-06-13 17:03:00 +04:00
parent aa9798b68a
commit b4a3786b33
5 changed files with 50 additions and 21 deletions

View File

@ -21,6 +21,7 @@ import com.ip.library.controllers.authors.AuthorEntity;
import com.ip.library.controllers.authors_books.AuthorsBooksEntity;
import com.ip.library.controllers.favorites.FavoriteEntity;
import com.ip.library.controllers.types.TypeEntity;
import com.ip.library.controllers.users.UserEntity;
@Entity
@Table(name = "books")
@ -39,7 +40,7 @@ public class BookEntity extends BaseEntity {
private Set<FavoriteEntity> fans = new HashSet<>();
@Transient
private boolean isChosen = false;
@Transient
@Column(nullable = false)
private int fansNumber = 0;
public BookEntity() {
@ -51,6 +52,10 @@ public class BookEntity extends BaseEntity {
this.type = type;
}
public BookEntity(boolean isChosen) {
this.isChosen = isChosen;
}
public TypeEntity getType() {
return type;
}
@ -110,6 +115,23 @@ public class BookEntity extends BaseEntity {
}
}
public boolean addFan(UserEntity user) {
FavoriteEntity entity = new FavoriteEntity(user, this);
boolean result = fans.add(entity);
if (!user.getFavorites().contains(entity)) {
user.getFavorites().add(entity);
}
fansNumber++;
return result;
}
public void removeFan(FavoriteEntity favorite) {
if (fans.contains(favorite)) {
fans.remove(favorite);
}
fansNumber--;
}
@Override
public int hashCode() {
return Objects.hash(id, name, type);

View File

@ -80,7 +80,6 @@ public class BookService {
if (favorites.contains(book)) {
book.setIsChosen(true);
}
book.setFansNumber(book.getFans().size());
}
return result;
}

View File

@ -73,11 +73,13 @@ public class UserEntity extends BaseEntity {
}
public boolean addBook(BookEntity book) {
return favorites.add(new FavoriteEntity(this, book));
FavoriteEntity entity = new FavoriteEntity(this, book);
boolean result = favorites.add(entity);
if (!book.getFans().contains(entity)) {
book.getFans().add(entity);
book.setFansNumber(book.getFansNumber() + 1);
}
public boolean removeBook(BookEntity book) {
return favorites.remove(new FavoriteEntity(this, book));
return result;
}
@Override

View File

@ -130,10 +130,12 @@ public class UserService implements UserDetailsService{
@Transactional
public FavoriteEntity removeFavorite(long userId, long bookId) {
final FavoriteEntity existsEntity = favoriteRepository.findById(new UserBookId(userId, bookId))
final FavoriteEntity favorite = favoriteRepository.findById(new UserBookId(userId, bookId))
.orElseThrow(() -> new IllegalArgumentException("Invalid id"));
favoriteRepository.delete(existsEntity);
return existsEntity;
BookEntity book = bookService.get(bookId);
book.removeFan(favorite);
favoriteRepository.delete(favorite);
return favorite;
}
@Transactional(readOnly = true)

View File

@ -49,12 +49,23 @@ class FavoritesTests {
userService.addFavorite(user1.getId(), book2.getId());
userService.addFavorite(user2.getId(), book1.getId());
userService.addFavorite(user2.getId(), book2.getId());
book1 = bookService.get(book1.getId());
book2 = bookService.get(book2.getId());
}
@Test
void getBookSubscribersNumberTest() {
Assertions.assertEquals(1, bookService.getBookSubscribersNumber(book1.getId()));
Assertions.assertEquals(2, bookService.getBookSubscribersNumber(book2.getId()));
void getFansNumberTest() {
Assertions.assertEquals(1, book1.getFansNumber());
Assertions.assertEquals(2, book2.getFansNumber());
}
@Test
void removeFavoriteTest() {
Assertions.assertTrue(userService.getUserFavorities(user2.getId()).contains(book1));
userService.removeFavorite(user2.getId(), book1.getId());
Assertions.assertTrue(!userService.getUserFavorities(user2.getId()).contains(book1));
book1 = bookService.get(book1.getId());
Assertions.assertEquals(0, book1.getFansNumber());
}
@Test
@ -64,11 +75,4 @@ class FavoritesTests {
Assertions.assertTrue(list.contains(book1));
Assertions.assertTrue(list.contains(book2));
}
@Test
void removeFavoriteTest() {
Assertions.assertTrue(userService.getUserFavorities(user2.getId()).contains(book1));
userService.removeFavorite(user2.getId(), book1.getId());
Assertions.assertTrue(!userService.getUserFavorities(user2.getId()).contains(book1));
}
}