feat: book rating and ratingsCount - #27
Open
gustavo-atanazio wants to merge 1 commit into
Open
Conversation
Mats057
reviewed
Jul 31, 2026
| AuthorDTO author, | ||
| List<GenreDTO> genres, | ||
| String coverUrl, | ||
| BigDecimal rating, |
Collaborator
There was a problem hiding this comment.
Acredito ser melhor armazenar o ratingSum em vez do rating. Além de evitar o uso de BigDecimal, também evitamos que, em um update de nota, precisemos recalcular a média de novo
| public interface ReviewRepository extends JpaRepository<Review, UUID> { | ||
| Page<Review> findByBookId(UUID bookID, Pageable pageable); | ||
|
|
||
| @Query("SELECT AVG(r.score) FROM Review r WHERE r.book.id = :bookID") |
Collaborator
There was a problem hiding this comment.
Deixaria a soma/count do rating atômica. Em vez de buscarmos o valor atual do db, alterarmos no backend e salvarmos novamente, deixar o próprio db cuidar da operação
Exemplo, em vez de:
product = getProductFromDb()
product.ratingCount += 1
product.submit()Criaria uma operação no db parecida com a de SELECT, mas para UPDATE:
@Query("""
UPDATE book
SET rating_sum = rating_sum + :rating,
rating_count = rating_count + 1
WHERE id = :bookId
""")
addRating(bookId, rating);Assim a operação fica atômica e conseguimos evitar possíveis problemas de concorrência
Mats057
reviewed
Jul 31, 2026
| ; | ||
|
|
||
| BigDecimal avgScore = repository.findAverageScoreByBookId(bookId); | ||
| long count = repository.countByBookId(bookId); |
Collaborator
There was a problem hiding this comment.
Com a mudança de atomicidade, podemos evitar também essas duas recalculações em toda operação
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adicionado 2 novos campos na entidade Book:
Os 2 novos campos são sempre atualizados após a criação, atualização ou deleção de uma Review
Atualizados os DTOs e mappers para os 2 novos campos
Atualizados os exemplos no seed do banco de dados
Testes corrigidos para os novos campos
Outros:
Adicionado 1 novo campo na entidade Book:
Retirado o prefixo "/api" e a URL "http://localhost:5173" do registro de CORS
Movido a rota "/books/{id}/reviews" do controller de Book para o controller público
Corrigido os testes do controller público para a alteração acima