Skip to content
Closed
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ target/
!**/src/main/**/target/
!**/src/test/**/target/

### macOS ###
.DS_Store

### STS ###
.apt_generated
.classpath
Expand Down
21 changes: 21 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<optional>true</optional>
</dependency>
<dependency>
Expand Down Expand Up @@ -81,6 +82,7 @@
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
Expand All @@ -97,6 +99,25 @@
</excludes>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<failOnViolation>true</failOnViolation>
</configuration>
</plugin>

</plugins>
</build>

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

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

import java.util.Collection;

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

private final DirectorService directorService;

@GetMapping
public Collection<DirectorDto> getDirectors() {
log.info("Received GET /directors request");
return directorService.getDirectors();
}

@GetMapping("/{directorId}")
public DirectorDto getDirectorById(@PathVariable long directorId) {
log.info("Received GET /directors/{} request", directorId);
return directorService.getDirectorById(directorId);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public DirectorDto addDirector(@RequestBody Director director) {
log.info("Received POST /directors request with body: {}", director);
return directorService.addDirector(director);
}

@PutMapping
public DirectorDto updateDirector(@RequestBody Director director) {
log.info("Received PUT /directors request with body: {}", director);
return directorService.updateDirector(director);
}

@DeleteMapping("/{directorId}")
public void deleteDirector(@PathVariable long directorId) {
log.info("Received DELETE /directors/{} request", directorId);
directorService.deleteDirector(directorId);

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@ public ErrorResponse handleConstraintViolation(final ConstraintViolationExceptio
log.warn("constraint violation");
return new ErrorResponse(e.getMessage());
}

@ExceptionHandler(InternalServerException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleException(Exception e) {
log.error("Ошибка сервера: {}", e.getMessage());
return new ErrorResponse("Внутренняя ошибка сервера: " + e.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ru.yandex.practicum.filmorate.controller;

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.Event;
import ru.yandex.practicum.filmorate.service.feed.FeedService;

import java.util.List;

@RestController
@RequestMapping("/users")
public class FeedController {

private final FeedService feedService;

public FeedController(FeedService feedService) {
this.feedService = feedService;
}

@GetMapping("/{id}/feed")
public List<Event> getUserFeed(@PathVariable("id") long userId) {
return feedService.getUsersEventFeed(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,39 @@ public void deleteLikeToFilm(@PathVariable long filmId, @PathVariable long userI
}

@GetMapping("/popular")
public List<FilmDto> getTopFilms(@RequestParam(defaultValue = "10") @Positive(message = "Count must be positive") int count) {
log.info("Received GET /films/popular?count={} request", count);
return filmService.getTopFilms(count);
public List<FilmDto> getTopFilms(@RequestParam(defaultValue = "10") @Positive(message = "Count must be positive") int count,
@RequestParam(defaultValue = "-1") int genreId,
@RequestParam(defaultValue = "-1") int year) {
log.info("Received GET /films/popular?count={}&genreId={}&year={} request", count, genreId, year);
return filmService.getTopFilms(count, genreId, year);
}

@DeleteMapping("/{filmId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteFilm(@PathVariable long filmId) {
log.info("Received DELETE /films/{} request", filmId);
filmService.deleteFilm(filmId);
}

@GetMapping("/common")
public List<FilmDto> getCommonFilms(
@RequestParam long userId,
@RequestParam long friendId) {
log.info("GET common films for userId={} and friendId={}", userId, friendId);
return filmService.getCommonFilms(userId, friendId);
}

@GetMapping("/director/{directorId}")
public List<FilmDto> findByDirector(@PathVariable long directorId,
@RequestParam(name = "sortBy") String sortMode) {
log.info("Received GET /films/director/{}?sortBy={} request", directorId, sortMode);
return filmService.findByDirector(directorId, sortMode);
}

@GetMapping("/search")
public List<FilmDto> searchFilms(@RequestParam String query,
@RequestParam String by) {
log.info("GET /films/search?query={}&by={}", query, by);
return filmService.searchFilms(query, by);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ru.yandex.practicum.filmorate.controller;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.dto.NewReviewRequest;
import ru.yandex.practicum.filmorate.dto.ReviewDto;
import ru.yandex.practicum.filmorate.dto.UpdateReviewRequest;
import ru.yandex.practicum.filmorate.service.review.ReviewService;

import java.util.List;

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

public ReviewController(ReviewService reviewService) {
this.reviewService = reviewService;
}

@GetMapping
public List<ReviewDto> getFilmReviews(@RequestParam(defaultValue = "0") long filmId,
@RequestParam(defaultValue = "10")
@Positive(message = "Count must be positive") long count) {
log.info("Received GET {} reviews for film with ID = {}", count, filmId);
return reviewService.getFilmReviews(filmId, count);
}

@GetMapping("{reviewId}")
@ResponseStatus(HttpStatus.OK)
public ReviewDto getReviewById(@PathVariable int reviewId) {
log.info("Received GET review with ID = {}", reviewId);
return reviewService.getReviewById(reviewId);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public ReviewDto addReview(@RequestBody @Valid NewReviewRequest request) {
log.info("Received POST new review: {}", request);
return reviewService.addReview(request);
}

@PutMapping
@ResponseStatus(HttpStatus.OK)
public ReviewDto updateReview(@RequestBody @Valid UpdateReviewRequest request) {
log.info("Received UPDATE review: {}", request);
return reviewService.updateReview(request);
}

@DeleteMapping("/{reviewId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteReview(@PathVariable long reviewId) {
log.info("Received DELETE review with ID = {}", reviewId);
reviewService.deleteReview(reviewId);
}

@PutMapping("/{reviewId}/like/{userId}")
@ResponseStatus(HttpStatus.OK)
public void likeReview(@PathVariable long reviewId,
@PathVariable long userId) {
log.info("Received LIKE review with reviewId = {} by user with userId = {}", reviewId, userId);
reviewService.likeReview(reviewId, userId);
}

@PutMapping("/{reviewId}/dislike/{userId}")
@ResponseStatus(HttpStatus.OK)
public void dislikeReview(@PathVariable long reviewId,
@PathVariable long userId) {
log.info("Received DISLIKE review with reviewId = {} by user with userId = {}", reviewId, userId);
reviewService.dislikeReview(reviewId, userId);
}

@DeleteMapping("/{reviewId}/like/{userId}")
@ResponseStatus(HttpStatus.OK)
public void removeLike(@PathVariable long reviewId,
@PathVariable long userId) {
log.info("Received REMOVE LIKE from review with reviewId = {} by user with userId = {}", reviewId, userId);
reviewService.removeLike(reviewId, userId);
}

@DeleteMapping("/{reviewId}/dislike/{userId}")
@ResponseStatus(HttpStatus.OK)
public void removeDislike(@PathVariable long reviewId,
@PathVariable long userId) {
log.info("Received REMOVE DISLIKE from review with reviewId = {} by user with userId = {}", reviewId, userId);
reviewService.removeDislike(reviewId, userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.dto.FilmDto;
import ru.yandex.practicum.filmorate.dto.UserDto;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.service.feed.FeedService;
import ru.yandex.practicum.filmorate.service.film.FilmService;
import ru.yandex.practicum.filmorate.service.user.UserService;
import ru.yandex.practicum.filmorate.storage.user.UserDbStorage;

Expand All @@ -17,10 +20,12 @@
@RequestMapping("/users")
public class UserController {
private final UserService userService;
private final FilmService filmService;

@Autowired
public UserController(UserDbStorage userDbStorage) {
userService = new UserService(userDbStorage);
public UserController(UserDbStorage userDbStorage, FilmService filmService, FeedService feedService) {
userService = new UserService(userDbStorage, feedService);
this.filmService = filmService;
}

@GetMapping
Expand Down Expand Up @@ -72,5 +77,18 @@ public Collection<UserDto> getFriends(@PathVariable int id) {
log.info("getFriends");
return userService.getFriends(id);
}

@DeleteMapping("/{userId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteUser(@PathVariable int userId) {
log.info("Recieved DELETE /users/{} request", userId);
userService.deleteUser(userId);
}

@GetMapping("/{id}/recommendations")
public Collection<FilmDto> getRecommendations(@PathVariable long id) {
log.info("get recommendations");
return filmService.getRecommendations(id);
}
}

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

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import ru.yandex.practicum.filmorate.model.Director;

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

@Repository
public class DirectorRepository extends BaseRepository<Director> {

private static final String FIND_ALL_QUERY = "SELECT * FROM DIRECTORS d";
private static final String FIND_BY_ID_QUERY = "SELECT * FROM DIRECTORS d WHERE d.director_id = ?";
private static final String INSERT_QUERY = "INSERT INTO DIRECTORS (NAME) VALUES(?)";
private static final String UPDATE_QUERY = "UPDATE DIRECTORS SET NAME = ? WHERE DIRECTOR_ID = ?";
private static final String DELETE_QUERY = "DELETE FROM DIRECTORS WHERE DIRECTOR_ID = ?";

public DirectorRepository(JdbcTemplate jdbc,
RowMapper<Director> mapper) {
super(jdbc, mapper);
}

public List<Director> findAll() {
return findMany(FIND_ALL_QUERY);
}

public Optional<Director> findById(long id) {
return findOne(FIND_BY_ID_QUERY, id);
}

public Director save(Director director) {
Long id = (Long) insert(INSERT_QUERY, director.getName());
director.setId(id);
return director;
}

public Director update(Director director) {
update(UPDATE_QUERY, director.getName(), director.getId());
return director;
}

public void delete(long id) {
update(DELETE_QUERY, id);
}

}
Loading
Loading