source: sources/app/src/main/java/parkup/services/ParkingZoneService.java

Last change on this file was c52cdbb, checked in by andrejTavchioski <andrej.tavchioski@…>, 2 years ago

fix

  • Property mode set to 100644
File size: 10.5 KB
Line 
1package parkup.services;
2
3import org.springframework.beans.factory.annotation.Autowired;
4import org.springframework.security.core.Authentication;
5import org.springframework.stereotype.Service;
6import parkup.ParkUpApplication;
7import parkup.data.ParkingZoneAdminView;
8import parkup.data.ParkingZoneLocation;
9import parkup.data.WorkerDemo;
10import parkup.entities.ParkingSpace;
11import parkup.entities.ParkingZone;
12import parkup.entities.Worker;
13import parkup.repositories.ParkingSessionRepository;
14import parkup.repositories.ParkingSpaceRepository;
15import parkup.repositories.ParkingZoneRepository;
16import parkup.repositories.WorkerRepository;
17import static parkup.ParkUpApplication.getToken;
18import javax.transaction.Transactional;
19import java.util.*;
20import java.util.stream.Collectors;
21
22@Service
23public class ParkingZoneService {
24 private final ParkingZoneRepository parkingZoneRepository;
25 private final ParkingSpaceRepository parkingSpaceRepository;
26 private final WorkerRepository workerRepository;
27 private final ParkingSessionRepository parkingSessionRepository;
28
29 @Autowired
30 public ParkingZoneService(ParkingZoneRepository parkingZoneRepository, ParkingSpaceRepository parkingSpaceRepository, WorkerRepository workerRepository, ParkingSessionRepository parkingSessionRepository) {
31 this.parkingZoneRepository = parkingZoneRepository;
32 this.parkingSpaceRepository = parkingSpaceRepository;
33 this.parkingSessionRepository = parkingSessionRepository;
34 this.workerRepository = workerRepository;
35 }
36
37 public List<ParkingZone> getAllParkingZones() {
38 Authentication user = getToken();
39 String role =user.getAuthorities().stream().findFirst().get().getAuthority();
40 String email = user.getName();
41 List<ParkingZone> parkingZones;
42 if(role.equals("ROLE_REG_USER"))
43 parkingZones= parkingZoneRepository.findAll();
44 else if(role.equals("ROLE_WORKER")){
45 Worker loggedInWorker = workerRepository.findWorkerByEmail(email).orElseThrow(null);
46 parkingZones= parkingZoneRepository.findAll().stream().filter(pz->loggedInWorker.getParkingZones().contains(pz)).collect(Collectors.toList());
47 }else if(role.equals("ROLE_ADMIN"))
48 parkingZones= parkingZoneRepository.findAll();
49 else
50 parkingZones=parkingZoneRepository.findAll();
51 for(ParkingZone pz:parkingZones){
52 setTransientVariables(pz);
53 }
54 return parkingZones;
55 }
56
57 public ParkingZoneAdminView findById(int parkingZoneId) {
58 Optional<ParkingZone> parkingZone = Optional.ofNullable(this.parkingZoneRepository.findByPzId(parkingZoneId));
59 if (!parkingZone.isPresent()) {
60 throw new IllegalStateException("ParkingZone does not exist");
61 }
62 setTransientVariables(parkingZone.get());
63 return new ParkingZoneAdminView(parkingZone.get(),getResponsibleWorkers(parkingZoneId));
64 }
65
66 public List<String> getAllParkingZoneNames() {
67 List<ParkingZone> parkingZones = this.parkingZoneRepository.findAll();
68 List<String> parkingZonesNames = new ArrayList<>();
69 for (ParkingZone pz : parkingZones) {
70 parkingZonesNames.add(pz.getPzName());
71 }
72 return parkingZonesNames;
73 }
74
75 public Optional<ParkingZone> addParkingZone(ParkingZone parkingZone) { //zavisno vo koj grad ili opstina i napravi proverki pred dodavanje, implementiraj u naredna faza
76 Optional<ParkingZone> parkingZoneOpt = Optional.ofNullable(parkingZoneRepository.findByPzName(parkingZone.getPzName()));
77 if (parkingZoneOpt.isPresent()) {
78 throw new IllegalStateException("Name already taken, try adding a ParkingZone with a different name");
79 } else {
80 System.out.println(parkingZone);
81 parkingZoneRepository.save(parkingZone);
82 }
83 return parkingZoneOpt;
84 }
85
86 public ParkingZone addParkingZoneNameOnly(String name) {
87 Optional<ParkingZone> parkingZoneOpt = Optional.ofNullable(parkingZoneRepository.findByPzName(name));
88 if (parkingZoneOpt.isPresent()) {
89 throw new IllegalStateException("Name already taken, try adding a ParkingZone with a different name");
90 } else {
91 ParkingZone parkingZone = new ParkingZone(name.trim());
92 parkingZoneRepository.save(parkingZone);
93 return parkingZone;
94 }
95 }
96
97 //TODO proveri dali ima odgovorni i dokolku ima dali postojat vo bazata
98 @Transactional
99 public ParkingZoneAdminView updateParkingZone(int parkingZoneId, String pzName, int price,
100 String location, int from, int to, String color,
101 List<ParkingSpace> parkingSpaces, ParkingZoneLocation parkingZoneLocation, List<WorkerDemo> responsibleWorkers) {
102
103 //TODO prati niza od objekti ParkingSpaces i prati objekt ParkingZoneLocation
104 ParkingZone parkingZone = parkingZoneRepository.findByPzId(parkingZoneId);
105 ParkingZone parkingZoneNov = parkingZoneRepository.findByPzId(parkingZoneId);
106 if (parkingZoneNov!=null) {
107 if (pzName != null && pzName.length() > 1) {
108 if (parkingZoneNov.getPzName().equals(pzName)&&parkingZoneNov.getId()!=parkingZoneId) {
109 throw new IllegalStateException("There is already a ParkingZone with the same name");
110 }
111
112 parkingZoneNov.setPzName(pzName);
113 }
114
115 if (price != 0 && !Objects.equals(parkingZoneNov.getPrice(), price)) {
116 parkingZoneNov.setPrice(price);
117 }
118
119 if (location != null && location.length() > 0 && !Objects.equals(parkingZoneNov.getAddress(), location)) {
120 parkingZoneNov.setAddress(location);
121 }
122
123 if (from != 0 && !Objects.equals(parkingZoneNov.getFrom(), from)) {
124 parkingZoneNov.setFrom(from);
125 }
126
127 if (to != 0 && !Objects.equals(parkingZoneNov.getTo(), to)) {
128 parkingZoneNov.setTo(to);
129 }
130
131 if (color != null && color.length() > 0 && !Objects.equals(parkingZoneNov.getColor(), color)) {
132 parkingZoneNov.setColor(color);
133 }
134
135 if (parkingZoneLocation != null) {
136 parkingZoneNov.setParkingZoneLocation(parkingZoneLocation);
137 }
138
139 if (!parkingSpaces.isEmpty()) {
140 List<ParkingSpace> spacesToDelete = parkingZoneNov.getParkingSpaces();
141 parkingZoneNov.setParkingSpaces(null);
142 parkingSpaceRepository.deleteAll(spacesToDelete);
143 parkingZoneNov.setParkingSpaces(parkingSpaces);
144 }
145 else{
146 parkingZoneNov.setParkingSpaces(new ArrayList<>());
147 }
148 if (!responsibleWorkers.isEmpty()) {
149
150 for(Integer workerId: getResponsibleWorkers(parkingZoneId).stream().map(WorkerDemo::getWorkerId).collect(Collectors.toList())){
151 workerRepository.findByWorkerId(workerId).getParkingZones().remove(parkingZone);
152 }
153 for (Integer workerId : responsibleWorkers.stream().map(WorkerDemo::getWorkerId).collect(Collectors.toList())) {
154 Worker workerToAdd = workerRepository.findByWorkerId(workerId);
155 if(workerToAdd !=null)
156 workerToAdd.getParkingZones().add(parkingZone);
157 }
158 }else{
159 workerRepository.findAll().stream().filter(w->w.getParkingZones().contains(parkingZone)).forEach(w->w.getParkingZones().remove(parkingZone));
160 }
161
162 setTransientVariables(parkingZoneNov);
163 return new ParkingZoneAdminView(parkingZoneNov,getResponsibleWorkers(parkingZoneId));
164 } else {
165 throw new IllegalStateException("There ParkingZone does not exist");
166 }
167 }
168
169
170 @Transactional
171 public Optional<ParkingZone> deleteParkingZone ( int parkingZoneId){
172 Optional<ParkingZone> parkingZoneOpt = Optional.ofNullable(parkingZoneRepository.findByPzId(parkingZoneId));
173 if (parkingZoneOpt.isPresent()) {
174 parkingZoneOpt.get().setParkingSpaces(null);
175 parkingZoneOpt.get().setParkingZoneLocation(null);
176 workerRepository.findAll().stream().filter(w->w.getParkingZones().contains(parkingZoneOpt.get())).forEach(w->w.getParkingZones().remove(parkingZoneOpt.get()));
177 parkingZoneRepository.deleteByPzId(parkingZoneId);
178 } else {
179 throw new IllegalStateException("ParkingZone doesn't exist, therefore can't be deleted");
180 }
181 return parkingZoneOpt;
182 }
183
184 public int calculateTakenSpaces(int pzId){
185 ParkingZone parkingZone=parkingZoneRepository.findByPzId(pzId);
186 return (int)parkingZone.getParkingSpaces().stream().filter(ParkingSpace::isTaken).count();
187 }
188 public int calculateCapacity(int pzId){
189 ParkingZone parkingZone=parkingZoneRepository.findByPzId(pzId);
190 return parkingZone.getParkingSpaces().size();
191 }
192 public void setTransientVariables(ParkingZone pz){
193 pz.setCapacity(calculateCapacity(pz.getId()));
194 pz.setTakenSpaces(calculateTakenSpaces(pz.getId()));
195 pz.setResponsibleWorkers(getWorkers(pz.getId()));
196 }
197 public List<WorkerDemo> getResponsibleWorkers(int pzId){
198 ParkingZone parkingZone =parkingZoneRepository.findByPzId(pzId);
199 return workerRepository.findAll().stream().filter(w->w.getParkingZones().contains(parkingZone)).map(WorkerDemo::new).collect(Collectors.toList());
200 }
201 public List<String> getWorkers(int pzId){
202 ParkingZone parkingZone =parkingZoneRepository.findByPzId(pzId);
203 return workerRepository.findAll().stream().filter(w->w.getParkingZones().contains(parkingZone)).map(w->w.getFirstName() + " " + w.getLastName()).collect(Collectors.toList());
204
205 }
206
207 public ParkingZone getParkingZoneByName(String parkingZoneName){
208 ParkingZone parkingZone=parkingZoneRepository.findByPzName(parkingZoneName);
209 if(parkingZone==null)
210 throw new IllegalStateException("No such parking zone exists");
211 setTransientVariables(parkingZone);
212 return parkingZone;
213 }
214 }
215
Note: See TracBrowser for help on using the repository browser.