Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
ac6f943
feature: add delete user
May 6, 2025
58c5023
feature: add delete film
May 6, 2025
9ba05f0
fix: code styles
May 6, 2025
8807e6d
fix: code styles
May 6, 2025
fc97220
fix: code styles
May 6, 2025
f339dde
fix: code styles
May 6, 2025
90ad9e1
feature: Add most populars - Вывод популярных фильмов по жанрам и годам
May 7, 2025
5854047
fix: sql request for popular films
May 7, 2025
bb45153
Merge branch 'add-remove-endpoint' into add-most-populars
May 7, 2025
d9ddde6
Merge pull request #15 from Kotezh/add-remove-endpoint
Kotezh May 8, 2025
07bd937
Merge branch 'develop' into add-most-populars
May 8, 2025
7863706
feature: Add most populars - Вывод самых популярных фильмов по жанрам…
May 9, 2025
4eb3718
fix: code style errors
May 9, 2025
d019cc8
Ветка для реализации задачи add-reviews.
May 9, 2025
3b32b7e
Add director - Добавление режиссёров в фильмы.
slavakorg May 10, 2025
61b5386
CheckStyle fix
slavakorg May 10, 2025
da48554
1. add interface ReviewService.
May 10, 2025
98d32dc
CheckStyle fix
slavakorg May 10, 2025
eac0cc1
CheckStyle fix
slavakorg May 10, 2025
16b3758
Испоавления модели режиссёров и валидации в контроллере
slavakorg May 10, 2025
decb1d6
CheckStyle fix
slavakorg May 10, 2025
602b51e
Удаление пустых строк и лишнего кода
slavakorg May 11, 2025
638e0e8
CheckStyle fix
slavakorg May 11, 2025
b45b859
1. add interface ReviewService.
May 11, 2025
d9ae8e6
Merge pull request #18 from Kotezh/add-director
Just-Roman May 11, 2025
6b389e3
merge
May 11, 2025
6d35c4a
feature: add common films - Общие фильмы
May 11, 2025
7a097ba
Merge branch 'develop' into add-common-films
May 11, 2025
e8ce4e4
fix code styles
May 11, 2025
26b5149
Merge pull request #17 from Kotezh/add-reviews
Just-Roman May 11, 2025
1f661e2
delete CHECK (release_date <= CURRENT_DATE) for schema in table films
May 11, 2025
c774261
Merge branch 'develop' into add-most-populars
May 11, 2025
9fdb560
resolve conflicts
May 11, 2025
cc6101e
resolve conflicts
May 11, 2025
7e18e08
Merge pull request #16 from Kotezh/add-most-populars
Kotezh May 11, 2025
374505e
Merge branch 'develop' into add-common-films
May 11, 2025
b2f74b3
Merge pull request #19 from Kotezh/add-common-films
Kotezh May 11, 2025
b9ca135
Функциональность «Поиск»
slavakorg May 11, 2025
52f8220
fix: add connectDirectors to common films
May 11, 2025
e0c8082
Merge remote-tracking branch 'origin/develop' into develop
May 12, 2025
d577668
Merge pull request #21 from Kotezh/add-common-films
Kotezh May 12, 2025
65df69c
Исправление валидации и запроса фильмов режиссёров.
slavakorg May 12, 2025
49302d5
Merge remote-tracking branch 'origin/develop' into develop
May 13, 2025
1a8f013
Ветка для реализации задачи add-feed.
May 13, 2025
7552fd2
Merge pull request #23 from Kotezh/add-director
Kotezh May 13, 2025
2418a7f
Функциональность «Поиск»
slavakorg May 11, 2025
f2caf55
Добавление регистронезависимого поиска
slavakorg May 13, 2025
1e8b933
Merge remote-tracking branch 'origin/develop' into develop
May 13, 2025
89d078d
Merge branch 'refs/heads/develop' into add-feed
May 13, 2025
bbca18a
Merge remote-tracking branch 'origin/add-search' into add-search
slavakorg May 13, 2025
06769f7
исправления
May 13, 2025
137beda
Merge pull request #20 from Kotezh/add-search
Kotezh May 13, 2025
3088636
feature: add recommendations - добавление Рекомендаций
May 14, 2025
6b422d6
Merge branch 'develop' into add-recommendations
May 14, 2025
a75234a
clean ups
May 14, 2025
472830e
edit constant search for Activity
May 14, 2025
b0ea79f
Merge pull request #24 from Kotezh/add-feed
Just-Roman May 14, 2025
9b33ae4
Merge branch 'develop' into add-recommendations
May 14, 2025
e1c8ebb
merge commit
May 14, 2025
72f8a06
Merge pull request #22 from Kotezh/add-recommendations
Kotezh May 14, 2025
a536203
fix
May 14, 2025
899d6e1
clean ups
May 14, 2025
f777dc6
fix 2
May 15, 2025
8f9f057
fix 2
May 15, 2025
43e3989
Merge remote-tracking branch 'origin/add-reviews' into add-reviews
May 15, 2025
a409452
fix 3
May 15, 2025
4855d36
fix fatalities
May 15, 2025
4ac3bf0
clean ups
May 15, 2025
ce78cd3
Merge pull request #26 from Kotezh/add-reviews
Kotezh May 15, 2025
9f8c99c
fix test gitHub
May 16, 2025
ccf9f13
fix tests
May 16, 2025
ffe59ba
fix tests
May 16, 2025
1278e79
fix tests
May 16, 2025
0c1ace6
fix tests
May 16, 2025
6afc5b7
fix tests
May 16, 2025
39294f7
fix tests
May 16, 2025
1fd36b2
fix tests
May 16, 2025
660030a
Merge pull request #28 from Kotezh/add-reviews
Kotezh May 16, 2025
0701c16
Merge remote-tracking branch 'origin/develop' into develop
May 17, 2025
a3e9d85
fix review
May 17, 2025
3bcce82
Merge pull request #29 from Kotezh/develop-fix
Kotezh May 17, 2025
a5607c6
Update application.properties
Kotezh May 17, 2025
7281cf7
Merge pull request #30 from Kotezh/develop-fix
Kotezh May 17, 2025
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,7 @@
package ru.yandex.practicum.filmorate.Enum;

public enum EventType {
LIKE,
FRIEND,
REVIEW
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.Enum;

public enum OperationType {
ADD,
UPDATE,
REMOVE
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.yandex.practicum.filmorate.model;
package ru.yandex.practicum.filmorate.annotation;

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.yandex.practicum.filmorate.model;
package ru.yandex.practicum.filmorate.annotation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.yandex.practicum.filmorate.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Director;
import ru.yandex.practicum.filmorate.service.DirectorServiceImpl;

import java.util.List;

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

private final DirectorServiceImpl directorService;

@PostMapping
@ResponseStatus(HttpStatus.OK)
public Director create(@Valid @RequestBody Director director) {
return directorService.create(director);
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<Director> getAll() {
return directorService.getAll();
}

@GetMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public Director getById(@PathVariable("id") long id) {
return directorService.getById(id);
}

@PutMapping
@ResponseStatus(HttpStatus.OK)
public Director updateDirector(@Valid @RequestBody Director director) {
return directorService.update(director);
}

@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public void deleteDirector(@PathVariable("id") long id) {
directorService.delete(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public Collection<Film> findAll() {

@GetMapping("/{filmId}")
public Film get(@PathVariable long filmId) {
return filmService.getById(filmId);
return filmService.getFilmById(filmId);
}

@PostMapping
Expand All @@ -40,6 +40,12 @@ public Film update(@Valid @RequestBody Film newFilm) {
return filmService.update(newFilm);
}

@DeleteMapping("/{filmId}")
@ResponseStatus(HttpStatus.OK)
public void deleteFilm(@PathVariable("filmId") long filmId) {
filmService.deleteFilm(filmId);
}

@PutMapping("/{filmId}/like/{userId}")
@ResponseStatus(HttpStatus.OK)
public void addLike(@PathVariable("filmId") long filmId, @PathVariable("userId") long userId) {
Expand All @@ -54,7 +60,28 @@ public void deleteLike(@PathVariable("id") long id, @PathVariable("userId") long

@GetMapping("/popular")
@ResponseStatus(HttpStatus.OK)
public Collection<Film> getPopularFilms(@RequestParam(value = "count", defaultValue = "10") final Integer count) {
return filmService.getPopularFilms(count);
public Collection<Film> getPopularFilms(@RequestParam(value = "count", defaultValue = "10") Integer count,
@RequestParam(value = "genreId", required = false) Long genreId,
@RequestParam(value = "year", required = false) Integer year) {
return filmService.getPopularFilms(count, genreId, year);
}

@GetMapping("/director/{directorId}")
@ResponseStatus(HttpStatus.OK)
public Collection<Film> getDirectorFilms(@RequestParam(value = "sortBy") final String sort, @PathVariable("directorId") long directorId) {
return filmService.getDirectorFilms(directorId, sort);
}

@GetMapping("/common")
@ResponseStatus(HttpStatus.OK)
public Collection<Film> getCommonFilms(@RequestParam(value = "userId") Long userId,
@RequestParam(value = "friendId") Long friendId) {
return filmService.getCommonFilms(userId, friendId);
}

@GetMapping("/search")
@ResponseStatus(HttpStatus.OK)
public Collection<Film> getSearch(@RequestParam(value = "query", defaultValue = "defaultSearch") final String query, @RequestParam(value = "by", defaultValue = "defaultSearch") final String by) {
return filmService.getSearch(query, by);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package ru.yandex.practicum.filmorate.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
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.ReviewServiceImpl;

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

@RestController
@RequiredArgsConstructor
@RequestMapping("/reviews")
@Validated
public class ReviewController {
private final ReviewServiceImpl reviewService;

@GetMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public Optional<Review> getReviewById(@PathVariable long id) {
return reviewService.getReviewById(id);
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<Review> getAllReviewsByFilmId(@RequestParam(value = "filmId", defaultValue = "-1") long filmId,
@RequestParam(value = "count", defaultValue = "10") long count) {
return reviewService.getAllReviewsByFilmId(filmId, count);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Review create(@Valid @RequestBody Review review) {
return reviewService.create(review);
}

@PutMapping
@ResponseStatus(HttpStatus.OK)
public Review update(@Valid @RequestBody Review review) {
return reviewService.update(review);
}

@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public void deleteReview(@PathVariable long id) {
reviewService.deleteReview(id);
}

@PutMapping("/{reviewId}/like/{userId}")
@ResponseStatus(HttpStatus.OK)
public void addLike(@PathVariable long reviewId, @PathVariable long userId) {
reviewService.addLike(reviewId, userId);
}

@PutMapping("/{reviewId}/dislike/{userId}")
@ResponseStatus(HttpStatus.OK)
public void addDislike(@PathVariable long reviewId, @PathVariable long userId) {
reviewService.addDislike(reviewId, userId);
}

@DeleteMapping("/{reviewId}/like/{userId}")
@ResponseStatus(HttpStatus.OK)
public void deleteLike(@PathVariable long reviewId, @PathVariable long userId) {
reviewService.deleteReaction(reviewId, userId);
}

@DeleteMapping("/{reviewId}/dislike/{userId}")
@ResponseStatus(HttpStatus.OK)
public void deleteDislike(@PathVariable long reviewId, @PathVariable long userId) {
reviewService.deleteReaction(reviewId, userId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Activity;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.service.RecommendationService;
import ru.yandex.practicum.filmorate.service.UserServiceImpl;

import java.util.Collection;
import java.util.List;

@RestController
@RequiredArgsConstructor
Expand All @@ -18,6 +22,13 @@
@Validated
public class UserController {
private final UserServiceImpl userService;
private final RecommendationService recommendationService;

@GetMapping("/{userId}/feed")
@ResponseStatus(HttpStatus.OK)
public List<Activity> getActivityByUserId(@PathVariable long userId) {
return userService.getActivityById(userId);
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
Expand All @@ -43,6 +54,12 @@ public User update(@Valid @RequestBody User newUser) {
return userService.update(newUser);
}

@DeleteMapping("/{userId}")
@ResponseStatus(HttpStatus.OK)
public void deleteUser(@PathVariable("userId") long userId) {
userService.deleteUser(userId);
}

@PutMapping("/{userId}/friends/{friendId}")
@ResponseStatus(HttpStatus.OK)
public void addFriend(@PathVariable("userId") long userId, @PathVariable("friendId") long friendId) {
Expand All @@ -66,4 +83,10 @@ public Collection<User> getAllFriends(@PathVariable("userId") long userId) {
public Collection<User> getCommonFriends(@PathVariable("userId") long userId, @PathVariable("otherId") long otherId) {
return userService.getCommonFriends(userId, otherId);
}

@GetMapping("/{userId}/recommendations")
@ResponseStatus(HttpStatus.OK)
public List<Film> getUserRecommendations(@PathVariable("userId") long userId) {
return recommendationService.getRecommendations(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ru.yandex.practicum.filmorate.dal;

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

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

public interface DirectorRepository {
Director create(Director director);

List<Director> getAll();

Optional<Director> getById(Long directorId);

Director update(Director director);

void delete(Long id);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package ru.yandex.practicum.filmorate.dal;

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

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Optional;
Expand All @@ -16,13 +18,31 @@ public interface FilmRepository {

Film update(Film film);

void deleteFilm(long filmId);

LinkedHashSet<Director> getFilmDirectors(Film film);

void connectGenres(Collection<Film> films);

void connectDirectors(Collection<Film> films);

void addLike(long filmId, long userId);

void deleteLike(long filmId, long userId);

void setFilmGenres(Film film);

void setFilmDirectors(Film film);

LinkedHashSet<Genre> getFilmGenres(Film film);

List<Film> getPopularFilms(int count);
List<Film> getPopularFilms(int count, Long genreId, Integer year);

List<Film> getDirectorFilmsByYear(long id);

List<Film> getDirectorFilmsByLikes(long id);

List<Film> getSearch(String query, String searchBy);

List<Film> getCommonFilms(long userId, long friendId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package ru.yandex.practicum.filmorate.dal;

import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import ru.yandex.practicum.filmorate.dal.mappers.DirectorRowMapper;
import ru.yandex.practicum.filmorate.model.Director;

import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

@Repository
@RequiredArgsConstructor
public class JdbcDirectorRepository implements DirectorRepository {
private final NamedParameterJdbcOperations jdbc;
private final DirectorRowMapper mapper;

private static final String CREATE_DIRECTOR_QUERY = "INSERT INTO directors (director_name) VALUES(:director_name)";
private static final String GET_ALL_DIRECTORS_QUERY = "SELECT * FROM directors ORDER BY director_id";
private static final String GET_BY_ID_QUERY = "SELECT * FROM directors WHERE director_id = :director_id";
private static final String UPDATE_DIRECTOR_QUERY = "UPDATE directors SET director_name=:director_name WHERE director_id=:director_id";
private static final String DELETE_DIRECTOR_QUERY = "DELETE FROM directors WHERE director_id = :director_id";

@Override
public Director create(Director director) {
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
MapSqlParameterSource params = new MapSqlParameterSource();

params.addValue("director_name", director.getName());
jdbc.update(CREATE_DIRECTOR_QUERY, params, keyHolder);
director.setId(keyHolder.getKeyAs(Long.class));
return director;
}

@Override
public List<Director> getAll() {
return jdbc.query(GET_ALL_DIRECTORS_QUERY, mapper);
}

@Override
public Optional<Director> getById(Long directorId) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("director_id", directorId);
try (Stream<Director> stream = jdbc.queryForStream(GET_BY_ID_QUERY, params, mapper)) {
return stream.findAny();
}

}

@Override
public Director update(Director director) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("director_name", director.getName());
params.addValue("director_id", director.getId());
jdbc.update(UPDATE_DIRECTOR_QUERY, params);
return director;
}

@Override
public void delete(Long id) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("director_id", id);
jdbc.update(DELETE_DIRECTOR_QUERY, params);

}
}
Loading