diff --git a/pom.xml b/pom.xml
index 47dbf8a..e44a628 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,19 @@
org.springframework.boot
spring-boot-starter-web
-
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+ runtime
+
org.projectlombok
lombok
@@ -37,7 +49,19 @@
junit
test
-
+
+ org.projectlombok
+ lombok
+
+
+ org.projectlombok
+ lombok
+
+
+ org.projectlombok
+ lombok
+
+
diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java
index 9aa7e4c..17cf5f3 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ErrorHandler.java
@@ -5,9 +5,7 @@
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
-import ru.yandex.practicum.filmorate.exception.FilmNotFoundException;
-import ru.yandex.practicum.filmorate.exception.UserNotFoundException;
-import ru.yandex.practicum.filmorate.exception.ValidationException;
+import ru.yandex.practicum.filmorate.exception.*;
import ru.yandex.practicum.filmorate.model.ErrorResponse;
@RestControllerAdvice
@@ -21,7 +19,7 @@ public ErrorResponse handleValidationException(final ValidationException e) {
return new ErrorResponse(e.getMessage());
}
- @ExceptionHandler({FilmNotFoundException.class, UserNotFoundException.class})
+ @ExceptionHandler({FilmNotFoundException.class, UserNotFoundException.class, MpaNotFoundException.class, GenreNotFoundException.class,LikeNotFoundException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleNotFoundException(final RuntimeException e) {
log.error(e.getMessage(), e);
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 7e25ffd..d14b397 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java
@@ -1,80 +1,111 @@
package ru.yandex.practicum.filmorate.controller;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.exception.FilmNotFoundException;
import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.Genre;
+import ru.yandex.practicum.filmorate.model.Mpa;
import ru.yandex.practicum.filmorate.service.FilmService;
import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
import ru.yandex.practicum.filmorate.validators.FilmValidator;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@RestController
@Slf4j
-@RequiredArgsConstructor
public class FilmController {
- private final FilmStorage inMemoryFilmStorage;
+ @Autowired
+ @Qualifier("filmDbStorage")
+ private final FilmStorage filmStorage;
private final FilmService service;
+ public FilmController(@Qualifier("filmDbStorage") FilmStorage filmStorage, FilmService service) {
+ this.filmStorage = filmStorage;
+ this.service = service;
+ }
+
@PostMapping("/films")
public Film addFilm(@RequestBody Film film) {
log.info("Получен запрос POST /film");
- if (FilmValidator.validate(film)) {
- inMemoryFilmStorage.addFilm(film);
- log.info("Запрос успешно обработан");
- return film;
- }
- return film;
+ FilmValidator.validate(film);
+ filmStorage.addFilm(film);
+ log.info("Запрос успешно обработан");
+ int rate = film.getRate();
+ Film newFilm = getFilmById(film.getId());
+ newFilm.setRate(rate);
+ return newFilm;
}
@PutMapping("/films")
public Film updateFilm(@RequestBody Film film) {
log.info("Получен запрос PUT /films");
- if (!inMemoryFilmStorage.isFilmExists(film)) {
- log.warn("Такого фильма не существует.");
- throw new FilmNotFoundException("Такого фильма не существует.");
+ List films = getFilms();
+ Map filmsAndId = new HashMap<>();
+ for (Film checkFilm: films) {
+ filmsAndId.put(checkFilm.getId(), checkFilm);
}
- if (FilmValidator.validate(film)) {
- inMemoryFilmStorage.updateFilm(film);
+ if (filmsAndId.containsKey(film.getId())) {
+ FilmValidator.validate(film);
+ filmStorage.updateFilm(film);
log.info("Запрос успешно обработан");
- return film;
+ return getFilmById(film.getId());
+ } else {
+ throw new FilmNotFoundException("Такого фильма не существует.");
}
- return film;
}
@GetMapping("/films")
public List getFilms() {
log.info("Получен запрос GET /films");
- return new ArrayList<>(inMemoryFilmStorage.getFilms().values());
+ return new ArrayList<>(filmStorage.getFilms());
}
@GetMapping("/films/{id}")
- public Film getUserById(@PathVariable long id) {
- if (!inMemoryFilmStorage.getFilms().containsKey(id)) {
- log.warn("Такого фильма не существует.");
- throw new FilmNotFoundException("Такого фильма не существует.");
- }
+ public Film getFilmById(@PathVariable int id) {
log.info("Получен запрос GET /films/id");
- return inMemoryFilmStorage.getFilms().get(id);
+ return filmStorage.getFilmById(id);
}
@PutMapping("/films/{id}/like/{userId}")
- public void likeFilm(@PathVariable long id, @PathVariable long userId) {
+ public void likeFilm(@PathVariable int id, @PathVariable int userId) {
log.info("Получен запрос PUT /films/{id}/like/{userId}");
service.addLike(id, userId);
}
@DeleteMapping("/films/{id}/like/{userId}")
- public void deleteLike(@PathVariable long id, @PathVariable long userId) {
+ public void deleteLike(@PathVariable int id, @PathVariable int userId) {
service.deleteLike(id, userId);
}
@GetMapping("/films/popular")
- public List getUserFriends(@RequestParam (value = "count", defaultValue = "10", required = false) Integer count) {
+ public List getTop(@RequestParam (value = "count", defaultValue = "10", required = false) Integer count) {
return service.getTop(count);
}
+
+ @GetMapping("/mpa")
+ public List getAllMpa() {
+ return filmStorage.getAllMpa();
+ }
+
+ @GetMapping("/mpa/{id}")
+ public Mpa getMpaById(@PathVariable int id) {
+ return filmStorage.getMpaById(id);
+ }
+
+ @GetMapping("/genres")
+ public List getAllGenres() {
+ return filmStorage.getAllGenres();
+ }
+
+ @GetMapping("/genres/{id}")
+ public Genre getGenreById(@PathVariable int id) {
+ return filmStorage.getGenreById(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 8548d6f..37fd94b 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java
@@ -1,30 +1,39 @@
package ru.yandex.practicum.filmorate.controller;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.exception.UserNotFoundException;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.service.UserService;
-import ru.yandex.practicum.filmorate.storage.user.InMemoryUserStorage;
+import ru.yandex.practicum.filmorate.storage.user.UserStorage;
import ru.yandex.practicum.filmorate.validators.UserValidator;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@RestController
@Slf4j
-@RequiredArgsConstructor
public class UserController {
- private final InMemoryUserStorage inMemoryUserStorage;
+ @Autowired
+ @Qualifier("userDbStorage")
+ private final UserStorage userStorage;
private final UserService service;
+ public UserController(@Qualifier("userDbStorage") UserStorage userStorage, UserService service) {
+ this.userStorage = userStorage;
+ this.service = service;
+ }
+
@PostMapping("/users")
public User addUser(@RequestBody User user) {
log.info("Получен запрос POST /users");
if (UserValidator.validate(user)) {
- inMemoryUserStorage.addUser(user);
+ userStorage.addUser(user);
log.info("Запрос успешно обработан");
return user;
}
@@ -34,52 +43,66 @@ public User addUser(@RequestBody User user) {
@PutMapping("/users")
public User updateUser(@RequestBody User user) {
log.info("Получен запрос PUT /users");
- if (!inMemoryUserStorage.isUserExists(user)) {
- log.warn("Такого пользователя не существует.");
- throw new UserNotFoundException("Такого пользователя не существует.");
+ List users = getUsers();
+ Map usersAndId = new HashMap<>();
+ for (User checkUser: users) {
+ usersAndId.put(checkUser.getId(), checkUser);
}
- if (UserValidator.validate(user)) {
- inMemoryUserStorage.updateUser(user);
- log.info("Запрос успешно обработан");
+ if (usersAndId.containsKey(user.getId())) {
+ if (UserValidator.validate(user)) {
+ userStorage.updateUser(user);
+ log.info("Запрос успешно обработан");
+ return user;
+ }
return user;
+ } else {
+ throw new UserNotFoundException("Такого пользователя не существует.");
}
- return user;
}
@GetMapping("/users")
public List getUsers() {
log.info("Получен запрос GET /users");
- return new ArrayList<>(inMemoryUserStorage.getUsers().values());
+ return new ArrayList<>(userStorage.getUsers());
}
@GetMapping("/users/{id}")
- public User getUserById(@PathVariable long id) {
- if (!inMemoryUserStorage.getUsers().containsKey(id)) {
+ public User getUserById(@PathVariable int id) {
+ log.info("Получен запрос GET /users/{id}");
+ User user = userStorage.getUserById(id);
+ if (user != null) {
+ return user;
+ } else {
log.warn("Такого пользователя не существует.");
throw new UserNotFoundException("Такого пользователя не существует.");
}
- log.info("Получен запрос GET /users");
- return inMemoryUserStorage.getUsers().get(id);
}
@PutMapping("/users/{id}/friends/{friendId}")
- public void addFriend(@PathVariable long id, @PathVariable long friendId) {
+ public void addFriend(@PathVariable int id, @PathVariable int friendId) {
+ User user1 = getUserById(id);
+ User user2 = getUserById(friendId);
service.addFriend(id, friendId);
}
@DeleteMapping("/users/{id}/friends/{friendId}")
- public void deleteFriend(@PathVariable long id, @PathVariable long friendId) {
+ public void deleteFriend(@PathVariable int id, @PathVariable int friendId) {
+ User user1 = getUserById(id);
+ User user2 = getUserById(friendId);
service.deleteFriend(id, friendId);
}
@GetMapping("/users/{id}/friends")
- public List getUserFriends(@PathVariable long id) {
+ public List getUserFriends(@PathVariable int id) {
+ User user1 = getUserById(id);
return service.getUserFriends(id);
}
@GetMapping("/users/{id}/friends/common/{otherId}")
- public List getUserCommonFriends(@PathVariable long id, @PathVariable long otherId) {
+ public List getUserCommonFriends(@PathVariable int id, @PathVariable int otherId) {
log.info("Получен запрос GET /users/{id}/friends/common/{otherId}");
+ User user1 = getUserById(id);
+ User user2 = getUserById(otherId);
return service.commonFriends(id, otherId);
}
}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDbStorage.java
new file mode 100644
index 0000000..6708b3d
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmDbStorage.java
@@ -0,0 +1,157 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.jdbc.support.KeyHolder;
+import org.springframework.stereotype.Component;
+import ru.yandex.practicum.filmorate.exception.FilmNotFoundException;
+import ru.yandex.practicum.filmorate.exception.GenreNotFoundException;
+import ru.yandex.practicum.filmorate.exception.LikeNotFoundException;
+import ru.yandex.practicum.filmorate.exception.MpaNotFoundException;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.Genre;
+import ru.yandex.practicum.filmorate.model.Like;
+import ru.yandex.practicum.filmorate.model.Mpa;
+import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+public class FilmDbStorage implements FilmStorage {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ public FilmDbStorage(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ @Override
+ public void addFilm(Film film) {
+ String sqlQuery = "INSERT INTO Films (name, description, release_date, duration, rating_id, rate) VALUES(?, ?, ?, ?, ?, ?)";
+ KeyHolder keyHolder = new GeneratedKeyHolder();
+ jdbcTemplate.update(connection -> {
+ PreparedStatement stmt = connection.prepareStatement(sqlQuery, new String[]{"id"});
+ stmt.setString(1, film.getName());
+ stmt.setString(2, film.getDescription());
+ stmt.setDate(3, Date.valueOf(film.getReleaseDate()));
+ stmt.setInt(4, film.getDuration());
+ stmt.setInt(5, film.getMpa().getId());
+ stmt.setInt(6, film.getRate());
+ return stmt;
+ }, keyHolder);
+ film.setId(keyHolder.getKey().intValue());
+ if (film.getGenres() != null) {
+ String sqlQuery2 = "INSERT INTO Film_genre (film_id, genre_id) VALUES(?, ?)";
+
+ List genres = film.getGenres();
+ for (Genre element:genres) {
+ jdbcTemplate.update(sqlQuery2, film.getId(), element.getId());
+ }
+ }
+ }
+
+ @Override
+ public void updateFilm(Film film) {
+ jdbcTemplate.update("UPDATE Films SET name=?, description=?, release_date=?, duration=?, rating_id=?, rate=? WHERE id=?",
+ film.getName(), film.getDescription(), film.getReleaseDate(), film.getDuration(), film.getMpa().getId(), film.getRate(), film.getId());
+
+ if (film.getGenres() != null) {
+ jdbcTemplate.update("DELETE FROM Film_genre WHERE film_id=?", film.getId());
+ String sqlQuery2 = "INSERT INTO Film_genre (film_id, genre_id) VALUES(?, ?)";
+ List genres = film.getGenres().stream().distinct().collect(Collectors.toList());
+ for (Genre element:genres) {
+ jdbcTemplate.update(sqlQuery2, film.getId(), element.getId());
+ }
+ }
+ }
+
+ @Override
+ public void deleteFilm(int filmId) {
+
+ }
+
+ @Override
+ public boolean isFilmExists(Film film) {
+ return false;
+ }
+
+ @Override
+ public List getFilms() {
+ List films = jdbcTemplate.query("SELECT * " +
+ "FROM Films AS f " +
+ "INNER JOIN rating AS r ON f.rating_id=r.id", new FilmMapper());
+
+ for (Film film:films) {
+ List filmGenre = jdbcTemplate.query("SELECT genre_id, genre_name " +
+ "FROM film_genre AS fg " +
+ "INNER JOIN genre AS g ON fg.genre_id=g.id " +
+ "WHERE film_id=? ORDER BY genre_id", new GenreMapper(), film.getId());
+ Set s = new HashSet<>(filmGenre);
+ film.setGenres(filmGenre);
+ }
+ return films;
+ }
+
+ public Film getFilmById(int id) {
+ List films = getFilms();
+ for (Film checkFilm : films) {
+ int checkId = checkFilm.getId();
+ if (checkId == id) {
+ return checkFilm;
+ }
+ }
+ throw new FilmNotFoundException("Такого фильма не существует.");
+ }
+
+ public List getAllMpa() {
+ return jdbcTemplate.query("SELECT * FROM rating", new MpaMapper());
+ }
+
+ public Mpa getMpaById(int id) {
+ List mpaList = jdbcTemplate.query("SELECT * FROM rating WHERE id=?", new MpaMapper(), id);
+ if (!mpaList.isEmpty()) {
+ Mpa mpa = mpaList.get(0);
+ return mpa;
+ } else {
+ throw new MpaNotFoundException("Такого mpa не существует");
+ }
+ }
+
+ public List getAllGenres() {
+ return jdbcTemplate.query("SELECT id AS genre_id, genre_name FROM genre", new GenreMapper());
+ }
+
+ public Genre getGenreById(int id) {
+ List genreList = jdbcTemplate.query("SELECT id AS genre_id, genre_name FROM genre WHERE id=?", new GenreMapper(), id);
+ if (!genreList.isEmpty()) {
+ Genre genre = genreList.get(0);
+ return genre;
+ } else {
+ throw new GenreNotFoundException("Такого жанра не существует");
+ }
+ }
+
+ public void addLike(int id, int userId) {
+ List likesList = jdbcTemplate.query("SELECT film_id, user_id FROM likes WHERE film_id=? AND user_id=?", new LikeMapper(), id, userId);
+ Film film = getFilmById(id);
+ if (likesList.isEmpty()) {
+ jdbcTemplate.update("INSERT INTO Likes (film_id, user_id) VALUES(?, ?)", id, userId);
+ film.setRate(film.getRate() + 1);
+ updateFilm(film);
+ }
+ }
+
+ public void deleteLike(int id, int userId) {
+ List likesList = jdbcTemplate.query("SELECT film_id, user_id FROM likes WHERE film_id=? AND user_id=?", new LikeMapper(), id, userId);
+ Film film = getFilmById(id);
+ if (!likesList.isEmpty()) {
+ jdbcTemplate.update("DELETE FROM Likes WHERE film_id=? AND user_id=?", id, userId);
+ film.setRate(film.getRate() - 1);
+ } else {
+ throw new LikeNotFoundException("Лайка у указаного фильма от этого пользователя нет");
+ }
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/FilmMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmMapper.java
new file mode 100644
index 0000000..247e286
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/FilmMapper.java
@@ -0,0 +1,26 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.Mpa;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class FilmMapper implements RowMapper {
+ @Override
+ public Film mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Film film = new Film();
+
+ film.setId(rs.getInt("id"));
+ film.setName(rs.getString("name"));
+ film.setDescription(rs.getString("description"));
+ film.setReleaseDate(rs.getDate("release_date").toLocalDate());
+ film.setDuration(rs.getInt("duration"));
+ Mpa mpa = new Mpa(rs.getInt("rating_id"), rs.getString("rating_name"));
+ film.setMpa(mpa);
+ film.setRate(rs.getInt("rate"));
+
+ return film;
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/GenreMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dao/GenreMapper.java
new file mode 100644
index 0000000..2bf303a
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/GenreMapper.java
@@ -0,0 +1,19 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.yandex.practicum.filmorate.model.Genre;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class GenreMapper implements RowMapper {
+ @Override
+ public Genre mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Genre genre = new Genre();
+
+ genre.setId(rs.getInt("genre_id"));
+ genre.setName(rs.getString("genre_name"));
+ return genre;
+ }
+
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/LikeMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dao/LikeMapper.java
new file mode 100644
index 0000000..ac0510b
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/LikeMapper.java
@@ -0,0 +1,21 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.yandex.practicum.filmorate.model.Like;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class LikeMapper implements RowMapper {
+
+ @Override
+ public Like mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Like like = new Like();
+
+ like.setFilmId(rs.getInt("film_id"));
+ like.setUserId(rs.getInt("user_id"));
+
+ return like;
+ }
+}
+
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/MpaMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dao/MpaMapper.java
new file mode 100644
index 0000000..f70e4d4
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/MpaMapper.java
@@ -0,0 +1,17 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.yandex.practicum.filmorate.model.Mpa;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class MpaMapper implements RowMapper {
+ @Override
+ public Mpa mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Mpa mpa = new Mpa();
+ mpa.setId(rs.getInt("id"));
+ mpa.setName(rs.getString("rating_name"));
+ return mpa;
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/dao/UserDbStorage.java b/src/main/java/ru/yandex/practicum/filmorate/dao/UserDbStorage.java
new file mode 100644
index 0000000..32fae72
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/dao/UserDbStorage.java
@@ -0,0 +1,90 @@
+package ru.yandex.practicum.filmorate.dao;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.jdbc.support.KeyHolder;
+import org.springframework.stereotype.Component;
+import ru.yandex.practicum.filmorate.model.User;
+import ru.yandex.practicum.filmorate.storage.user.UserStorage;
+
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class UserDbStorage implements UserStorage {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ @Autowired
+ public UserDbStorage(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ @Override
+ public void addUser(User user) {
+ String sqlQuery = "INSERT INTO Users (email, login, name, birthday) VALUES(?, ?, ?, ?)";
+ KeyHolder keyHolder = new GeneratedKeyHolder();
+ jdbcTemplate.update(connection -> {
+ PreparedStatement stmt = connection.prepareStatement(sqlQuery, new String[]{"id"});
+ stmt.setString(1, user.getEmail());
+ stmt.setString(2, user.getLogin());
+ stmt.setString(3, user.getName());
+ stmt.setDate(4, Date.valueOf(user.getBirthday()));
+ return stmt;
+ }, keyHolder);
+ user.setId(keyHolder.getKey().intValue());
+ }
+
+ @Override
+ public void updateUser(User user) {
+ jdbcTemplate.update("UPDATE Users SET email=?, login=?, name=?, birthday=? WHERE id=?",
+ user.getEmail(), user.getLogin(), user.getName(), user.getBirthday(), user.getId());
+ }
+
+ @Override
+ public void deleteUser(int userId) {
+ jdbcTemplate.update("DELETE FROM Users WHERE id=?", userId);
+ }
+
+ @Override
+ public List getUsers() {
+ return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));
+ }
+
+ @Override
+ public User getUserById(int id) {
+ return jdbcTemplate.query("SELECT * FROM Users WHERE id=?", new Object[]{id}, new BeanPropertyRowMapper<>(User.class))
+ .stream().findAny().orElse(null);
+ }
+
+ @Override
+ public void addFriend(int id, int friendId) {
+ jdbcTemplate.update("INSERT INTO Friends (user_id, friend_id) VALUES(?, ?)", id, friendId);
+ }
+
+ @Override
+ public void deleteFriend(int id, int friendId) {
+ jdbcTemplate.update("DELETE FROM Friends WHERE user_id=? AND friend_id=?", id, friendId);
+ }
+
+ @Override
+ public List getUserFriends(int id) {
+ return jdbcTemplate.query("SELECT * FROM Users WHERE id IN (SELECT friend_id FROM Friends WHERE user_id=?)", new BeanPropertyRowMapper<>(User.class), id);
+ }
+
+ @Override
+ public List getUserCommonFriends(int id, int otherId) {
+ List friends1 = getUserFriends(id);
+ List friends2 = getUserFriends(otherId);
+ List common = friends1.stream()
+ .distinct()
+ .filter(friends2::contains)
+ .collect(Collectors.toList());
+
+ return common;
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/GenreNotFoundException.java b/src/main/java/ru/yandex/practicum/filmorate/exception/GenreNotFoundException.java
new file mode 100644
index 0000000..1509632
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/exception/GenreNotFoundException.java
@@ -0,0 +1,7 @@
+package ru.yandex.practicum.filmorate.exception;
+
+public class GenreNotFoundException extends RuntimeException {
+ public GenreNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/LikeNotFoundException.java b/src/main/java/ru/yandex/practicum/filmorate/exception/LikeNotFoundException.java
new file mode 100644
index 0000000..996e427
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/exception/LikeNotFoundException.java
@@ -0,0 +1,7 @@
+package ru.yandex.practicum.filmorate.exception;
+
+public class LikeNotFoundException extends RuntimeException {
+ public LikeNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/MpaNotFoundException.java b/src/main/java/ru/yandex/practicum/filmorate/exception/MpaNotFoundException.java
new file mode 100644
index 0000000..b07a83f
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/exception/MpaNotFoundException.java
@@ -0,0 +1,7 @@
+package ru.yandex.practicum.filmorate.exception;
+
+public class MpaNotFoundException extends RuntimeException {
+ public MpaNotFoundException(String message) {
+ super(message);
+ }
+}
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 49f1d14..6f81146 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java
@@ -4,16 +4,21 @@
import lombok.Data;
import java.time.LocalDate;
-import java.util.Set;
+import java.util.List;
@Data
@AllArgsConstructor
public class Film {
- private long id;
- private final String name;
- private final String description;
- private final LocalDate releaseDate;
- private final Integer duration; //продолжительность в минтутах
- private Set likes;
- private long likesSum;
+
+ private int id;
+ private String name;
+ private String description;
+ private LocalDate releaseDate;
+ private Integer duration; //продолжительность в минтутах
+ private Mpa mpa;
+ private List genres;
+ private int rate;
+
+ public Film() {
+ }
}
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..8d02525
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/model/Genre.java
@@ -0,0 +1,47 @@
+package ru.yandex.practicum.filmorate.model;
+
+import java.util.Objects;
+
+public class Genre {
+
+ private int id;
+ private String name;
+
+ public Genre() {
+
+ }
+
+ public Genre(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Genre genre = (Genre) o;
+ return id == genre.id && Objects.equals(name, genre.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Like.java b/src/main/java/ru/yandex/practicum/filmorate/model/Like.java
new file mode 100644
index 0000000..c41efd8
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/model/Like.java
@@ -0,0 +1,32 @@
+package ru.yandex.practicum.filmorate.model;
+
+public class Like {
+
+ private int filmId;
+ private int userId;
+
+ public Like() {
+
+ }
+
+ public Like(int filmId, int userId) {
+ this.filmId = filmId;
+ this.userId = userId;
+ }
+
+ public int getFilmId() {
+ return filmId;
+ }
+
+ public void setFilmId(int filmId) {
+ this.filmId = filmId;
+ }
+
+ public int getUserId() {
+ return userId;
+ }
+
+ public void setUserId(int userId) {
+ this.userId = userId;
+ }
+}
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..b559666
--- /dev/null
+++ b/src/main/java/ru/yandex/practicum/filmorate/model/Mpa.java
@@ -0,0 +1,31 @@
+package ru.yandex.practicum.filmorate.model;
+
+public class Mpa {
+ private int id;
+ private String name;
+
+ public Mpa() {
+
+ }
+
+ public Mpa(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = 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 d6ea269..144e7d3 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/model/User.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java
@@ -4,16 +4,19 @@
import lombok.Data;
import java.time.LocalDate;
-import java.util.Set;
@Data
@AllArgsConstructor
public class User {
- private long id;
+ public User() {
+
+ }
+
+ private int id;
private String email;
private String login;
private String name;
private LocalDate birthday;
- private Set friends;
+
}
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 9f37369..bc5e739 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/service/FilmService.java
@@ -1,47 +1,45 @@
package ru.yandex.practicum.filmorate.service;
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
-import ru.yandex.practicum.filmorate.exception.FilmNotFoundException;
-import ru.yandex.practicum.filmorate.exception.UserNotFoundException;
import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
+import ru.yandex.practicum.filmorate.storage.user.UserStorage;
-import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@Service
-@RequiredArgsConstructor
+@Qualifier("filmDbStorage")
public class FilmService {
- private final FilmStorage inMemoryFilmStorage;
- public void addLike(long filmId, long userId) {
- Film film = inMemoryFilmStorage.getFilms().get(filmId);
- if (!(film.getLikes().contains(userId))) {
- film.getLikes().add(userId);
- film.setLikesSum(film.getLikesSum() + 1);
- }
+ private final FilmStorage filmStorage;
+ private final UserStorage userStorage;
+
+ public FilmService(@Qualifier("filmDbStorage") FilmStorage filmStorage, @Qualifier("userDbStorage") UserStorage userStorage) {
+ this.filmStorage = filmStorage;
+ this.userStorage = userStorage;
+ }
+
+ public void addLike(int filmId, int userId) {
+ Film film = filmStorage.getFilmById(filmId);
+ User user = userStorage.getUserById(userId);
+ filmStorage.addLike(filmId, userId);
}
- public void deleteLike(long filmId, long userId) {
- if (!inMemoryFilmStorage.getFilms().containsKey(filmId)) {
- throw new FilmNotFoundException("Указанного фильма не существует");
- }
- Film film = inMemoryFilmStorage.getFilms().get(filmId);
- if (!(film.getLikes().contains(userId))) {
- throw new UserNotFoundException("Указанного пользователя не существует");
- }
- film.getLikes().remove(userId);
- film.setLikesSum(film.getLikesSum() + 1);
+ public void deleteLike(int filmId, int userId) {
+ Film film = filmStorage.getFilmById(filmId);
+ User user = userStorage.getUserById(userId);
+ filmStorage.deleteLike(filmId, userId);
}
public List getTop(int count) {
- List films = new ArrayList<>(inMemoryFilmStorage.getFilms().values());
+ List films = filmStorage.getFilms();
return films.stream()
- .sorted(Comparator.comparing(Film::getLikesSum).reversed())
+ .sorted(Comparator.comparing(Film::getRate).reversed())
.limit(count)
.collect(Collectors.toList());
}
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 b063b96..f359d07 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java
@@ -1,62 +1,36 @@
package ru.yandex.practicum.filmorate.service;
-import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
-import ru.yandex.practicum.filmorate.exception.UserNotFoundException;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.storage.user.UserStorage;
-import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
@Service
-@RequiredArgsConstructor
+@Qualifier("userDbStorage")
public class UserService {
- private final UserStorage inMemoryUserStorage;
+ private final UserStorage userStorage;
- public void addFriend(long userId1, long userId2) {
- if (!(inMemoryUserStorage.getUsers().containsKey(userId1)) || !(inMemoryUserStorage.getUsers().containsKey(userId2))) {
- throw new UserNotFoundException("Указанный пользователь не найден");
- }
- inMemoryUserStorage.getUsers().get(userId1).getFriends().add(userId2);
- inMemoryUserStorage.getUsers().get(userId2).getFriends().add(userId1);
+ public UserService(@Qualifier("userDbStorage") UserStorage userStorage) {
+ this.userStorage = userStorage;
}
- public void deleteFriend(long userId1, long userId2) {
- if (!(inMemoryUserStorage.getUsers().containsKey(userId1)) || !(inMemoryUserStorage.getUsers().containsKey(userId2))) {
- throw new UserNotFoundException("Указанный пользователь не найден");
- }
- inMemoryUserStorage.getUsers().get(userId1).getFriends().remove(userId2);
- inMemoryUserStorage.getUsers().get(userId2).getFriends().remove(userId1);
+ public void addFriend(int id, int friendId) {
+ userStorage.addFriend(id, friendId);
}
- public List getUserFriends(long userId) {
- if (!(inMemoryUserStorage.getUsers().containsKey(userId))) {
- throw new UserNotFoundException("Указанный пользователь не найден");
- }
- Set userFriends = new HashSet<>(inMemoryUserStorage.getUsers().get(userId).getFriends());
- List friends = new ArrayList<>();
- for (long id : userFriends) {
- friends.add(inMemoryUserStorage.getUsers().get(id));
- }
- return friends;
+ public void deleteFriend(int id, int friendId) {
+ userStorage.deleteFriend(id, friendId);
}
- public List commonFriends(long userId1, long userId2) {
- if (!(inMemoryUserStorage.getUsers().containsKey(userId1)) || !(inMemoryUserStorage.getUsers().containsKey(userId2))) {
- throw new UserNotFoundException("Указанный пользователь не найден");
- }
- Set user1Friends = new HashSet<>(inMemoryUserStorage.getUsers().get(userId1).getFriends());
- Set user2Friends = inMemoryUserStorage.getUsers().get(userId2).getFriends();
- user1Friends.retainAll(user2Friends);
-
- List commonFriends = new ArrayList<>();
- for (long userId : user1Friends) {
- commonFriends.add(inMemoryUserStorage.getUsers().get(userId));
- }
- return commonFriends;
+ public List getUserFriends(int id) {
+ return userStorage.getUserFriends(id);
+ }
+
+ public List commonFriends(int id, int otherId) {
+
+ return userStorage.getUserCommonFriends(id, otherId);
}
}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java
index 455b1ca..dc6d0d2 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/FilmStorage.java
@@ -1,8 +1,10 @@
package ru.yandex.practicum.filmorate.storage.film;
import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.Genre;
+import ru.yandex.practicum.filmorate.model.Mpa;
-import java.util.Map;
+import java.util.List;
public interface FilmStorage {
@@ -14,5 +16,19 @@ public interface FilmStorage {
boolean isFilmExists(Film film);
- Map getFilms();
+ List getFilms();
+
+ Film getFilmById(int id);
+
+ List getAllMpa();
+
+ Mpa getMpaById(int id);
+
+ List getAllGenres();
+
+ Genre getGenreById(int id);
+
+ void addLike(int id, int userId);
+
+ void deleteLike(int id, int userId);
}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java
index 3fb9c27..76dd78b 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/storage/film/InMemoryFilmStorage.java
@@ -2,13 +2,15 @@
import org.springframework.stereotype.Component;
import ru.yandex.practicum.filmorate.model.Film;
+import ru.yandex.practicum.filmorate.model.Genre;
+import ru.yandex.practicum.filmorate.model.Mpa;
import java.util.*;
@Component
public class InMemoryFilmStorage implements FilmStorage {
- private final Map films = new HashMap<>();
+ private final List films = new ArrayList<>();
private int filmId = 0;
private int generateNewId() {
@@ -16,25 +18,57 @@ private int generateNewId() {
}
public void addFilm(Film film) {
- film.setId(generateNewId());
- film.setLikes(new HashSet<>());
- films.put(film.getId(), film);
+
}
public void updateFilm(Film film) {
- film.setLikes(new HashSet<>());
- films.put(film.getId(), film);
+
}
public void deleteFilm(int filmId) {
films.remove(filmId);
}
- public Map getFilms() {
+ public List getFilms() {
return films;
}
+ @Override
+ public Film getFilmById(int id) {
+ return null;
+ }
+
+ @Override
+ public List getAllMpa() {
+ return null;
+ }
+
+ @Override
+ public Mpa getMpaById(int id) {
+ return null;
+ }
+
+ @Override
+ public List getAllGenres() {
+ return null;
+ }
+
+ @Override
+ public Genre getGenreById(int id) {
+ return null;
+ }
+
+ @Override
+ public void addLike(int id, int userId) {
+
+ }
+
+ @Override
+ public void deleteLike(int id, int userId) {
+
+ }
+
public boolean isFilmExists(Film film) {
- return films.containsKey(film.getId());
+ return films.contains(film);
}
}
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 3f1ec8a..193911b 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
@@ -1,16 +1,15 @@
package ru.yandex.practicum.filmorate.storage.user;
import org.springframework.stereotype.Component;
+import ru.yandex.practicum.filmorate.exception.UserNotFoundException;
import ru.yandex.practicum.filmorate.model.User;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
+import java.util.*;
@Component
public class InMemoryUserStorage implements UserStorage {
- private final Map users = new HashMap<>();
+ private final List users = new ArrayList<>();
private int userId = 0;
private int generateNewId() {
@@ -18,25 +17,52 @@ private int generateNewId() {
}
public void addUser(User user) {
- user.setId(generateNewId());
- user.setFriends(new HashSet<>());
- users.put(user.getId(), user);
+
}
public void updateUser(User user) {
- user.setFriends(new HashSet<>());
- users.put(user.getId(), user);
+
}
public void deleteUser(int userId) {
users.remove(userId);
}
- public Map getUsers() {
+ public List getUsers() {
return users;
}
public boolean isUserExists(User user) {
- return users.containsKey(user.getId());
+ return users.contains(user);
+ }
+
+ public User getUserById(int id) {
+ List users = getUsers();
+ Map usersAndId = new HashMap<>();
+ for (User user: users) {
+ usersAndId.put(user.getId(), user);
+ }
+ if (usersAndId.containsKey(id)) {
+ return usersAndId.get(id);
+ } else {
+ throw new UserNotFoundException("Такого пользователя не существует.");
+ }
+ }
+
+ public void addFriend(int id, int friendId) {
+
+ }
+
+ public void deleteFriend(int id, int friendId) {
+
+ }
+
+ public List getUserFriends(int id) {
+ return null;
+ }
+
+ @Override
+ public List getUserCommonFriends(int id, int otherId) {
+ return null;
}
}
diff --git a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java
index 2aaa015..2260e78 100644
--- a/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java
+++ b/src/main/java/ru/yandex/practicum/filmorate/storage/user/UserStorage.java
@@ -2,7 +2,7 @@
import ru.yandex.practicum.filmorate.model.User;
-import java.util.Map;
+import java.util.List;
public interface UserStorage {
@@ -12,5 +12,15 @@ public interface UserStorage {
void deleteUser(int userId);
- Map getUsers();
+ List getUsers();
+
+ User getUserById(int id);
+
+ void addFriend(int id, int friendId);
+
+ void deleteFriend(int id, int friendId);
+
+ List getUserFriends(int id);
+
+ List getUserCommonFriends(int id, int otherId);
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 8b13789..f0e14c4 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,5 @@
-
+spring.sql.init.mode=always
+spring.datasource.url=jdbc:h2:file:./db/filmorate
+spring.datasource.driverClassName=org.h2.Driver
+spring.datasource.username=sa
+spring.datasource.password=password
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
new file mode 100644
index 0000000..fcff18f
--- /dev/null
+++ b/src/main/resources/schema.sql
@@ -0,0 +1,73 @@
+DROP TABLE users IF EXISTS cascade;
+DROP TABLE friends IF EXISTS cascade;
+DROP TABLE films IF EXISTS cascade;
+DROP TABLE rating IF EXISTS cascade;
+DROP TABLE likes IF EXISTS cascade;
+DROP TABLE film_genre IF EXISTS cascade;
+DROP TABLE genre IF EXISTS cascade;
+
+CREATE TABLE IF NOT EXISTS users (
+ id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+ email VARCHAR(64) NOT NULL,
+ login VARCHAR(64) NOT NULL,
+ name VARCHAR(64) NOT NULL,
+ birthday DATE
+);
+
+CREATE TABLE IF NOT EXISTS friends (
+ user_id INTEGER,
+ friend_id INTEGER,
+ status BOOLEAN,
+ FOREIGN KEY (user_id) REFERENCES users(id),
+ FOREIGN KEY (friend_id) REFERENCES users(id)
+);
+
+CREATE TABLE IF NOT EXISTS rating (
+ id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+ rating_name VARCHAR(64)
+);
+
+CREATE TABLE IF NOT EXISTS films (
+ id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+ name VARCHAR(64) NOT NULL,
+ description VARCHAR(200) NOT NULL,
+ release_date DATE NOT NULL,
+ duration INTEGER,
+ rating_id INTEGER,
+ rate INTEGER,
+ FOREIGN KEY (rating_id) REFERENCES rating(id)
+);
+
+CREATE TABLE IF NOT EXISTS likes (
+ film_id INTEGER,
+ user_id INTEGER,
+ FOREIGN KEY (user_id) REFERENCES users(id),
+ FOREIGN KEY (film_id) REFERENCES films(id)
+);
+
+CREATE TABLE IF NOT EXISTS genre (
+ id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+ genre_name VARCHAR(64)
+);
+
+CREATE TABLE IF NOT EXISTS film_genre (
+ film_id INTEGER,
+ genre_id INTEGER,
+ FOREIGN KEY (film_id) REFERENCES films(id),
+ FOREIGN KEY (genre_id) REFERENCES genre(id)
+);
+
+INSERT INTO rating (id, rating_name) VALUES (1, 'G');
+INSERT INTO rating (id, rating_name) VALUES (2, 'PG');
+INSERT INTO rating (id, rating_name) VALUES (3, 'PG-13');
+INSERT INTO rating (id, rating_name) VALUES (4, 'R');
+INSERT INTO rating (id, rating_name) VALUES (5, 'NC-17');
+
+INSERT INTO genre (id, genre_name) VALUES (1, 'Комедия');
+INSERT INTO genre (id, genre_name) VALUES (2, 'Драма');
+INSERT INTO genre (id, genre_name) VALUES (3, 'Мультфильм');
+INSERT INTO genre (id, genre_name) VALUES (4, 'Триллер');
+INSERT INTO genre (id, genre_name) VALUES (5, 'Документальный');
+INSERT INTO genre (id, genre_name) VALUES (6, 'Боевик');
+
+
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 07850c5..0000000
--- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package ru.yandex.practicum.filmorate;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-import ru.yandex.practicum.filmorate.exception.ValidationException;
-import ru.yandex.practicum.filmorate.model.Film;
-import ru.yandex.practicum.filmorate.model.User;
-import ru.yandex.practicum.filmorate.validators.FilmValidator;
-import ru.yandex.practicum.filmorate.validators.UserValidator;
-
-import java.time.LocalDate;
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-@SpringBootTest
-class FilmorateApplicationTests {
- Set friendSet = new HashSet<>();
- Set likesSet = new HashSet<>();
- User userBlankEmail = new User(1,"", "login", "name", LocalDate.parse("1990-01-01"), friendSet);
- User userWrongEmail = new User(1,"email", "login", "name", LocalDate.parse("1990-01-01"), friendSet);
- User userBlankLogin = new User(1,"email@gmail.com", "", "name", LocalDate.parse("1990-01-01"), friendSet);
- User userSpaceLogin = new User(1,"email@gmail.com", "login login", "name", LocalDate.parse("1990-01-01"), friendSet);
- User userBlankName = new User(1,"email@gmail.com", "login", "", LocalDate.parse("1990-01-01"), friendSet);
- User userFutureDate = new User(1,"email@gmail.com", "login", "name", LocalDate.parse("2100-01-01"), friendSet);
-
- Film filmBlankName = new Film(1, "", "description", LocalDate.parse("1990-01-01"), 90, likesSet, 0);
- Film filmMaxLength = new Film(1, "name", "Lorem ipsum dolor sit amet, consectetuer adipiscing " +
- "elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi " +
- "enim ad minim veniam, quis nostrud exerci tation ull", LocalDate.parse("1990-01-01"), 90, likesSet, 0);
- Film filmReleaseDate = new Film(1, "name", "description", LocalDate.parse("1800-01-01"), 90, likesSet, 0);
- Film filmDuration = new Film(1, "name", "description", LocalDate.parse("1990-01-01"), -90, likesSet, 0);
-
- @Test
- void userValidationTest() {
- assertThrows(ValidationException.class, () -> UserValidator.validate(userBlankEmail));
- assertThrows(ValidationException.class, () -> UserValidator.validate(userWrongEmail));
- assertThrows(ValidationException.class, () -> UserValidator.validate(userBlankLogin));
- assertThrows(ValidationException.class, () -> UserValidator.validate(userSpaceLogin));
- UserValidator.validate(userBlankName);
- assertEquals("login", userBlankName.getName());
- assertThrows(ValidationException.class, () -> UserValidator.validate(userFutureDate));
- }
-
- @Test
- void filmValidationTest() {
- assertThrows(ValidationException.class, () -> FilmValidator.validate(filmBlankName));
- assertThrows(ValidationException.class, () -> FilmValidator.validate(filmMaxLength));
- assertThrows(ValidationException.class, () -> FilmValidator.validate(filmReleaseDate));
- assertThrows(ValidationException.class, () -> FilmValidator.validate(filmDuration));
- }
-
-}
diff --git a/src/test/java/ru/yandex/practicum/filmorate/UserDbStorageTest.java b/src/test/java/ru/yandex/practicum/filmorate/UserDbStorageTest.java
new file mode 100644
index 0000000..cc601b7
--- /dev/null
+++ b/src/test/java/ru/yandex/practicum/filmorate/UserDbStorageTest.java
@@ -0,0 +1,34 @@
+package ru.yandex.practicum.filmorate;
+
+import lombok.RequiredArgsConstructor;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+import ru.yandex.practicum.filmorate.dao.UserDbStorage;
+import ru.yandex.practicum.filmorate.model.User;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.time.LocalDate;
+
+@JdbcTest // указываем, о необходимости подготовить бины для работы с БД
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+class UserDbStorageTest {
+ private final JdbcTemplate jdbcTemplate;
+
+ @Test
+ public void testFindUserById() {
+ // Подготавливаем данные для теста
+ User newUser = new User(1, "user@email.ru", "vanya123", "Ivan Petrov", LocalDate.of(1990, 1, 1));
+ UserDbStorage userStorage = new UserDbStorage(jdbcTemplate);
+ userStorage.addUser(newUser);
+
+ // вызываем тестируемый метод
+ User savedUser = userStorage.getUserById(1);
+
+ assertNotNull(savedUser);
+ assertEquals(savedUser, newUser);
+ }
+}