Skip to content

Commit b1e8a58

Browse files
committed
ТЗ 10 исправлен, перенесен в другой проект
1 parent 95bf5e5 commit b1e8a58

16 files changed

Lines changed: 736 additions & 13 deletions

pom.xml

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>3.2.4</version>
8+
<version>3.3.3</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>ru.yandex.practicum</groupId>
@@ -21,7 +21,6 @@
2121
<groupId>org.springframework.boot</groupId>
2222
<artifactId>spring-boot-starter-web</artifactId>
2323
</dependency>
24-
2524
<dependency>
2625
<groupId>org.projectlombok</groupId>
2726
<artifactId>lombok</artifactId>
@@ -32,10 +31,52 @@
3231
<artifactId>spring-boot-starter-test</artifactId>
3332
<scope>test</scope>
3433
</dependency>
34+
<dependency>
35+
<groupId>com.google.code.gson</groupId>
36+
<artifactId>gson</artifactId>
37+
<version>2.10.1</version>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.springframework.boot</groupId>
41+
<artifactId>spring-boot-starter-validation</artifactId>
42+
<version>3.3.4</version>
43+
</dependency>
44+
<dependency>
45+
<groupId>org.slf4j</groupId>
46+
<artifactId>slf4j-api</artifactId>
47+
<version>2.0.16</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.junit.jupiter</groupId>
51+
<artifactId>junit-jupiter</artifactId>
52+
<version>5.11.1</version>
53+
<scope>test</scope>
54+
</dependency>
55+
<dependency>
56+
<groupId>org.assertj</groupId>
57+
<artifactId>assertj-core</artifactId>
58+
<version>3.26.3</version>
59+
<scope>test</scope>
60+
</dependency>
3561
</dependencies>
3662

3763
<build>
3864
<plugins>
65+
<plugin>
66+
<groupId>org.apache.maven.plugins</groupId>
67+
<artifactId>maven-resources-plugin</artifactId>
68+
<version>3.3.1</version>
69+
</plugin>
70+
<plugin>
71+
<groupId>org.apache.maven.plugins</groupId>
72+
<artifactId>maven-compiler-plugin</artifactId>
73+
<version>3.13.0</version>
74+
</plugin>
75+
<plugin>
76+
<groupId>org.apache.maven.plugins</groupId>
77+
<artifactId>maven-checkstyle-plugin</artifactId>
78+
<version>3.5.0</version>
79+
</plugin>
3980
<plugin>
4081
<groupId>org.springframework.boot</groupId>
4182
<artifactId>spring-boot-maven-plugin</artifactId>
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package ru.yandex.practicum.filmorate;
22

3+
34
import org.springframework.boot.SpringApplication;
45
import org.springframework.boot.autoconfigure.SpringBootApplication;
56

67
@SpringBootApplication
78
public class FilmorateApplication {
8-
public static void main(String[] args) {
9-
SpringApplication.run(FilmorateApplication.class, args);
10-
}
11-
9+
public static void main(String[] args) {
10+
SpringApplication.run(FilmorateApplication.class, args);
11+
}
1212
}
Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,72 @@
11
package ru.yandex.practicum.filmorate.controller;
22

3-
import org.springframework.web.bind.annotation.RestController;
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.ValidationException;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.*;
10+
import ru.yandex.practicum.filmorate.model.Film;
11+
12+
import java.util.Collection;
13+
import java.util.HashMap;
14+
import java.util.Map;
415

516
@RestController
17+
@RequestMapping("/films")
618
public class FilmController {
19+
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);
23+
24+
@GetMapping
25+
public ResponseEntity<Collection<Film>> filmAll() {
26+
log.info("вывод списка фильмов");
27+
return ResponseEntity.ok(films.values());
28+
}
29+
30+
@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);
37+
}
38+
39+
@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);
61+
}
62+
63+
private long getNextId() {
64+
long currentMaxId = films.keySet()
65+
.stream()
66+
.mapToLong(id -> id)
67+
.max()
68+
.orElse(0);
69+
return ++currentMaxId;
70+
71+
}
772
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package ru.yandex.practicum.filmorate.controller;
2+
3+
import jakarta.validation.Valid;
4+
5+
import jakarta.validation.ValidationException;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.http.HttpStatus;
9+
import org.springframework.http.ResponseEntity;
10+
11+
import org.springframework.web.bind.annotation.*;
12+
import ru.yandex.practicum.filmorate.model.User;
13+
14+
import java.util.Collection;
15+
import java.util.HashMap;
16+
import java.util.Map;
17+
18+
@RestController
19+
@RequestMapping("/users")
20+
public class UserController {
21+
22+
private final ValidateController validate = new ValidateController();
23+
private final Map<Long, User> users = new HashMap<>();
24+
25+
private final Logger log = LoggerFactory.getLogger(UserController.class);
26+
27+
@GetMapping //запрос всех пользователей
28+
public ResponseEntity<Collection<User>> usersAll() {
29+
30+
log.info("вывод списка пользователей");
31+
return ResponseEntity.ok(users.values());
32+
}
33+
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); //отрпавляем ответ с статусом и телом
46+
}
47+
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);
70+
}
71+
72+
private long getNextId() {
73+
long currentMaxId = users.keySet()
74+
.stream()
75+
.mapToLong(id -> id)
76+
.max()
77+
.orElse(0);
78+
return ++currentMaxId;
79+
80+
}
81+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package ru.yandex.practicum.filmorate.controller;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import ru.yandex.practicum.filmorate.exception.ValidationException;
6+
import ru.yandex.practicum.filmorate.exception.ValidationNullException;
7+
import ru.yandex.practicum.filmorate.model.Film;
8+
import ru.yandex.practicum.filmorate.model.User;
9+
10+
import java.time.LocalDate;
11+
12+
public class ValidateController {
13+
14+
private final Logger log = LoggerFactory.getLogger(ValidateController.class);
15+
16+
public void ValidateFilm(Film film) {
17+
18+
final LocalDate FILM_DATE = LocalDate.of(1895, 12, 28);
19+
20+
if (film.getName() == null) {
21+
log.warn("название пустое");
22+
throw new ValidationNullException("название пустое");
23+
}
24+
25+
if (film.getName().isBlank() || film.getName().isEmpty()) {
26+
log.warn("название пустое");
27+
throw new ValidationException("название пустое");
28+
}
29+
if (film.getDescription() == null) {
30+
log.warn("описание пустое");
31+
throw new ValidationNullException("описание пустое");
32+
}
33+
34+
if (film.getDescription().isBlank() || film.getDescription().isEmpty()) {
35+
log.warn("описание пустое");
36+
throw new ValidationException("описание пустое");
37+
}
38+
39+
if (film.getDescription().length() > 200) {
40+
log.warn("превышает количество символов");
41+
throw new ValidationException("превышает количество символов");
42+
}
43+
44+
if (film.getReleaseDate() == null) {
45+
log.warn("дата выпуска не заполнена");
46+
throw new ValidationNullException("дата выпуска не заполнена");
47+
}
48+
49+
if (FILM_DATE.isAfter(film.getReleaseDate())) {
50+
log.warn("дата выпуска раньше 28 декабря 1895");
51+
throw new ValidationException("дата выпуска раньше 28 декабря 1895");
52+
}
53+
if (film.getDuration() <= 0) {
54+
log.warn("продолжительность <= 0");
55+
throw new ValidationException("продолжительность <= 0");
56+
}
57+
}
58+
59+
public void ValidateUser(User user) {
60+
if (user.getLogin() == null) {
61+
log.warn("login пустой");
62+
throw new ValidationNullException("login пустой");
63+
}
64+
if (user.getLogin().isBlank() || user.getLogin().isEmpty()) {
65+
log.warn("логин пустой");
66+
throw new ValidationException("login пустой");
67+
}
68+
if (user.getLogin().contains(" ")) {
69+
log.warn("присутствуют пробелы");
70+
throw new ValidationException("присутствуют пробелы");
71+
}
72+
if (user.getName() == null || user.getName().isBlank()) {
73+
user.setName(user.getLogin());
74+
log.info("имя не заполнено, будет присвоенно имя " + user.getLogin());
75+
}
76+
77+
if (user.getEmail() == null) {
78+
log.warn("email пустой");
79+
throw new ValidationNullException("email пустой");
80+
}
81+
82+
if (user.getEmail().isBlank() || user.getEmail().isEmpty()) {
83+
log.warn("email пустой");
84+
throw new ValidationException("email пустой");
85+
}
86+
if (!user.getEmail().contains("@")) {
87+
88+
log.warn("введен не email");
89+
throw new ValidationException("введен не email");
90+
}
91+
if (user.getBirthday() == null) {
92+
log.warn("дата пустая");
93+
throw new ValidationNullException("дата пустая");
94+
}
95+
if (user.getBirthday().isAfter(LocalDate.now())) {
96+
log.warn("введена дата из будущего");
97+
throw new ValidationException("введена дата из будущего");
98+
}
99+
100+
}
101+
}
102+
103+

0 commit comments

Comments
 (0)