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

Add friends likes #109

Open
wants to merge 6 commits into
base: add-friends-likes
Choose a base branch
from
Open
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
95 changes: 95 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?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>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</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>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.zalando</groupId>
<artifactId>logbook-spring-boot-starter</artifactId>
<version>3.7.2</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<failOnViolation>true</failOnViolation>
<logViolationCountToConsole>true</logViolationCountToConsole>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.yandex.practicum.filmorate;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@Slf4j
@SpringBootApplication
public class FilmorateApplication {
public static void main(String[] args) {
SpringApplication.run(FilmorateApplication.class, args);
log.info("Приложение запущено");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.yandex.practicum.filmorate.controller;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import ru.yandex.practicum.filmorate.ecxeption.NotFoundException;
import ru.yandex.practicum.filmorate.ecxeption.OccurredException;
import ru.yandex.practicum.filmorate.ecxeption.ValidationException;
import ru.yandex.practicum.filmorate.model.ErrorResponse;

@RestControllerAdvice
public class ErrorHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse validationException(final ValidationException e) {
return new ErrorResponse(e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse occurredException(final OccurredException e) {
return new ErrorResponse(e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse notFoundException(final NotFoundException e) {
return new ErrorResponse(e.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package ru.yandex.practicum.filmorate.controller;

import jakarta.validation.Valid;
import ru.yandex.practicum.filmorate.model.Film;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.service.FilmService;

import java.util.Collection;

@RestController
@RequestMapping("/films")
public class FilmController {
private final FilmService filmService;

public FilmController(FilmService filmService) {
this.filmService = filmService;
}

@GetMapping
public Collection<Film> getAllFilms() {
return filmService.getAllFilms();
}

@GetMapping("/{id}")
public Film getFilmById(@PathVariable("id") long id) {
return filmService.getFilmById(id);
}

@PostMapping
public Film createFilm(@Valid @RequestBody Film film) {
return filmService.createFilm(film);
}

@PutMapping
public Film updateFilm(@Valid @RequestBody Film film) {
return filmService.updateFilm(film);
}

@PutMapping("/{id}/like/{userId}")
public Film userLikesFilm(@PathVariable("id") Long id, @PathVariable("userId") Long userId) {
return filmService.userLikesFilm(id, userId);
}

@DeleteMapping("/{id}/like/{userId}")
public Film deleteLikesFilm(@PathVariable("id") Long id, @PathVariable("userId") Long userId) {
return filmService.deleteLikesFilm(id, userId);
}

@GetMapping("/popular")
public Collection<Film> listFirstCountFilm(@RequestParam(defaultValue = "10") int count) {
return filmService.listFirstCountFilm(count);
}

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

import jakarta.validation.Valid;
import ru.yandex.practicum.filmorate.model.User;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.service.UserService;

import java.util.Collection;

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

private final UserService userService;

UserController(UserService userService) {
this.userService = userService;
}

@GetMapping
public Collection<User> getAllUsers() {
return userService.getAllUsers();
}

@GetMapping("/{id}")
public User getUserById(@PathVariable("id") long id) {
return userService.getUserById(id);
}

@PostMapping
public User createUser(@Valid @RequestBody User user) {
return userService.createUser(user);
}

@PutMapping
public User updateUser(@Valid @RequestBody User user) {
return userService.updateUser(user);
}

@PutMapping("/{id}/friends/{friendId}")
public User putFriends(@PathVariable("id") long id, @PathVariable("friendId") long friendId) {
return userService.makeFriendship(id, friendId);
}

@DeleteMapping("/{id}/friends/{friendId}")
public User deleteFriends(@PathVariable("id") long id, @PathVariable("friendId") long friendId) {
return userService.deleteFriendship(id, friendId);
}

@GetMapping("/{id}/friends")
public Collection<User> listFriends(@PathVariable("id") long id) {
return userService.listOfFriends(id);
}

@GetMapping("/{id}/friends/common/{otherId}")
public Collection<User> commonFriends(@PathVariable("id") long id, @PathVariable("otherId") long otherId) {
return userService.listOfCommonFriends(id, otherId);
}

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

public class NotFoundException extends RuntimeException {
public NotFoundException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.ecxeption;

public class OccurredException extends RuntimeException {
public OccurredException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.ecxeption;

public class ValidationException extends RuntimeException {
public ValidationException(String string) {
super(string);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.yandex.practicum.filmorate.model;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ErrorResponse {
String error;
}

27 changes: 27 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,27 @@
package ru.yandex.practicum.filmorate.model;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Film {
Long id;
@NotBlank(message = "Название не может быть пустым!")
String name;
@Size(max = 200, message = "Максимальная длина описания — 200 символов!")
String description;
LocalDate releaseDate;
@Positive(message = "Продолжительность фильма должна быть положительным числом!")
int duration;
Set<Long> likes = new HashSet<>();
}
27 changes: 27 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,27 @@
package ru.yandex.practicum.filmorate.model;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Past;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.HashSet;
import java.util.Set;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
Long id;
@Email(message = "Введенный email не соответствует формату email-адресов!")
String email;
@NotBlank(message = "Логин не может быть пустым и содержать пробелы!")
String login;
String name;
@Past(message = "Дата рождения не может быть в будущем!")
LocalDate birthday;
Set<Long> friends = new HashSet<>();
}
Loading
Loading