diff --git a/backend/src/main/java/com/example/backend/core/configurations/Constants.java b/backend/src/main/java/com/example/backend/core/configurations/Constants.java index 5ca3a8d..fd340f3 100644 --- a/backend/src/main/java/com/example/backend/core/configurations/Constants.java +++ b/backend/src/main/java/com/example/backend/core/configurations/Constants.java @@ -6,7 +6,7 @@ public class Constants { public static final String SEQUENCE_NAME = "hibernate_sequence"; - public static final int DEFUALT_PAGE_SIZE = 10; + public static final int DEFUALT_PAGE_SIZE = 5; public static final String REDIRECT_VIEW = "redirect:"; diff --git a/backend/src/main/java/com/example/backend/favorites/api/FavoriteController.java b/backend/src/main/java/com/example/backend/favorites/api/FavoriteController.java index 4713b32..3ebfe2d 100644 --- a/backend/src/main/java/com/example/backend/favorites/api/FavoriteController.java +++ b/backend/src/main/java/com/example/backend/favorites/api/FavoriteController.java @@ -1,77 +1,181 @@ package com.example.backend.favorites.api; import java.util.List; +import java.util.ArrayList; +import org.springframework.ui.Model; import org.modelmapper.ModelMapper; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; import com.example.backend.core.configurations.Constants; import com.example.backend.favorites.model.FavoriteEntity; import com.example.backend.favorites.service.FavoriteService; +import com.example.backend.movies.api.MovieDTO; +import com.example.backend.movies.api.MovieUserDTO; +import com.example.backend.movies.model.MovieEntity; import com.example.backend.movies.service.MovieService; +import com.example.backend.users.model.UserEntity; import com.example.backend.users.service.UserService; +import com.example.backend.viewed.model.ViewedEntity; +import com.example.backend.viewed.service.ViewedService; -import jakarta.validation.Valid; - -@RestController -@RequestMapping(Constants.API_URL + "/favorite") +@Controller +@RequestMapping(FavoriteController.URL) public class FavoriteController { + public static final String URL = "/favs"; + private static final String FAVORITE_VIEW = "favs"; + private static final String PAGE_ATTRIBUTE = "page"; + private final FavoriteService favoriteService; private final UserService userService; private final MovieService movieService; private final ModelMapper modelMapper; + private final ViewedService viewedServise; public FavoriteController(FavoriteService favoriteService, UserService userService, - MovieService movieService, ModelMapper modelMapper) { + MovieService movieService, ModelMapper modelMapper, ViewedService viewedServise) { this.modelMapper = modelMapper; this.userService = userService; this.favoriteService = favoriteService; + this.viewedServise = viewedServise; this.movieService = movieService; } - private FavoriteDto toDto(FavoriteEntity entity) { - return modelMapper.map(entity, FavoriteDto.class); + private MovieDTO toDtoMovie(MovieEntity entity) { + return modelMapper.map(entity, MovieDTO.class); } - private FavoriteEntity toEntity(FavoriteDto dto) { - final FavoriteEntity entity = modelMapper.map(dto, FavoriteEntity.class); - entity.setMovie(movieService.get(dto.getMovieId())); - entity.setUser(userService.get(dto.getUserId())); - return entity; + private List getListMovieUserDTOs(Integer categorieId, int page) { + List movies = movieService.getAll(categorieId, page, Constants.DEFUALT_PAGE_SIZE) + .stream() + .map(this::toDtoMovie) + .toList(); + List muDTO = new ArrayList(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + List favs = favoriteService.getAll(currentUserId); + List viewes = viewedServise.getAll(currentUserId); + + for (MovieDTO movieDTO : movies) { + MovieUserDTO newMovDto = new MovieUserDTO(); + newMovDto.setMovieDTO(movieDTO); + newMovDto.setCountViewes(movieService.countView(movieDTO.getId())); + + for (FavoriteEntity favoriteEntity : favs) { + if ((int) favoriteEntity.getMovie().getId() == (int) movieDTO.getId()) { + newMovDto.setFavorite(true); + break; + } + newMovDto.setFavorite(false); + } + + for (ViewedEntity viewedEntity : viewes) { + if ((int) viewedEntity.getMovie().getId() == (int) movieDTO.getId()) { + newMovDto.setViewed(true); + break; + } + newMovDto.setViewed(false); + } + + muDTO.add(newMovDto); + } + return muDTO; } - @GetMapping - public List getAll(@RequestParam(name = "userId", defaultValue = "0") Integer userId) { - return favoriteService.getAll(userId).stream().map(this::toDto).toList(); + @GetMapping() + public String getAll(Model model, @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page) { + List muDTO = getListMovieUserDTOs(0, page); + model.addAttribute("movies", muDTO); + model.addAttribute(PAGE_ATTRIBUTE, page); + return FAVORITE_VIEW; } - @GetMapping("/{id}") - public FavoriteDto get(@PathVariable(name = "id") Integer id) { - return toDto(favoriteService.get(id)); + @PostMapping("/changeFavStatus/{id}") + public String changeFavStatus(@PathVariable(name = "id") Integer movieId, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + + boolean isFavorite = false; + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + FavoriteEntity fav = favoriteService.findByUserIdAndMovieId(currentUserId, movieId); + + if (fav == null) { + isFavorite = false; + } else { + isFavorite = true; + } + + if (isFavorite == false) { + + UserEntity user = userService.get(currentUserId); + MovieEntity movie = movieService.get(movieId); + + FavoriteEntity newFav = new FavoriteEntity(null, user, movie); + + favoriteService.create(newFav); + + } else { + + FavoriteEntity delFav = favoriteService.findByUserIdAndMovieId(currentUserId, movieId); + + favoriteService.delete(delFav.getId()); + } + + model.addAttribute(PAGE_ATTRIBUTE, page); + + return Constants.REDIRECT_VIEW + URL; } - @PostMapping - public FavoriteDto create(@RequestBody @Valid FavoriteDto dto) { - return toDto(favoriteService.create(toEntity(dto))); + @PostMapping("/changeViewStatus/{id}") + public String changeViewStatus(@PathVariable(name = "id") Integer movieId, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + + boolean isViewed = false; + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + ViewedEntity view = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + if (view == null) { + isViewed = false; + } else { + isViewed = true; + } + + if (isViewed == false) { + + UserEntity user = userService.get(currentUserId); + MovieEntity movie = movieService.get(movieId); + + ViewedEntity newView = new ViewedEntity(null, user, movie); + + viewedServise.create(newView); + + } else { + + ViewedEntity delView = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + viewedServise.delete(delView.getId()); + } + + model.addAttribute(PAGE_ATTRIBUTE, page); + + return Constants.REDIRECT_VIEW + URL; } - @PutMapping("/{id}") - public FavoriteDto update(@PathVariable(name = "id") Integer id, - @RequestBody FavoriteDto dto) { - return toDto(favoriteService.update(id, toEntity(dto))); - } - - @DeleteMapping("/{id}") - public FavoriteDto delete(@PathVariable(name = "id") Integer id) { - return toDto(favoriteService.delete(id)); - } } diff --git a/backend/src/main/java/com/example/backend/favorites/repository/FavoriteRepository.java b/backend/src/main/java/com/example/backend/favorites/repository/FavoriteRepository.java index 667dfea..806baf3 100644 --- a/backend/src/main/java/com/example/backend/favorites/repository/FavoriteRepository.java +++ b/backend/src/main/java/com/example/backend/favorites/repository/FavoriteRepository.java @@ -3,10 +3,12 @@ package com.example.backend.favorites.repository; import java.util.Optional; import java.util.List; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; import com.example.backend.favorites.model.FavoriteEntity; -public interface FavoriteRepository extends CrudRepository { +public interface FavoriteRepository + extends CrudRepository, PagingAndSortingRepository { List findByUserId(Integer userId); diff --git a/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java b/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java index faab61f..21dcc3d 100644 --- a/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java +++ b/backend/src/main/java/com/example/backend/favorites/service/FavoriteService.java @@ -3,12 +3,16 @@ package com.example.backend.favorites.service; import java.util.List; import java.util.stream.StreamSupport; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.backend.core.errors.NotFoundException; import com.example.backend.favorites.model.FavoriteEntity; import com.example.backend.favorites.repository.FavoriteRepository; +import com.example.backend.users.model.UserEntity; @Service public class FavoriteService { @@ -26,6 +30,11 @@ public class FavoriteService { return repository.findByUserId(userId); } + @Transactional(readOnly = true) + public Page getAll(int page, int size) { + return repository.findAll(PageRequest.of(page, size, Sort.by("id"))); + } + @Transactional(readOnly = true) public FavoriteEntity get(Integer id) { return repository.findById(id).orElseThrow(() -> new NotFoundException(FavoriteEntity.class, id)); diff --git a/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java b/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java index 0cb0df8..f576e15 100644 --- a/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java +++ b/backend/src/main/java/com/example/backend/movies/api/MovieUserController.java @@ -1,5 +1,6 @@ package com.example.backend.movies.api; +import java.util.Map; import java.util.List; import java.util.ArrayList; @@ -21,6 +22,7 @@ import org.springframework.ui.Model; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import com.example.backend.core.api.PageAttributesMapper; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/backend/src/main/java/com/example/backend/viewed/api/ViewedController.java b/backend/src/main/java/com/example/backend/viewed/api/ViewedController.java index 6e2ef78..2d2aac3 100644 --- a/backend/src/main/java/com/example/backend/viewed/api/ViewedController.java +++ b/backend/src/main/java/com/example/backend/viewed/api/ViewedController.java @@ -1,78 +1,182 @@ package com.example.backend.viewed.api; import java.util.List; +import java.util.ArrayList; import org.modelmapper.ModelMapper; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; import com.example.backend.core.configurations.Constants; +import com.example.backend.favorites.model.FavoriteEntity; +import com.example.backend.favorites.service.FavoriteService; import com.example.backend.viewed.model.ViewedEntity; import com.example.backend.viewed.service.ViewedService; +import com.example.backend.movies.api.MovieDTO; +import com.example.backend.movies.api.MovieUserDTO; +import com.example.backend.movies.model.MovieEntity; import com.example.backend.movies.service.MovieService; +import com.example.backend.users.model.UserEntity; import com.example.backend.users.service.UserService; -import jakarta.validation.Valid; - -@RestController -@RequestMapping(Constants.API_URL + "/viewed") +@Controller +@RequestMapping(ViewedController.URL) public class ViewedController { - private final ViewedService viewedService; + public static final String URL = "/viewed"; + private static final String FAVORITE_VIEW = "viewed"; + private static final String PAGE_ATTRIBUTE = "page"; + + private final FavoriteService favoriteService; private final UserService userService; private final MovieService movieService; private final ModelMapper modelMapper; + private final ViewedService viewedServise; public ViewedController( - ViewedService viewedService, UserService userService, - MovieService movieService, ModelMapper modelMapper) { + FavoriteService favoriteService, UserService userService, + MovieService movieService, ModelMapper modelMapper, ViewedService viewedServise) { this.modelMapper = modelMapper; this.userService = userService; - this.viewedService = viewedService; + this.favoriteService = favoriteService; + this.viewedServise = viewedServise; this.movieService = movieService; } - private ViewedDto toDto(ViewedEntity entity) { - return modelMapper.map(entity, ViewedDto.class); + private MovieDTO toDtoMovie(MovieEntity entity) { + return modelMapper.map(entity, MovieDTO.class); } - private ViewedEntity toEntity(ViewedDto dto) { - final ViewedEntity entity = modelMapper.map(dto, ViewedEntity.class); - entity.setMovie(movieService.get(dto.getMovieId())); - entity.setUser(userService.get(dto.getUserId())); - return entity; + private List getListMovieUserDTOs(Integer categorieId, int page) { + List movies = movieService.getAll(categorieId, page, Constants.DEFUALT_PAGE_SIZE) + .stream() + .map(this::toDtoMovie) + .toList(); + List muDTO = new ArrayList(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + List favs = favoriteService.getAll(currentUserId); + List viewes = viewedServise.getAll(currentUserId); + + for (MovieDTO movieDTO : movies) { + MovieUserDTO newMovDto = new MovieUserDTO(); + newMovDto.setMovieDTO(movieDTO); + newMovDto.setCountViewes(movieService.countView(movieDTO.getId())); + + for (FavoriteEntity favoriteEntity : favs) { + if ((int) favoriteEntity.getMovie().getId() == (int) movieDTO.getId()) { + newMovDto.setFavorite(true); + break; + } + newMovDto.setFavorite(false); + } + + for (ViewedEntity viewedEntity : viewes) { + if ((int) viewedEntity.getMovie().getId() == (int) movieDTO.getId()) { + newMovDto.setViewed(true); + break; + } + newMovDto.setViewed(false); + } + + muDTO.add(newMovDto); + } + return muDTO; } - @GetMapping - public List getAll(@RequestParam(name = "userId", defaultValue = "0") Integer userId) { - return viewedService.getAll(userId).stream().map(this::toDto).toList(); + @GetMapping() + public String getAll(Model model, @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page) { + List muDTO = getListMovieUserDTOs(0, page); + model.addAttribute("movies", muDTO); + + model.addAttribute(PAGE_ATTRIBUTE, page); + return FAVORITE_VIEW; } - @GetMapping("/{id}") - public ViewedDto get(@PathVariable(name = "id") Integer id) { - return toDto(viewedService.get(id)); + @PostMapping("/changeFavStatus/{id}") + public String changeFavStatus(@PathVariable(name = "id") Integer movieId, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { + + boolean isFavorite = false; + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + FavoriteEntity fav = favoriteService.findByUserIdAndMovieId(currentUserId, movieId); + + if (fav == null) { + isFavorite = false; + } else { + isFavorite = true; + } + + if (isFavorite == false) { + + UserEntity user = userService.get(currentUserId); + MovieEntity movie = movieService.get(movieId); + + FavoriteEntity newFav = new FavoriteEntity(null, user, movie); + + favoriteService.create(newFav); + + } else { + + FavoriteEntity delFav = favoriteService.findByUserIdAndMovieId(currentUserId, movieId); + + favoriteService.delete(delFav.getId()); + } + + model.addAttribute(PAGE_ATTRIBUTE, page); + + return Constants.REDIRECT_VIEW + URL; } - @PostMapping - public ViewedDto create(@RequestBody @Valid ViewedDto dto) { - return toDto(viewedService.create(toEntity(dto))); - } + @PostMapping("/changeViewStatus/{id}") + public String changeViewStatus(@PathVariable(name = "id") Integer movieId, + @RequestParam(name = PAGE_ATTRIBUTE, defaultValue = "0") int page, + Model model) { - @PutMapping("/{id}") - public ViewedDto update(@PathVariable(name = "id") Integer id, - @RequestBody ViewedDto dto) { - return toDto(viewedService.update(id, toEntity(dto))); - } + boolean isViewed = false; - @DeleteMapping("/{id}") - public ViewedDto delete(@PathVariable(name = "id") Integer id) { - return toDto(viewedService.delete(id)); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Integer currentUserId = userService.getCurrentUserId(authentication.getName()); + + ViewedEntity view = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + if (view == null) { + isViewed = false; + } else { + isViewed = true; + } + + if (isViewed == false) { + + UserEntity user = userService.get(currentUserId); + MovieEntity movie = movieService.get(movieId); + + ViewedEntity newView = new ViewedEntity(null, user, movie); + + viewedServise.create(newView); + + } else { + + ViewedEntity delView = viewedServise.findByUserIdAndMovieId(currentUserId, movieId); + + viewedServise.delete(delView.getId()); + } + + model.addAttribute(PAGE_ATTRIBUTE, page); + + return Constants.REDIRECT_VIEW + URL; } } diff --git a/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java b/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java index 604c54e..b87f070 100644 --- a/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java +++ b/backend/src/main/java/com/example/backend/viewed/repository/ViewedRepository.java @@ -4,10 +4,12 @@ import java.util.Optional; import java.util.List; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; import com.example.backend.viewed.model.ViewedEntity; -public interface ViewedRepository extends CrudRepository { +public interface ViewedRepository + extends CrudRepository, PagingAndSortingRepository { List findByUserId(Integer userId); diff --git a/backend/src/main/resources/templates/favorites.html b/backend/src/main/resources/templates/favorites.html deleted file mode 100644 index b537184..0000000 --- a/backend/src/main/resources/templates/favorites.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Просмотренные - - - -
- -
- - - \ No newline at end of file diff --git a/backend/src/main/resources/templates/favs.html b/backend/src/main/resources/templates/favs.html new file mode 100644 index 0000000..57ae58e --- /dev/null +++ b/backend/src/main/resources/templates/favs.html @@ -0,0 +1,68 @@ + + + + + Избранные + + + + +
+ +

Данные отсутствуют

+ +
+
+ +
+ + + +
+
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/backend/src/main/resources/templates/index.html b/backend/src/main/resources/templates/index.html index b2b29de..0879ebd 100644 --- a/backend/src/main/resources/templates/index.html +++ b/backend/src/main/resources/templates/index.html @@ -49,8 +49,8 @@ th:classappend="${activeLink.startsWith('/categories') ? 'active' : '' }">Категории Фильмы - Избранные + Избранные Просмотренные diff --git a/backend/src/main/resources/templates/movies.html b/backend/src/main/resources/templates/movies.html index a83ca76..106b7fc 100644 --- a/backend/src/main/resources/templates/movies.html +++ b/backend/src/main/resources/templates/movies.html @@ -107,7 +107,7 @@
-
-
+
+
+ + +
+
+ + + + + + + + \ No newline at end of file diff --git a/data.mv.db b/data.mv.db index 7c0c8da..0e140d7 100644 Binary files a/data.mv.db and b/data.mv.db differ