Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into fix-dao-dependecies
Browse files Browse the repository at this point in the history
  • Loading branch information
vvbakhanovich committed Feb 8, 2024
2 parents 14699f5 + 6f4dc87 commit 87c38bb
Show file tree
Hide file tree
Showing 12 changed files with 107 additions and 52 deletions.
71 changes: 48 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,67 @@
## Entity relations table for filmorate database

![er table](filmorate_er.jpg)
![er table](er.jpg)

---
### База данных состоит из следующих таблиц:
1. __filmorate_user__:
- *id* (первичный ключ)
- *email* (электронная почта пользователя)
- *login* (логин пользователя)
- *user_name* (имя пользователя)
- *birthday* (дата рождения пользователя)

- *id* (первичный ключ)
- *email* (электронная почта пользователя)
- *login* (логин пользователя)
- *user_name* (имя пользователя)
- *birthday* (дата рождения пользователя)
2. __friendship_status__:
- *id* (первичный ключ)
- *status_name* (статус, например, 'Ожидает подтверждения', 'В друзьях')
- *id* (первичный ключ)
- *status_name* (статус, например, 'Ожидает подтверждения', 'В друзьях')
3. __friendship__:
- *user_id* (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы __user__)
- *friend_id* (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы __user__, который является другом пользователя c идентификатором *user_id*)
- *friendship_id* (внешний ключ, содержит id статуса дружбы из таблицы __friendship__)
4. __mpa_rating__:
- *id* (первичный ключ)
- *rating_name* (навзвание возрастного рейтинга)
- *id* (первичный ключ)
- *rating_name* (навзвание возрастного рейтинга)
5. __film__:
- *id* (первичный ключ)
- *title* (название фильма)
- *description* (опсисание фильма)
- *release_date* (дата релиза фильма)
- duration (длительность фильма в минутах)
- *mpa_rating_id* (внешний кллюч, содержит id возрастного рейтинга из таблицы __mpa_rating__)
- *id* (первичный ключ)
- *title* (название фильма)
- *description* (опсисание фильма)
- *release_date* (дата релиза фильма)
- duration (длительность фильма в минутах)
- *mpa_rating_id* (внешний кллюч, содержит id возрастного рейтинга из таблицы __mpa_rating__)
6. __genre__:
- *id* (первичный ключ)
- *genre_name* (название жанра фильма)
- *id* (первичный ключ)
- *genre_name* (название жанра фильма)
7. __film_genre__ (соединительная таблица между __film__ и __genre__):
- *film_id* (составной первичный ключ, внешний ключ, содержит id фильма из таблицы __film__)
- *genre_id* (составной первичный ключ, внешний ключ, содержит id жанра из таблицы __genre__)
- *film_id* (составной первичный ключ, внешний ключ, содержит id фильма из таблицы __film__)
- *genre_id* (составной первичный ключ, внешний ключ, содержит id жанра из таблицы __genre__)
8. __film_like__ (содержит список лайков фильмов от пользователей):
- *film_id* (составной первичный ключ, внешний ключ, содержит id фильма из таблицы __film__)
- *user_id (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы __user__)
- *film_id* (составной первичный ключ, внешний ключ, содержит id фильма из таблицы __film__)
- *user_id* (составной первичный ключ, внешний ключ, содержит id пользователя из таблицы __user__)
9. __review__
- *id* (первичный ключ)
- *review_content* (содержание отзыва)
- *is_positive* (является ли отзыв положительным)
- *useful* (количество положительных лайков отзыва)
- *user_id* (идентификатор пользователя, который написал отзыв)
- *film_id* (идентификатор фильма, о котором напсисан отзыв)

10. __review_like__ (соединительная таблица между __review__ и __filmorate_user__)
- *review_id* (внешний ключ, содержит id фильма из таблицы __review__)
- *user_id* (внешний ключ, содержит id фильма из таблицы __filmorate_user__)
- *like_type* (тип оценки (лайк/дизлайк))
11. __director__
- *id* (первичный ключ)
- *director_name* (имя режиссера)
12. __film_director__ (соединительная таблица между __film__ и __director__)
- *id* (первичный ключ)
- *film_id* (внешний ключ, содержит id фильма из таблицы __film__)
- *director_id* (внешний ключ, содержит id фильма из таблицы __director__))
13. __feed_events__
- *id* (первичный ключ)
- *event_type* (тип события в ленте)
- *operation* (тип операции над объектом)
- *entity_id* (идентификатор объекта, на котром прозводилась операция)
- *publication_time* (время выполнения события)
- *user_id* (внешний ключ, содержит id фильма из таблицы __filmorate_user__)
---

### Примеры запросов для основных операций:
Expand Down
Binary file added er.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import ru.yandex.practicum.filmorate.service.FilmService;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import java.util.Collection;

@RestController
Expand Down Expand Up @@ -50,9 +51,9 @@ public FilmDto removeLike(@PathVariable long id, @PathVariable long userId) {
}

@GetMapping("/popular")
public Collection<FilmDto> getMostPopularFilms(@RequestParam(required = false, defaultValue = "10") int count,
public Collection<FilmDto> getMostPopularFilms(@RequestParam(defaultValue = "10") int count,
@RequestParam(required = false) Integer genreId,
@RequestParam(required = false) Integer year) {
@RequestParam(required = false) @Min(1895) Integer year) {
return filmService.getMostPopularFilms(count, genreId, year);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public ReviewDto getReviewById(@PathVariable long id) {

@GetMapping
public List<ReviewDto> getReviewsByFilmId(@RequestParam(required = false) Long filmId,
@RequestParam(required = false, defaultValue = "10") int count) {
@RequestParam(defaultValue = "10") int count) {
return reviewService.getReviewsByFilmId(filmId, count);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package ru.yandex.practicum.filmorate.dao.impl;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
Expand All @@ -21,7 +20,6 @@

@Repository
@RequiredArgsConstructor
@Slf4j
public class ReviewDbStorage implements ReviewStorage {

private final JdbcTemplate jdbcTemplate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
@Builder
public class DirectorDto {

long id;
private long id;
@NotBlank(message = "Имя режиссера не может быть пустым.")
String name;
private String name;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Size;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Director {

long id;
String name;
private long id;
@Size(max = 255, message = "Имя режиссера не должно превышать 255 символов.")
private String name;
}
35 changes: 35 additions & 0 deletions src/main/java/ru/yandex/practicum/filmorate/model/SortBy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.yandex.practicum.filmorate.model;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@RequiredArgsConstructor
@Getter
public enum SortBy {
YEAR("f.release_date"),
LIKES("likes DESC");

private final String sql;

public static List<String> getStringValues() {
return Stream.of(SortBy.values())
.map(Enum::name)
.map(String::toLowerCase)
.collect(Collectors.toList());
}

public static SortBy fromString(String text) {
return Arrays.stream(SortBy.values())
.filter(sortBy -> sortBy.name().equalsIgnoreCase(text))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Данная сортировка не поддерживатется"));
}
}



Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,11 @@
import ru.yandex.practicum.filmorate.dto.FilmDto;
import ru.yandex.practicum.filmorate.dto.FilmSearchDto;
import ru.yandex.practicum.filmorate.mapper.FilmMapper;
import ru.yandex.practicum.filmorate.model.EventType;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.model.Operation;
import ru.yandex.practicum.filmorate.model.SearchBy;
import ru.yandex.practicum.filmorate.model.*;
import ru.yandex.practicum.filmorate.service.FilmService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Collectors;

import static ru.yandex.practicum.filmorate.mapper.FilmMapper.toDto;
Expand All @@ -27,11 +23,6 @@
@Slf4j
public class FilmServiceImpl implements FilmService {

public static final Map<String, String> ALLOWED_SORTS = Map.of(
"year", "f.release_date",
"likes", "likes DESC"
);

private final FilmStorage filmStorage;

private final UserStorage userStorage;
Expand Down Expand Up @@ -89,11 +80,10 @@ public Collection<FilmDto> getAllFilms() {
* @return найденный фильм.
*/
@Override
@Transactional
public FilmDto getFilmById(final long filmId) {
filmStorage.findById(filmId);
Film film = filmStorage.findById(filmId);
log.info("Фильм с id {} найден.", filmId);
return toDto(filmStorage.findById(filmId));
return toDto(film);
}

/**
Expand Down Expand Up @@ -189,11 +179,12 @@ public Collection<FilmDto> searchFilms(FilmSearchDto search) {
@Override
@Transactional
public Collection<FilmDto> getFilmsFromDirector(final long directorId, final String sortBy) {
if (!ALLOWED_SORTS.containsKey(sortBy)) {
if (!SortBy.getStringValues().contains(sortBy)) {
throw new IllegalArgumentException("Поле сортировки '" + sortBy + "' не поддерживается.");
}
String sort = SortBy.fromString(sortBy).getSql();
directorStorage.findById(directorId);
return filmStorage.findFilmsFromDirectorOrderBy(directorId, ALLOWED_SORTS.get(sortBy)).stream()
return filmStorage.findFilmsFromDirectorOrderBy(directorId, sort).stream()
.map(FilmMapper::toDto)
.collect(Collectors.toList());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public class ReviewServiceImpl implements ReviewService {
* @return отзыв с присвоенным идентификатором.
*/
@Override
@Transactional
public ReviewDto addReview(final ReviewDto reviewDto) {
findUserAndFilmInDb(reviewDto);
final Review review = toModel(reviewDto);
Expand Down Expand Up @@ -101,7 +102,6 @@ public void deleteReview(final long id) {
* @return список отзывов.
*/
@Override
@Transactional
public List<ReviewDto> getReviewsByFilmId(final Long filmId, final int count) {
if (filmId == null) {
final List<Review> reviews = reviewStorage.findAllLimitBy(count);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import ru.yandex.practicum.filmorate.dao.impl.DirectorDbStorage;
import ru.yandex.practicum.filmorate.exception.NotFoundException;
import ru.yandex.practicum.filmorate.model.Director;
import ru.yandex.practicum.filmorate.model.SortBy;

import java.util.Collection;
import java.util.List;
Expand Down Expand Up @@ -46,6 +47,8 @@ public void init() {
public void testFindEmptyDirectors() {
Collection<Director> emptyDirectors = directorStorage.findAll();

System.out.println(SortBy.getStringValues());

assertThat(emptyDirectors)
.isNotNull()
.isEmpty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import ru.yandex.practicum.filmorate.dto.FilmSearchDto;
import ru.yandex.practicum.filmorate.exception.NotFoundException;
import ru.yandex.practicum.filmorate.model.*;
import ru.yandex.practicum.filmorate.service.impl.FilmServiceImpl;

import java.time.LocalDate;
import java.util.Collection;
Expand Down Expand Up @@ -563,7 +562,7 @@ public void findFilmsByDirectorSortByYear() {
filmDbStorage.add(film2);

Collection<Film> films = filmDbStorage.findFilmsFromDirectorOrderBy(director.getId(),
FilmServiceImpl.ALLOWED_SORTS.get("year"));
SortBy.YEAR.getSql());

assertThat(films)
.isNotNull()
Expand All @@ -589,7 +588,7 @@ public void findFilmsByDirectorSortByLikes() {


Collection<Film> films = filmDbStorage.findFilmsFromDirectorOrderBy(director.getId(),
FilmServiceImpl.ALLOWED_SORTS.get("likes"));
SortBy.LIKES.getSql());

assertThat(films)
.isNotNull()
Expand All @@ -603,7 +602,7 @@ public void findFilmsByDirectorSortByLikes() {
public void findFilmsByDirectorUnknownId() {
directorStorage.add(director);
Collection<Film> films = filmDbStorage.findFilmsFromDirectorOrderBy(director.getId(),
FilmServiceImpl.ALLOWED_SORTS.get("year"));
SortBy.YEAR.getSql());

assertThat(films)
.isNotNull()
Expand Down

0 comments on commit 87c38bb

Please sign in to comment.