Skip to content
Merged
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
11 changes: 11 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,22 @@
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ public class FilmorateApplication {
public static void main(String[] args) {
SpringApplication.run(FilmorateApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,85 @@
package ru.yandex.practicum.filmorate.controller;

import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Film;
import jakarta.validation.ValidationException;

import java.time.LocalDate;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/films")
public class FilmController {
}

private final Map<Integer, Film> films = new HashMap<>();

@GetMapping
public Collection<Film> findAll() {
log.info("Список фильмов выведен");
return films.values();
}

private int getNextId() {
int currentMaxId = films.keySet()
.stream()
.mapToInt(id -> id)
.max()
.orElse(0);
return ++currentMaxId;
}

@PostMapping
public Film create(@Valid @RequestBody Film film) {
validateFilm(film);
film.setId(getNextId());
films.put(film.getId(), film);
log.info("Фильм: {} добавлен в базу", film);
return film;
}

@PutMapping
public Film update(@Valid @RequestBody Film newFilm) {
if (newFilm.getId() == null) {
log.warn("Не указан id");
throw new ValidationException("Id должен быть указан");
}
if (!films.containsKey(newFilm.getId())) {
log.warn("Фильм с указанным id не найден");
throw new ValidationException("Фильм с id = " + newFilm.getId() + " не найден");
}
validateFilm(newFilm);
Film oldFilm = films.get(newFilm.getId());
oldFilm.setDescription(newFilm.getDescription());
oldFilm.setDuration(newFilm.getDuration());
oldFilm.setName(newFilm.getName());
oldFilm.setReleaseDate(newFilm.getReleaseDate());
log.info("Данные о фильме: {} обновлены", oldFilm);
return oldFilm;
}

private void validateFilm(Film film) {
if (film.getDescription().length() > 200) {
log.warn("Ошибка лимита");
throw new ValidationException("Описание превышает 200 символов");
}
if (film.getReleaseDate().isBefore(LocalDate.of(1895, 12, 28))) {
log.warn("Ошибка даты");
throw new ValidationException("Неверная дата релиза");
}

if (film.getName() == null || film.getName().isBlank()) {
log.warn("Пустое название фильма");
throw new ValidationException("Название не может быть пустым");
}

if (film.getDuration() < 1) {
log.warn("Ошибка длительности");
throw new ValidationException("Длительность не может быть меньше 1");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
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.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/users")
public class UserController {

private final Map<Integer, User> users = new HashMap<>();

@GetMapping
public Collection<User> findAll() {
log.info("Список фильмов выведен");
return users.values();
}

private int getNextId() {
int currentMaxId = users.keySet()
.stream()
.mapToInt(id -> id)
.max()
.orElse(0);
return ++currentMaxId;
}

@PostMapping
public User create(@RequestBody User user) {
validateUser(user);
user.setId(getNextId());
users.put(user.getId(), user);
log.info("Пользователь: {} добавлен в базу", user);
return user;
}

@PutMapping
public User update(@RequestBody User newUser) {
if (newUser.getId() == null) {
log.warn("Не указан id");
throw new ValidationException("Id должен быть указан");
}
if (!users.containsKey(newUser.getId())) {
log.warn("Пользователь с указанным id не найден");
throw new ValidationException("Пользователь с id = " + newUser.getId() + " не найден");
}
validateUser(newUser);
User oldUser = users.get(newUser.getId());
oldUser.setEmail(newUser.getEmail());
oldUser.setName(newUser.getName());
oldUser.setLogin(newUser.getLogin());
oldUser.setBirthday(newUser.getBirthday());
log.info("Данные о пользователе: {} обновлены", oldUser);
return oldUser;
}

private void validateUser(User user) {
if (!user.getEmail().contains("@")) {
log.warn("Ошибка в формате почты");
throw new ValidationException("Неверная почта");
}
if (user.getBirthday().isAfter(LocalDate.now())) {
log.warn("Ошибка в дате рождения");
throw new ValidationException("Неверная дата рождения");
}
if (user.getLogin().contains(" ")) {
log.warn("Ошибка в формате логина");
throw new ValidationException("Неправильный формат логина");
}
if (user.getName() == null || user.getName().trim().isEmpty()) {
log.info("Пустое имя пользователя заменено на логин");
user.setName(user.getLogin());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.exception;

public class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}
19 changes: 15 additions & 4 deletions src/main/java/ru/yandex/practicum/filmorate/model/Film.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
package ru.yandex.practicum.filmorate.model;

import lombok.Getter;
import lombok.Setter;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.time.LocalDate;

/**
* Film.
*/
@Getter
@Setter
@Data
public class Film {
private Integer id;
@NotBlank
private String name;
private String description;
@NotNull
private LocalDate releaseDate;
@Min(1)
private int duration;
}
14 changes: 14 additions & 0 deletions src/main/java/ru/yandex/practicum/filmorate/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.yandex.practicum.filmorate.model;

import lombok.Data;

import java.time.LocalDate;

@Data
public class User {
private Integer id;
private String email;
private String login;
private String name;
private LocalDate birthday;
}
2 changes: 1 addition & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@

server.port=8080
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.yandex.practicum.filmorate.controller;

import jakarta.validation.ValidationException;
import org.junit.jupiter.api.Test;
import ru.yandex.practicum.filmorate.model.Film;
import static org.junit.jupiter.api.Assertions.*;

import java.time.LocalDate;

public class FilmControllerTest {

FilmController filmController = new FilmController();

@Test
void getFilmTest() {
Film film = new Film();
film.setReleaseDate(LocalDate.now());
film.setDuration(100);
film.setName("test");
film.setDescription("t");
filmController.create(film);
film.setName(" ");
assertThrows(ValidationException.class, () -> filmController.update(film));
film.setName("test");
String description200 = "A".repeat(200);
film.setDescription(film.getDescription() + description200);
assertThrows(ValidationException.class, () -> filmController.update(film));
film.setDescription("t");
film.setReleaseDate(LocalDate.of(1895, 12, 27));
assertThrows(ValidationException.class, () -> filmController.update(film));
film.setReleaseDate(LocalDate.now());
film.setDuration(0);
assertThrows(ValidationException.class, () -> filmController.update(film));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.yandex.practicum.filmorate.controller;

import org.junit.jupiter.api.Test;
import ru.yandex.practicum.filmorate.exception.ValidationException;
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 UserControllerTest {
UserController userController = new UserController();

@Test
void getFilmTest() {
User user = new User();
user.setName("test1");
user.setLogin("test2");
user.setBirthday(LocalDate.of(2000, 12, 27));
user.setEmail("test@");
userController.create(user);
user.setEmail(" ");
assertThrows(ValidationException.class, () -> userController.update(user));
user.setEmail("test2@");
user.setLogin("TEST ETS");
assertThrows(ValidationException.class, () -> userController.update(user));
user.setLogin("test2");
user.setName(" ");
userController.update(user);
assertEquals(user.getLogin(), user.getName(), "Имя совпадает с логином");
user.setBirthday(LocalDate.of(2200, 12, 27));
assertThrows(ValidationException.class, () -> userController.update(user));
}
}