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
50 changes: 29 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,30 @@

## Текущий этап работы над проектом:
Спринт 12:
- Проектирование будущей базы данных;
- Создание ER-диаграммы базы данных.
- Переработана архитектура проекта;
- Добавлены новые модели: MPA-рейтинг, Genre, Likes, Friendship;
- Добавлен слой DAL для работы с данными из базы данных;
- Добавлен маппинг для преобразования записей из базы данных в объекты и обратно;
- Написаны интеграционные тесты;
- Добавлены тестовые хранилища для unit-тестов;
- Переработаны unit-тесты для граничных условий с учетом новой архитектуры проекта;

## Этапы работы над проектом
1. Спринт 10:
- Создание каркаса приложения с использользованием Spring Boot;
- Вся логика и хранение данных находятся в контроллерах;
- Разработан базовый функционал: добавление, обновление и получение всех фильмов/пользователей;
- Написаны unit-тесты для текущего функционала.
- Создание каркаса приложения с использользованием Spring Boot;
- Вся логика и хранение данных находятся в контроллерах;
- Разработан базовый функционал: добавление, обновление и получение всех фильмов/пользователей;
- Написаны unit-тесты для текущего функционала.
2. Спринт 11:
- Добавлены классы-хранилища для работы с данными о фильмах и пользователях;
- Добавлен новый функционал, позволяющий добавлять друзей и ставить лайки фильмам;
- Добавлены аннотации @service и @component для внедрения зависимостей;
- В классы контроллеры добавлена аннотация @ResponseStatus для указания HTTP-статуса ответа, который должен вернуться при обработке запроса;
- Добавлены классы ErrorHandler и ErrorResponse для централизованной обработки ошибок;
- Добавлены unit-тесты для нового функционала.
- Добавлены классы-хранилища для работы с данными о фильмах и пользователях;
- Добавлен новый функционал, позволяющий добавлять друзей и ставить лайки фильмам;
- Добавлены аннотации @service и @component для внедрения зависимостей;
- В классы контроллеры добавлена аннотация @ResponseStatus для указания HTTP-статуса ответа, который должен вернуться при обработке запроса;
- Добавлены классы ErrorHandler и ErrorResponse для централизованной обработки ошибок;
- Добавлены unit-тесты для нового функционала.
3. Спринт 12. Промежуточное задание:
- Спроектирована будущая база данных;
- Создана ER-диаграмма базы данных.

## ER-диаграмма
![Схема](filmorate_diagram.png)
Expand All @@ -34,7 +42,7 @@

1. Получить всех пользователей, кто родился не раньше 1995 года
```sql
SELECT *
SELECT u.user_id, u.email, u.login, u.name, u.birthday
FROM users AS u
WHERE EXTRACT(YEAR
FROM birthday) >= 1995
Expand All @@ -43,26 +51,26 @@ ORDER BY birthday
2. Получить фильмы, у которых не меньше двух лайков
```sql
SELECT f.film_id,
f.name AS film_name,
f.name AS title,
f.description,
f.release_date,
m.name AS mpa_rating,
COUNT(l.user_id) AS likes_count
FROM films AS f
LEFT JOIN likes l ON f.film_id = l.film_id
GROUP BY f.film_id,
f.name,
f.description,
f.release_date
JOIN mpa_rating AS m ON f.rating_id = m.rating_id
GROUP BY f.film_id, m.name
HAVING COUNT(l.user_id) >= 2
ORDER BY likes_count DESC;
```

3. Получить пользователей, у которых яндекс почта
```sql
SELECT u.user_id,
u.email,
u.login,
u.name
FROM users AS u
WHERE email LIKE '%yandex%'
```
WHERE email LIKE '%yandex%' OR email LIKE '%@ya.ru%'
ORDER BY user_id
```
Binary file modified filmorate_diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
114 changes: 59 additions & 55 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,59 +1,63 @@
<?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>
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>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

<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.zalando</groupId>
<artifactId>logbook-spring-boot-starter</artifactId>
<version>3.7.2</version>
</dependency>

</dependencies>

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

</project>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.dto.FilmDto;
import ru.yandex.practicum.filmorate.dto.NewFilmRequest;
import ru.yandex.practicum.filmorate.dto.UpdateFilmRequest;
import ru.yandex.practicum.filmorate.service.FilmService;

import java.util.Collection;
Expand All @@ -18,22 +20,22 @@ public class FilmController {
private final FilmService filmService;

@GetMapping
public Collection<Film> findAll() {
public Collection<FilmDto> findAll() {
log.info("Получен запрос на получение списка всех фильмов");
return filmService.findAll();
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Film create(@RequestBody Film newFilm) {
log.info("Получен запрос на добавление фильма {}", newFilm.getName());
return filmService.create(newFilm);
public FilmDto create(@RequestBody NewFilmRequest newFilmRequest) {
log.info("Получен запрос на добавление фильма {}", newFilmRequest.getName());
return filmService.create(newFilmRequest);
}

@PutMapping
public Film update(@RequestBody Film film) {
log.info("Получен запрос на обновление фильма c Id:{}", film.getId());
return filmService.update(film);
public FilmDto update(@RequestBody UpdateFilmRequest filmRequest) {
log.info("Получен запрос на обновление фильма c Id:{}", filmRequest.getId());
return filmService.update(filmRequest);
}

@DeleteMapping("/{id}")
Expand All @@ -44,9 +46,9 @@ public void delete(@PathVariable("id") Long filmId) {
}

@GetMapping("/{id}")
public Film getById(@PathVariable("id") Long filmId) {
public FilmDto getById(@PathVariable("id") Long filmId) {
log.info("Получен запрос на получение фильма с Id:{}", filmId);
return filmService.getById(filmId);
return filmService.findById(filmId);
}

@PutMapping("/{id}/like/{userId}")
Expand All @@ -64,9 +66,9 @@ public void removeLike(@PathVariable("id") Long filmId, @PathVariable("userId")
}

@GetMapping("/popular")
public Collection<Film> getPopularFilms(
public Collection<FilmDto> getPopularFilms(
@RequestParam(defaultValue = "10") int count) {
log.info("Получен запрос на получение топ-{} фильмов по количеству лайков", count);
return filmService.getPopularFilms(count);
return filmService.findPopularFilms(count);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.yandex.practicum.filmorate.model.Genre;
import ru.yandex.practicum.filmorate.service.GenreService;

import java.util.Collection;

@Slf4j
@RestController
@RequestMapping("/genres")
@RequiredArgsConstructor
public class GenreController {

private final GenreService genreService;

@GetMapping
public Collection<Genre> findAll() {
log.info("Получен запрос на получение всех пользователей");
return genreService.findAll();
}

@GetMapping("/{id}")
public Genre findById(@PathVariable("id") Long genreId) {
log.info("Получен запрос на получение жанра с id:{}", genreId);
return genreService.findById(genreId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.yandex.practicum.filmorate.model.Mpa;
import ru.yandex.practicum.filmorate.service.MpaService;

import java.util.Collection;

@Slf4j
@RestController
@RequestMapping("/mpa")
@RequiredArgsConstructor
public class MpaController {

private final MpaService mpaService;

@GetMapping
public Collection<Mpa> findAll() {
log.info("Получен запрос на получение всех MPA-рейтингов");
return mpaService.findAll();
}

@GetMapping("/{id}")
public Mpa findById(@PathVariable("id") Long ratingId) {
log.info("Получен запрос на получение MPA-рейтинга с id:{}", ratingId);
return mpaService.findById(ratingId);
}
}
Loading
Loading