From 4b28757b6c8df8c821aec940d13d51fc1ea30bad Mon Sep 17 00:00:00 2001 From: UmarVis Date: Sun, 4 Dec 2022 13:58:25 +0300 Subject: [PATCH 1/4] TZ 9 --- pom.xml | 53 ++++++ .../filmorate/FilmorateApplication.java | 13 ++ .../filmorate/controller/FilmController.java | 73 ++++++++ .../filmorate/controller/UserController.java | 72 ++++++++ .../exception/ValidationException.java | 7 + .../practicum/filmorate/model/Film.java | 18 ++ .../practicum/filmorate/model/User.java | 16 ++ src/main/resources/application.properties | 1 + .../filmorate/FilmorateApplicationTests.java | 13 ++ .../practicum/filmorate/ValidateTest.java | 156 ++++++++++++++++++ 10 files changed, 422 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/exception/ValidationException.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Film.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/User.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java create mode 100644 src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a8aec0a --- /dev/null +++ b/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.5 + + + ru.yandex.practicum + filmorate + 0.0.1-SNAPSHOT + filmorate + Кинопоиск для друзей + + 11 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.jupiter + junit-jupiter-api + 5.9.0 + test + + + + org.projectlombok + lombok + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java new file mode 100644 index 0000000..3c12a84 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/FilmorateApplication.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.filmorate; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FilmorateApplication { + + public static void main(String[] args) { + SpringApplication.run(FilmorateApplication.class, args); + } + +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java new file mode 100644 index 0000000..6acb9a4 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FilmController.java @@ -0,0 +1,73 @@ +package ru.yandex.practicum.filmorate.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.Film; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +@Slf4j +@RestController +@RequestMapping("/films") +public class FilmController { + private final Set filmSet = new HashSet<>(); + private int id = 0; + + public int idGenerate() { + return ++id; + } + + @GetMapping + public Collection getFilms() { + return filmSet; + } + + @PostMapping + public Film create(@RequestBody Film film) { + validate(film); + film.setId(idGenerate()); + log.info("Фильм создан {}", film.toString()); + filmSet.add(film); + return film; + } + + @PutMapping + public Film updateFilm(@RequestBody Film film) { + validate(film); + for (Film films : filmSet) { + if (film.getId() == films.getId()) { + filmSet.remove(films); + filmSet.add(film); + log.info("Фильм обновлен {}", film.toString()); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND); + } + } + return film; + } + + private void validate(Film film) { + if (film.getName().isBlank()) { + log.info("Отсутствует название фильма {}", film.toString()); + throw new ValidationException("Название не может быть пустым"); + } + if (film.getDescription().length() > 200) { + log.info("Максимальная длина описания больше 200 символов {}", film.toString()); + throw new ValidationException("Максимальная длина описания — 200 символов"); + } + if (film.getReleaseDate().isBefore(LocalDate.of(1895, 12, 28))) { + log.info("Дата релиза 28 декабря 1895 года {}", film.toString()); + throw new ValidationException("Дата релиза не может быть раньше 28 декабря 1895 года"); + } + if (film.getDuration() < 0) { + log.info("Введена отрицательная продолжительсность фильма {}", film.toString()); + throw new ValidationException("Продолжительность фильма должна быть положительной"); + } + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java new file mode 100644 index 0000000..85ff7af --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -0,0 +1,72 @@ +package ru.yandex.practicum.filmorate.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.User; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +@Slf4j +@RestController +@RequestMapping("/users") +public class UserController { + private Set userSet = new HashSet<>(); + private int id = 0; + + public int idGenerate() { + return ++id; + } + + @GetMapping + public Collection users() { + return userSet; + } + + @PostMapping + public User newUser(@RequestBody User user) { + validate(user); + if (user.getName() == null || user.getName().isEmpty() || user.getName().isBlank()) { + user.setName(user.getLogin()); + } + user.setId(idGenerate()); + userSet.add(user); + log.info("Пользователь {} создан.", user.toString()); + return user; + } + + @PutMapping + public User updateUser(@RequestBody User user) { + validate(user); + for (User users : userSet) { + if (user.getId() == users.getId()) { + userSet.remove(users); + userSet.add(user); + log.info("Пользователь {} обновлен.", user.toString()); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND); + } + } + return user; + } + + public void validate(User user) { + if (user.getEmail().isBlank() || !user.getEmail().contains("@")) { + log.info("Отсутствует электронная почта {}", user.toString()); + throw new ValidationException("Электронная почта не может быть пустой или должна содержать символ @"); + } + if (user.getLogin().isBlank() || user.getLogin().contains(" ")) { + log.info("Отсутствует логин {}", user.toString()); + throw new ValidationException("Логин не может быть пустым и содержать пробелы"); + } + if (user.getBirthday().isAfter(LocalDate.now())) { + log.info("Введена не корректная дата рождения {}", user.toString()); + throw new ValidationException("Дата рождения не может быть в будущем"); + } + } +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationException.java b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationException.java new file mode 100644 index 0000000..52dc49c --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/exception/ValidationException.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.filmorate.exception; + +public class ValidationException extends RuntimeException { + public ValidationException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Film.java b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java new file mode 100644 index 0000000..9b15e99 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Film.java @@ -0,0 +1,18 @@ +package ru.yandex.practicum.filmorate.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NonNull; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class Film { + private Integer id; + @NonNull + private String name; + private String description; + private LocalDate releaseDate; + private Integer duration; +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/User.java b/src/main/java/ru/yandex/practicum/filmorate/model/User.java new file mode 100644 index 0000000..45c2d91 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/User.java @@ -0,0 +1,16 @@ +package ru.yandex.practicum.filmorate.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class User { + private Integer id; + private String email; + private String login; + private String name; + private LocalDate birthday; +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java new file mode 100644 index 0000000..660412e --- /dev/null +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java @@ -0,0 +1,13 @@ +package ru.yandex.practicum.filmorate; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class FilmorateApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java new file mode 100644 index 0000000..641a2ea --- /dev/null +++ b/src/test/java/ru/yandex/practicum/filmorate/ValidateTest.java @@ -0,0 +1,156 @@ +package ru.yandex.practicum.filmorate; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; +import ru.yandex.practicum.filmorate.controller.FilmController; +import ru.yandex.practicum.filmorate.controller.UserController; +import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.Film; +import ru.yandex.practicum.filmorate.model.User; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ValidateTest { + + @Test + public void createdFilmTest() { + final FilmController film = new FilmController(); + Film fm = new Film(1, "Я Легенда", "Фильм про зомби", LocalDate.of(2010, 12, + 24), 90); + film.create(fm); + assertEquals(1, film.getFilms().size(), "Фильм не создан"); + } + + @Test + public void notNameFilmTest() { + final FilmController film = new FilmController(); + Film fm = new Film(1, "", "Фильм про зомби", LocalDate.of(2010, 12, 24), + 90); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + film.create(fm); + } + }); + assertEquals("Название не может быть пустым", ex.getMessage()); + } + + @Test + public void maxSimFilmTest() { + final FilmController film = new FilmController(); + Film fm = new Film(1, "Я Легенда", + "Фильм про зомбииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииии" + + "ииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииии" + + "иииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииии", + LocalDate.of(2010, 12, 24), 90); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + film.create(fm); + } + }); + assertEquals("Максимальная длина описания — 200 символов", ex.getMessage()); + } + + @Test + public void dataFilmTest() { + final FilmController film = new FilmController(); + Film fm = new Film(1, "Я Легенда", "Фильм про зомби", LocalDate.of(1800, 12, 24), + 90); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + film.create(fm); + } + }); + assertEquals("Дата релиза не может быть раньше 28 декабря 1895 года", ex.getMessage()); + } + + @Test + public void durationFilmTest() { + final FilmController film = new FilmController(); + Film fm = new Film(1, "Я Легенда", "Фильм про зомби", LocalDate.of(2010, 12, 24), + -1); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + film.create(fm); + } + }); + assertEquals("Продолжительность фильма должна быть положительной", ex.getMessage()); + } + + @Test + public void createdUserTest() { + UserController uc = new UserController(); + User user = new User(1, "maks@yandex.ru", "maks_1992", "Maksim", + LocalDate.of(1992, 12, 24)); + uc.newUser(user); + assertEquals(1, uc.users().size(), "Пользователь не создан"); + } + + @Test + public void mailUserTest() { + UserController uc = new UserController(); + User user = new User(1, "maksyandex.ru", "maks_1992", "Maksim", + LocalDate.of(1992, 12, 24)); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + uc.newUser(user); + } + }); + assertEquals("Электронная почта не может быть пустой или должна содержать символ @", + ex.getMessage()); + } + + @Test + public void loginUserTest() { + UserController uc = new UserController(); + User user = new User(1, "maks@yandex.ru", "", "Maksim", + LocalDate.of(1992, 12, 24)); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + uc.newUser(user); + } + }); + assertEquals("Логин не может быть пустым и содержать пробелы", + ex.getMessage()); + } + + @Test + public void bdUserTest() { + UserController uc = new UserController(); + User user = new User(1, "maks@yandex.ru", "maks_1992", "Maksim", + LocalDate.of(2025, 12, 24)); + final ValidationException ex = assertThrows(ValidationException.class, + new Executable() { + @Override + public void execute() throws Throwable { + uc.newUser(user); + } + }); + assertEquals("Дата рождения не может быть в будущем", + ex.getMessage()); + } + + @Test + public void createdUserNotNameTest() { + UserController uc = new UserController(); + User user = new User(1, "maks@yandex.ru", "maks_1992", "", + LocalDate.of(1992, 12, 24)); + uc.newUser(user); + assertEquals("maks_1992", user.getName(), "Не назначено имя"); + } +} + From ed313f583b516ff23dc4ea7623a9bbe396843235 Mon Sep 17 00:00:00 2001 From: UmarVis Date: Mon, 5 Dec 2022 20:13:39 +0300 Subject: [PATCH 2/4] TZ 9 after 1 rew --- pom.xml | 28 +++++++++---------- .../filmorate/FilmorateApplicationTests.java | 6 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index a8aec0a..344bbdc 100644 --- a/pom.xml +++ b/pom.xml @@ -1,22 +1,22 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + org.springframework.boot spring-boot-starter-parent 2.7.5 - - ru.yandex.practicum - filmorate - 0.0.1-SNAPSHOT - filmorate - Кинопоиск для друзей - + + ru.yandex.practicum + filmorate + 0.0.1-SNAPSHOT + filmorate + Кинопоиск для друзей + 11 - - + + org.springframework.boot spring-boot-starter-web @@ -39,15 +39,15 @@ org.projectlombok lombok - + - + org.springframework.boot spring-boot-maven-plugin - + diff --git a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java index 660412e..dc5cfdf 100644 --- a/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java +++ b/src/test/java/ru/yandex/practicum/filmorate/FilmorateApplicationTests.java @@ -6,8 +6,8 @@ @SpringBootTest class FilmorateApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } } From bc876c07fd2fca99ea03aac99d7c36e3c0d4211f Mon Sep 17 00:00:00 2001 From: UmarVis Date: Mon, 5 Dec 2022 21:26:36 +0300 Subject: [PATCH 3/4] tz after rev2 --- aaas | 26 ++++++++++++++++++++++++++ dddd | 26 ++++++++++++++++++++++++++ pom.xml | 48 ++++++++++++++++++++++++------------------------ 3 files changed, 76 insertions(+), 24 deletions(-) create mode 100644 aaas create mode 100644 dddd diff --git a/aaas b/aaas new file mode 100644 index 0000000..305b5bf --- /dev/null +++ b/aaas @@ -0,0 +1,26 @@ +commit 141724278ecaf4242892220c96640f718f383eb3 (origin/develop) +Merge: 3aa8b57 ed313f5 +Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> +Date: Mon Dec 5 20:18:58 2022 +0300 + + Merge pull request #1 from UmarVis/controllers-films-users + + TZ 9 + +commit ed313f583b516ff23dc4ea7623a9bbe396843235 (HEAD -> controllers-films-users, origin/controllers-films-users) +Author: UmarVis +Date: Mon Dec 5 20:13:39 2022 +0300 + + TZ 9 after 1 rew + +commit 4b28757b6c8df8c821aec940d13d51fc1ea30bad +Author: UmarVis +Date: Sun Dec 4 13:58:25 2022 +0300 + + TZ 9 + +commit 3aa8b57dda2efac245c8aa1aca245d645cd20e42 (origin/main, origin/HEAD, main) +Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> +Date: Sun Dec 4 13:10:45 2022 +0300 + + Initial commit diff --git a/dddd b/dddd new file mode 100644 index 0000000..305b5bf --- /dev/null +++ b/dddd @@ -0,0 +1,26 @@ +commit 141724278ecaf4242892220c96640f718f383eb3 (origin/develop) +Merge: 3aa8b57 ed313f5 +Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> +Date: Mon Dec 5 20:18:58 2022 +0300 + + Merge pull request #1 from UmarVis/controllers-films-users + + TZ 9 + +commit ed313f583b516ff23dc4ea7623a9bbe396843235 (HEAD -> controllers-films-users, origin/controllers-films-users) +Author: UmarVis +Date: Mon Dec 5 20:13:39 2022 +0300 + + TZ 9 after 1 rew + +commit 4b28757b6c8df8c821aec940d13d51fc1ea30bad +Author: UmarVis +Date: Sun Dec 4 13:58:25 2022 +0300 + + TZ 9 + +commit 3aa8b57dda2efac245c8aa1aca245d645cd20e42 (origin/main, origin/HEAD, main) +Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> +Date: Sun Dec 4 13:10:45 2022 +0300 + + Initial commit diff --git a/pom.xml b/pom.xml index 344bbdc..02d3f75 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,12 @@ - 4.0.0 + 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 2.7.5 - + org.springframework.boot + spring-boot-starter-parent + 2.7.5 + ru.yandex.practicum filmorate @@ -14,40 +14,40 @@ filmorate Кинопоиск для друзей - 11 + 11 - - org.springframework.boot - spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-web - org.springframework.boot - spring-boot-starter-test - test + org.springframework.boot + spring-boot-starter-test + test - org.junit.jupiter - junit-jupiter-api - 5.9.0 - test + org.junit.jupiter + junit-jupiter-api + 5.9.0 + test - org.projectlombok - lombok + org.projectlombok + lombok - - - org.springframework.boot - spring-boot-maven-plugin - - + + + org.springframework.boot + spring-boot-maven-plugin + + From a36ac2befde1d79a8bd29053dd2287330bb002dd Mon Sep 17 00:00:00 2001 From: UmarVis Date: Mon, 5 Dec 2022 21:28:47 +0300 Subject: [PATCH 4/4] tz after rev3 --- aaas | 26 -------------------------- dddd | 26 -------------------------- 2 files changed, 52 deletions(-) delete mode 100644 aaas delete mode 100644 dddd diff --git a/aaas b/aaas deleted file mode 100644 index 305b5bf..0000000 --- a/aaas +++ /dev/null @@ -1,26 +0,0 @@ -commit 141724278ecaf4242892220c96640f718f383eb3 (origin/develop) -Merge: 3aa8b57 ed313f5 -Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> -Date: Mon Dec 5 20:18:58 2022 +0300 - - Merge pull request #1 from UmarVis/controllers-films-users - - TZ 9 - -commit ed313f583b516ff23dc4ea7623a9bbe396843235 (HEAD -> controllers-films-users, origin/controllers-films-users) -Author: UmarVis -Date: Mon Dec 5 20:13:39 2022 +0300 - - TZ 9 after 1 rew - -commit 4b28757b6c8df8c821aec940d13d51fc1ea30bad -Author: UmarVis -Date: Sun Dec 4 13:58:25 2022 +0300 - - TZ 9 - -commit 3aa8b57dda2efac245c8aa1aca245d645cd20e42 (origin/main, origin/HEAD, main) -Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> -Date: Sun Dec 4 13:10:45 2022 +0300 - - Initial commit diff --git a/dddd b/dddd deleted file mode 100644 index 305b5bf..0000000 --- a/dddd +++ /dev/null @@ -1,26 +0,0 @@ -commit 141724278ecaf4242892220c96640f718f383eb3 (origin/develop) -Merge: 3aa8b57 ed313f5 -Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> -Date: Mon Dec 5 20:18:58 2022 +0300 - - Merge pull request #1 from UmarVis/controllers-films-users - - TZ 9 - -commit ed313f583b516ff23dc4ea7623a9bbe396843235 (HEAD -> controllers-films-users, origin/controllers-films-users) -Author: UmarVis -Date: Mon Dec 5 20:13:39 2022 +0300 - - TZ 9 after 1 rew - -commit 4b28757b6c8df8c821aec940d13d51fc1ea30bad -Author: UmarVis -Date: Sun Dec 4 13:58:25 2022 +0300 - - TZ 9 - -commit 3aa8b57dda2efac245c8aa1aca245d645cd20e42 (origin/main, origin/HEAD, main) -Author: Умар Висаитов <100874991+UmarVis@users.noreply.github.com> -Date: Sun Dec 4 13:10:45 2022 +0300 - - Initial commit