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); + } +}