source: Git/src/main/java/com/wediscussmovies/project/service/impl/MovieServiceImpl.java@ 3c0f9a9

main
Last change on this file since 3c0f9a9 was 3c0f9a9, checked in by Petar Partaloski <ppartaloski@…>, 2 years ago

Added genre liking, fixed counter, improved paging, improved searches

  • Property mode set to 100644
File size: 7.8 KB
Line 
1package com.wediscussmovies.project.service.impl;
2
3
4import com.wediscussmovies.project.ajaxmodels.Grade;
5import com.wediscussmovies.project.model.*;
6import com.wediscussmovies.project.model.exception.GenreNotExistException;
7import com.wediscussmovies.project.model.exception.PersonNotExistException;
8import com.wediscussmovies.project.model.exception.UserNotExistException;
9import com.wediscussmovies.project.model.primarykeys.MovieLikesPK;
10import com.wediscussmovies.project.model.primarykeys.MovieRatesPK;
11import com.wediscussmovies.project.model.relation.MovieActors;
12import com.wediscussmovies.project.model.relation.MovieGenres;
13import com.wediscussmovies.project.model.relation.MovieLikes;
14import com.wediscussmovies.project.model.relation.MovieRates;
15import com.wediscussmovies.project.repository.*;
16import com.wediscussmovies.project.model.exception.MovieIdNotFoundException;
17import com.wediscussmovies.project.service.MovieService;
18import org.springframework.stereotype.Service;
19
20import javax.swing.text.html.Option;
21import javax.transaction.Transactional;
22import java.sql.Date;
23import java.util.List;
24import java.util.Optional;
25import java.util.stream.Collectors;
26
27@Service
28public class MovieServiceImpl implements MovieService {
29
30 private final MovieRepository movieRepository;
31 private final PersonRepository personRepository;
32 private final GenreRepository genreRepository;
33 private final MovieActorsRepository movieActorsRepository;
34 private final MovieGenresRepository movieGenresRepository;
35 private final UserRepository userRepository;
36 private final MovieLikesRepository movieLikesRepository;
37 private final MovieRatesRepository movieRatesRepository;
38
39 public MovieServiceImpl(MovieRepository movieRepository, PersonRepository personRepository,
40 GenreRepository genreRepository, MovieActorsRepository movieActorsRepository,
41 MovieGenresRepository movieGenresRepository,
42 UserRepository userRepository, MovieLikesRepository movieLikesRepository,
43 MovieRatesRepository movieRatesRepository) {
44
45 this.movieRepository = movieRepository;
46 this.personRepository = personRepository;
47 this.genreRepository = genreRepository;
48 this.movieActorsRepository = movieActorsRepository;
49 this.movieGenresRepository = movieGenresRepository;
50 this.userRepository = userRepository;
51 this.movieLikesRepository = movieLikesRepository;
52 this.movieRatesRepository = movieRatesRepository;
53 }
54
55 @Override
56 public List<Movie> listAll() {
57 return this.movieRepository.findAll();
58 }
59
60 @Override
61 public List<Movie> listAllByType(Character type) {
62 if (type.equals('A'))
63 return this.listAll();
64 return this.listAllWithoutDirector();
65 }
66
67 @Override
68 public List<Movie> listAllWithoutDirector() {
69 return this.movieRepository.findAllByDirectorIsNull();
70 }
71
72 @Override
73 public Movie findById(Integer id) {
74 return this.movieRepository.findById(id).orElseThrow(() -> new MovieIdNotFoundException(id));
75 }
76
77 @Override
78 public List<Integer> listAllIds() {
79 return this.movieRepository.findAllMovieIds();
80 }
81
82 @Override
83 @Transactional
84 public Movie save(String title, String description, String imageUrl,
85 Date airingDate, Double rating, Integer directorId,List<Integer> actorIds,List<Integer> genreIds) {
86
87
88 Person director =getDirector(directorId);
89 Movie movie = new Movie(title,description,imageUrl,airingDate,rating,director);
90 movie = this.movieRepository.saveAndFlush(movie);
91 addActorsAndGenresForMovie(movie,actorIds,genreIds);
92 return movie;
93 }
94
95
96 @Transactional
97 @Override
98 public Movie edit(Integer movieId, String title, String description,
99 String imageUrl, Date airingDate, Double rating,
100 Integer directorId, List<Integer> actorIds,List<Integer> genreIds) {
101
102
103 Person director =getDirector(directorId);
104 Movie movie = this.findById(movieId);
105
106 movie.setTitle(title);
107 movie.setDescription(description);
108 movie.setImageUrl(imageUrl);
109 movie.setAiringDate(airingDate);
110 movie.setImdbRating(rating);
111 movie.setDirector(director);
112
113 this.movieActorsRepository.deleteAllByMovie(movie);
114 this.movieGenresRepository.deleteAllByMovie(movie);
115
116 movie = this.movieRepository.save(movie);
117 this.addActorsAndGenresForMovie(movie,actorIds,genreIds);
118
119 return movie;
120 }
121
122 @Override
123 public List<Person> findAllActorsForMovie(Movie movie) {
124 return this.movieActorsRepository.findAllByMovie(movie)
125 .stream()
126 .map(MovieActors::getPerson)
127 .collect(Collectors.toList());
128 }
129
130 @Override
131 public List<Genre> findAllGenresForMovie(Movie movie) {
132 return this.movieGenresRepository.findAllByMovie(movie)
133 .stream()
134 .map(MovieGenres::getGenre)
135 .collect(Collectors.toList());
136 }
137
138 @Override
139 public void likeMovie(Integer movieId, Integer userId) {
140 User user = this.userRepository.findById(userId).orElseThrow(() -> new UserNotExistException(userId.toString()));
141 Movie movie = this.findById(movieId);
142
143 this.movieLikesRepository.save(new MovieLikes(movie, user));
144 }
145
146 @Override
147 public void unlikeMovie(Integer movieId, Integer userId) {
148 MovieLikesPK movieLikesPK = new MovieLikesPK(movieId,userId);
149 this.movieLikesRepository.deleteById(movieLikesPK);
150 }
151
152 @Override
153 public List<Movie> findLikedMoviesByUser(User user) {
154 return
155 this.movieLikesRepository
156 .findAllByUser(user)
157 .stream()
158 .map(MovieLikes::getMovie)
159 .collect(Collectors.toList());
160 }
161
162
163 @Override
164 public void deleteById(Integer id) {
165 this.movieRepository.deleteById(id);
166 }
167
168 @Override
169 public void addGradeMovie(Integer movieId, User user, Grade grade) {
170 MovieRatesPK key = new MovieRatesPK(movieId, user.getUserId());
171 Optional<MovieRates> movieRates = this.movieRatesRepository.findById(key);
172 if (movieRates.isPresent()){
173 MovieRates rates = movieRates.get();
174 rates.setReason(grade.getReason());
175 rates.setStarsRated(grade.getRating());
176 this.movieRatesRepository.save(rates);
177 }
178 else{
179 Movie movie = this.findById(movieId);
180 MovieRates rates = new MovieRates(user,movie,grade.getReason(),grade.getRating());
181 this.movieRatesRepository.save(rates);
182 }
183 }
184
185 @Override
186 public List<Movie> searchByTitle(String title) {
187 return this.movieRepository.findAllByTitleLike("%"+title+"%");
188 }
189
190 @Transactional
191 void addActorsAndGenresForMovie(Movie movie, List<Integer> actorIds, List<Integer> genreIds)
192 {
193
194 actorIds.stream()
195 .map(this::findPersonById)
196 .forEach(actor -> this.movieActorsRepository.save(new MovieActors(movie,actor)));
197
198 genreIds.stream()
199 .map(this::findGenreById)
200 .forEach(genre -> this.movieGenresRepository.save(new MovieGenres(movie,genre)));
201
202 }
203 private Person getDirector(Integer directorId){
204
205 if (directorId != null)
206 return this.findPersonById(directorId);
207 return null;
208
209 }
210 private Person findPersonById(Integer id){
211 return this.personRepository.findById(id).orElseThrow(() -> new PersonNotExistException(id));
212 }
213 private Genre findGenreById(Integer id){
214 return this.genreRepository.findById(id).orElseThrow(() -> new GenreNotExistException(id));
215 }
216}
217
218
Note: See TracBrowser for help on using the repository browser.