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
+
+
+Получение списка фильмов по рейтингу:
+```
+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());
}