Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<optional>true</optional>
</dependency>
<dependency>
Expand Down Expand Up @@ -81,6 +82,7 @@
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,10 @@ public void deleteLikeToFilm(@PathVariable long filmId, @PathVariable long userI
}

@GetMapping("/popular")
public List<FilmDto> getTopFilms(@RequestParam(defaultValue = "10") @Positive(message = "Count must be positive") int count) {
log.info("Received GET /films/popular?count={} request", count);
return filmService.getTopFilms(count);
public List<FilmDto> getTopFilms(@RequestParam(defaultValue = "10") @Positive(message = "Count must be positive") int count,
@RequestParam(defaultValue = "-1") int genreId,
@RequestParam(defaultValue = "-1") int year) {
log.info("Received GET /films/popular?count={}&genreId={}&year={} request", count, genreId, year);
return filmService.getTopFilms(count, genreId, year);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public Optional<Film> findById(long id) {
if (films.isEmpty()) {
return Optional.empty();
} else {
Film film = films.get(0);
Film film = films.getFirst();
setGenresForFilms(List.of(film));
return Optional.of(film);
}
Expand Down Expand Up @@ -206,4 +206,32 @@ public void addLike(long filmId, long userId) {
public void removeLike(long filmId, long userId) {
jdbc.update(REMOVE_LIKE_QUERY, filmId, userId);
}
}

public List<Film> getTopFilms(int count, Integer genreId, Integer year) {

StringBuilder queryBuilder = new StringBuilder("SELECT f.*, r.rating_id AS mpa_id, r.rating_name AS mpa_name " +
"FROM films AS f JOIN rating AS r on f.rating_id = r.rating_id " +
"JOIN film_genre AS fg ON f.id = fg.film_id " +
"JOIN likes AS l ON f.id = l.film_id WHERE 1=1");

List<Integer> filterParams = new ArrayList<>();

if (genreId != -1) {
queryBuilder.append(" AND fg.genre_id = ?");
filterParams.add(genreId);
}

if (year != -1) {
queryBuilder.append(" AND EXTRACT(YEAR FROM f.release_date) = ?");
filterParams.add(year);
}

queryBuilder.append(" GROUP BY f.id, r.rating_id, r.rating_name ORDER BY COUNT(l.user_id) DESC LIMIT ?;");
filterParams.add(count);

List<Film> films = jdbc.query(queryBuilder.toString(), filmWithRatingMapper, filterParams.toArray());
setGenresForFilms(films);
return films;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -89,23 +88,19 @@ public void deleteLikeToFilm(long filmId, long userId) {
log.info("Like removed successfully");
}

public List<FilmDto> getTopFilms(int count) {
log.info("Getting top {} popular films", count);
public List<FilmDto> getTopFilms(int count, int genreId, int year) {
log.info("Getting top {} popular films with genreId = {} and release year = {}", count, genreId, year);
if (count <= 0) {
throw new ValidationException("Count parameter must be positive.");
}
Collection<Film> allFilms = filmStorage.getFilms();

return allFilms.stream()
return filmStorage.getTopFilms(count, genreId, year)
.stream()
.map(film -> {
Set<Long> likes = filmStorage.getLikes(film.getId());
return Map.entry(film, likes.size());
return FilmMapper.mapToFilmDto(film, likes);
})
.sorted(Map.Entry.<Film, Integer>comparingByValue().reversed())
.limit(count)
.map(Map.Entry::getKey)
.map(film -> FilmMapper.mapToFilmDto(film, filmStorage.getLikes(film.getId())))
.collect(Collectors.toList());
.toList();
}

public Collection<GenreDto> getGenres() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ public Rating getRatingById(int id) {
.orElseThrow(() -> new NotFoundException("Rating with id " + id + " not found"));
}

public List<Film> getTopFilms(int count, int genreId, int year) {
return filmRepository.getTopFilms(count, genreId, year);
}

private void validateRatingExists(Rating mpa) {
if (mpa == null || mpa.getId() == 0) {
throw new IllegalArgumentException("Film Rating (MPA) is required.");
Expand Down
8 changes: 7 additions & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
logging.level.org.zalando.logbook:ERROR
logging.level.org.zalando.logbook=TRACE
logging.level.ru.yandex.practicum.filmorate=INFO
spring.sql.init.mode=always
spring.datasource.url=jdbc:h2:file:./db/filmorate
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
Loading