Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
cc340b4
feat: добавлена возможность удаления фильмов и пользователей
alex9379992 Feb 15, 2023
18a27c4
add-recommendations
kasisaki Feb 14, 2023
84a304b
add-recommendations
kasisaki Feb 15, 2023
ba12d81
get-add-common-films
kasisaki Feb 14, 2023
4ffb8a3
get-add-common-films
kasisaki Feb 14, 2023
a3dbd23
get-add-common-films
kasisaki Feb 14, 2023
f8f02db
get-add-common-films
kasisaki Feb 14, 2023
4963073
Merge pull request #7 from Ilusha92/add-remove-endpoint
alex9379992 Feb 16, 2023
d559d60
feat: реализовать ТЗ
Feb 17, 2023
aed5f21
feat & fix: исправить согласно тестам
Feb 17, 2023
760e987
Add director (#9)
AleksandraBoycova Feb 18, 2023
2bf798e
Merge remote-tracking branch 'origin/develop' into develop
Feb 20, 2023
ce692e9
fix: исправить замечания по контроллеру и сервису
Feb 21, 2023
374aa4c
Merge pull request #11 from Ilusha92/add-reviews
igorshmidt99 Feb 21, 2023
83aefe0
fead: добавлены Events
alex9379992 Feb 21, 2023
25f8e00
add-feed
kasisaki Feb 21, 2023
534f5a3
add-feed
kasisaki Feb 21, 2023
c203e93
Merge pull request #12 from Ilusha92/add-feed
igorshmidt99 Feb 22, 2023
69fcb7b
add search by title and director
Feb 22, 2023
0fa59a0
декомпозирован код метода search
Feb 22, 2023
71f4046
Merge pull request #13 from Ilusha92/add-search
igorshmidt99 Feb 22, 2023
d609e78
restructed schema
Feb 22, 2023
8a63d16
Merge pull request #14 from Ilusha92/add-search
Ilusha92 Feb 22, 2023
b41ed34
fix: перенести взаимодействия review & event dao в ReviewService
Feb 23, 2023
22af136
добавлены тесты
alex9379992 Feb 23, 2023
3cddda6
refactor develop
kasisaki Feb 24, 2023
7e20e67
fix: генерация ключей
Feb 24, 2023
b41ccdb
refactor: удаления методов генерации ключей
Feb 24, 2023
8492176
Merge branch 'develop-mutaev' into bug-fix-reviews
Feb 24, 2023
f3473d2
Update README.md
Feb 24, 2023
f995940
Merge pull request #16 from Ilusha92/develop-nazyan
Ilusha92 Feb 24, 2023
0ca95ff
refactor: устранить запросы внутри цикла
Feb 24, 2023
0f76289
Merge branch 'develop-nazyan' into bug-fix-reviews
Feb 24, 2023
77d0c20
Merge branch 'develop' into bug-fix-reviews
Feb 24, 2023
a4c914d
Merge pull request #20 from Ilusha92/develop-shmidt
Ilusha92 Feb 24, 2023
60dbe89
Осталось разобраться с FilmMapper
Feb 24, 2023
46cdbc2
refactor develop
kasisaki Feb 24, 2023
a040e0e
Merge pull request #21 from Ilusha92/develop-refactor
Ilusha92 Feb 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,25 @@
# java-filmorate
Template repository for Filmorate project.
# Filmorate
![](https://img.shields.io/badge/Language-Java-orange)

![](https://img.shields.io/badge/Framework-Spring_boot-green)

![](https://img.shields.io/badge/Build_automation_tool-Maven-blue)

![](https://img.shields.io/badge/Database-H2Database-blue)

#### Приложение имеет:

1. Full Rest API для работы с пользователями, фильмами, жанрами и режисёрами фильмов.
2. Для хранения данных задействована H2DB.
3. Входные данные проходят валидацию.
4. Реализовано логирование на Slf4j.
5. Приложение имеет стандартные функциональности соцсети: Лента событий, добавление отзывов о фильме, добавление друзей и т.д.
6. Дополнительные характеристики фильма: рейтинг на основе кол-ва лайков от пользователей, возрастные рекомендации для просмотра, жанр фильма.
7. У фильмов реализовано свойство - режиссёр фильма с функциональностью:
- вывод всех фильмов режиссёра, отсортированных по количеству лайков.
- вывод всех фильмов режиссёра, отсортированных по годам.
8. Основные свойства пользователя: e-mail, логин, имя, день рождения.
9. Дополнительные связи пользователя: друзья, отзывы и лайки фильмам.
10. Есть возможность получения списка фильмов по определнным фильтрам и заданной сортировке


Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Director;
import ru.yandex.practicum.filmorate.service.DirectorService;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping ("directors")
@Slf4j
public class DirectorController {
private final DirectorService directorService;

@GetMapping
public ResponseEntity<List<Director>> getAll () {
log.info("Получен запрос на список директоров");
List<Director> directorList = directorService.getAll();
return new ResponseEntity<>(directorList, HttpStatus.OK);
}

@GetMapping ("{id}")
public ResponseEntity<Director> getById (@PathVariable Integer id) {
log.info("Получен запрос на директора по id " + id);
Director director = directorService.getById(id);
return new ResponseEntity<>(director, HttpStatus.OK);
}



@PostMapping
public ResponseEntity<Director> create (@RequestBody Director director) {
log.info("Получен запрос на создание директора");
Director createdDirector = directorService.create(director);
return new ResponseEntity<>(createdDirector, HttpStatus.OK);
}


@PutMapping
public ResponseEntity<Director> update (@RequestBody Director director) {
log.info("Получен запрос на обновление директора с id " + director.getId());
Director updatedDirector = directorService.update(director);
return new ResponseEntity<>(updatedDirector, HttpStatus.OK);
}

@DeleteMapping ("{id}")
public ResponseEntity<Director> delete (@PathVariable Integer id) {
log.info("Получен запрос на удаление директора с id " + id);
Director director = directorService.delete(id);
return new ResponseEntity<>(director, HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
import ru.yandex.practicum.filmorate.service.FilmService;

import javax.validation.Valid;
import java.util.*;
import javax.validation.constraints.NotBlank;
import java.util.Collection;
import java.util.List;

@Slf4j
@RestController
Expand All @@ -18,48 +20,71 @@ public class FilmController {

private final FilmService filmService;

@GetMapping("/common")
public List<Film> getCommonFilms(@RequestParam("userId") int userId, @RequestParam("friendId") int friendId) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просил добавить логирование, ладно….

return filmService.getCommonFilms(userId, friendId);
}

@GetMapping
public Collection<Film> getAllFilms() {
return filmService.getAllFilms();
}

@GetMapping("/{id}")
public Film getFilm(@PathVariable int id) {
log.info("Get Film {}", id);
return filmService.getFilmById(id);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Film createFilm(@Valid @RequestBody Film film) {
log.info("Creating Film " + film);
log.info("Creating Film {}", film.getName());
return filmService.createFilm(film);
}

@PutMapping
public Film updateFilm(@Valid @RequestBody Film film) {
log.info("Updating Film " + film);
log.info("Updating Film {}", film.getName());
return filmService.updateFilm(film);
}

@DeleteMapping("/{id}")
public void deleteFilm(@PathVariable int id) {
log.info("Deleting Film " + id);
log.info("Deleting Film {}", id);
filmService.deleteFilmById(id);
}

@GetMapping("/popular")
public List<Film> getPopularFilms(@RequestParam(defaultValue = "10") int count) {
log.info("Получен запрос на список популярных фильмов");
return filmService.getPopularFilms(count);
}

@PutMapping("/{id}/like/{userId}")
public Film likeFilm(@PathVariable int id, @PathVariable int userId) {
log.info("Получен запрос на добавление лайка фильму id " + id + " юзером " + userId);
return filmService.likeFilm(id, userId);
}

@DeleteMapping("/{id}/like/{userId}")
public Film deleteLikeFromFilm(@PathVariable int id, @PathVariable int userId) {
log.info("Получен запрос на удаление лайка фильму id " + id + " юзером " + userId);
return filmService.deleteLikeFromFilm(id, userId);
}

@GetMapping ("director/{directorId}")
public List<Film> getFilmsByDirectorId (@PathVariable Integer directorId,
@RequestParam (value = "sortBy")String param) {
log.info("Получен запрос на получение");
return filmService.getFilmsSortedByLikesOrYear(directorId, param);
}

@GetMapping("/search")
public List<Film> searchFilms(@RequestParam @NotBlank String query,
@RequestParam @NotBlank List<String> by) {
log.info("Получен запрос на поиск фильмов");
return filmService.searchFilms(query, by);
}
}

Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.yandex.practicum.filmorate.model.Genre;
import ru.yandex.practicum.filmorate.service.FilmService;
import ru.yandex.practicum.filmorate.service.GenreService;

import java.util.List;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/genres")
public class GenreController {
private final FilmService filmService;

public GenreController(FilmService filmService) {
this.filmService = filmService;
}
private final GenreService genreService;

@GetMapping
public List<Genre> getAllGenres(){
return filmService.getAllGenres();
log.info("Получен запрос на получение списка жанров");
return genreService.getAllGenres();
}

@GetMapping("/{id}")
public Genre getGenreById(@PathVariable("id") int id){
return filmService.getGenreById(id);
log.info("Получен запрос на получение жанра по id " + id);
return genreService.getGenreById(id);
}
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.yandex.practicum.filmorate.model.Mpa;
import ru.yandex.practicum.filmorate.service.FilmService;
import ru.yandex.practicum.filmorate.service.MpaService;

import java.util.List;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/mpa")
public class MpaController {
private final FilmService filmService;

public MpaController(FilmService filmService) {
this.filmService = filmService;
}
private final MpaService mpaService;

@GetMapping
public List<Mpa> getAllMpa(){
return filmService.getAllMpa();
log.info("Получен запрос на получение списка Mpa");
return mpaService.getAllMpa();
}


@GetMapping("/{id}")
public Mpa getMpaById(@PathVariable("id") int id){
return filmService.getMpaById(id);
log.info("Получен запрос на получение Mpa по id " + id);
return mpaService.getMpaById(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Review;
import ru.yandex.practicum.filmorate.service.review.ReviewService;

import javax.validation.Valid;
import java.util.List;

@RestController
@Slf4j
@AllArgsConstructor
@RequestMapping("/reviews")
public class ReviewController {
private final ReviewService service;

@GetMapping("/{id}")
public Review getReviewById(@PathVariable("id") Long reviewId) {
Review review = service.getById(reviewId);
log.info("Обзор с ID #{} пользователя с ID #{} передан", review.getReviewId(), review.getUserId());
return review;

}

@PostMapping
public Review postReview(@RequestBody @Valid Review review) {
review = service.add(review);
log.info("Отзыв с ID #{} добавлен.", review.getReviewId());
return review;
}

@PutMapping
public Review putReview(@RequestBody @Valid Review review) {
review = service.update(review);
log.info("Отзыв с ID #{} обновлен.", review.getReviewId());
return review;
}

@DeleteMapping("/{id}")
public void deleteReview(@PathVariable("id") long reviewId) {
service.delete(reviewId);
log.info("Отзыв с ID #{} удален.", reviewId);
}

@GetMapping
public List<Review> getReviewsByFilmId(@RequestParam(required = false) Long filmId,
@RequestParam(defaultValue = "10") Integer count) {
List<Review> reviews;
if (filmId == null) {
reviews = service.getAllReviews();
log.info("Передан список всех отзывов в размере {}", reviews.size());
return reviews;
}
reviews = service.getAllReviewsByFilmId(filmId, count);
log.info("Список отзывов в размере {} фильма с ID {}", count, filmId);
return reviews;
}

@PutMapping("/{id}/like/{userId}")
public Review addLike(@PathVariable("id") Long reviewId, @PathVariable Long userId) {
Review review = service.addLike(reviewId, userId);
log.info("Лайк отзыв с ID #{} пользователя c ID #{} добавлен. Количество лайков отзыва {}",
reviewId, userId, review.getUseful());
return review;
}

@PutMapping("/{id}/dislike/{userId}")
public Review addDislike(@PathVariable("id") Long reviewId, @PathVariable Long userId) {
Review review = service.addDislike(reviewId, userId);
log.info("Дизлайк отзыва с ID #{} пользователя c ID #{} добавлен. Количество лайков отзыва {}",
reviewId, userId, review.getUseful());
return review;
}

@DeleteMapping("/{id}/like/{userId}")
public Review deleteLike(@PathVariable("id") Long reviewId, @PathVariable Long userId) {
Review review = service.deleteLike(reviewId, userId);
log.info("Лайк отзыва с ID #{} пользователя c ID #{} удален. Количество лайков отзыва {}",
reviewId, userId, review.getUseful());
return review;
}

@DeleteMapping("/{id}/dislike/{userId}")
public Review deleteDislike(@PathVariable("id") Long reviewId, @PathVariable Long userId) {
Review review = service.deleteDislike(reviewId, userId);
log.info("Дизлайк отзыва с ID #{} пользователя c ID #{} удален. Количество лайков отзыва {}",
reviewId, userId, review.getUseful());
return review;
}
}
Loading