source: Git/src/main/java/com/wediscussmovies/project/service/impl/PersonServiceImpl.java@ 3fe36de

main
Last change on this file since 3fe36de 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: 6.4 KB
RevLine 
[7a0bf79]1package com.wediscussmovies.project.service.impl;
2
[e0ef1b1]3import com.wediscussmovies.project.ajaxmodels.Grade;
4import com.wediscussmovies.project.model.Movie;
5import com.wediscussmovies.project.model.User;
6import com.wediscussmovies.project.model.exception.MovieHasAlreadyDirector;
7import com.wediscussmovies.project.model.exception.MovieIdNotFoundException;
8import com.wediscussmovies.project.model.exception.PersonNotExistException;
9import com.wediscussmovies.project.model.primarykeys.PersonRatesPK;
10import com.wediscussmovies.project.model.relation.MovieActors;
[c02189f]11import com.wediscussmovies.project.model.relation.MovieLikes;
[e0ef1b1]12import com.wediscussmovies.project.model.relation.PersonRates;
[3c0f9a9]13import com.wediscussmovies.project.repository.*;
[e0ef1b1]14import com.wediscussmovies.project.model.Person;
[7a0bf79]15import com.wediscussmovies.project.service.PersonService;
16import org.springframework.stereotype.Service;
17
[e0ef1b1]18import javax.transaction.Transactional;
19import java.sql.Date;
[7a0bf79]20import java.util.List;
21import java.util.Optional;
[e0ef1b1]22import java.util.stream.Collectors;
[7a0bf79]23
24@Service
25public class PersonServiceImpl implements PersonService {
[e0ef1b1]26
[7a0bf79]27 private final PersonRepository personRepository;
[e0ef1b1]28 private final MovieRepository movieRepository;
29 private final MovieActorsRepository movieActorsRepository;
30 private final PersonRatesRepository personRatesRepository;
31 public PersonServiceImpl(PersonRepository personRepository,
32 MovieRepository movieRepository, MovieActorsRepository movieActorsRepository,
33 PersonRatesRepository personRatesRepository) {
[7a0bf79]34 this.personRepository = personRepository;
[e0ef1b1]35 this.movieRepository = movieRepository;
36 this.movieActorsRepository = movieActorsRepository;
37 this.personRatesRepository = personRatesRepository;
[7a0bf79]38 }
39
40 @Override
[e0ef1b1]41 public List<Person> findAll() {
42 return this.personRepository.findAll();
[7a0bf79]43 }
44
45 @Override
[e0ef1b1]46 public List<Person> findAllDirectors() {
47 return this.personRepository.findAllByType('D');
[7a0bf79]48 }
49
[2a5d6a3]50 @Override
[e0ef1b1]51 public Person findById(Integer id) {
52 return this.personRepository.findById(id).orElseThrow(() -> new PersonNotExistException(id));
[2a5d6a3]53 }
[7a0bf79]54
[e0ef1b1]55
56
[7a0bf79]57 @Override
[e0ef1b1]58 public List<Person> findAllActors() {
59 return this.personRepository.findAllByType('A');
[7a0bf79]60 }
61
62 @Override
[e0ef1b1]63 @Transactional
64 public Person save(String name, String surname, Character type, Date birthDate, String image_url,
65 String description,List<Integer> movieIds) {
66
67 Person person = this.personRepository.saveAndFlush(new Person(name,surname,type,birthDate,image_url,description));
68
69 if (movieIds!= null) {
70 if (type.equals('A'))
71 this.addActorForMovies(person, movieIds);
72 else
73 this.addDirectorForMovies(person, movieIds);
74 }
75 return person;
76
[7a0bf79]77 }
[2a5d6a3]78
79 @Override
[e0ef1b1]80 @Transactional
81 public Person edit(Integer personId, String name, String surname,
82 Character type, Date birthDate, String image_url, String description, List<Integer> movieIds) {
83 Person person = this.findById(personId);
84
85 person.setName(name);
86 person.setSurname(surname);
87 person.setDateOfBirth(birthDate);
88 person.setImageUrl(image_url);
89 person.setType(type);
90 person.setDescription(description);
91
92
93 person = this.personRepository.saveAndFlush(person);
94
95 this.movieActorsRepository.deleteAllByPerson(person);
96 this.removeMovieDirectorsBeforeEdit(person);
97 if (movieIds != null) {
98 if (type.equals('A'))
99 this.addActorForMovies(person, movieIds);
100 else
101 this.addDirectorForMovies(person, movieIds);
102 }
103
104 return person;
105
[2a5d6a3]106 }
107
108 @Override
[e0ef1b1]109 public List<Person> findPersonsByNameOrSurname(Character type,String searchQuery) {
110 if (searchQuery != null && searchQuery.isEmpty())
111 return this.personRepository.findAllByTypeAndNameLikeOrSurnameLike(type,searchQuery,searchQuery);
112 if (type.equals('D'))
113 return this.findAllDirectors();
114 return this.findAllActors();
115
[2a5d6a3]116 }
117
118 @Override
[e0ef1b1]119 public List<Movie> findAllMoviesByPerson(Person person) {
120 if (person.getType().equals('A'))
121 return this.movieActorsRepository
122 .findAllByPerson(person)
123 .stream()
124 .map(MovieActors::getMovie)
125 .collect(Collectors.toList());
126 return this.movieRepository.findAllByDirector(person);
[2a5d6a3]127 }
128
129 @Override
[e0ef1b1]130 public void deleteById(Integer id) {
131 this.personRepository.deleteById(id);
[2a5d6a3]132 }
133
134 @Override
[e0ef1b1]135 public void addGradePerson(Integer personId, User user, Grade grade) {
136 PersonRatesPK key = new PersonRatesPK(personId, user.getUserId());
137 Optional<PersonRates> personRates = this.personRatesRepository.findById(key);
138 if (personRates.isPresent()){
139 PersonRates rates = personRates.get();
140 rates.setReason(grade.getReason());
141 rates.setStarsRated(grade.getRating());
142 this.personRatesRepository.save(rates);
143 }
144 else{
145 Person person = this.findById(personId);
146 PersonRates rates = new PersonRates(user,person,grade.getReason(),grade.getRating());
147 this.personRatesRepository.save(rates);
148 }
149
150 }
151
152
[3c0f9a9]153
[e0ef1b1]154 private void addActorForMovies(Person person, List<Integer> movieIds){
155
156 movieIds.stream()
157 .map(this::findMovieById)
158 .forEach(m -> this.movieActorsRepository.save(new MovieActors(m,person)));
159
[2a5d6a3]160 }
[e0ef1b1]161 private void addDirectorForMovies(Person person, List<Integer> movieIds){
162 movieIds.stream()
163 .map(this::findMovieById)
164 .forEach(m -> this.addMovieDirector(m,person));
165 }
166 private void addMovieDirector(Movie movie,Person person){
167 Person director = movie.getDirector();
168 if (director != null)
169 throw new MovieHasAlreadyDirector(movie.getTitle(),director.getName(),director.getSurname());
170 movie.setDirector(person);
171 this.movieRepository.save(movie);
172 }
173 private void removeMovieDirectorsBeforeEdit(Person person){
174 this.movieRepository.findAllByDirector(person)
175 .forEach(m ->{ m.setDirector(null); this.movieRepository.save(m); });
176
177 }
178
179 private Movie findMovieById(Integer id){
180 return this.movieRepository.findById(id).orElseThrow(() -> new MovieIdNotFoundException(id));
181 }
182
[7a0bf79]183}
Note: See TracBrowser for help on using the repository browser.