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

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

change in getParkingSpaces logic

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