Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.yandex.practicum.filmorate.controller;

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

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

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/directors")
public class DirectorController {

private final DirectorService directorService;

@GetMapping
public List<Director> getAll() {
log.info("GET-запрос к эндпоинту: '/directors'");
return directorService.getAll();
}

@GetMapping("/{directorId}")
public Director findDirector(@PathVariable("directorId") long directorId) {
log.info("GET-запрос к эндпоинту: '/directors/{directorId}'");
return directorService.findById(directorId);
}

@PostMapping
public Director createDirector(@Valid @RequestBody Director director) {
log.info("POST-запрос к эндпоинту: '/directors'");
return directorService.create(director);
}

@PutMapping
public Director updateDirector(@Valid @RequestBody Director director) {
log.info("PUT-запрос к эндпоинту: '/directors'");
return directorService.update(director);
}

@DeleteMapping("/{directorId}")
public Director deleteDirector(@PathVariable("directorId") long directorId) {
log.info("DELETE-запрос к эндпоинту: '/directors/{directorId}'");
return directorService.delete(directorId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
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.exeption.AlreadyExistException;
import ru.yandex.practicum.filmorate.exeption.NotFoundException;
import ru.yandex.practicum.filmorate.model.ErrorResponse;

import javax.validation.ConstraintViolationException;

@Slf4j
@RestControllerAdvice
public class ErrorHandler {
Expand All @@ -20,6 +23,20 @@ public ErrorResponse handleValidationException(final MethodArgumentNotValidExcep
return new ErrorResponse("Ошибка валидации: " + e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleValidationException(final ConstraintViolationException e) {
log.error("ERROR Validation 400! {}", e.getMessage());
return new ErrorResponse("Ошибка валидации: " + e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleAlreadyExistException(final AlreadyExistException e) {
log.info("ERROR 400! {}", e.getMessage());
return new ErrorResponse(e.getMessage());
}

Comment thread
Dobroeutro1 marked this conversation as resolved.
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleNotFoundException(final NotFoundException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.service.BaseFilmService;
import ru.yandex.practicum.filmorate.service.BaseUserService;
import ru.yandex.practicum.filmorate.service.impl.BaseFilmService;
import ru.yandex.practicum.filmorate.service.impl.BaseUserService;

import javax.validation.Valid;

import java.util.List;

@Slf4j
Expand All @@ -20,8 +18,8 @@
@RequestMapping("/films")
public class FilmController {

final BaseFilmService filmService;
final BaseUserService userService;
private final BaseFilmService filmService;
private final BaseUserService userService;

@GetMapping()
public List<Film> getAll() {
Expand All @@ -47,6 +45,12 @@ public Film update(@Valid @RequestBody Film film) {
return filmService.update(film);
}

@DeleteMapping("/{filmId}")
public void delete(@PathVariable("filmId") long filmId) {
log.info("DELETE-запрос к эндпоинту: '/films/{filmId}");
filmService.delete(filmId);
}

@PutMapping("/{filmId}/like/{userId}")
public void addLike(@PathVariable("filmId") long filmId, @PathVariable("userId") long userId) {
log.info("PUT-запрос к эндпоинту: '/films/{filmId}/like/{userId}'");
Expand All @@ -60,9 +64,29 @@ public void removeLike(@PathVariable("filmId") long filmId, @PathVariable("userI
}

@GetMapping("/popular")
public List<Film> getMostPopularFilms(@RequestParam(defaultValue = "10", required = false) Integer count) {
public List<Film> getMostPopularFilms(@RequestParam(defaultValue = "10") Integer count,
@RequestParam(required = false) Integer year,
@RequestParam(required = false) Integer genreId) {
log.info("GET-запрос к эндпоинту: '/films/popular'");
return filmService.getMostPopularFilms(count);
return filmService.getMostPopularFilms(count, year, genreId);
}

@GetMapping("/common")
public List<Film> getCommonFilms(@RequestParam long userId, @RequestParam long friendId) {
log.info("GET-запрос к эндпоинту: '/films/common?userId={userId}&friendId={friendId}'");
return filmService.getCommonFilms(userId, friendId);
}

@GetMapping("/director/{directorId}")
public List<Film> getSortedFilms(@PathVariable("directorId") long directorId, @RequestParam String sortBy) {
log.info("GET-запрос к эндпоинту: 'films/director/{directorId}'");
return filmService.getSortedFilmsByDirector(directorId, sortBy);
}

@GetMapping("/search")
public List<Film> search(@RequestParam String query, @RequestParam(defaultValue = "director,title") String by) {
log.info("GET-запрос к эндпоинту: 'films/search'");
return filmService.search(query, by);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Genre;
import ru.yandex.practicum.filmorate.service.BaseGenreService;
import ru.yandex.practicum.filmorate.service.impl.BaseGenreService;

import java.util.List;

Expand All @@ -14,7 +14,7 @@
@RequestMapping("/genres")
public class GenreController {

final BaseGenreService service;
private final BaseGenreService service;

@GetMapping()
public List<Genre> getAll() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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.BaseMpaService;
import ru.yandex.practicum.filmorate.service.impl.BaseMpaService;

import java.util.List;

Expand All @@ -17,7 +17,7 @@
@RequestMapping("/mpa")
public class MpaController {

final BaseMpaService service;
private final BaseMpaService service;

@GetMapping()
public List<MPA> getAll() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Review;
import ru.yandex.practicum.filmorate.service.impl.BaseReviewService;

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

@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/reviews")
public class ReviewsController {

private final BaseReviewService reviewService;

@GetMapping()
public List<Review> getAll(@RequestParam(required = false) Long filmId,
@RequestParam(defaultValue = "10", required = false) Integer count) {
log.info("GET-запрос к эндпоинту: '/reviews?filmId={filmId}&count={count}'");
return reviewService.getAll(filmId, count);
}

@GetMapping("/{id}")
public Review getReview(@PathVariable("id") long id) {
log.info("GET-запрос к эндпоинту: '/reviews/{id}'");
return reviewService.getReview(id);
}

@PostMapping()
public Review create(@Valid @RequestBody Review review) {
log.info("POST-запрос к эндпоинту: '/reviews'");
return reviewService.create(review);
}

@PutMapping()
public Review update(@Valid @RequestBody Review review) {
log.info("PUT-запрос к эндпоинту: '/reviews'");
return reviewService.update(review);
}

@DeleteMapping("/{id}")
public void remove(@PathVariable("id") long id) {
log.info("DELETE-запрос к эндпоинту: '/reviews/{id}'");
reviewService.remove(id);
}

@PutMapping("/{id}/like/{userId}")
public void addLike(@PathVariable("id") long id, @PathVariable("userId") long userId) {
log.info("PUT-запрос к эндпоинту: '/reviews/{id}/like/{userId}'");
reviewService.addLike(id, userId);
}

@DeleteMapping("/{id}/like/{userId}")
public void removeLike(@PathVariable("id") long id, @PathVariable("userId") long userId) {
log.info("DELETE-запрос к эндпоинту: '/reviews/{id}/like/{userId}'");
reviewService.removeLike(id, userId);
}

@PutMapping("/{id}/dislike/{userId}")
public void addDislike(@PathVariable("id") long id, @PathVariable("userId") long userId) {
log.info("PUT-запрос к эндпоинту: '/reviews/{id}/dislike/{userId}'");
reviewService.addDislike(id, userId);
}

@DeleteMapping("/{id}/dislike/{userId}")
public void removeDislike(@PathVariable("id") long id, @PathVariable("userId") long userId) {
log.info("PUT-запрос к эндпоинту: '/reviews/{id}/dislike/{userId}'");
reviewService.removeDislike(id, userId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Event;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.service.BaseUserService;
import ru.yandex.practicum.filmorate.service.impl.BaseUserService;

import javax.validation.Valid;
import java.util.List;
Expand All @@ -17,7 +19,7 @@
@RequestMapping("/users")
public class UserController {

final BaseUserService service;
private final BaseUserService service;

@GetMapping()
public List<User> getAll() {
Expand All @@ -43,6 +45,12 @@ public User update(@Valid @RequestBody User user) {
return service.update(user);
}

@DeleteMapping("/{userId}")
public void delete(@PathVariable("userId") long userId) {
log.info("DELETE-запрос к эндпоинту: '/users/{userId}");
service.delete(userId);
}

@GetMapping("/{userId}/friends")
public List<User> getUserFriends(@PathVariable("userId") long userId) {
log.info("GET-запрос к эндпоинту: '/users/{userId}/friends'");
Expand Down Expand Up @@ -73,4 +81,16 @@ public List<User> getCommonFriends(@PathVariable("userId") long userId, @PathVar
return service.getCommonFriends(userId, otherId);
}

@GetMapping("/{id}/feed")
public List<Event> getFeed(@PathVariable("id") long id) {
log.info("GET-запрос к эндпоинту: '/user/{id}/feed");
return service.getNewsFeed(id);
}

@GetMapping("/{userId}/recommendations")
public List<Film> getRecommendations(@PathVariable("userId") long userId) {
log.info("GET-запрос к эндпоинту: '/users/{userId}/recommendations");
return service.getRecommendations(userId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.yandex.practicum.filmorate.dao;

import ru.yandex.practicum.filmorate.model.Director;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface DirectorRepository extends Repository<Director> {

Optional<Director> findById(long id);

void delete(long directorId);

Set<Director> findByIds(List<Long> ids);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.yandex.practicum.filmorate.dao;

import ru.yandex.practicum.filmorate.model.Event;

import java.util.List;

public interface EventRepository {

List<Event> getNewsFeed(long userId);

void saveFeed(Event event);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.yandex.practicum.filmorate.dao;

import ru.yandex.practicum.filmorate.model.Director;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface FilmDirectorsRepository {
Map<Long, Set<Director>> findDirectorsByFilmIds(List<Long> filmIds);

Set<Director> findDirectorsByFilmId(long filmId);

void setFilmDirectors(long filmId, Set<Director> directors);

void deleteFilmDirectors(long filmId, Set<Director> directors);
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
package ru.yandex.practicum.filmorate.dao;

import ru.yandex.practicum.filmorate.enums.SearchFilmBy;
import ru.yandex.practicum.filmorate.model.Film;

import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface FilmRepository extends Repository<Film> {

List<Film> getAll();

Optional<Film> getFilm(long filmId);

void deleteFilm(long filmId);

List<Film> getSortedByYearFilmsOfDirector(long directorId);

List<Film> getSortedByLikesFilmsOfDirector(long directorId);

List<Film> searchFilmByNameAndDirectors(String query, Set<SearchFilmBy> by);

}
Loading