Skip to content

Commit a35ae52

Browse files
authored
Merge pull request #2 from LevshaKS/add-friends-likes
Add friends likes
2 parents 8de7a94 + ebb1e36 commit a35ae52

24 files changed

Lines changed: 696 additions & 145 deletions

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@
6666
<version>3.3.3</version>
6767
<scope>test</scope>
6868
</dependency>
69+
<dependency>
70+
<groupId>org.zalando</groupId>
71+
<artifactId>logbook-spring-boot-starter</artifactId>
72+
<version>3.7.2</version>
73+
</dependency>
6974
</dependencies>
7075

7176
<build>

src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ru.yandex.practicum.filmorate;
22

3-
43
import org.springframework.boot.SpringApplication;
54
import org.springframework.boot.autoconfigure.SpringBootApplication;
65

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,84 @@
11
package ru.yandex.practicum.filmorate.controller;
22

33
import jakarta.validation.Valid;
4-
import jakarta.validation.ValidationException;
4+
import jakarta.validation.constraints.Positive;
55
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
7+
import org.springframework.beans.factory.annotation.Autowired;
78
import org.springframework.http.HttpStatus;
8-
import org.springframework.http.ResponseEntity;
9+
import org.springframework.validation.annotation.Validated;
910
import org.springframework.web.bind.annotation.*;
1011
import ru.yandex.practicum.filmorate.model.Film;
12+
import ru.yandex.practicum.filmorate.service.FilmService;
1113

1214
import java.util.Collection;
13-
import java.util.HashMap;
14-
import java.util.Map;
1515

16+
@Validated
1617
@RestController
1718
@RequestMapping("/films")
1819
public class FilmController {
1920

20-
private final ValidateController validateController = new ValidateController();
21-
private final Map<Long, Film> films = new HashMap<>();
22-
private final Logger log = LoggerFactory.getLogger(FilmController.class);
21+
private final Logger logger = LoggerFactory.getLogger(FilmController.class);
22+
private final FilmService filmService;
23+
24+
@Autowired
25+
public FilmController(FilmService filmService) {
26+
this.filmService = filmService;
27+
}
28+
29+
@GetMapping("/{id}")
30+
@ResponseStatus(HttpStatus.OK)
31+
32+
public Film getFilmId(@Positive(message = "неверное значение") @PathVariable long id) {
33+
logger.info("вывод фильма по ID");
34+
return filmService.getFilmId(id);
35+
}
2336

2437
@GetMapping
25-
public ResponseEntity<Collection<Film>> filmAll() {
26-
log.info("вывод списка фильмов");
27-
return ResponseEntity.ok(films.values());
38+
@ResponseStatus(HttpStatus.OK)
39+
public Collection<Film> getFilmAll() {
40+
logger.info("вывод списка фильмов");
41+
return filmService.getAll();
2842
}
2943

3044
@PostMapping
31-
public ResponseEntity<?> create(@Valid @RequestBody Film film) {
32-
validateController.validateFilm(film);
33-
film.setId(getNextId());
34-
films.put(film.getId(), film);
35-
log.info("фильм добавлен id: " + film.getId());
36-
return ResponseEntity.status(HttpStatus.CREATED).body(film);
45+
@ResponseStatus(HttpStatus.CREATED)
46+
public Film create(@Valid @RequestBody Film film) {
47+
logger.info("Фильм добавлен");
48+
return filmService.create(film);
49+
}
50+
51+
@DeleteMapping("/{id}")
52+
@ResponseStatus(HttpStatus.OK)
53+
public void delete(@Positive(message = "неверное значение") @PathVariable long id) {
54+
logger.info("Удаление id=" + id);
55+
filmService.delete(id);
3756
}
3857

3958
@PutMapping
40-
public ResponseEntity<?> update(@Valid @RequestBody Film newFilm) {
41-
if (newFilm.getId() == null) {
42-
log.warn("ID пустой");
43-
throw new ValidationException("пользователь с таким ID не найден");
44-
// изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman
45-
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ID пустой");
46-
}
47-
if (!films.containsKey(newFilm.getId())) {
48-
log.warn("пользователь с таким ID не найден");
49-
// изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman
50-
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("пользователь с таким ID не найден");
51-
throw new ValidationException("пользователь с таким ID не найден");
52-
}
53-
validateController.validateFilm(newFilm);
54-
Film oldFilm = films.get(newFilm.getId());
55-
oldFilm.setName(newFilm.getName());
56-
oldFilm.setDescription(newFilm.getDescription());
57-
oldFilm.setReleaseDate(newFilm.getReleaseDate());
58-
oldFilm.setDuration(newFilm.getDuration());
59-
log.info("запись фильма обновлена");
60-
return ResponseEntity.ok(oldFilm);
59+
@ResponseStatus(HttpStatus.OK)
60+
public Film update(@RequestBody Film newFilm) {
61+
logger.info("запись фильма обновлена");
62+
return filmService.update(newFilm);
6163
}
6264

63-
private long getNextId() {
64-
long currentMaxId = films.keySet()
65-
.stream()
66-
.mapToLong(id -> id)
67-
.max()
68-
.orElse(0);
69-
return ++currentMaxId;
65+
@PutMapping("/{id}/like/{userId}")
66+
@ResponseStatus(HttpStatus.OK)
67+
public Collection<Long> likeAdd(@Positive(message = "неверное значение") @PathVariable long id,
68+
@Positive(message = "неверное значение") @PathVariable long userId) {
69+
return filmService.likeAdd(id, userId);
70+
}
71+
72+
@DeleteMapping("/{id}/like/{userId}")
73+
@ResponseStatus(HttpStatus.OK)
74+
public Collection<Long> likeDelete(@Positive(message = "неверное значение") @PathVariable long id,
75+
@Positive(message = "неверное значение") @PathVariable long userId) {
76+
return filmService.likeDelete(id, userId);
77+
}
7078

79+
@GetMapping("/popular")
80+
@ResponseStatus(HttpStatus.OK)
81+
public Collection<Film> getPopular(@Positive(message = "неверное значение") @RequestParam(defaultValue = "10") int count) {
82+
return filmService.getPopular(count);
7183
}
7284
}

src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java

Lines changed: 69 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,80 +2,95 @@
22

33
import jakarta.validation.Valid;
44

5-
import jakarta.validation.ValidationException;
5+
import jakarta.validation.constraints.Positive;
66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
8+
import org.springframework.beans.factory.annotation.Autowired;
89
import org.springframework.http.HttpStatus;
9-
import org.springframework.http.ResponseEntity;
10-
10+
import org.springframework.validation.annotation.Validated;
1111
import org.springframework.web.bind.annotation.*;
1212
import ru.yandex.practicum.filmorate.model.User;
13+
import ru.yandex.practicum.filmorate.service.UserService;
1314

1415
import java.util.Collection;
15-
import java.util.HashMap;
16-
import java.util.Map;
1716

17+
@Validated
1818
@RestController
1919
@RequestMapping("/users")
2020
public class UserController {
2121

22-
private final ValidateController validate = new ValidateController();
23-
private final Map<Long, User> users = new HashMap<>();
22+
private final UserService userService;
23+
24+
private final Logger logger = LoggerFactory.getLogger(UserController.class);
25+
26+
@Autowired
27+
public UserController(UserService userService) {
28+
this.userService = userService;
29+
}
2430

25-
private final Logger log = LoggerFactory.getLogger(UserController.class);
31+
@GetMapping("/{id}")
32+
@ResponseStatus(HttpStatus.OK)
33+
public User getUserId(@Positive(message = "неверное значение") @PathVariable long id) {
34+
logger.info("вывод пользователя по ID");
35+
return userService.getUserId(id);
36+
}
2637

27-
@GetMapping //запрос всех пользователей
28-
public ResponseEntity<Collection<User>> usersAll() {
38+
@GetMapping
39+
@ResponseStatus(HttpStatus.OK)
40+
public Collection<User> userAll() {
41+
logger.info("вывод списка пользователей");
42+
return userService.getAll();
43+
}
2944

30-
log.info("вывод списка пользователей");
31-
return ResponseEntity.ok(users.values());
45+
@PostMapping
46+
@ResponseStatus(HttpStatus.CREATED)
47+
public User create(@Valid @RequestBody User user) {
48+
logger.info("Пользователь добавлен");
49+
return userService.create(user);
3250
}
3351

34-
@PostMapping //добавление нового пользователя
35-
public ResponseEntity<?> create(@Valid @RequestBody User user) {
36-
validate.validateUser(user);
37-
38-
if (users.containsValue(user)) {
39-
log.warn("ошибка добавления пользователя, такой пользователь уже есть");
40-
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ошибка добавления пользователя, такой пользователь уже есть");
41-
}
42-
user.setId(getNextId());
43-
users.put(user.getId(), user);
44-
log.info("пользователь создан id: " + user.getId());
45-
return ResponseEntity.status(HttpStatus.CREATED).body(user); //отрпавляем ответ с статусом и телом
52+
@DeleteMapping("/{id}")
53+
@ResponseStatus(HttpStatus.OK)
54+
public void delete(@Positive(message = "неверное значение") @PathVariable long id) {
55+
logger.info("Удаление id=" + id);
56+
userService.delete(id);
4657
}
4758

48-
@PutMapping //обновление пользователя
49-
public ResponseEntity<?> update(@Valid @RequestBody User newUser) {
50-
if (newUser.getId() == null) {
51-
log.warn("ID пустой");
52-
throw new ValidationException(" ID пустой");
53-
// изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman
54-
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ID пустой");
55-
}
56-
if (!users.containsKey(newUser.getId())) {
57-
log.warn("пользователь с таким ID не найден");
58-
throw new ValidationException("пользователь с таким ID не найден");
59-
// изначально сделал чтоб в теле была ошибка, но не прошло тесты в Postman
60-
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("пользователь с таким ID не найден");
61-
}
62-
validate.validateUser(newUser);
63-
User oldUser = users.get(newUser.getId());
64-
oldUser.setEmail(newUser.getEmail());
65-
oldUser.setLogin(newUser.getLogin());
66-
oldUser.setBirthday(newUser.getBirthday());
67-
oldUser.setName(newUser.getName());
68-
log.info("пользователь изменен");
69-
return ResponseEntity.ok(oldUser);
59+
@PutMapping
60+
@ResponseStatus(HttpStatus.OK)
61+
public User update(@RequestBody User newUser) {
62+
logger.info("запись пользователя обновлена");
63+
return userService.update(newUser);
7064
}
7165

72-
private long getNextId() {
73-
long currentMaxId = users.keySet()
74-
.stream()
75-
.mapToLong(id -> id)
76-
.max()
77-
.orElse(0);
78-
return ++currentMaxId;
66+
@PutMapping("/{id}/friends/{friendsId}")
67+
@ResponseStatus(HttpStatus.OK)
68+
public Collection<Long> friendsAdd(@Positive(message = "неверное значение") @PathVariable long id,
69+
@Positive(message = "неверное значение") @PathVariable long friendsId) {
70+
logger.info("добавили в друзья");
71+
return userService.friendsAdd(id, friendsId);
72+
}
73+
74+
@DeleteMapping("/{id}/friends/{friendsId}")
75+
@ResponseStatus(HttpStatus.OK)
76+
public Collection<Long> friendsDelete(@Positive(message = "неверное значение") @PathVariable long id,
77+
@Positive(message = "неверное значение") @PathVariable long friendsId) {
78+
logger.info("удалили из друзей");
79+
return userService.friendsDelete(id, friendsId);
80+
}
81+
82+
@GetMapping("/{id}/friends")
83+
@ResponseStatus(HttpStatus.OK)
84+
public Collection<User> friendsGetList(@Positive(message = "неверное значение") @PathVariable long id) {
85+
logger.info("показывает список друзей");
86+
return userService.friendsGetList(id);
87+
}
7988

89+
@GetMapping("/{id}/friends/common/{otherId}")
90+
@ResponseStatus(HttpStatus.OK)
91+
public Collection<User> friendsGetCommonList(@Positive(message = "неверное значение") @PathVariable long id,
92+
@Positive(message = "неверное значение") @PathVariable long otherId) {
93+
logger.info("показывает список друзей");
94+
return userService.friendsGetCommonList(id, otherId);
8095
}
81-
}
96+
}

src/main/java/ru/yandex/practicum/filmorate/controller/ValidateController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
5+
import org.springframework.stereotype.Component;
56
import ru.yandex.practicum.filmorate.exception.ValidationException;
67
import ru.yandex.practicum.filmorate.exception.ValidationNullException;
78
import ru.yandex.practicum.filmorate.model.Film;
89
import ru.yandex.practicum.filmorate.model.User;
910

1011
import java.time.LocalDate;
1112

13+
@Component
1214
public class ValidateController {
1315

1416
private final Logger log = LoggerFactory.getLogger(ValidateController.class);
@@ -96,7 +98,6 @@ public void validateUser(User user) {
9698
log.warn("введена дата из будущего");
9799
throw new ValidationException("введена дата из будущего");
98100
}
99-
100101
}
101102
}
102103

0 commit comments

Comments
 (0)