source: sources/app/src/main/java/parkup/services/ParkingSessionService.java@ e8b1076

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

fix

  • Property mode set to 100644
File size: 9.9 KB
RevLine 
[ce6ad22]1package parkup.services;
2
3import org.springframework.beans.factory.annotation.Autowired;
[3f0bf09]4import org.springframework.security.core.Authentication;
[ce6ad22]5import org.springframework.stereotype.Service;
[3f0bf09]6import parkup.ParkUpApplication;
[9dd526f]7import parkup.data.Plate;
[9ff45d6]8import parkup.data.enumarations.SessionStatus;
[3f0bf09]9import parkup.entities.*;
[52df867]10import parkup.repositories.*;
[ce6ad22]11
[97fbc67]12import javax.transaction.Transactional;
[9ff45d6]13import java.time.Duration;
14import java.time.LocalDateTime;
[ce6ad22]15import java.util.List;
16import java.util.Optional;
[9ff45d6]17import java.util.stream.Collectors;
[ce6ad22]18
19@Service
20public class ParkingSessionService {
21 private final ParkingSessionRepository parkingSessionRepository;
[9ff45d6]22 private final ParkingZoneRepository parkingZoneRepository;
23 private final ParkingSpaceRepository parkingSpaceRepository;
[52df867]24 private final RegisteredUserRepository registeredUserRepository;
[9dd526f]25 private final PlateRepository plateRepository;
[3f0bf09]26 private final GuestRepository guestRepository;
[ce6ad22]27
28 @Autowired
[3f0bf09]29 public ParkingSessionService(ParkingSessionRepository parkingSessionRepository, ParkingZoneRepository parkingZoneRepository, ParkingSpaceRepository parkingSpaceRepository, RegisteredUserRepository registeredUserRepository, PlateRepository plateRepository, GuestRepository guestRepository) {
[ce6ad22]30 this.parkingSessionRepository = parkingSessionRepository;
[9ff45d6]31 this.parkingZoneRepository = parkingZoneRepository;
32 this.parkingSpaceRepository = parkingSpaceRepository;
[52df867]33 this.registeredUserRepository = registeredUserRepository;
[9dd526f]34 this.plateRepository = plateRepository;
[3f0bf09]35 this.guestRepository = guestRepository;
[ce6ad22]36 }
37
[9ff45d6]38 //TODO add getMethod for paid sessions or all sessions
39
[ce6ad22]40 public List<ParkingSession> getAllParkingSessions() {
[9ff45d6]41 //Get all sessions that arent paid
42 return parkingSessionRepository.findAll().stream()
43 .filter(s->!s.getStatus().equals(SessionStatus.ENDED_PAID))
44 .collect(Collectors.toList());
[ce6ad22]45 }
46
[ad4da86]47 public List<ParkingSession> getAllParkingSessionsFromZone(Integer pzId) {
48 //Get all sessions that arent paid
49
50 return parkingSessionRepository.findAll().stream()
[0707e4e]51 .filter(s->!s.getStatus().equals(SessionStatus.ENDED_PAID) && s.getParkingZone()!=null && s.getParkingZone().getId()==pzId)
[ad4da86]52 .collect(Collectors.toList());
53 }
54
[ce6ad22]55 public ParkingSession findById(int parkingSessionId) {
56 Optional<ParkingSession> parkingSessionOpt = Optional.ofNullable(parkingSessionRepository.findByPssId(parkingSessionId));
57 return parkingSessionOpt.orElse(null);
58 }
59
[9ff45d6]60 @Transactional
[ebc5eee]61 public Optional<ParkingSession> deleteParkingSession(int parkingSessionId) {
62 Optional<ParkingSession> parkingSessionOpt = Optional.ofNullable(parkingSessionRepository.findByPssId(parkingSessionId));
63 if (parkingSessionOpt.isPresent()) {
64 if(parkingSessionOpt.get().getStatus()!=SessionStatus.STARTED_UNVERIFIED)
65 parkingSessionOpt.get().getParkingSpace().setTaken(false);
66 parkingSessionOpt.get().setPlate(null);
67 registeredUserRepository.findAll().stream().filter(u->u.getSession().equals(parkingSessionOpt.get())).forEach(u->u.setSession(null));
68 guestRepository.findAll().stream().filter(u->u.getSession().equals(parkingSessionOpt.get())).forEach(u->u.setSession(null));
[ce6ad22]69 parkingSessionRepository.deleteByPssId(parkingSessionId);
[ebc5eee]70 return parkingSessionOpt;
[ce6ad22]71 } else {
72 throw new IllegalStateException("ParkingSpace doesn't exist, therefore can't be deleted");
73 }
74 }
75
[9ff45d6]76 @Transactional
[0e407de]77 public Optional<ParkingSession> startParkingSession(String tablica, String parkingZoneName) {
78 ParkingZone parkingZone = parkingZoneRepository.findByPzName(parkingZoneName);
[3f0bf09]79 Authentication token = ParkUpApplication.getToken();
[9dd526f]80 Plate plate = plateRepository.findByPlate(tablica);
81 ParkingSession sessionToAdd = new ParkingSession(plate);
[9ff45d6]82 sessionToAdd.setParkingZone(parkingZone);
83 parkingSessionRepository.save(sessionToAdd);
[3f0bf09]84 String role =token.getAuthorities().stream().findFirst().get().getAuthority();
85 String email =token.getName();
86 if(role.equals("ROLE_REG_USER")){
87 RegisteredUser user = registeredUserRepository.findRegisteredUserByEmail(email).get();
88 user.setSession(sessionToAdd);
89 }
90 else{
91 Guest user = guestRepository.findGuestByEmail(email).get();
92 user.setSession(sessionToAdd);
93 }
[9ff45d6]94 return Optional.of(sessionToAdd);
95
96 }
[bfc49f4]97 public int calculatePayment(){
98 ParkingSession session = getParkingSession();
[9ff45d6]99 if(session==null){
100 throw new IllegalStateException("No such session exists");
101 }
[b2e6513]102 else if(session.getStatus()!= SessionStatus.ENDED_UNPAID){
[0707e4e]103 throw new IllegalStateException("Cannot calculate payment on a session that is not ended");
104 }
[9ff45d6]105 int price = session.getParkingZone().getPrice();
[ad4da86]106 return (int) (Math.ceil(Duration.between(session.getTimeStart(),session.getTimeEnd()).toMinutes()/60.0)*price);
[9ff45d6]107 }
108 @Transactional
[ccb2d72]109 public ParkingSession verifyParkingSession(int id,String parkingSpaceName){
[9ff45d6]110 ParkingSession parkingSession = parkingSessionRepository.findByPssId(id);
111 if(parkingSession==null){
112 throw new IllegalStateException("No such session exists");
113 }
114 else if(parkingSession.getStatus()==SessionStatus.STARTED_VERIFIED){
115 throw new IllegalStateException("The session you are trying to verify has already been verified");
116 }
[ccb2d72]117 ParkingZone parkingZone = parkingSession.getParkingZone();
[9ff45d6]118// else if(parkingSession.getStatus()!=SessionStatus.STARTED_)
119 if(!parkingZone.getParkingSpaces().contains(parkingSpaceRepository.findByPsName(parkingSpaceName))){
120 throw new IllegalStateException("Ivalid parking space inserted. Type in a new parking space or let the admin know that they should add the parking space to this zone");
121 }
[ad4da86]122 if(parkingSpaceRepository.findByPsName(parkingSpaceName).isTaken()){
123 throw new IllegalStateException("Ivalid parking space inserted. Type in a new parking space, this space is already in a session");
124 }
[9ff45d6]125 parkingSession.setStatus(SessionStatus.STARTED_VERIFIED);
[ccb2d72]126 ParkingSpace parkingSpace = parkingZoneRepository.findByPzId(parkingZone.getId()).getParkingSpaces().stream().filter(ps->ps.getPsName().equals(parkingSpaceName)).findFirst().get();
[9ff45d6]127 parkingSpace.setTaken(true);
128 parkingSession.setParkingSpace(parkingSpace);
129 return parkingSession;
130 }
131 @Transactional
[3f0bf09]132 public ParkingSession endParkingSession(){
[3b17c69]133 ParkingSession parkingSession=getParkingSession();
134 if(parkingSession==null){
[9ff45d6]135 throw new IllegalStateException("No such session exists");
136 }
[3b17c69]137 else if(parkingSession.getStatus()==SessionStatus.ENDED_UNPAID){
[9ff45d6]138 throw new IllegalStateException("The session you are trying to end has already been ended");
139 }
[3b17c69]140 parkingSession.setStatus(SessionStatus.ENDED_UNPAID);
141 parkingSession.setTimeEnd(LocalDateTime.now());
142 return parkingSession;
[9ff45d6]143 }
144 @Transactional
[b6e52e1]145 public boolean payParkingSession(String date){
[0ad69c1]146 if(!date.isEmpty()){
[9ff45d6]147 String expMonthString=date.split("/")[0];
148 String expYearString=date.split("/")[1];
149 if(expMonthString.startsWith("0"))
[98f448a]150 expMonthString=expMonthString.substring(1);
[9ff45d6]151 if(expYearString.startsWith("0"))
152 expYearString=expYearString.substring(1);
153 int expMonth=Integer.parseInt(expMonthString);
154 int expYear=Integer.parseInt(expYearString);
155 int month = LocalDateTime.now().getMonth().getValue();
156 int year = LocalDateTime.now().getYear()%100;
157 if(year>expYear){
158 throw new IllegalStateException("Your card has expired or the date that you have entered is incorrect");
159 }
160 else if(year==expYear){
161 if(month>=expMonth)
162 throw new IllegalStateException("Your card has expired or the date that you have entered is incorrect");
163 }
[0ad69c1]164 }
[3b17c69]165 ParkingSession parkingSession=getParkingSession();
[9ff45d6]166 if(parkingSession==null){
167 throw new IllegalStateException("No such session exists");
168 }
169 else if(parkingSession.getStatus()==SessionStatus.ENDED_PAID){
170 throw new IllegalStateException("The session has already been paid for");
[ce6ad22]171 }
[9ff45d6]172 parkingSession.setStatus(SessionStatus.ENDED_PAID);
[7bb19d4]173 if(parkingSession.getParkingSpace()!=null)
[9ff45d6]174 parkingSession.getParkingSpace().setTaken(false);
[b519b38]175 parkingSession.setPlate(null);
[7bb19d4]176 registeredUserRepository.findAll().stream().filter(rp->rp.getSession().getStatus().equals(SessionStatus.ENDED_PAID)).forEach(rp->rp.setSession(null));
[bfc49f4]177 guestRepository.findAll().stream().filter(g->g.getSession().getStatus().equals(SessionStatus.ENDED_PAID)).forEach(g->g.setSession(null));
178 guestRepository.deleteAll(guestRepository.findAll().stream().filter(g-> g.getSession() == null).collect(Collectors.toList()));
[7bb19d4]179 parkingSessionRepository.deleteByPssId(parkingSession.getPssId());
[9ff45d6]180 return true;
[ce6ad22]181 }
[52df867]182
[843a941]183 public SessionStatus getStatusOfParkirac(){
184 ParkingSession session=getParkingSession();
[7bb19d4]185 return session == null ? null : session.getStatus();
[52df867]186 }
[3b17c69]187
188 public ParkingSession getParkingSession() {
189 Authentication token = ParkUpApplication.getToken();
190 String role =token.getAuthorities().stream().findFirst().get().getAuthority();
191 String email =token.getName();
192 ParkingSession parkingSession;
193 if(role.equals("ROLE_REG_USER")){
194 RegisteredUser user = registeredUserRepository.findRegisteredUserByEmail(email).get();
195 parkingSession=user.getSession();
196 }
197 else{
198 Guest user = guestRepository.findGuestByEmail(email).get();
199 parkingSession=user.getSession();
200 }
201 return parkingSession;
202 }
[ce6ad22]203}
Note: See TracBrowser for help on using the repository browser.