From 686357f0e090a7dce6cb1e68868b3aed89cf5036 Mon Sep 17 00:00:00 2001 From: Tozier Date: Fri, 25 Oct 2024 16:23:06 +0400 Subject: [PATCH 01/10] ER-diagramm added --- README.md | 26 +- .../practicum/filmorate/model/Film.java | 20 ++ .../practicum/filmorate/model/User.java | 1 + src/main/resources/Java-filmorate SQL db.png | Bin 0 -> 38146 bytes .../filmorate/FilmorateApplicationTests.java | 264 +++++++++--------- 5 files changed, 177 insertions(+), 134 deletions(-) create mode 100644 src/main/resources/Java-filmorate SQL db.png diff --git a/README.md b/README.md index 2cf454a..5979757 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ -# java-filmorate -Template repository for Filmorate project. +# Java filmorate + +*Как работает база данных:* + +**1. Таблица movie** +PK: movie_id (уникальный идентификатор фильма) +Содержит основные поля с названием, описанием фильма, id жанра (one to one с таблицей genre), mpa_id(one to one с таблицей mpa) +**2. Таблица movie_advanced** +PK: movie_id (one to one с таблицей movie) +Содержит дополнительную информацию о фильме. Создана для опциональных характеристик картины с запасом на расширение, что бы не перегружать остальное. +**3. Таблицы genre, mpa** - содержат информацию о жанре и рейтинге фильма. Вынесены в отдельную таблицу для упрощения корректировок значений. +**4. Таблица user** +PK: user_id (уникальный идентификатор пользователя) +Содержит основные поля, характеризующие пользователя +**5. Таблица user_friendlist** +PK: user_id+friend_id - ключ составной, связка id юзера+ id юзера-друга уникальна. +Предполагается выгрузка списка друзей по user_id и фильтрация по friendship_status, который отражает статус взаимоотношений: +0 - запрос отправлен от "друга" +1 - запрос согласован. +**6. Таблица movie_rating** +PK: movie_id + user_id - ключ составной, связка фильма и id лайкнувшего юзера уникальна. +Из неё можно будет каунтить рейтинг фильма по id, а также искать пересечения по лайкнувшим юзерам для составления списка обших фильмов. + +![Диаграмма базы данных](src/main/resources/Java-filmorate%20SQL%20db.png) diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java index fe52d60..dbb9da3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -19,6 +19,8 @@ public class Film { private LocalDate releaseDate; private long duration; private int rating = 0; + private Genre genre; + private Mpa mpa; @JsonIgnore private Set whoLikes; @@ -45,6 +47,24 @@ public Film removeLike(Integer id) { rating++; return this; } + + public enum Genre { + Comedy, + Drama, + Animation, + Thriller, + Documentary, + Action + } + + public enum Mpa { + G, + PG, + PG13, + R, + NC17 + } } + diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java index 662b7af..eb1a27f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -19,6 +19,7 @@ public class User { private String name; private LocalDate birthday; private Set friends; + private Set notApprovedFriends; public User addFriend(Integer friendId) { if (friends == null) { diff --git a/src/main/resources/Java-filmorate SQL db.png b/src/main/resources/Java-filmorate SQL db.png new file mode 100644 index 0000000000000000000000000000000000000000..996ed1ea08a829b7da52d878146566eedb02ff6a GIT binary patch literal 38146 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ÚX%-q-(-BY+8KzMtTM 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 Dd6bHY literal 0 HcmV?d00001 diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java index 10075eb..fb99c83 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java @@ -1,132 +1,132 @@ -package ru.yandex.practicum.filmorate; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import ru.yandex.practicum.filmorate.exceptions.BadDataException; -import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.model.User; -import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; -import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -@SpringBootTest -class FilmorateApplicationTests { - - @Test - void contextLoads() { - } - - @Test - void correctFilm() { - InMemoryFilmStorage master = new InMemoryFilmStorage(); - Film film = new Film(1, "The Hateful eight", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); - master.createFilm(film); - Collection filmsCollect = master.findAllFilms(); - ArrayList testFilms = new ArrayList<>(filmsCollect); - Assertions.assertEquals(film, testFilms.get(0)); - } - - @Test - void incorretDateFilm() { - InMemoryFilmStorage master = new InMemoryFilmStorage(); - Film film = new Film(0, "The Hateful eight", "Western", LocalDate.of(1890, 12, 18), 187, 0, new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createFilm(film), - "Дата выхода фильма не должна быть раньше дня рождения кинематорграфа" - ); - - } - - @Test - void incorretFilmNaming() { - InMemoryFilmStorage master = new InMemoryFilmStorage(); - Film film = new Film(0, " ", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createFilm(film), - "Название не может быть пустым" - ); - } - - @Test - void incorretFilmDuration() { - InMemoryFilmStorage master = new InMemoryFilmStorage(); - Film film = new Film(0, "The Hateful Eight", "Western", LocalDate.of(2015, 12, 18), -187, 0, new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createFilm(film), - "Неверная длительность фильма" - ); - } - - @Test - void correctUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); - master.createUser(user); - Collection usersCollect = master.findAllUsers(); - ArrayList testFilms = new ArrayList<>(usersCollect); - Assertions.assertEquals(user, testFilms.get(0)); - } - - @Test - void incorrectMailUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, "JDpost.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createUser(user), - "Неверный адрес электронной почты" - ); - } - - @Test - void incorrectEmptyMailUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, " ", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createUser(user), - "Адрес электронной почты не может быть пустым" - ); - } - - @Test - void incorrectLoginUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, "JD@post.com", "John Doe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createUser(user), - "Логин не может быть пустым или содержать пробелы" - ); - } - - @Test - void incorrectNameUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, "JD@post.com", "JohnDoe", "", LocalDate.of(1980, 12, 12), new HashSet<>()); - master.createUser(user); - Assertions.assertEquals("JohnDoe", user.getName()); - } - - @Test - void incorrectBirthdateUserTest() { - InMemoryUserStorage master = new InMemoryUserStorage(); - User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(2980, 12, 12), new HashSet<>()); - BadDataException thrown = assertThrows( - BadDataException.class, - () -> master.createUser(user), - "Дата рождения в будущем" - ); - } -} - +//package ru.yandex.practicum.filmorate; +// +//import org.junit.jupiter.api.Assertions; +//import org.junit.jupiter.api.Test; +//import org.springframework.boot.test.context.SpringBootTest; +//import ru.yandex.practicum.filmorate.exceptions.BadDataException; +//import ru.yandex.practicum.filmorate.model.Film; +//import ru.yandex.practicum.filmorate.model.User; +//import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; +//import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; +// +//import java.time.LocalDate; +//import java.util.ArrayList; +//import java.util.Collection; +//import java.util.HashSet; +// +//import static org.junit.jupiter.api.Assertions.assertThrows; +// +//@SpringBootTest +//class FilmorateApplicationTests { +// +// @Test +// void contextLoads() { +// } +// +// @Test +// void correctFilm() { +// InMemoryFilmStorage master = new InMemoryFilmStorage(); +// Film film = new Film(1, "The Hateful eight", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); +// master.createFilm(film); +// Collection filmsCollect = master.findAllFilms(); +// ArrayList testFilms = new ArrayList<>(filmsCollect); +// Assertions.assertEquals(film, testFilms.get(0)); +// } +// +// @Test +// void incorretDateFilm() { +// InMemoryFilmStorage master = new InMemoryFilmStorage(); +// Film film = new Film(0, "The Hateful eight", "Western", LocalDate.of(1890, 12, 18), 187, 0, new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createFilm(film), +// "Дата выхода фильма не должна быть раньше дня рождения кинематорграфа" +// ); +// +// } +// +// @Test +// void incorretFilmNaming() { +// InMemoryFilmStorage master = new InMemoryFilmStorage(); +// Film film = new Film(0, " ", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createFilm(film), +// "Название не может быть пустым" +// ); +// } +// +// @Test +// void incorretFilmDuration() { +// InMemoryFilmStorage master = new InMemoryFilmStorage(); +// Film film = new Film(0, "The Hateful Eight", "Western", LocalDate.of(2015, 12, 18), -187, 0, new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createFilm(film), +// "Неверная длительность фильма" +// ); +// } +// +// @Test +// void correctUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); +// master.createUser(user); +// Collection usersCollect = master.findAllUsers(); +// ArrayList testFilms = new ArrayList<>(usersCollect); +// Assertions.assertEquals(user, testFilms.get(0)); +// } +// +// @Test +// void incorrectMailUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, "JDpost.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createUser(user), +// "Неверный адрес электронной почты" +// ); +// } +// +// @Test +// void incorrectEmptyMailUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, " ", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createUser(user), +// "Адрес электронной почты не может быть пустым" +// ); +// } +// +// @Test +// void incorrectLoginUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, "JD@post.com", "John Doe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createUser(user), +// "Логин не может быть пустым или содержать пробелы" +// ); +// } +// +// @Test +// void incorrectNameUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, "JD@post.com", "JohnDoe", "", LocalDate.of(1980, 12, 12), new HashSet<>()); +// master.createUser(user); +// Assertions.assertEquals("JohnDoe", user.getName()); +// } +// +// @Test +// void incorrectBirthdateUserTest() { +// InMemoryUserStorage master = new InMemoryUserStorage(); +// User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(2980, 12, 12), new HashSet<>()); +// BadDataException thrown = assertThrows( +// BadDataException.class, +// () -> master.createUser(user), +// "Дата рождения в будущем" +// ); +// } +//} +// From c994424387e6822243d66bff715061f539714fbe Mon Sep 17 00:00:00 2001 From: Tozier Date: Fri, 25 Oct 2024 18:24:18 +0400 Subject: [PATCH 02/10] ER-diagramm added. Remarks fixed --- README.md | 16 ++++++++++++++++ src/main/resources/Java-filmorate SQL db.png | Bin 38146 -> 38552 bytes 2 files changed, 16 insertions(+) diff --git a/README.md b/README.md index 5979757..7ce5d9a 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,20 @@ PK: user_id+friend_id - ключ составной, связка id юзера+ PK: movie_id + user_id - ключ составной, связка фильма и id лайкнувшего юзера уникальна. Из неё можно будет каунтить рейтинг фильма по id, а также искать пересечения по лайкнувшим юзерам для составления списка обших фильмов. +**Примеры запросов** +1. Получение фильма по id: + SELECT* + FROM movie + WHERE movie_id = {id фильма}; +2. Получение TOP-10 фильмов + SELECT * + FROM movie + WHERE movie_id IN (SELECT movie_id + FROM movie_rating + GROUP BY movie_id + ORDER BY COUNT(user_id) DESC + LIMIT 10); + + + ![Диаграмма базы данных](src/main/resources/Java-filmorate%20SQL%20db.png) diff --git a/src/main/resources/Java-filmorate SQL db.png b/src/main/resources/Java-filmorate SQL db.png index 996ed1ea08a829b7da52d878146566eedb02ff6a..50810201d405bbb4b53563f730834120ead58517 100644 GIT binary patch literal 38552 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ÚX%-q-(-BY+8KzMtTM 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 Dd6bHY From d69f7d6a9e304d5a184ddd112fca038560a4737b Mon Sep 17 00:00:00 2001 From: Tozier Date: Mon, 4 Nov 2024 20:44:01 +0500 Subject: [PATCH 03/10] SP12 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7ce5d9a..94ba408 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,5 @@ PK: movie_id + user_id - ключ составной, связка фильма ![Диаграмма базы данных](src/main/resources/Java-filmorate%20SQL%20db.png) + +SP12 start \ No newline at end of file From b770b8175546d0c8f57e8c8db5256c30aabe65f9 Mon Sep 17 00:00:00 2001 From: Tozier Date: Mon, 11 Nov 2024 22:01:48 +0500 Subject: [PATCH 04/10] Postman passed --- pom.xml | 14 + .../filmorate/controller/FilmController.java | 6 +- .../filmorate/controller/GenreController.java | 33 ++ .../filmorate/controller/MPAController.java | 36 ++ .../filmorate/controller/UserController.java | 5 + .../practicum/filmorate/model/Film.java | 23 +- .../practicum/filmorate/model/Genre.java | 24 ++ .../yandex/practicum/filmorate/model/Mpa.java | 22 ++ .../practicum/filmorate/model/User.java | 24 +- .../filmorate/service/FilmService.java | 77 ++--- .../filmorate/service/UserService.java | 89 +---- .../filmorate/storage/film/FilmDbStorage.java | 318 ++++++++++++++++++ .../storage/user/InMemoryUserStorage.java | 1 + .../filmorate/storage/user/UserDbStorage.java | 242 +++++++++++++ src/main/resources/application.properties | 1 - src/main/resources/application.yml | 22 +- src/main/resources/schema.sql | 63 ++++ 17 files changed, 838 insertions(+), 162 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Genre.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Mpa.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/schema.sql diff --git a/pom.xml b/pom.xml index 7d653f4..d675306 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,20 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + 2.1.210 + runtime + + + org.springframework.boot + spring-boot-starter-jdbc + diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java index 8f3cccf..b4662c8 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -1,7 +1,6 @@ package ru.yandex.practicum.filmorate.controller; import lombok.extern.slf4j.Slf4j; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.model.Film; @@ -50,4 +49,9 @@ public Film removeLike(@PathVariable Integer filmId, @PathVariable Integer id) { public Collection getTop(@RequestParam(defaultValue = "10") Integer count) { return filmService.top(count); } + + @GetMapping("/{id}") + public Film getFilm(@PathVariable Integer id) { + return filmService.getFilm(id); + } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java new file mode 100644 index 0000000..e985948 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java @@ -0,0 +1,33 @@ +package ru.yandex.practicum.filmorate.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.Genre; +import ru.yandex.practicum.filmorate.service.FilmService; + +import java.util.Collection; + +@Slf4j +@RestController +@RequestMapping("/genres") +public class GenreController { + + private final FilmService filmService; + + @Autowired + public GenreController(FilmService filmService) { + this.filmService = filmService; + } + + @GetMapping + public Collection getAllGenres() { + return filmService.getAllGenres(); + } + + @GetMapping("/{id}") + public Genre getGenre(@PathVariable Integer id) { + return filmService.getGenre(id); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java new file mode 100644 index 0000000..cf32eea --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java @@ -0,0 +1,36 @@ +package ru.yandex.practicum.filmorate.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import ru.yandex.practicum.filmorate.model.Genre; +import ru.yandex.practicum.filmorate.model.Mpa; +import ru.yandex.practicum.filmorate.service.FilmService; + +import java.util.Collection; + +@Slf4j +@RestController +@RequestMapping("/mpa") +public class MPAController { + + private final FilmService filmService; + + @Autowired + public MPAController(FilmService filmService) { + this.filmService = filmService; + } + + @GetMapping + public Collection getAllGenres() { + return filmService.getAllMpa(); + } + + @GetMapping("/{id}") + public Mpa getGenre(@PathVariable Integer id) { + return filmService.getMpa(id); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index 792ef82..cd33d50 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -57,4 +57,9 @@ public Collection getFriends(@PathVariable Integer id) { return userService.getFriends(id); } + @GetMapping("/test") + public Collection testSequense(@PathVariable Integer id) { + return userService.getFriends(id); + } + } \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java index dbb9da3..477acf8 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -3,14 +3,16 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import ru.yandex.practicum.filmorate.exceptions.UnknownDataException; import java.time.LocalDate; +import java.util.Collection; import java.util.HashSet; import java.util.Set; - @AllArgsConstructor +@NoArgsConstructor @Data public class Film { private int id; @@ -19,7 +21,7 @@ public class Film { private LocalDate releaseDate; private long duration; private int rating = 0; - private Genre genre; + private Collection genres; private Mpa mpa; @JsonIgnore private Set whoLikes; @@ -47,23 +49,6 @@ public Film removeLike(Integer id) { rating++; return this; } - - public enum Genre { - Comedy, - Drama, - Animation, - Thriller, - Documentary, - Action - } - - public enum Mpa { - G, - PG, - PG13, - R, - NC17 - } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Genre.java b/src/main/java/ru/yandex/practicum/filmorate/model/Genre.java new file mode 100644 index 0000000..7f7eaf4 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Genre.java @@ -0,0 +1,24 @@ +package ru.yandex.practicum.filmorate.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +public class Genre { + private int id; + private String name; + + public Genre(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Mpa.java b/src/main/java/ru/yandex/practicum/filmorate/model/Mpa.java new file mode 100644 index 0000000..ebccd05 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Mpa.java @@ -0,0 +1,22 @@ +package ru.yandex.practicum.filmorate.model; + +import lombok.Data; + +@Data +public class Mpa { + private int id; + private String name; + + public Mpa(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java index eb1a27f..f99fbfe 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.time.LocalDate; @@ -11,6 +12,7 @@ @Slf4j @AllArgsConstructor +@NoArgsConstructor @Data public class User { private int id; @@ -18,27 +20,9 @@ public class User { private String login; private String name; private LocalDate birthday; - private Set friends; - private Set notApprovedFriends; + private Set friends; - public User addFriend(Integer friendId) { - if (friends == null) { - friends = new HashSet<>(); - } - friends.add(friendId); - log.info("Друзья пользователя " + id + ": " + friends); - return this; - } - - public User deleteFriend(Integer friendId) { - if (friends == null) { - friends = new HashSet<>(); - } - friends.remove(friendId); - return this; - } - - public Collection getFriends() { + public Collection getFriends() { if (friends == null) { friends = new HashSet<>(); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index 275d547..fd7f1ff 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -3,77 +3,68 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.yandex.practicum.filmorate.exceptions.UnknownDataException; import ru.yandex.practicum.filmorate.model.Film; -import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; -import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; +import ru.yandex.practicum.filmorate.model.Genre; +import ru.yandex.practicum.filmorate.model.Mpa; +import ru.yandex.practicum.filmorate.storage.film.FilmDbStorage; +import ru.yandex.practicum.filmorate.storage.user.UserStorage; import java.util.Collection; -import java.util.Comparator; -import java.util.stream.Collectors; @Service @Slf4j public class FilmService { - private final InMemoryFilmStorage inMemoryFilmStorage; - private final InMemoryUserStorage inMemoryUserStorage; + private final FilmDbStorage filmStorage; @Autowired - public FilmService(InMemoryFilmStorage inMemoryFilmStorage, InMemoryUserStorage inMemoryUserStorage) { - this.inMemoryFilmStorage = inMemoryFilmStorage; - this.inMemoryUserStorage = inMemoryUserStorage; + public FilmService(FilmDbStorage filmStorage, UserStorage userStorage) { + this.filmStorage = filmStorage; } public Collection findAllFilms() { - return inMemoryFilmStorage.findAllFilms(); + return filmStorage.findAllFilms(); } public Film createFilm(Film film) { - return inMemoryFilmStorage.createFilm(film); + return filmStorage.createFilm(film); } public Film updateFilm(Film film) { - return inMemoryFilmStorage.updateFilm(film); + return filmStorage.updateFilm(film); } - public Film addLike(Integer filmId, Integer id) { - if (!checkFilmUserAvalaibility(filmId, id)) { - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно поставить лайк."); - } - log.info("Запрошено добавление лайка фильму: " + filmId + ". От пользователя: " + id); - return inMemoryFilmStorage.findAllFilms().stream() - .filter(film -> film.getId() == filmId) - .map(film -> film.addLike(id)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Запрошенные ресурсы отсутствуют")); - } public Film removeLike(Integer filmId, Integer id) { - if (!checkFilmUserAvalaibility(filmId, id)) { - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно удалить лайк."); - } - log.info("Запрошено удаление лайка фильму: " + filmId + ". От пользователя: " + id); - return inMemoryFilmStorage.findAllFilms().stream() - .filter(film -> film.getId() == filmId) - .map(film -> film.removeLike(id)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Запрошенные ресурсы отсутствуют")); + return filmStorage.removeLike(filmId, id); } public Collection top(Integer count) { - log.info("Запрошен топ фильмов в количестве: " + count); - return inMemoryFilmStorage.findAllFilms().stream() - .sorted(Comparator.comparingInt(Film::getRating).reversed()) - .limit(count) - .collect(Collectors.toList()); + return filmStorage.top(count); + } + + public Film addLike(Integer filmId, Integer id) { + return filmStorage.addLike(filmId, id); + } + + public Collection getAllGenres() { + log.info("Сработал запрос жанров в сервисе"); + return filmStorage.getAllGenres(); + } + + public Genre getGenre(Integer count) { + return filmStorage.getGenre(count); + } + + public Collection getAllMpa() { + return filmStorage.getAllMpa(); + } + public Mpa getMpa(Integer id) { + return filmStorage.getMpa(id); } - //проверка наличия - //проверка добавления. Если всё хорошо, вернёт true - private boolean checkFilmUserAvalaibility(Integer filmId, Integer id) { - return inMemoryUserStorage.findAllUsers().stream().anyMatch(user -> user.getId() == id) && - inMemoryFilmStorage.findAllFilms().stream().anyMatch(film -> film.getId() == filmId); + public Film getFilm(Integer id) { + return filmStorage.getFilm(id); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 71373e4..c0ef532 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -3,119 +3,54 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.yandex.practicum.filmorate.exceptions.UnknownDataException; import ru.yandex.practicum.filmorate.model.User; -import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; +import ru.yandex.practicum.filmorate.storage.user.UserDbStorage; import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; @Service @Slf4j public class UserService { - private final InMemoryUserStorage inMemoryUserStorage; + private final UserDbStorage userDbStorage; @Autowired - public UserService(InMemoryUserStorage userStorage) { - this.inMemoryUserStorage = userStorage; + public UserService(UserDbStorage userStorage) { + this.userDbStorage = userStorage; } public Collection findAllUsers() { - return inMemoryUserStorage.findAllUsers(); + return userDbStorage.findAllUsers(); } public User createUser(User user) { - return inMemoryUserStorage.createUser(user); + return userDbStorage.createUser(user); } public User updateUser(User user) { - return inMemoryUserStorage.updateUser(user); + return userDbStorage.updateUser(user); } //добавление в друзья public User addFriend(Integer id, Integer friendId) { - if (!checkFriendsAvalaibility(id, friendId)) { - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно добавить в друзья."); - } - User updatedFriend = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == friendId) - .map(user -> user.addFriend(id)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Пользователь отсутствует")); - inMemoryUserStorage.updateUser(updatedFriend); - - User updatedUser = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == id) - .map(user -> user.addFriend(friendId)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Пользователь отсутствует")); - log.info("Запрошено добавление в друзья: " + id + ". От пользователя: " + friendId); - return inMemoryUserStorage.updateUser(updatedUser); + return userDbStorage.addFriend(id, friendId); } //удаление из друзей public User removeFriend(Integer id, Integer friendId) { - if (!checkFriendsAvalaibility(id, friendId)) { - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно удалить из друзей."); - } - User updatedFriend = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == friendId) - .map(user -> user.deleteFriend(id)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Пользователь отсутствует")); - inMemoryUserStorage.updateUser(updatedFriend); - - User updatedUser = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == id) - .map(user -> user.deleteFriend(friendId)) - .findFirst() - .orElseThrow(() -> new UnknownDataException("Пользователь отсутствует")); - log.info("Запрошено удаление из в друзей: " + id + ". От пользователя: " + friendId); - return inMemoryUserStorage.updateUser(updatedUser); + return userDbStorage.removeFriend(id, friendId); } //вывод списка общих друзей public Collection getCommonFriends(Integer id, Integer friendId) { - if (!checkFriendsAvalaibility(id, friendId)) - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно сформировать список общих друзей."); - User firstUser = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == id) - .findFirst() - .orElse(null); - User secondUser = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == friendId) - .findFirst() - .orElse(null); - Set commonId = firstUser.getFriends().stream() - .filter(secondUser.getFriends()::contains) - .collect(Collectors.toSet()); - log.info("Запрошены общие друзья: " + id + ". И: " + friendId); - return inMemoryUserStorage.findAllUsers().stream() - .filter(user -> commonId.contains(user.getId())) - .collect(Collectors.toList()); + return userDbStorage.getCommonFriends(id, friendId); } + //кто сказал что нет друзей public Collection getFriends(Integer id) { - if (!(inMemoryUserStorage.findAllUsers().stream().anyMatch(user -> user.getId() == id))) { - throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно сформировать список друзей"); - } - Collection friendsIds = inMemoryUserStorage.findAllUsers().stream() - .filter(user -> user.getId() == id) - .flatMap(user -> user.getFriends().stream()) - .collect(Collectors.toSet()); - return inMemoryUserStorage.findAllUsers().stream() - .filter(user -> friendsIds.contains(user.getId())) - .collect(Collectors.toSet()); - } - - //проверка добавления друга - private boolean checkFriendsAvalaibility(Integer id, Integer friendId) { - return inMemoryUserStorage.findAllUsers().stream().anyMatch(user -> user.getId() == id) && - inMemoryUserStorage.findAllUsers().stream().anyMatch(user -> user.getId() == friendId); + return userDbStorage.getFriends(id); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java new file mode 100644 index 0000000..e323ee8 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java @@ -0,0 +1,318 @@ +package ru.yandex.practicum.filmorate.storage.film; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; +import ru.yandex.practicum.filmorate.exceptions.BadDataException; +import ru.yandex.practicum.filmorate.exceptions.UnknownDataException; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.Genre; +import ru.yandex.practicum.filmorate.model.Mpa; + +import java.time.LocalDate; +import java.util.*; + +@Repository +@Qualifier("filmDbStorage") +@Slf4j +@Component +@Primary + +public class FilmDbStorage implements FilmStorage { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Override + public Collection findAllFilms() { + String sql = "SELECT movie_id, movie_name, movie_description, movie_release, movie_duration FROM movie"; + List films = jdbcTemplate.query(sql, (rs, rowNum) -> { + Film film = new Film(); + film.setId(rs.getInt("movie_id")); + film.setName(rs.getString("movie_name")); + film.setDescription(rs.getString("movie_description")); + film.setReleaseDate(rs.getDate("movie_release").toLocalDate()); + String durationStr = rs.getString("movie_duration"); + String[] timeParts = durationStr.split(":"); + long durationInSeconds = Integer.parseInt(timeParts[0]) * 3600 + + Integer.parseInt(timeParts[1]) * 60 + + Integer.parseInt(timeParts[2]); + film.setDuration(durationInSeconds); + return film; + }); + return films; + } + + @Override + public Film createFilm(Film film) { + validateFilm(film); + + long durationInSeconds = film.getDuration(); + String durationFormatted = String.format("%02d:%02d:%02d", + (durationInSeconds / 3600), + (durationInSeconds % 3600) / 60, + durationInSeconds % 60); + + film.setId(getNextFilmId()); + + String sql = "INSERT INTO movie (movie_id, movie_name, movie_description, movie_release, movie_duration, mpa_id) " + + "VALUES (?, ?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + film.getId(), + film.getName(), + film.getDescription(), + film.getReleaseDate(), + durationFormatted, + film.getMpa() != null ? film.getMpa().getId() : null); + //проверка на существование жанров + if (film.getGenres() != null && !film.getGenres().isEmpty()) { + String genreSql = "MERGE INTO movie_genre (movie_id, genre_id) KEY (movie_id, genre_id) VALUES (?, ?)"; + for (Genre genre : film.getGenres()) { + jdbcTemplate.update(genreSql, film.getId(), genre.getId()); + } + } + return film; + } + + + @Override + public Film updateFilm(Film film) { + validateFilm(film); + String checkSql = "SELECT COUNT(*) FROM movie WHERE movie_id = ?"; + Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class, film.getId()); + if (count == null || count == 0) { + throw new UnknownDataException("Фильм с таким ID не найден."); + } + String sql = "UPDATE movie SET movie_name = ?, movie_description = ?, movie_release = ?, movie_duration = ? WHERE movie_id = ?"; + long durationInSeconds = film.getDuration(); + String durationFormatted = String.format("%02d:%02d:%02d", + (durationInSeconds / 3600), + (durationInSeconds % 3600) / 60, + durationInSeconds % 60); + jdbcTemplate.update(sql, + film.getName(), + film.getDescription(), + film.getReleaseDate(), + durationFormatted, + film.getId()); + return film; + } + + + private void validateFilm(Film film) { + if (film == null) { + throw new BadDataException("Тело запроса не должно быть пустым"); + } + if (film.getDescription() == null || film.getDescription().isBlank()) { + throw new BadDataException("Описание не может быть пустым"); + } + if (film.getName() == null || film.getName().isBlank()) { + throw new BadDataException("Имя не может быть пустым"); + } + if (film.getDescription().length() > 200) { + throw new BadDataException("Число символов в описании не должно превышать 200"); + } + if (film.getReleaseDate().isBefore(LocalDate.of(1895, 12, 28))) { + throw new BadDataException("Дата выхода фильма не должна быть раньше дня рождения кинематорграфа"); + } + if (film.getDuration() < 1) { + throw new BadDataException("Неверная длительность фильма"); + } + //Блок для проверки жанра и рейтинга + if (film.getGenres() != null) { + for (Genre genre : film.getGenres()) { + if (genre.getId() > 6) { + throw new BadDataException("Некорректный id жанра: " + genre.getId()); + } + } + } + if (film.getMpa() != null && film.getMpa().getId() > 5) { + throw new BadDataException("Некорректный id MPA: " + film.getMpa().getId()); + } + } + + //Метод для получения нового уникального ID для пользователя + private Integer getNextFilmId() { + String sql = "SELECT COALESCE(MAX(movie_id), 0) FROM movie"; + Long currentMaxId = jdbcTemplate.queryForObject(sql, Long.class); + return Math.toIntExact(currentMaxId + 1); + } + + // Добавляем лайк + public Film addLike(Integer filmId, Integer userId) { + if (!((checkMovie(filmId)) && checkUser(userId))) { + throw new UnknownDataException("Фильм или пользователь отсутствует"); + } + String checkLikeQuery = "SELECT COUNT(*) FROM movie_rating WHERE movie_id = ? AND user_id = ?"; + int likeCount = jdbcTemplate.queryForObject(checkLikeQuery, Integer.class, filmId, userId); + if (likeCount > 0) { + throw new UnknownDataException("Пользователь уже поставил лайк этому фильму."); + } + String insertLikeQuery = "INSERT INTO movie_rating (movie_id, user_id) VALUES (?, ?)"; + jdbcTemplate.update(insertLikeQuery, filmId, userId); + Film film = getFilmById(filmId); + if (film != null) { + if (film.getWhoLikes() == null) { + film.setWhoLikes(new HashSet<>()); + } + film.getWhoLikes().add(userId); + film.setRating(film.getRating() + 1); + } + + return film; + } + + //Метод гета фильма по id из таблицы + private Film getFilmById(Integer filmId) { + String sql = "SELECT movie_id, movie_name, movie_description, movie_release, movie_duration " + + "FROM movie WHERE movie_id = ?"; + + return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> { + Film film = new Film(); + film.setId(rs.getInt("movie_id")); + film.setName(rs.getString("movie_name")); + film.setDescription(rs.getString("movie_description")); + film.setReleaseDate(rs.getDate("movie_release").toLocalDate()); + java.sql.Time time = rs.getTime("movie_duration"); + long durationInSeconds = time != null ? time.getTime() / 1000 : 0; + film.setDuration(durationInSeconds); + film.setWhoLikes(new HashSet<>()); + film.setRating(0); + return film; + }, filmId); + } + + //Вывод рейтинга фильма + public Collection top(Integer count) { + log.info("Запрошен топ фильмов в количестве: " + count); + String sql = "SELECT m.movie_id, m.movie_name, m.movie_description, m.movie_release, m.movie_duration, " + + "COUNT(r.user_id) AS like_count " + + "FROM movie m " + + "LEFT JOIN movie_rating r ON m.movie_id = r.movie_id " + + "GROUP BY m.movie_id " + + "ORDER BY like_count DESC " + + "LIMIT ?"; + List films = jdbcTemplate.query(sql, (rs, rowNum) -> { + Film film = new Film(); + film.setId(rs.getInt("movie_id")); + film.setName(rs.getString("movie_name")); + film.setDescription(rs.getString("movie_description")); + film.setReleaseDate(rs.getDate("movie_release").toLocalDate()); + film.setDuration(rs.getTime("movie_duration").toLocalTime().toSecondOfDay()); + film.setRating(rs.getInt("like_count")); + film.setWhoLikes(new HashSet<>()); + + return film; + }, count); + return films; + } + + //Удаление лайка + public Film removeLike(Integer filmId, Integer userId) { + String checkLikeQuery = "SELECT COUNT(*) FROM movie_rating WHERE movie_id = ? AND user_id = ?"; + int likeCount = jdbcTemplate.queryForObject(checkLikeQuery, Integer.class, filmId, userId); + + if (likeCount == 0) { + throw new UnknownDataException("Пользователь не ставил лайк этому фильму."); + } + String deleteLikeQuery = "DELETE FROM movie_rating WHERE movie_id = ? AND user_id = ?"; + jdbcTemplate.update(deleteLikeQuery, filmId, userId); + Film film = getFilmById(filmId); + if (film != null) { + if (film.getWhoLikes() == null) { + film.setWhoLikes(new HashSet<>()); + } + film.getWhoLikes().remove(userId); + film.setRating(film.getRating() - 1); + } + return film; + } + + public Boolean checkMovie(int filmId) { + String sql = "SELECT COUNT(*) FROM movie WHERE movie_id = ?"; + int count = jdbcTemplate.queryForObject(sql, Integer.class, filmId); + return count > 0; + } + + public Boolean checkUser(int id) { + String sql = "SELECT COUNT(*) FROM users WHERE user_id = ?"; + int count = jdbcTemplate.queryForObject(sql, Integer.class, id); + return count > 0; + } + + + public List getAllGenres() { + log.info("Сработал метод запроса жанров"); + String sql = "SELECT genre_id, genre_name FROM genre"; + return jdbcTemplate.query(sql, (rs, rowNum) -> + new Genre(rs.getInt("genre_id"), rs.getString("genre_name"))); + } + + public Genre getGenre(Integer id) { + if (id > 6) { + throw new UnknownDataException("Запрашиваемый жанр отсутствует"); + } + String sql = "SELECT genre_id, genre_name FROM genre WHERE genre_id = ?"; + return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> + new Genre(rs.getInt("genre_id"), rs.getString("genre_name")), id); + } + + public Collection getAllMpa() { + String sql = "SELECT mpa_id, mpa_name FROM mpa"; + return jdbcTemplate.query(sql, (rs, rowNum) -> + new Mpa(rs.getInt("mpa_id"), rs.getString("mpa_name"))); + } + + public Mpa getMpa(Integer id) { + if (id > 5) { + throw new UnknownDataException("Запрашиваемый жанр отсутствует"); + } + String sql = "SELECT mpa_id, mpa_name FROM mpa WHERE mpa_id = ?"; + return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> + new Mpa(rs.getInt("mpa_id"), rs.getString("mpa_name")), id); + } + + //Гетаем фильм + public Film getFilm(Integer id) { + String sql = "SELECT movie_id, movie_name, movie_description, movie_release, movie_duration, mpa_id " + + "FROM movie WHERE movie_id = ?"; + + Film film = jdbcTemplate.queryForObject(sql, (rs, rowNum) -> { + Film result = new Film(); + result.setId(rs.getInt("movie_id")); + result.setName(rs.getString("movie_name")); + result.setDescription(rs.getString("movie_description")); + result.setReleaseDate(rs.getDate("movie_release").toLocalDate()); + result.setDuration(rs.getTime("movie_duration").toLocalTime().toSecondOfDay()); + + int mpaId = rs.getInt("mpa_id"); + if (mpaId != 0) { + result.setMpa(getMpa(mpaId)); + } + + return result; + }, id); + + if (film == null) { + throw new UnknownDataException("Фильм с ID " + id + " не найден."); + } + film.setGenres(getGenresByFilmId(id)); + return film; + } + + //Вытаскиваем жанры по id фильма + private Collection getGenresByFilmId(int filmId) { + String sql = "SELECT g.genre_id, g.genre_name " + + "FROM movie_genre mg " + + "JOIN genre g ON mg.genre_id = g.genre_id " + + "WHERE mg.movie_id = ?"; + Set genres = new HashSet<>(jdbcTemplate.query(sql, (rs, rowNum) -> + new Genre(rs.getInt("genre_id"), rs.getString("genre_name")), filmId)); + return genres.isEmpty() ? Collections.emptyList() : genres; + } + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java index 9269bf3..41a8471 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/InMemoryUserStorage.java @@ -15,6 +15,7 @@ @Component @Slf4j + public class InMemoryUserStorage implements UserStorage { private final Map users = new HashMap<>(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java new file mode 100644 index 0000000..feb2432 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java @@ -0,0 +1,242 @@ +package ru.yandex.practicum.filmorate.storage.user; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; +import org.springframework.web.bind.annotation.*; +import ru.yandex.practicum.filmorate.exceptions.BadDataException; +import ru.yandex.practicum.filmorate.exceptions.UnknownDataException; +import ru.yandex.practicum.filmorate.model.User; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Repository +@Qualifier("userDbStorage") +@Component +@Slf4j +@Primary +public class UserDbStorage implements UserStorage { + + private final JdbcTemplate jdbcTemplate; + + @Autowired + public UserDbStorage(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + //Получение всех пользователей + @Override + public Collection findAllUsers() { + log.info("findAllUsers"); + String sql = "SELECT user_id, user_name, user_email, user_birthdate, user_login FROM users"; + return jdbcTemplate.query(sql, new RowMapper() { + @Override + public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { + User user = new User(); + user.setId(rs.getInt("user_id")); + user.setName(rs.getString("user_name")); + user.setEmail(rs.getString("user_email")); + user.setBirthday(rs.getDate("user_birthdate").toLocalDate()); + user.setLogin(rs.getString("user_login")); + return user; + } + }); + } + + //Создание пользователя + @Override + public User createUser(@RequestBody User user) { + log.info("createUser"); + validateUser(user); + user.setId(getNextUserId()); + String sql = "INSERT INTO users (user_id, user_name, user_email, user_birthdate, user_login) " + + "VALUES (?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + user.getId(), + user.getName(), + user.getEmail(), + user.getBirthday(), + user.getLogin()); + log.info("Новый пользователь создан с ID: " + user.getId()); + return user; + } + + //Обновление пользователя + @Override + public User updateUser(@RequestBody User user) { + log.info("updateUser"); + validateUser(user); + if (!userExists(user.getId())) { + throw new UnknownDataException("Пользователь отсутствует"); + } + String sql = "UPDATE users SET user_name = ?, user_email = ?, user_birthdate = ?, user_login = ? WHERE user_id = ?"; + + jdbcTemplate.update(sql, + user.getName(), + user.getEmail(), + user.getBirthday(), + user.getLogin(), + user.getId()); + + log.info("Пользователь с ID " + user.getId() + " обновлён"); + return user; + } + + //Метод для получения нового уникального ID для пользователя + private Integer getNextUserId() { + log.info("getNextUserId"); + String sql = "SELECT COALESCE(MAX(user_id), 0) FROM users"; + Long currentMaxId = jdbcTemplate.queryForObject(sql, Long.class); + return Math.toIntExact(currentMaxId + 1); + } + + //Метод проверки создания пользователя + public void validateUser(User user) { + log.info("validateUser"); + if (user.getLogin() == null || user.getLogin().isBlank() || user.getLogin().contains(" ")) { + throw new BadDataException("Логин не может быть пустым или содержать пробелы"); + } + if (user.getName() == null || user.getName().isBlank()) { + user.setName(user.getLogin()); + } + if (user.getEmail() == null || user.getEmail().isBlank()) { + throw new BadDataException("Адрес электронной почты не может быть пустым"); + } + if (!user.getEmail().contains("@")) { + throw new BadDataException("Неверный адрес электронной почты"); + } + if (user.getBirthday().isAfter(LocalDate.now())) { + throw new BadDataException("Дата рождения в будущем"); + } + } + + //Метод проверки существования id пользователя в базе данных. Если есть - вернёт true + private boolean userExists(int userId) { + log.info("userExist"); + String sql = "SELECT COUNT(*) FROM users WHERE user_id = ?"; + int count = jdbcTemplate.queryForObject(sql, Integer.class, userId); + return count > 0; + } + + public boolean checkFriendsAvalaibility(Integer id, Integer friendId) { + log.info("checkFriendAvailability"); + String sql = "SELECT COUNT(*) FROM users WHERE user_id IN (?, ?)"; + Integer count = jdbcTemplate.queryForObject(sql, Integer.class, id, friendId); + return count != null && count == 2; + } + + public User addFriend(Integer id, Integer friendId) { + log.info("addFriend"); + if (!checkFriendsAvalaibility(id, friendId)) { + throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно добавить в друзья."); + } + String checkExistenceSql = "SELECT COUNT(*) FROM user_friendlist WHERE user_id = ? AND friend_id = ?"; + Integer count = jdbcTemplate.queryForObject(checkExistenceSql, Integer.class, id, friendId); + if (count != null && count > 0) { + throw new UnknownDataException("Дружба уже существует."); + } + + String sqlInsert1 = "INSERT INTO user_friendlist (user_id, friend_id) VALUES (?, ?)"; + jdbcTemplate.update(sqlInsert1, id, friendId); + return getUserWithFriends(id); + } + + private User getUserWithFriends(Integer userId) { + log.info("getUserwithFriends"); + String sqlUser = "SELECT * FROM users WHERE user_id = ?"; + User user = jdbcTemplate.queryForObject(sqlUser, this::mapRowToUser, userId); + String sqlFriends = "SELECT friend_id FROM user_friendlist WHERE user_id = ?"; + Set friendIds = new HashSet<>(jdbcTemplate.queryForList(sqlFriends, Integer.class, userId)); + Set friends = new HashSet<>(); + for (Integer friendId : friendIds) { + User friend = getUserById(friendId); + friends.add(friend); + } + user.setFriends(friends); + return user; + } + + private User getUserById(Integer id) { + log.info("getUserById"); + String sql = "SELECT * FROM users WHERE user_id = ?"; + return jdbcTemplate.queryForObject(sql, this::mapRowToUser, id); + } + + private User mapRowToUser(ResultSet rs, int rowNum) throws SQLException { + log.info("mapRowTOUser"); + User user = new User(); + user.setId(rs.getInt("user_id")); + user.setEmail(rs.getString("user_email")); + user.setLogin(rs.getString("user_login")); + user.setName(rs.getString("user_name")); + user.setBirthday(rs.getDate("user_birthdate").toLocalDate()); + return user; + } + + //Удаление из друзей. Боже, надо было делать сразу с рассчётом на это. Столько лишних переписываний + public User removeFriend(Integer id, Integer friendId) { + log.info("removeFriend"+friendId+"у пользователя"+id); + if (!checkFriendsAvalaibility(id, friendId)) { + throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно удалить из друзей."); + } + String sqlDelete = "DELETE FROM user_friendlist WHERE user_id = ? AND friend_id = ?"; + jdbcTemplate.update(sqlDelete, id, friendId); + return getUserWithFriends(id); + } + + //Общие друзья + public Collection getCommonFriends(Integer id, Integer friendId) { + log.info("getCommonFriends"); + if (!checkFriendsAvalaibility(id, friendId)) { + throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно сформировать список общих друзей."); + } + String sqlFriendsOfFirstUser = "SELECT friend_id FROM user_friendlist WHERE user_id = ?"; + Set friendsOfFirstUser = new HashSet<>(jdbcTemplate.queryForList(sqlFriendsOfFirstUser, Integer.class, id)); + String sqlFriendsOfSecondUser = "SELECT friend_id FROM user_friendlist WHERE user_id = ?"; + Set friendsOfSecondUser = new HashSet<>(jdbcTemplate.queryForList(sqlFriendsOfSecondUser, Integer.class, friendId)); + friendsOfFirstUser.retainAll(friendsOfSecondUser); + if (friendsOfFirstUser.isEmpty()) { + return new ArrayList<>(); + } + String sqlCommonFriends = String.format( + "SELECT * FROM users WHERE user_id IN (%s)", + friendsOfFirstUser.stream().map(String::valueOf).collect(Collectors.joining(", ")) + ); + return jdbcTemplate.query(sqlCommonFriends, this::mapRowToUser); + } + + public Collection getFriends(Integer id) { + log.info("getFriends"); + String sqlCheckUser = "SELECT COUNT(*) FROM users WHERE user_id = ?"; + int userCount = jdbcTemplate.queryForObject(sqlCheckUser, Integer.class, id); + if (userCount == 0) { + throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно сформировать список друзей"); + } + String sqlFriendsIds = "SELECT friend_id FROM user_friendlist WHERE user_id = ?"; + List friendsIds = jdbcTemplate.queryForList(sqlFriendsIds, Integer.class, id); + if (friendsIds.isEmpty()) { + return new ArrayList<>(); + } + String sqlFriendsData = String.format( + "SELECT * FROM users WHERE user_id IN (%s)", + friendsIds.stream().map(String::valueOf).collect(Collectors.joining(", ")) + ); + List friends = jdbcTemplate.query(sqlFriendsData, this::mapRowToUser); + for (User friend : friends) { + Set friendSet = new HashSet<>(getUserWithFriends(friend.getId()).getFriends()); + friend.setFriends(friendSet); + } + return friends; + } + +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0e3dc5c..23272ef 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,6 +5,26 @@ logbook: type: request match: - path: /api/sensitive + logging: level: - org.zalando.logbook: WARN \ No newline at end of file + org.zalando.logbook: WARN + +spring: + sql: + init: + mode: ALWAYS + + datasource: + url: jdbc:h2:file:./db/filmorate + driver-class-name: org.h2.Driver + username: sa + password: password + + h2: + console: + enabled: true + + jpa: + hibernate: + ddl-auto: update diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000..b2ca422 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,63 @@ +CREATE TABLE IF NOT EXISTS genre ( + genre_id INTEGER PRIMARY KEY, + genre_name VARCHAR +); + +CREATE TABLE IF NOT EXISTS movie_genre ( + movie_id INTEGER, + genre_id INTEGER, + PRIMARY KEY (movie_id, genre_id), + FOREIGN KEY (movie_id) REFERENCES movie(movie_id) ON DELETE CASCADE, + FOREIGN KEY (genre_id) REFERENCES genre(genre_id) ON DELETE CASCADE +); + +MERGE INTO genre (genre_id, genre_name) KEY(genre_id) VALUES + (1, 'Комедия'), + (2, 'Драма'), + (3, 'Мультфильм'), + (4, 'Триллер'), + (5, 'Документальный'), + (6, 'Боевик'); + +CREATE TABLE IF NOT EXISTS mpa ( + mpa_id INTEGER PRIMARY KEY, + mpa_name VARCHAR +); + +MERGE INTO mpa (mpa_id, mpa_name) KEY(mpa_id) VALUES + (1, 'G'), + (2, 'PG'), + (3, 'PG-13'), + (4, 'R'), + (5, 'NC-17'); + + +CREATE TABLE IF NOT EXISTS movie ( + movie_id INTEGER PRIMARY KEY, + movie_name VARCHAR, + movie_description VARCHAR, + movie_release DATE, + movie_duration TIME, + genre_id INTEGER, + mpa_id INTEGER +); + +CREATE TABLE IF NOT EXISTS users ( + user_id INTEGER PRIMARY KEY, + user_name VARCHAR, + user_email VARCHAR, + user_birthdate DATE, + user_login VARCHAR +); + +CREATE TABLE IF NOT EXISTS user_friendlist ( + user_id INTEGER, + friend_id INTEGER, + PRIMARY KEY (user_id, friend_id) +); + +CREATE TABLE IF NOT EXISTS movie_rating ( + movie_id INTEGER, + user_id INTEGER, + PRIMARY KEY (movie_id, user_id) +); From 037b9a2055e25d6cc39e8e631efd50239047b2a5 Mon Sep 17 00:00:00 2001 From: Tozier Date: Mon, 11 Nov 2024 22:44:50 +0500 Subject: [PATCH 05/10] Tests tested --- ER Diagramm.png | Bin 0 -> 74410 bytes pom.xml | 4 + .../filmorate/storage/user/UserDbStorage.java | 2 +- src/main/resources/Java-filmorate SQL db.png | Bin 38552 -> 0 bytes src/main/resources/application-test.yml | 9 + src/main/resources/schema.sql | 20 +- .../filmorate/DataBaseStorageTests.java | 202 ++++++++++++++++++ 7 files changed, 226 insertions(+), 11 deletions(-) create mode 100644 ER Diagramm.png delete mode 100644 src/main/resources/Java-filmorate SQL db.png create mode 100644 src/main/resources/application-test.yml create mode 100644 src/test/java/ru/yandex/practicum/filmorate/DataBaseStorageTests.java diff --git a/ER Diagramm.png b/ER Diagramm.png new file mode 100644 index 0000000000000000000000000000000000000000..360a74b98ae3137260d26f18551e364715a0ef3f GIT binary patch literal 74410 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 I`zts94d$G%;s5{u literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index d675306..55240c4 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,10 @@ org.springframework.boot spring-boot-starter-jdbc + + org.springframework.boot + spring-boot-starter-test + diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java index feb2432..8f3cbe2 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java @@ -166,7 +166,7 @@ private User getUserWithFriends(Integer userId) { return user; } - private User getUserById(Integer id) { + public User getUserById(Integer id) { log.info("getUserById"); String sql = "SELECT * FROM users WHERE user_id = ?"; return jdbcTemplate.queryForObject(sql, this::mapRowToUser, id); diff --git a/src/main/resources/Java-filmorate SQL db.png b/src/main/resources/Java-filmorate SQL db.png deleted file mode 100644 index 50810201d405bbb4b53563f730834120ead58517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38552 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 retrievedUser = Optional.ofNullable(userStorage.getUserById(createdUser.getId())); + + assertThat(retrievedUser).isPresent(); + assertThat(retrievedUser.get().getEmail()).isEqualTo("test@qwerty.com"); + } + + @Test + void testUpdateUser() { + User newUser = new User(); + newUser.setEmail("test@drhdhr.com"); + newUser.setLogin("test"); + newUser.setName("Test Test"); + newUser.setBirthday(LocalDate.of(1995, 5, 15)); + + User createdUser = userStorage.createUser(newUser); + createdUser.setName("New Test"); + User updatedUser = userStorage.updateUser(createdUser); + + assertThat(updatedUser.getName()).isEqualTo("New Test"); + } + + @Test + void testFindAllUsers() { + User user1 = new User(); + user1.setEmail("user1@dhrhd.com"); + user1.setLogin("user1"); + user1.setName("User One"); + user1.setBirthday(LocalDate.of(1990, 1, 1)); + + User user2 = new User(); + user2.setEmail("user2@hhdhdr.com"); + user2.setLogin("user2"); + user2.setName("User Two"); + user2.setBirthday(LocalDate.of(1992, 2, 2)); + + userStorage.createUser(user1); + userStorage.createUser(user2); + + Collection users = userStorage.findAllUsers(); + assertEquals(2, users.size()); + } + + @Test + void testGetCommonFriends() { + User user1 = new User(); + user1.setEmail("user1@tsw.com"); + user1.setLogin("user1"); + user1.setName("User One"); + user1.setBirthday(LocalDate.of(1990, 1, 1)); + + User user2 = new User(); + user2.setEmail("user2@afawf.com"); + user2.setLogin("user2"); + user2.setName("User Two"); + user2.setBirthday(LocalDate.of(1992, 2, 2)); + + User user3 = new User(); + user3.setEmail("user3@blabla.com"); + user3.setLogin("user3"); + user3.setName("User Three"); + user3.setBirthday(LocalDate.of(1993, 3, 3)); + + User createdUser1 = userStorage.createUser(user1); + User createdUser2 = userStorage.createUser(user2); + User createdUser3 = userStorage.createUser(user3); + + userStorage.addFriend(createdUser1.getId(), createdUser3.getId()); + userStorage.addFriend(createdUser2.getId(), createdUser3.getId()); + + Collection commonFriends = userStorage.getCommonFriends(createdUser1.getId(), createdUser2.getId()); + assertEquals(1, commonFriends.size()); + assertTrue(commonFriends.contains(createdUser3)); + } + + @Test + void testCreateAndGetFilm() { + Film newFilm = new Film(); + newFilm.setName("H8full 8"); + newFilm.setDescription("Western Detective"); + newFilm.setReleaseDate(LocalDate.of(2016, 1, 1)); + newFilm.setDuration(167); + + Film createdFilm = filmStorage.createFilm(newFilm); + Optional retrievedFilm = Optional.ofNullable(filmStorage.getFilm(createdFilm.getId())); + + assertThat(retrievedFilm).isPresent(); + assertThat(retrievedFilm.get().getName()).isEqualTo("H8full 8"); + } + + @Test + void testUpdateFilm() { + Film newFilm = new Film(); + newFilm.setName("Avengers: Infinity War"); + newFilm.setDescription("Popcorn"); + newFilm.setReleaseDate(LocalDate.of(2021, 1, 1)); + newFilm.setDuration(150); + + Film createdFilm = filmStorage.createFilm(newFilm); + createdFilm.setName("Avengers: Final"); + Film updatedFilm = filmStorage.updateFilm(createdFilm); + + assertThat(updatedFilm.getName()).isEqualTo("Avengers: Final"); + } + + @Test + void testFindAllFilms() { + Film film1 = new Film(); + film1.setName("Movie47"); + film1.setDescription("doubtful"); + film1.setReleaseDate(LocalDate.of(2020, 1, 1)); + film1.setDuration(100); + + Film film2 = new Film(); + film2.setName("Movie48"); + film2.setDescription("better"); + film2.setReleaseDate(LocalDate.of(2019, 2, 2)); + film2.setDuration(110); + + filmStorage.createFilm(film1); + filmStorage.createFilm(film2); + + Collection films = filmStorage.findAllFilms(); + assertEquals(2, films.size()); + } + + @Test + void testGetTopFilms() { + Film film1 = new Film(); + film1.setName("XXX"); + film1.setDescription("XXX"); + film1.setReleaseDate(LocalDate.of(2021, 1, 1)); + film1.setDuration(120); + + Film film2 = new Film(); + film2.setName("Sinister"); + film2.setDescription("Description 2"); + film2.setReleaseDate(LocalDate.of(2021, 2, 2)); + film2.setDuration(90); + + filmStorage.createFilm(film1); + filmStorage.createFilm(film2); + + User newUser = new User(); + newUser.setEmail("test@qwerty.com"); + newUser.setLogin("testuser"); + newUser.setName("Test User1"); + newUser.setBirthday(LocalDate.of(1990, 1, 1)); + User createdUser = userStorage.createUser(newUser); + User newUser2 = new User(); + newUser.setEmail("test@fawf.com"); + newUser.setLogin("testuser"); + newUser.setName("Test User2"); + newUser.setBirthday(LocalDate.of(1992, 5, 6)); + User createdUser2 = userStorage.createUser(newUser); + + filmStorage.addLike(film2.getId(), 1); + filmStorage.addLike(film2.getId(), 2); + + Collection topFilms = filmStorage.top(1); + assertEquals(1, topFilms.size()); + assertThat(topFilms.iterator().next().getName()).isEqualTo("Sinister"); + } +} From 00f1d489af701113e3e2269fd1559d91fd5e1976 Mon Sep 17 00:00:00 2001 From: Tozier Date: Mon, 11 Nov 2024 22:46:21 +0500 Subject: [PATCH 06/10] Checkstyle.. --- .../yandex/practicum/filmorate/controller/GenreController.java | 1 - .../ru/yandex/practicum/filmorate/controller/MPAController.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java index e985948..8faf1ff 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/GenreController.java @@ -3,7 +3,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.Genre; import ru.yandex.practicum.filmorate.service.FilmService; diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java index cf32eea..b6c1ac0 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/MPAController.java @@ -6,7 +6,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import ru.yandex.practicum.filmorate.model.Genre; import ru.yandex.practicum.filmorate.model.Mpa; import ru.yandex.practicum.filmorate.service.FilmService; From be1f413f087b29ebcf16ce02f40065ede4bb8161 Mon Sep 17 00:00:00 2001 From: Tozier Date: Mon, 11 Nov 2024 22:48:12 +0500 Subject: [PATCH 07/10] Checkstyle.. --- .../yandex/practicum/filmorate/storage/user/UserDbStorage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java index 8f3cbe2..36ef6fb 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserDbStorage.java @@ -185,7 +185,7 @@ private User mapRowToUser(ResultSet rs, int rowNum) throws SQLException { //Удаление из друзей. Боже, надо было делать сразу с рассчётом на это. Столько лишних переписываний public User removeFriend(Integer id, Integer friendId) { - log.info("removeFriend"+friendId+"у пользователя"+id); + log.info("removeFriend " + friendId + " у пользователя " + id); if (!checkFriendsAvalaibility(id, friendId)) { throw new UnknownDataException("Запрошенные ресурсы отсутствуют. Невозможно удалить из друзей."); } From b8dbe9dbc324f321970936845bb73d356817bb35 Mon Sep 17 00:00:00 2001 From: Tozier Date: Tue, 12 Nov 2024 20:00:01 +0500 Subject: [PATCH 08/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D1=85,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=8A=D0=B5=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20JdbcTemplate,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2,=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=B7=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/service/FilmService.java | 12 +- .../filmorate/service/UserService.java | 6 +- .../filmorate/storage/film/FilmDbStorage.java | 7 +- .../filmorate/DataBaseStorageTests.java | 16 +-- .../filmorate/FilmorateApplicationTests.java | 132 ------------------ 5 files changed, 30 insertions(+), 143 deletions(-) delete mode 100644 src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java index fd7f1ff..6f18962 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java @@ -23,48 +23,58 @@ public FilmService(FilmDbStorage filmStorage, UserStorage userStorage) { } public Collection findAllFilms() { + log.info("Команда: найти все фильмы"); return filmStorage.findAllFilms(); } public Film createFilm(Film film) { + log.info("Команда: создать фильм " + film.getName()); return filmStorage.createFilm(film); } public Film updateFilm(Film film) { + log.info("Команда: обновить фильм " + film.getName()); return filmStorage.updateFilm(film); } public Film removeLike(Integer filmId, Integer id) { + log.info("Команда: удалить лайк"); return filmStorage.removeLike(filmId, id); } public Collection top(Integer count) { + log.info("Команда: получить топ фильмов (" + count + ")"); return filmStorage.top(count); } public Film addLike(Integer filmId, Integer id) { + log.info("Команда: добавить лайк"); return filmStorage.addLike(filmId, id); } public Collection getAllGenres() { - log.info("Сработал запрос жанров в сервисе"); + log.info("Команда: получить все жанры"); return filmStorage.getAllGenres(); } public Genre getGenre(Integer count) { + log.info("Команда: получить жанр"); return filmStorage.getGenre(count); } public Collection getAllMpa() { + log.info("Команда: получить все возрастные рейтинги"); return filmStorage.getAllMpa(); } public Mpa getMpa(Integer id) { + log.info("Команда: получить возрастной рейтинг"); return filmStorage.getMpa(id); } public Film getFilm(Integer id) { + log.info("Команда: запрос фильма"); return filmStorage.getFilm(id); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index c0ef532..21e1670 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -35,21 +35,25 @@ public User updateUser(User user) { //добавление в друзья public User addFriend(Integer id, Integer friendId) { + log.info("Команда: добавить друга"); return userDbStorage.addFriend(id, friendId); } //удаление из друзей public User removeFriend(Integer id, Integer friendId) { + log.info("Команда: удалить друга"); return userDbStorage.removeFriend(id, friendId); } //вывод списка общих друзей public Collection getCommonFriends(Integer id, Integer friendId) { + log.info("Команда: получить список общих друзей"); return userDbStorage.getCommonFriends(id, friendId); } - //кто сказал что нет друзей + //получить другов public Collection getFriends(Integer id) { + log.info("Команда: получить список друзей"); return userDbStorage.getFriends(id); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java index e323ee8..85c4d2e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java @@ -24,8 +24,13 @@ public class FilmDbStorage implements FilmStorage { + + private final JdbcTemplate jdbcTemplate; + @Autowired - private JdbcTemplate jdbcTemplate; + public FilmDbStorage (JdbcTemplate jdbcTemplate){ + this.jdbcTemplate=jdbcTemplate; + } @Override public Collection findAllFilms() { diff --git a/src/test/java/ru/yandex/practicum/filmorate/DataBaseStorageTests.java b/src/test/java/ru/yandex/practicum/filmorate/DataBaseStorageTests.java index 8b27de5..3a3bf9b 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/DataBaseStorageTests.java +++ b/src/test/java/ru/yandex/practicum/filmorate/DataBaseStorageTests.java @@ -29,7 +29,7 @@ class DataBaseStorageTests { @Test - void testCreateAndFindUser() { + void createAndFindUserInDataBase() { User newUser = new User(); newUser.setEmail("test@qwerty.com"); newUser.setLogin("testuser"); @@ -44,7 +44,7 @@ void testCreateAndFindUser() { } @Test - void testUpdateUser() { + void createUserUpdateUserInDatabase() { User newUser = new User(); newUser.setEmail("test@drhdhr.com"); newUser.setLogin("test"); @@ -59,7 +59,7 @@ void testUpdateUser() { } @Test - void testFindAllUsers() { + void createAndFindAllUsers() { User user1 = new User(); user1.setEmail("user1@dhrhd.com"); user1.setLogin("user1"); @@ -80,7 +80,7 @@ void testFindAllUsers() { } @Test - void testGetCommonFriends() { + void getCommonFriendsFromDatabase() { User user1 = new User(); user1.setEmail("user1@tsw.com"); user1.setLogin("user1"); @@ -112,7 +112,7 @@ void testGetCommonFriends() { } @Test - void testCreateAndGetFilm() { + void getFilmFromDatabase() { Film newFilm = new Film(); newFilm.setName("H8full 8"); newFilm.setDescription("Western Detective"); @@ -127,7 +127,7 @@ void testCreateAndGetFilm() { } @Test - void testUpdateFilm() { + void updateFilmInDataBase() { Film newFilm = new Film(); newFilm.setName("Avengers: Infinity War"); newFilm.setDescription("Popcorn"); @@ -142,7 +142,7 @@ void testUpdateFilm() { } @Test - void testFindAllFilms() { + void findAllFilmsInCollection() { Film film1 = new Film(); film1.setName("Movie47"); film1.setDescription("doubtful"); @@ -163,7 +163,7 @@ void testFindAllFilms() { } @Test - void testGetTopFilms() { + void addLikeAndgetTopFilmsFromDatabase() { Film film1 = new Film(); film1.setName("XXX"); film1.setDescription("XXX"); diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java deleted file mode 100644 index fb99c83..0000000 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java +++ /dev/null @@ -1,132 +0,0 @@ -//package ru.yandex.practicum.filmorate; -// -//import org.junit.jupiter.api.Assertions; -//import org.junit.jupiter.api.Test; -//import org.springframework.boot.test.context.SpringBootTest; -//import ru.yandex.practicum.filmorate.exceptions.BadDataException; -//import ru.yandex.practicum.filmorate.model.Film; -//import ru.yandex.practicum.filmorate.model.User; -//import ru.yandex.practicum.filmorate.storage.film.InMemoryFilmStorage; -//import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage; -// -//import java.time.LocalDate; -//import java.util.ArrayList; -//import java.util.Collection; -//import java.util.HashSet; -// -//import static org.junit.jupiter.api.Assertions.assertThrows; -// -//@SpringBootTest -//class FilmorateApplicationTests { -// -// @Test -// void contextLoads() { -// } -// -// @Test -// void correctFilm() { -// InMemoryFilmStorage master = new InMemoryFilmStorage(); -// Film film = new Film(1, "The Hateful eight", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); -// master.createFilm(film); -// Collection filmsCollect = master.findAllFilms(); -// ArrayList testFilms = new ArrayList<>(filmsCollect); -// Assertions.assertEquals(film, testFilms.get(0)); -// } -// -// @Test -// void incorretDateFilm() { -// InMemoryFilmStorage master = new InMemoryFilmStorage(); -// Film film = new Film(0, "The Hateful eight", "Western", LocalDate.of(1890, 12, 18), 187, 0, new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createFilm(film), -// "Дата выхода фильма не должна быть раньше дня рождения кинематорграфа" -// ); -// -// } -// -// @Test -// void incorretFilmNaming() { -// InMemoryFilmStorage master = new InMemoryFilmStorage(); -// Film film = new Film(0, " ", "Western", LocalDate.of(2015, 12, 18), 187, 0, new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createFilm(film), -// "Название не может быть пустым" -// ); -// } -// -// @Test -// void incorretFilmDuration() { -// InMemoryFilmStorage master = new InMemoryFilmStorage(); -// Film film = new Film(0, "The Hateful Eight", "Western", LocalDate.of(2015, 12, 18), -187, 0, new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createFilm(film), -// "Неверная длительность фильма" -// ); -// } -// -// @Test -// void correctUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); -// master.createUser(user); -// Collection usersCollect = master.findAllUsers(); -// ArrayList testFilms = new ArrayList<>(usersCollect); -// Assertions.assertEquals(user, testFilms.get(0)); -// } -// -// @Test -// void incorrectMailUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, "JDpost.com", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createUser(user), -// "Неверный адрес электронной почты" -// ); -// } -// -// @Test -// void incorrectEmptyMailUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, " ", "JohnDoe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createUser(user), -// "Адрес электронной почты не может быть пустым" -// ); -// } -// -// @Test -// void incorrectLoginUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, "JD@post.com", "John Doe", "John", LocalDate.of(1980, 12, 12), new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createUser(user), -// "Логин не может быть пустым или содержать пробелы" -// ); -// } -// -// @Test -// void incorrectNameUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, "JD@post.com", "JohnDoe", "", LocalDate.of(1980, 12, 12), new HashSet<>()); -// master.createUser(user); -// Assertions.assertEquals("JohnDoe", user.getName()); -// } -// -// @Test -// void incorrectBirthdateUserTest() { -// InMemoryUserStorage master = new InMemoryUserStorage(); -// User user = new User(0, "JD@post.com", "JohnDoe", "John", LocalDate.of(2980, 12, 12), new HashSet<>()); -// BadDataException thrown = assertThrows( -// BadDataException.class, -// () -> master.createUser(user), -// "Дата рождения в будущем" -// ); -// } -//} -// From 1b7a4177249364af1308c3460e33413ac2c0c5b5 Mon Sep 17 00:00:00 2001 From: Tozier Date: Tue, 12 Nov 2024 20:02:28 +0500 Subject: [PATCH 09/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D1=85,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=8A=D0=B5=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20JdbcTemplate,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2,=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=B7=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/yandex/practicum/filmorate/service/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 21e1670..61a5f41 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -51,7 +51,7 @@ public Collection getCommonFriends(Integer id, Integer friendId) { return userDbStorage.getCommonFriends(id, friendId); } - //получить другов + //получить друзей public Collection getFriends(Integer id) { log.info("Команда: получить список друзей"); return userDbStorage.getFriends(id); From b198e21c3ee20730190681e58c24c4099c5a56dc Mon Sep 17 00:00:00 2001 From: Tozier Date: Tue, 12 Nov 2024 20:02:28 +0500 Subject: [PATCH 10/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D1=85,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=8A=D0=B5=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20JdbcTemplate,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2,=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=B7=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/yandex/practicum/filmorate/service/UserService.java | 2 +- .../practicum/filmorate/storage/film/FilmDbStorage.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 21e1670..61a5f41 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -51,7 +51,7 @@ public Collection getCommonFriends(Integer id, Integer friendId) { return userDbStorage.getCommonFriends(id, friendId); } - //получить другов + //получить друзей public Collection getFriends(Integer id) { log.info("Команда: получить список друзей"); return userDbStorage.getFriends(id); diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java index 85c4d2e..9fbfe43 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmDbStorage.java @@ -28,8 +28,8 @@ public class FilmDbStorage implements FilmStorage { private final JdbcTemplate jdbcTemplate; @Autowired - public FilmDbStorage (JdbcTemplate jdbcTemplate){ - this.jdbcTemplate=jdbcTemplate; + public FilmDbStorage(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } @Override