GGk77 / java-filmorate-groupProject

πŸ“½πŸ—ƒ REST-service of social network for discussion and selection of movies

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Filmorate - сСрвис ΠΏΠΎ ΠΎΡ†Π΅Π½ΠΊΠ΅ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ:

  • создания/обновлСния/удалСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • создания/обновлСния/удалСния Ρ„ΠΈΠ»ΡŒΠΌΠ°
  • создания/обновлСния/удалСния рСТиссСра
  • получСния Ρ„ΠΈΠ»ΡŒΠΌΠ° ΠΏΠΎ ID
  • получСния списка всСх созданных Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²
  • получСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ ID
  • получСния списка всСх созданных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
  • добавлСнию Ρ„ΠΈΠ»ΡŒΠΌΡƒ Π»Π°ΠΉΠΊΠΎΠ² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • добавлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π² Π΄Ρ€ΡƒΠ·ΡŒΡ
  • получСния списка ΠΎΠ±Ρ‰ΠΈΡ… Π΄Ρ€ΡƒΠ·Π΅ΠΉ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ
  • получСния списка ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² Π½Π° основС ΠΎΡ†Π΅Π½ΠΎΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • добавлСния ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² ΠΊ Ρ„ΠΈΠ»ΡŒΠΌΡƒ
  • поиска Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову ΠΈΠ»ΠΈ ΠΏΠΎ части слова
  • ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π»Π΅Π½Ρ‚Ρƒ событий
  • получСния Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΏΠΎ Ρ„ΠΈΠ»ΡŒΠΌΡƒ
  • получСния самых популярных Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΏΠΎ Π³ΠΎΠ΄Π°ΠΌ ΠΈ ΠΏΠΎ ΠΆΠ°Π½Ρ€Π°ΠΌ

Π’ состав ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ„ΠΈΠ»ΡŒΠΌΠ° Π²Ρ…ΠΎΠ΄ΠΈΡ‚:

  1. НазваниС Ρ„ΠΈΠ»ΡŒΠΌΠ°
  2. ОписаниС Ρ„ΠΈΠ»ΡŒΠΌΠ°
  3. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΠΌΠ°
  4. Π”Π°Ρ‚Ρƒ Π²Ρ‹Ρ…ΠΎΠ΄Π° Ρ„ΠΈΠ»ΡŒΠΌΠ°
  5. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π»Π°ΠΉΠΊΠΎΠ² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
  6. Π–Π°Π½Ρ€ Ρ„ΠΈΠ»ΡŒΠΌΠ°
  7. Возрастной Ρ†Π΅Π½Π· Ρ„ΠΈΠ»ΡŒΠΌΠ°

Π’ состав ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Ρ…ΠΎΠ΄ΠΈΡ‚:

  1. Π›ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  2. Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  3. Email ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  4. Π”Π°Ρ‚Ρƒ роТдСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  5. Бписок Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

ВсС Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² Π‘Π”.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана Π½Π° Java с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Spring, Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… H2.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°: Поиск ΠΏΠΎ Ρ„ΠΈΠ»ΡŒΠΌΠ° ΠΏΠΎ названию ΠΈ рСТиссСру

    public List<Film> searchFilms(String lowerQuery, String params) {
        List<Film> filmList = new ArrayList<>();
        String sql;
        if (params.contains("title") && params.contains("director")) {
        sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
        "f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
        "from FILMS f " +
        "join MPA m on m.MPA_ID = f.MPA_ID " +
        "left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
        "left join DIRECTORS d on fd.DIRECTOR_ID = d.DIRECTOR_ID " +
        "left join (select FILM_ID, count(USER_LIKED_ID) evaluate " +
        "from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
        "where (lower(d.DIRECTOR_NAME) like '%' || lower(?) || '%' or lower(f.NAME) like '%' || lower(?) || '%') " +
        "order by e.evaluate desc ";
        filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery, lowerQuery);
        }
        else if (params.equals("director")) {
        sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
        "f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
        "from FILMS f " +
        "left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
        "left join DIRECTORS d on fd.DIRECTOR_ID = d.DIRECTOR_ID " +
        "join MPA m on m.MPA_ID = f.MPA_ID " +
        "left join (select FILM_ID, count(USER_LIKED_ID) evaluate " +
        "from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
        "where lower(d.DIRECTOR_NAME) like '%' || lower(?) || '%' " +
        "order by e.evaluate desc";
        filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery);
        } else if (params.equals("title")) {
        sql = "select f.FILM_ID, f.NAME, f.DESCRIPTION, " +
        "f.RELEASE_DATE, f.DURATION, f.MPA_ID, m.MPA_NAME " +
        "from FILMS f " +
        "join MPA m on m.MPA_ID = f.MPA_ID " +
        "left join FILM_DIRECTOR fd on fd.FILM_ID = f.FILM_ID " +
        "left join (select FILM_ID, count(user_liked_id) evaluate " +
        "from LIKES group by FILM_ID) e on f.FILM_ID = e.FILM_ID " +
        "where lower(f.NAME) like '%' || lower(?) || '%' " +
        "order by e.evaluate desc";
        filmList = jdbcTemplate.query(sql,((rs, rowNum) -> makeFilm(rs)), lowerQuery);
        }
        return filmList;
        }

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² Ρƒ Ρ„ΠΈΠ»ΡŒΠΌΠ°

 public Review createReview(Review review) {
        String sql = "insert into REVIEWS (CONTENT, IS_POSITIVE, USER_ID, FILM_ID, USEFUL) values (?, ?, ?, ?, ?)";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(connection -> {
            PreparedStatement stmt = connection.prepareStatement(sql, new String[]{"REVIEW_ID"});
            stmt.setString(1, review.getContent());
            stmt.setBoolean(2, review.getIsPositive());
            stmt.setInt(3, review.getUserId());
            stmt.setInt(4, review.getFilmId());
            stmt.setInt(5, review.getUseful());
            return stmt;
        }, keyHolder);
        review.setReviewId(Objects.requireNonNull(keyHolder.getKey()).intValue());
        log.debug("Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ ΠΎΡ‚Π·Ρ‹Π² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ {} ΠΎ Ρ„ΠΈΠ»ΡŒΠΌΠ΅ {}", review.getUserId(), review.getFilmId());
        return review;
    }

    public Review updateReview(Review review) {
        String sql = "update REVIEWS set CONTENT = ?, IS_POSITIVE = ?, USEFUL = ?" +
                " where REVIEW_ID = ?";
        jdbcTemplate.update(sql,
                review.getContent(),
                review.getIsPositive(),
                review.getUseful(),
                review.getReviewId());
        log.debug("ОбновлСн ΠΎΡ‚Π·Ρ‹Π² {} Ρƒ Ρ„ΠΈΠ»ΡŒΠΌΠ° {} ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ {}.", review.getReviewId(), review.getFilmId(),
                review.getUserId());
        return review;
    }

    public void deleteReview(int id) {
        String sql = "delete from REVIEWS where REVIEW_ID = ?";
        jdbcTemplate.update(sql, id);
        log.debug("Π£Π΄Π°Π»Π΅Π½ ΠΎΡ‚Π·Ρ‹Π² {}.", id);
    }

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ рСТиссСра Ρƒ Ρ„ΠΈΠ»ΡŒΠΌΠ°

    public List<Director> findAll() {
        String sql = "select DIRECTORS.* from DIRECTORS";
        return jdbcTemplate.query(sql, ((rs, rowNum) -> this.createDirector(rs)));
    }

    public Director addDirector(Director director) {
        String sql = "insert into DIRECTORS (DIRECTOR_NAME) values (?)";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(connection -> {
            PreparedStatement stmt = connection.prepareStatement(sql, new String[]{"DIRECTOR_ID"});
            stmt.setString(1, director.getName());
            return stmt;
        }, keyHolder);
        director.setId(keyHolder.getKey().intValue());
        log.debug("Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ рСТиссСр {}", director.getName());
        return director;
    }

    public void updateDirector(Director director) {
        String sql = "update DIRECTORS set DIRECTOR_ID = ?,DIRECTOR_NAME = ? where DIRECTOR_ID = ?";
        jdbcTemplate.update(sql,
                director.getId(),
                director.getName(),
                director.getId());
    }

    public void deleteDirector(Integer Id) {
        String sql = "delete from DIRECTORS where DIRECTOR_ID=?";
        int count = jdbcTemplate.update(sql, Id);
        if (count == 0) throw new ServerException(String.format("РСТиссСр с ID=%d Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½", Id));
    }

Запрос самых популярных Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ

    public List<Film> getMostPopularFilmsByYear(int year, int limit) {
        String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
                "left join LIKES L ON F.FILM_ID = L.FILM_ID " +
                "where YEAR(F.RELEASE_DATE) = ? " +
                "group by F.FILM_ID, L.USER_LIKED_ID " +
                "order by COUNT(L.USER_LIKED_ID) desc limit ?";
        return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), year, limit);
    }

    @Override
    public List<Film> getMostPopularFilmsByGenre(int genreId, int limit) {
        String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
                "left join LIKES L ON F.FILM_ID = L.FILM_ID " +
                "left join FILM_GENRE FG ON F.FILM_ID = FG.FILM_ID " +
                "where FG.GENRE_ID = ? " +
                "group by F.FILM_ID, L.USER_LIKED_ID, FG.GENRE_ID " +
                "order by COUNT(L.USER_LIKED_ID) desc limit ?";
        return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), genreId, limit);
    }

    @Override
    public List<Film> getMostPopularFilmsByGenreAndYear(int genreId, int year, int limit) {
        String sql = "select * from FILMS F join MPA M on F.MPA_ID = M.MPA_ID " +
                "left join LIKES L ON F.FILM_ID = L.FILM_ID " +
                "left join FILM_GENRE FG ON F.FILM_ID = FG.FILM_ID " +
                "where FG.GENRE_ID = ? AND YEAR(F.RELEASE_DATE) = ? " +
                "group by F.FILM_ID, L.USER_LIKED_ID " +
                "order by COUNT(L.USER_LIKED_ID) desc limit ?";
        return jdbcTemplate.query(sql, (rs, rowNum) -> makeFilm(rs), genreId, year, limit);
    }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π»Π°ΠΉΠΊΠΎΠ² Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΠΌΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ соритровка Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ² ΠΏΠΎ ΠΊΠΎΠ»-Π²Ρƒ Π»Π°ΠΉΠΊΠΎΠ²

    private Optional<List<Integer>> getLikesByFilm(int filmId) {
        //Ѐункция получСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ Ρ„ΠΈΠ»ΡŒΠΌΠ° (Ρ‚.Π΅. Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ)
        Function<Integer, List<Integer>> filterFuncByFilmId = (filmIdentifier) -> {
            String sqlSelectLikesByFilmId = "SELECT user_liked_id FROM likes WHERE film_id = ?";
            List<Integer> usersId = likeStorage.getJdbcTemplate()
                    .query(sqlSelectLikesByFilmId, (rs, rowNum) -> rs.getInt("user_liked_id"), filmIdentifier);
            return usersId;
        };
        //ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ Π»Π°ΠΉΠΊΠΎΠ², ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ
        List<Integer> likes = likeStorage.sortingOrFiltering(filterFuncByFilmId, filmId);
        return Optional.of(likes);
    }
    
    private List<Film> getFilmsOrderedByNumberOfLikes(HashMap<Integer, Integer> filmsIdWithNumberOfLikes) {
        //Ѐункция сортировки
        Function<HashMap<Integer, Integer>, List<Film>> sortingFunction = (filmIdNumberLike) -> {
            return filmIdNumberLike.entrySet().stream()
                    .sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
                    .map(Map.Entry::getKey)
                    .map(filmId -> filmStorage.getFilmByID(filmId).get())
                    .collect(Collectors.toList());
        };

About

πŸ“½πŸ—ƒ REST-service of social network for discussion and selection of movies


Languages

Language:Java 100.0%