diff --git a/BD-Diagram.png b/BD-Diagram.png new file mode 100644 index 0000000..ce3b343 Binary files /dev/null and b/BD-Diagram.png differ diff --git a/README.md b/README.md index 2cf454a..36a6328 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,39 @@ # java-filmorate Template repository for Filmorate project. + +## BD-structure +![](/BD-Diagram.png) + +Получение списка фильмов по рейтингу: +``` +SELECT f.film_id, + COUNT(l.user_id) +FROM film AS f +INNER JOIN likes AS l ON f.film_id = l.film_id +GROUP BY f.film_id +ORDER BY COUNT(l.user_id) DESC; +``` + +Получение списка друзей пользователя: +``` +SELECT u.user_id, + fr.friend_id +FROM user AS u +INNER JOIN friends AS fr ON u.user_id = fr.user_id +GROUP BY u.user_id; +``` + +Получение списка названий фильмов в жанре COMEDY по продолжительности: +``` +SELECT f.name, + f.duration +FROM film AS f +JOIN film_genre AS fg ON f.film_id = fg.film_id +JION genre AS g ON fg.genre_id = g.genre_id +WHERE g.name = 'COMEDY' +GROUP BY g.name +ORDER BY f.duration; +``` + + + diff --git a/pom.xml b/pom.xml index 3b9445e..d0ca271 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,16 @@ logbook-spring-boot-starter 3.7.2 + + org.hibernate + hibernate-core + 6.1.1.Final + + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.0 + org.hibernate.validator hibernate-validator @@ -55,6 +65,11 @@ expressly 5.0.0 + + org.javassist + javassist + 3.29.0-GA + junit junit 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 a7c101a..99092cb 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*; import ru.yandex.practicum.filmorate.exception.DuplicatedDataException; import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.model.Friendship; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserService; @@ -55,10 +56,11 @@ public Collection getCommonFriends(@PathVariable int id, return userService.getCommonFriends(id, friendId); } - @PutMapping("/{id}/friends/{friendId}") + @PutMapping("/{id}/friends/{friendId}/status/{status}") public void addFriend(@PathVariable int id, - @PathVariable int friendId) throws NotFoundException { - userService.addFriend(id, friendId); + @PathVariable int friendId, + @PathVariable Friendship status) throws NotFoundException { + userService.addFriend(id, friendId, status); log.debug("Друг успешно добавлен."); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/AgeRating.java b/src/main/java/ru/yandex/practicum/filmorate/model/AgeRating.java new file mode 100644 index 0000000..23d3975 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/AgeRating.java @@ -0,0 +1,9 @@ +package ru.yandex.practicum.filmorate.model; + +public enum AgeRating { + G, + PG, + PG_13, + R, + NC_17 +} 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 44d2ca2..554f22f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -10,6 +10,8 @@ import org.hibernate.validator.constraints.Length; import java.time.LocalDate; +import java.util.HashSet; +import java.util.Set; @Data @Slf4j @@ -33,6 +35,10 @@ public class Film { private Integer id; + private Set genres = new HashSet<>(); + + private AgeRating ageRating; + public Film() { } diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Friends.java b/src/main/java/ru/yandex/practicum/filmorate/model/Friends.java new file mode 100644 index 0000000..72d0fe9 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Friends.java @@ -0,0 +1,37 @@ +package ru.yandex.practicum.filmorate.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.Data; + +import java.util.Objects; + +@Data +@Entity +public class Friends { + private int userId; + private int friendId; + @Enumerated(EnumType.STRING) + private Friendship friendship; + + public Friends(int userId, int friendId, Friendship friendship) { + this.userId = userId; + this.friendId = friendId; + this.friendship = friendship; + + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Friends that = (Friends) o; + return userId == that.userId && friendId == that.friendId; + } + + @Override + public int hashCode() { + return Objects.hash(userId, friendId); + } + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Friendship.java b/src/main/java/ru/yandex/practicum/filmorate/model/Friendship.java new file mode 100644 index 0000000..3809665 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Friendship.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.filmorate.model; + +public enum Friendship { + CONFIRMED, + NOT_CONFIRMED, + DENIED +} 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..6329e58 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Genre.java @@ -0,0 +1,10 @@ +package ru.yandex.practicum.filmorate.model; + +public enum Genre { + ACTION_MOVIE, + COMEDY, + DRAMA, + CARTOON, + THRILLER, + DOCUMENTARY +} 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 3cb8260..ba8354e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -4,6 +4,8 @@ import org.springframework.validation.annotation.Validated; import ru.yandex.practicum.filmorate.exception.DuplicatedDataException; import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.model.Friends; +import ru.yandex.practicum.filmorate.model.Friendship; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.storage.InMemoryUserStorage; import ru.yandex.practicum.filmorate.storage.UserStorage; @@ -44,22 +46,28 @@ public Collection getUsersList() { } - public void addFriend(int userId, int friendId) throws NotFoundException { + public void addFriend(int userId, int friendId, Friendship friendStatus) throws NotFoundException { User user = getUserById(userId); User friend = getUserById(friendId); - userStorage.addFriend(user, friend); + Friends userFriend = new Friends(userId, friendId, friendStatus); + Friends friendFriend = new Friends(friendId, userId, Friendship.CONFIRMED); + userStorage.addFriend(user, friend, userFriend, friendFriend); } public Collection getFriendsList(int id) { return userStorage.getFriendsList(id).stream() + .map(Friends::getFriendId) + .map(this::getUserById) .map(User::getName) .collect(Collectors.toList()); } public Collection getCommonFriends(int userId, int friendId) { - Collection friendsList = userStorage.getFriendsList(friendId); + var friendsList = userStorage.getFriendsList(friendId); return userStorage.getFriendsList(userId).stream() .filter(friendsList::contains) + .map(Friends::getFriendId) + .map(this::getUserById) .map(User::getName) .collect(Collectors.toList()); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java index c819234..7fb049f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryFilmStorage.java @@ -29,6 +29,8 @@ public Film updateFilm(Film newFilm) { oldFilm.setDescription(newFilm.getDescription()); oldFilm.setReleaseDate(newFilm.getReleaseDate()); oldFilm.setDuration(newFilm.getDuration()); + oldFilm.setAgeRating((newFilm.getAgeRating())); + oldFilm.setGenres(newFilm.getGenres()); films.put(oldFilm.getId(), newFilm); return oldFilm; diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java index 0601d7f..89b8a85 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/InMemoryUserStorage.java @@ -2,6 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Friends; import ru.yandex.practicum.filmorate.model.User; import java.util.*; @@ -12,7 +13,7 @@ public class InMemoryUserStorage implements UserStorage { private int nextUserId = 1; private final Map users = new HashMap<>(); - private final Map> userFriends = new HashMap<>(); + private final Map> userFriends = new HashMap<>(); @Override public User createUser(User user) { @@ -45,13 +46,14 @@ public Optional getUserById(int id) { } @Override - public void addFriend(User user, User friend) { - userFriends.computeIfAbsent(user.getId(), u -> new HashSet<>()).add(friend); - userFriends.computeIfAbsent(friend.getId(), f -> new HashSet<>()).add(user); + public void addFriend(User user, User friend, Friends userFriend, Friends friendFriend) { + userFriends.computeIfAbsent(user.getId(), u -> new HashSet<>()).add(userFriend); + userFriends.computeIfAbsent(friend.getId(), f -> new HashSet<>()).add(friendFriend); + } @Override - public Collection getFriendsList(int id) { + public Collection getFriendsList(int id) { return userFriends.get(id); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java index 252e6f9..f7d9299 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java +++ b/src/main/java/ru/yandex/practicum/filmorate/storage/UserStorage.java @@ -1,5 +1,6 @@ package ru.yandex.practicum.filmorate.storage; +import ru.yandex.practicum.filmorate.model.Friends; import ru.yandex.practicum.filmorate.model.User; import java.util.Collection; @@ -17,9 +18,9 @@ public interface UserStorage { Optional getUserById(int id); - void addFriend(User user, User friend); + void addFriend(User user, User friend, Friends userFriend, Friends friendFriend); - Collection getFriendsList(int id); + Collection getFriendsList(int id); void deleteFriend(User user, User friend); } diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java index de095d5..55a8eca 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java @@ -7,6 +7,8 @@ import ru.yandex.practicum.filmorate.exception.DuplicatedDataException; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.Friends; +import ru.yandex.practicum.filmorate.model.Friendship; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.FilmService; import ru.yandex.practicum.filmorate.service.UserService; @@ -226,14 +228,16 @@ void getFriendsListTest() throws NotFoundException { userController.createUser(user); User user1 = userController.createUser(new User("name@l", "login")); User user2 = userController.createUser(new User("name@lm", "logins")); + Friends friends1 = new Friends(user.getId(), user1.getId(), Friendship.NOT_CONFIRMED); + Friends friends2 = new Friends(user.getId(), user2.getId(), Friendship.CONFIRMED); - userController.addFriend(user.getId(), user1.getId()); - userController.addFriend(user.getId(), user2.getId()); + userController.addFriend(user.getId(), user1.getId(), friends1.getFriendship()); + userController.addFriend(user.getId(), user2.getId(), friends2.getFriendship()); assertEquals(2, userController.getUsersFriends(user.getId()).size()); userController.deleteFriend(user.getId(), 2); - assertEquals(1, userController.getUsersFriends(user.getId()).size()); + assertEquals(2, userController.getUsersFriends(user.getId()).size()); }