Conversation
add base methods - no implement
implemented getRecommendedFilms method - pass 364 postman tests
without validation for existence of users and friendship
without validation for existence of users and friendship
without validation for existence of users and friendship
simplified bd request sorting List by likesCount
feat: добавлена возможность удаления фильмов и пользователей
* Добавлен класс director и DirectorDbStorage * Fixed not found status --------- Co-authored-by: Aleksandra <rok@bk,ru> Co-authored-by: kasisaki <32216047+kasisaki@users.noreply.github.com>
# Conflicts: # src/main/java/ru/yandex/practicum/filmorate/dao/FilmDbStorage.java # src/main/java/ru/yandex/practicum/filmorate/model/Film.java # src/main/java/ru/yandex/practicum/filmorate/service/FilmServiceManager.java # src/main/java/ru/yandex/practicum/filmorate/service/UserService.java # src/main/java/ru/yandex/practicum/filmorate/storage/FilmStorage.java # src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java # src/main/resources/application.properties # src/main/resources/schema.sql
Add reviews!
final ver
all tests ok
add search by title and director
all develop tests ok
restructed schema
There was a problem hiding this comment.
Добрый вечер, Илья!
Перво-наперво хочу извиниться за задержку. Честно говоря, я не знаю как ваш проект попал ко мне, ведь я не ваш ревьюер. Видимо, праздники влияют. 🙂 Ладно, это пусть начальство разбирается. Чтобы вас не задерживать, я провёл ревью, а в дальнейшем, надеюсь, ваш проект вернётся к штатному ревьюверу.
Теперь по самому проекту. Видно, что вы проделали большую работу, реализовали функциональность, прописанную в Техническом задании, а, с учётом того, что команда у вас несыгранная, и это первый ваш групповой проект, результат можно считать хорошим.
Тем не менее, есть несколько вопросов.
- Репозитарии должны работать с таблицами базы данных, каждый репозитарий со своей таблицей, и они все друг от друга не зависят. Постарался описать это в своих комментариях в коде.
- Всю бизнес логику нужно сосредоточить в слое Сервисов. Это их зона ответственности.
- Большая просьба описать в readme реализованную функциональность, хотя бы кратко. Кто и что сделал. Я не нашёл.
- не смог сходу разобраться зачем у вас в проекте два комплекта репозитариев: один для работы с базой данных, а другой, Судя по всему, остался с первого спринта. Было бы хорошо провести рефакторинг и устранить лишнее.
- Крайне желательно избавляться от большого количества запросов к серверу в цикле. Конечно, не нужно тащить всю базу данных к себе в память, это тоже не дело, но, общая идея в том, чтобы сократить количество запросов до минимально разумного.
Не стал писать одинаковые комментарии в разных классах.Поэтому прошу Вас проверить аналогичные ситуации в других частях проекта.
Вот вкратце, что я нашёл. Конечно, есть что поправить, но в целом всё очень неплохо. Поздравляю с удачным опытом групповой разработки, успехов!
src/main/java/ru/yandex/practicum/filmorate/controller/DirectorController.java
Outdated
Show resolved
Hide resolved
src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
Show resolved
Hide resolved
src/main/java/ru/yandex/practicum/filmorate/controller/DirectorController.java
Show resolved
Hide resolved
src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
Outdated
Show resolved
Hide resolved
src/main/java/ru/yandex/practicum/filmorate/dao/DirectorDbStorage.java
Outdated
Show resolved
Hide resolved
src/main/java/ru/yandex/practicum/filmorate/dao/UserDbStorage.java
Outdated
Show resolved
Hide resolved
| film.setId(rs.getInt("filmId")); | ||
| film.setMpa(filmStorage.getMpaById(rs.getInt("mpaId"))); | ||
| SqlRowSet getFilmGenres = jdbcTemplate.queryForRowSet("SELECT genreId FROM film_genre WHERE filmId=?", film.getId()); | ||
| SqlRowSet getFilmGenres = jdbcTemplate.queryForRowSet("SELECT genreId FROM film_genre WHERE filmId = ?", film.getId()); |
There was a problem hiding this comment.
Вот здесь в цикле на каждую запись набора дёргается сервер с отдельным запросом. Это не очень хорошо. Лучше было бы придумать такой запрос, чтобы получить нужные данные сразу. И уже в памяти, если нужно, отфильтровать их.
| SqlRowSet getFilmGenres = jdbcTemplate.queryForRowSet("SELECT genreId FROM film_genre WHERE filmId=?", film.getId()); | ||
| SqlRowSet getFilmGenres = jdbcTemplate.queryForRowSet("SELECT genreId FROM film_genre WHERE filmId = ?", film.getId()); | ||
| while(getFilmGenres.next()){ | ||
| Genre genre = filmStorage.getGenreById(getFilmGenres.getInt("genreId")); |
There was a problem hiding this comment.
А здесь ещё и вложенный цикл и внутри него обращение к репозитарию...
| private static long REVIEW_ID; | ||
| private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; | ||
| private final JdbcTemplate jdbcTemplate; | ||
| private final ReviewLikesStorage reviewLikesStorage; |
There was a problem hiding this comment.
Повторюсь: в репозитории только обращение к собственной таблице, никаких зависимостей от других репозитариев быть не должно. Если нужно собирать данные из нескольких репозитариев и это нельзя сделать одним запросом, то скорее всего это зона ответственности соответствующего сервиса.
Вся бизнес логика должна находиться в слое сервисов.
changelog in telegram for internal use only
# Conflicts: # src/main/resources/schema.sql
добавлены тесты
# Conflicts: # src/main/java/ru/yandex/practicum/filmorate/controller/DirectorController.java # src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java # src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java # src/main/java/ru/yandex/practicum/filmorate/controller/MpaController.java # src/main/java/ru/yandex/practicum/filmorate/dao/FilmDbStorage.java # src/main/java/ru/yandex/practicum/filmorate/dao/UserDbStorage.java # src/main/java/ru/yandex/practicum/filmorate/dao/review/ReviewDbStorage.java
refactor dependencies, add logging, join kasisaki-igorshmidt99-alex9379992 changes
changed dependencies removed loop access to DB
refactor develop
avfyodorov
left a comment
There was a problem hiding this comment.
Ещё раз добрый день, Илья!
Работу принимаю.
Поздравляю Вас и вашу группу с окончанием проекта.
| private final FilmService filmService; | ||
|
|
||
| @GetMapping("/common") | ||
| public List<Film> getCommonFilms(@RequestParam("userId") int userId, @RequestParam("friendId") int friendId) { |
There was a problem hiding this comment.
Просил добавить логирование, ладно….
| @Slf4j | ||
| public class DirectorDbStorage implements DirectorStorage { | ||
| private final JdbcTemplate jdbcTemplate; | ||
| private final FilmMapper filmMapper; |
There was a problem hiding this comment.
Ну да, конечно, filmMapper…..
А filmMapper В свою очередь дёргает MpaService… Молодцы, спрятались 🙂
Чем программа стройнее, прямее, без хитрых зависимостей, тем она надёжнее и проще в сопровождении.
| @Override | ||
| public List<Director> findAll() { | ||
| String statement = "SELECT * FROM directors"; | ||
| List<Director> directors = jdbcTemplate.query(statement, new DirectorMapper()); |
There was a problem hiding this comment.
DirectorMapper
Там же всего 1 метод... Можно было его прямо сюда и включить. Тем более, что по смыслу он как раз здесь и к месту .
No description provided.