Skip to content

Develop#15

Open
Ilusha92 wants to merge 38 commits intomainfrom
develop
Open

Develop#15
Ilusha92 wants to merge 38 commits intomainfrom
develop

Conversation

@Ilusha92
Copy link
Owner

No description provided.

alex9379992 and others added 23 commits February 15, 2023 21:47
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 user existence check
add getting review user id before update
replaced some constructors with lombok annotation
simplified checkUserInDb method
removed commented code
some other small changes
add search by title and director
all develop tests ok
Copy link

@avfyodorov avfyodorov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый вечер, Илья!

Перво-наперво хочу извиниться за задержку. Честно говоря, я не знаю как ваш проект попал ко мне, ведь я не ваш ревьюер. Видимо, праздники влияют. 🙂 Ладно, это пусть начальство разбирается. Чтобы вас не задерживать, я провёл ревью, а в дальнейшем, надеюсь, ваш проект вернётся к штатному ревьюверу.

Теперь по самому проекту. Видно, что вы проделали большую работу, реализовали функциональность, прописанную в Техническом задании, а, с учётом того, что команда у вас несыгранная, и это первый ваш групповой проект, результат можно считать хорошим.

Тем не менее, есть несколько вопросов.

  • Репозитарии должны работать с таблицами базы данных, каждый репозитарий со своей таблицей, и они все друг от друга не зависят. Постарался описать это в своих комментариях в коде.
  • Всю бизнес логику нужно сосредоточить в слое Сервисов. Это их зона ответственности.
  • Большая просьба описать в readme реализованную функциональность, хотя бы кратко. Кто и что сделал. Я не нашёл.
  • не смог сходу разобраться зачем у вас в проекте два комплекта репозитариев: один для работы с базой данных, а другой, Судя по всему, остался с первого спринта. Было бы хорошо провести рефакторинг и устранить лишнее.
  • Крайне желательно избавляться от большого количества запросов к серверу в цикле. Конечно, не нужно тащить всю базу данных к себе в память, это тоже не дело, но, общая идея в том, чтобы сократить количество запросов до минимально разумного.

Не стал писать одинаковые комментарии в разных классах.Поэтому прошу Вас проверить аналогичные ситуации в других частях проекта.

Вот вкратце, что я нашёл. Конечно, есть что поправить, но в целом всё очень неплохо. Поздравляю с удачным опытом групповой разработки, успехов!

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());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот здесь в цикле на каждую запись набора дёргается сервер с отдельным запросом. Это не очень хорошо. Лучше было бы придумать такой запрос, чтобы получить нужные данные сразу. И уже в памяти, если нужно, отфильтровать их.

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"));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А здесь ещё и вложенный цикл и внутри него обращение к репозитарию...

private static long REVIEW_ID;
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
private final JdbcTemplate jdbcTemplate;
private final ReviewLikesStorage reviewLikesStorage;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Повторюсь: в репозитории только обращение к собственной таблице, никаких зависимостей от других репозитариев быть не должно. Если нужно собирать данные из нескольких репозитариев и это нельзя сделать одним запросом, то скорее всего это зона ответственности соответствующего сервиса.
Вся бизнес логика должна находиться в слое сервисов.

Ilusha92 and others added 9 commits February 24, 2023 13:12
добавлены тесты
# 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
Copy link

@avfyodorov avfyodorov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ещё раз добрый день, Илья!

Работу принимаю.
Поздравляю Вас и вашу группу с окончанием проекта.

private final FilmService filmService;

@GetMapping("/common")
public List<Film> getCommonFilms(@RequestParam("userId") int userId, @RequestParam("friendId") int friendId) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просил добавить логирование, ладно….

@Slf4j
public class DirectorDbStorage implements DirectorStorage {
private final JdbcTemplate jdbcTemplate;
private final FilmMapper filmMapper;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну да, конечно, filmMapper…..
А filmMapper В свою очередь дёргает MpaService… Молодцы, спрятались 🙂

Чем программа стройнее, прямее, без хитрых зависимостей, тем она надёжнее и проще в сопровождении.

@Override
public List<Director> findAll() {
String statement = "SELECT * FROM directors";
List<Director> directors = jdbcTemplate.query(statement, new DirectorMapper());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DirectorMapper
Там же всего 1 метод... Можно было его прямо сюда и включить. Тем более, что по смыслу он как раз здесь и к месту .

@Ilusha92 Ilusha92 requested a review from avfyodorov May 13, 2024 19:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants