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

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

Added new core functionalities, fixed bugs and improved visual clarity

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