Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Controllers films users #112

Closed
wants to merge 3 commits into from
Closed
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
46 changes: 46 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>ru.yandex.practicum</groupId>
<artifactId>filmorate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>filmorate</name>
<description>filmorate</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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);
}

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

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.exceptions.ValidationException;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.validators.FilmValidator;

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

@RestController
@RequestMapping("/films")
@Slf4j
public class FilmController {
private final Map<Integer, Film> films = new HashMap<>();

@PostMapping
public Film addFilm(@RequestBody Film film) {
if (FilmValidator.isValidate(film)) {
film.setId(getNextId());
films.put(film.getId(), film);
} else
throw new ValidationException("Непредвиденная ошибка..");
return film;
}

@PutMapping
public Film updateFilm(@RequestBody Film film) {
if (FilmValidator.isValidate(film)) {
if (films.containsKey(film.getId())) {
films.replace(film.getId(), film);
} else throw new ValidationException("Фильма с таким id не существует");
} else
throw new ValidationException("Непредвиденная ошибка");
return film;
}

@GetMapping
public Collection<Film> getFilms() {
return films.values();
}

private Integer getNextId() {
Integer currentMaxId = films.keySet()
.stream()
.mapToInt(id -> id)
.max()
.orElse(0);
return ++currentMaxId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.exceptions.ValidationException;
import ru.yandex.practicum.filmorate.model.User;
import ru.yandex.practicum.filmorate.validators.UserValidator;

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

@RestController
@RequestMapping("/users")
@Slf4j
public class UserController {
private final Map<Integer, User> users = new HashMap<>();

@PostMapping
public User addUser(@RequestBody User user) {
if (UserValidator.isValidate(user)) {
user.setId(getNextId());
users.put(user.getId(), user);
} else
throw new ValidationException("Непредвиденная ошибка..");
return user;
}

@PutMapping
public User updateUser(@RequestBody User user) {
if (UserValidator.isValidate(user)) {
if (users.containsKey(user.getId()))
users.replace(user.getId(), user);
else throw new ValidationException("Пользователя с таким id не существует");
} else
throw new ValidationException("Непредвиденная ошибка..");
return user;
}

@GetMapping
public Collection<User> getUsers() {
return users.values();
}

private Integer getNextId() {
Integer currentMaxId = users.keySet()
.stream()
.mapToInt(id -> id)
.max()
.orElse(0);
return ++currentMaxId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.exceptions;

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

import lombok.*;

import java.time.LocalDate;

@Data
public class Film {
private int id;
private String name;
private String description;
private LocalDate releaseDate;
private int duration;
}
21 changes: 21 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,21 @@
package ru.yandex.practicum.filmorate.model;

import lombok.Data;

import java.time.LocalDate;

@Data
public class User {
private int id;
private String email;
private String login;
private String name;
private LocalDate birthday;

public User(String email, String login, LocalDate birthday) {
this.email = email;
this.login = login;
this.name = login;
this.birthday = birthday;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ru.yandex.practicum.filmorate.validators;

import lombok.extern.slf4j.Slf4j;
import ru.yandex.practicum.filmorate.exceptions.ValidationException;
import ru.yandex.practicum.filmorate.model.Film;


import java.time.LocalDate;

@Slf4j
public class FilmValidator {
private final static int MAX_DESCRIPTION_LENGTH = 200;
private final static LocalDate MIN_RELEASE_DATE = LocalDate.of(1895, 12, 12);

public static boolean isValidate(Film film) {
return (checkName(film) && checkDescription(film) && checkDuration(film) && checkReleaseDate(film));
}

private static boolean checkName(Film film) {
if (!film.getName().isBlank() || film.getName().equals(null))
return true;
else
throw new ValidationException("Название фильма не может быть пустым");
}

private static boolean checkDescription(Film film) {
if (film.getDescription().length() <= MAX_DESCRIPTION_LENGTH)
return true;
else
throw new ValidationException("Описание фильма не может быть длиннее 200 символов");
}

private static boolean checkReleaseDate(Film film) {
if (film.getReleaseDate().isAfter(MIN_RELEASE_DATE))
return true;
else
throw new ValidationException("Некорректная дата выпуска");
}

private static boolean checkDuration(Film film) {
if (film.getDuration() > 0) {
return true;
}
else
throw new ValidationException("Длительность фильма не может быть отрицательной");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package ru.yandex.practicum.filmorate.validators;

import lombok.extern.slf4j.Slf4j;
import ru.yandex.practicum.filmorate.exceptions.ValidationException;
import ru.yandex.practicum.filmorate.model.User;

import java.time.LocalDate;

@Slf4j
public class UserValidator {

public static boolean isValidate(User user) {
return (checkMail(user) && checkLogin(user) && checkName(user) && checkBirthday(user));
}

private static boolean checkMail(User user) {
if (!user.getEmail().isEmpty() && user.getEmail().contains("@"))
return true;
else
throw new ValidationException("Почта пустая или не содержит \"@\"");
}

private static boolean checkLogin(User user) {
if (!user.getLogin().isBlank() && !user.getLogin().contains(" "))
return true;
else
throw new ValidationException("Логин не может быть пустым или содержит пробелы");
}

private static boolean checkName(User user) {
if (user.getName().isBlank())
user.setName(user.getLogin());
return true;
}

private static boolean checkBirthday(User user) {
if (!user.getBirthday().isAfter(LocalDate.now()))
return true;
else
throw new ValidationException("Привет из будущего!)");
}
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -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() {
}

}
Loading