Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
da5d1a2
первая попытка
progingir Feb 28, 2025
752106b
удален файл
progingir Feb 28, 2025
61ca261
стиль
progingir Feb 28, 2025
70c62e7
обновлены запросы
progingir Feb 28, 2025
566820a
поменяла запросы
progingir Feb 28, 2025
b94fb11
изменен контроллер
progingir Feb 28, 2025
af1a962
куча изменений
progingir Feb 28, 2025
883df51
опять стиль
progingir Feb 28, 2025
a1292fb
пофиксила ошибочки
progingir Feb 28, 2025
b6d1eb9
3 утра
progingir Feb 28, 2025
f9f1c77
поправила класс фильмов
progingir Mar 1, 2025
a467709
14
progingir Mar 1, 2025
d80198c
2
progingir Mar 1, 2025
cb61ead
работаем с жанрами
progingir Mar 1, 2025
620288c
работаем с мпа
progingir Mar 1, 2025
6b1bc34
добавила обработку еще одной ошибки
progingir Mar 1, 2025
9fc8e20
попытка обработать ошибки
progingir Mar 1, 2025
cc7151a
проверка фильмов
progingir Mar 1, 2025
6dbf4f5
стиль стиль
progingir Mar 1, 2025
c8b6ad5
aaaa
progingir Mar 1, 2025
685fb63
все изменения назад
progingir Mar 1, 2025
c63d6fe
добавила обработчик
progingir Mar 1, 2025
fa2d755
aaaaaaaaaaaaaaaaaa
progingir Mar 1, 2025
c85e045
132 попытка
progingir Mar 1, 2025
943350e
откат изменений
progingir Mar 1, 2025
bf5baf9
валидация
progingir Mar 1, 2025
4725a47
обновила методы update create
progingir Mar 1, 2025
546be13
исправила исключение
progingir Mar 1, 2025
801d655
рефракторинг класса filmdbstorage
progingir Mar 1, 2025
9977efd
еще рефракторинг
progingir Mar 1, 2025
d01fd5d
рефракторингг
progingir Mar 1, 2025
84cbfe8
все еще делаем код красивым
progingir Mar 1, 2025
0863670
побаловалась с документацией
progingir Mar 1, 2025
264bb8f
убраны выбросы исключений
progingir Mar 2, 2025
34fb7e6
стиль
progingir Mar 2, 2025
8587e4d
убрала лишний парсинг
progingir Mar 2, 2025
61fcc05
убрала mpa constant
progingir Mar 2, 2025
a99c72b
notfoundexception и название запросов
progingir Mar 2, 2025
8c6a131
вынесла классы
progingir Mar 2, 2025
9407269
стиль
progingir Mar 2, 2025
e35156a
убрала assert
progingir Mar 2, 2025
9641c76
убрала множественные селекторы
progingir Mar 2, 2025
2e335dd
поправила конф
progingir Mar 2, 2025
cdd107d
стиль
progingir Mar 2, 2025
8e2ef28
все изменения назад, потому что падают с ошибкой
progingir Mar 2, 2025
1e3f047
все изменения назад
progingir Mar 2, 2025
57c2362
убрала лишнюю проверку
progingir Mar 2, 2025
11b239e
изменения назад, потому что опять ошибка
progingir Mar 2, 2025
c9d1736
добавила foreign key
progingir Mar 2, 2025
084da27
еще один foreign key
progingir Mar 2, 2025
bcad0ce
откат по тестам
progingir Mar 2, 2025
d2fa888
переделываю через json
progingir Mar 2, 2025
5b6aaec
стиль
progingir Mar 2, 2025
ffc8e2b
откат изменений
progingir Mar 2, 2025
4da9d03
убрала парсер
progingir Mar 2, 2025
3d7acc3
откат изменений
progingir Mar 2, 2025
fe91557
убрала throws
progingir Mar 2, 2025
50bdf27
стиль
progingir Mar 2, 2025
a3cc1c0
добавлены модификаторы доступа
progingir Mar 2, 2025
28a9df4
переименовала
progingir Mar 2, 2025
1ffdbfc
убрала ненужные методы
progingir Mar 2, 2025
e920739
получаем общих друзей через inner join
progingir Mar 2, 2025
e8ca87a
откат изменений
progingir Mar 2, 2025
de3ef48
defaultValue = 10 так же оставила
progingir Mar 2, 2025
096d0c7
поменяла сообщения об ошибках
progingir Mar 2, 2025
c034739
передаю параметр count в запрос
progingir Mar 2, 2025
cd8b0d7
откат правок
progingir Mar 2, 2025
1f37ed4
убрала лишнюю аннотацию
progingir Mar 2, 2025
6a6b99a
стиль
progingir Mar 2, 2025
2ce3532
переименовала запросы
progingir Mar 2, 2025
6ac5615
стиль
progingir Mar 2, 2025
4d7f8bd
стиииль
progingir Mar 2, 2025
8efda50
вынесла классы
progingir Mar 2, 2025
c450028
спасите
progingir Mar 2, 2025
2936d2f
ненужные импорты
progingir Mar 2, 2025
acbdf27
убрала нереализованный метод
progingir Mar 2, 2025
07f40cd
поменяла аннотацию
progingir Mar 2, 2025
a61057c
ненужный import
progingir Mar 2, 2025
dd74d6f
пора бы настроить идею на удаление ненужных импортов, да?
progingir Mar 2, 2025
d37c609
без аннотаций вообще все падает, вернула обратно
progingir Mar 2, 2025
c7d8b6b
получение друзей через один запрос
progingir Mar 2, 2025
051172f
название переменной
progingir Mar 2, 2025
3095016
пробуем
progingir Mar 2, 2025
1b2cbfa
убрала проверку
progingir Mar 2, 2025
efa09ab
возврат изменений
progingir Mar 2, 2025
a2f9c7b
пробуем
progingir Mar 2, 2025
4ab5358
кошмар
progingir Mar 2, 2025
9c5a915
откат изменений
progingir Mar 2, 2025
98eab61
лимит
progingir Mar 2, 2025
b5292b9
пробуем
progingir Mar 2, 2025
80e7f12
опять пробуем
progingir Mar 2, 2025
313816f
откат изменений
progingir Mar 2, 2025
da5e701
ижектю через конструктор
progingir Mar 3, 2025
f738fa6
сделала бины с маленькой буквы
progingir Mar 3, 2025
f0e464d
убрала аннотацию
progingir Mar 3, 2025
8739351
стиль кода
progingir Mar 3, 2025
3f33f52
убрала аннотацию
progingir Mar 3, 2025
490817c
убрала еще ненужные аннотации
progingir Mar 3, 2025
0d46144
убрала аннотацию @Qualifier
progingir Mar 3, 2025
97c5632
убрала проверку айди, скорее всего, полетят тесты
progingir Mar 3, 2025
7f213ed
пытаюсь внести count в запрос
progingir Mar 3, 2025
b5a841d
откат изменений
progingir Mar 3, 2025
29db077
избавляюсь от лишнего парсинга
progingir Mar 3, 2025
d716acb
лишний парсинг
progingir Mar 3, 2025
06af9ea
стиль
progingir Mar 3, 2025
bc332bd
опять
progingir Mar 3, 2025
2a32abc
парсим напрямую через buffer
progingir Mar 3, 2025
798bcba
ааа
progingir Mar 3, 2025
da95413
....
progingir Mar 3, 2025
239d5dd
стиль
progingir Mar 3, 2025
f04cfc2
откат изменений
progingir Mar 3, 2025
60500ad
sss
progingir Mar 3, 2025
2c6864a
откат
progingir Mar 3, 2025
0a9c5c1
правки
progingir Mar 3, 2025
bb81b4e
dd
progingir Mar 3, 2025
a44d1df
откат
progingir Mar 3, 2025
3089811
опять класс по парсингу
progingir Mar 3, 2025
265b785
откат
progingir Mar 3, 2025
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
21 changes: 21 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,27 @@
<version>4.0.0</version>
<scope>test</scope>
</dependency>

<!-- H2 Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Spring Boot JDBC Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- Spring Boot Test Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,118 @@
package ru.yandex.practicum.filmorate.controller;

import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import ru.yandex.practicum.filmorate.exception.NotFoundException;
import ru.yandex.practicum.filmorate.model.Buffer;
import ru.yandex.practicum.filmorate.model.Film;
import ru.yandex.practicum.filmorate.service.FilmService;
import ru.yandex.practicum.filmorate.model.FilmResponse;
import ru.yandex.practicum.filmorate.service.FilmInterface;
import ru.yandex.practicum.filmorate.storage.film.FilmStorage;
import ru.yandex.practicum.filmorate.storage.user.UserStorage;

import java.util.Collection;
import java.util.Map;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

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

private final FilmService filmService;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final String DEFAULT_GENRE = "нет жанра";

private final FilmStorage filmStorage;
private final UserStorage userStorage;
private final FilmInterface filmInterface;

@Autowired
public FilmController(FilmService filmService) {
this.filmService = filmService;
public FilmController(
FilmStorage filmStorage,
UserStorage userStorage,
FilmInterface filmInterface
) {
this.filmStorage = filmStorage;
this.userStorage = userStorage;
this.filmInterface = filmInterface;
}

//создание фильма
@PostMapping
public Film createFilm(@Valid @RequestBody Film film) {
return filmService.createFilm(film);
@GetMapping
public List<Film> findAll() {
return filmStorage.findAll();
}

//обновление фильма
@PutMapping
public Film update(@Valid @RequestBody Film film) {
return filmService.update(film);
@GetMapping("/{id}")
public FilmResponse findById(@PathVariable("id") Long id) {
return filmStorage.findById(id);
}

//получение всех фильмов
@GetMapping
public Collection<Film> getFilms() {
return filmService.getFilms();
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public FilmResponse create(@Valid @RequestBody ObjectNode objectNode) {
Buffer buffer = parseObjectNodeToBuffer(objectNode);
return filmStorage.create(buffer);
}

//получение фильма по ID
@GetMapping("/{id}")
public Film getFilmById(@PathVariable Long id) {
return filmService.getFilmById(id);
@PutMapping
public FilmResponse update(@Valid @RequestBody ObjectNode objectNode) {
Buffer buffer = parseObjectNodeToBuffer(objectNode);
return filmStorage.update(buffer);
}

@PutMapping("/{id}/like/{userId}")
public ResponseEntity<?> addLike(@PathVariable Long id, @PathVariable Long userId) {
try {
filmService.addLike(id, userId);
return ResponseEntity.ok().build(); // Возвращаем 200 OK, если лайк добавлен
} catch (NotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("error", e.getMessage())); // Возвращаем 404 и JSON с ошибкой
}
public FilmResponse addLike(@Valid @PathVariable("id") Long id, @PathVariable("userId") Long userId) {
return filmInterface.addLike(userId, id);
}

//удаление лайка из фильма
@DeleteMapping("/{id}/like/{userId}")
public ResponseEntity<Void> removeLike(@PathVariable Long id, @PathVariable Long userId) {
filmService.removeLike(id, userId);
return ResponseEntity.ok().build();
public FilmResponse delLike(@Valid @PathVariable("id") Long id, @PathVariable("userId") Long userId) {
return filmInterface.delLike(userId, id);
}

//получение популярных фильмов
@GetMapping("/popular")
public Collection<Film> getTopFilms(@RequestParam(defaultValue = "10") int count) {
return filmService.getTopFilms(count);
public LinkedHashSet<FilmResponse> viewRating(@RequestParam(defaultValue = "10") Long count) {
return filmInterface.viewRating(count);
}

/**
* преобразует json объект в объект Buffer
*
* @param objectNode json объект
* @return объект Buffer
*/
private Buffer parseObjectNodeToBuffer(ObjectNode objectNode) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется лишней манипуляцией с данными

Copy link
Owner Author

@progingir progingir Mar 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тесты падают с ошибками без парсинга, пробовала без него, все полетело

Long id = objectNode.has("id") ? objectNode.get("id").asLong() : 0L;
String name = objectNode.get("name").asText();
String description = objectNode.get("description").asText();
String releaseDate = objectNode.get("releaseDate").asText();
Integer duration = objectNode.get("duration").asInt();
List<String> mpa = objectNode.get("mpa").findValuesAsText("id");
List<String> genres = extractGenresFromObjectNode(objectNode);

return Buffer.of(
id,
name,
description,
LocalDate.parse(releaseDate, DATE_FORMATTER),
duration,
genres,
Long.valueOf(mpa.get(0))
);
}

/**
* извлекает список жанров из json объекта
*
* @param objectNode json объект
* @return список жанров
*/
private List<String> extractGenresFromObjectNode(ObjectNode objectNode) {
try {
return objectNode.get("genres").findValuesAsText("id");
} catch (NullPointerException e) {
return List.of(DEFAULT_GENRE);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Genre;
import ru.yandex.practicum.filmorate.service.GenreService;

import java.util.List;

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

private final GenreService genreService;

/**
* получить жанр по его идентификатору
*
* @param id идентификатор жанра
* @return объект жанра
*/
@GetMapping("/{id}")
public Genre getGenreById(@PathVariable Long id) {
return genreService.getGenreById(id);
}

/**
* получить список всех жанров
*
* @return список всех жанров
*/
@GetMapping
public List<Genre> getAllGenres() {
return genreService.getAllGenres();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.yandex.practicum.filmorate.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.yandex.practicum.filmorate.model.Mpa;
import ru.yandex.practicum.filmorate.service.MpaService;

import java.util.List;

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

private final MpaService mpaService;

/**
* получить рейтинг mpa по его идентификатору
*
* @param id идентификатор рейтинга mpa
* @return объект рейтинга mpa
*/
@GetMapping("/{id}")
public Mpa getMpaById(@PathVariable Long id) {
return mpaService.getMpaById(id);
}

/**
* получить список всех рейтингов mpa
*
* @return список всех рейтингов mpa
*/
@GetMapping
public List<Mpa> getAllMpa() {
return mpaService.getAllMpa();
}
}
Loading