package de.rwth.idsg.bikeman.ixsi.processor.query.user; import com.google.common.base.Optional; import de.rwth.idsg.bikeman.domain.Booking; import de.rwth.idsg.bikeman.domain.Pedelec; import de.rwth.idsg.bikeman.ixsi.ErrorFactory; import de.rwth.idsg.bikeman.ixsi.IxsiProcessingException; import de.rwth.idsg.bikeman.ixsi.processor.api.UserRequestProcessor; import de.rwth.idsg.bikeman.ixsi.service.BookingService; import de.rwth.idsg.bikeman.psinterface.dto.request.RemoteAuthorizeDTO; import de.rwth.idsg.bikeman.psinterface.rest.client.StationClient; import de.rwth.idsg.bikeman.web.rest.exception.DatabaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import xjc.schema.ixsi.ChangeBookingStateRequestType; import xjc.schema.ixsi.ChangeBookingStateResponseType; import xjc.schema.ixsi.ErrorType; import xjc.schema.ixsi.Language; import xjc.schema.ixsi.UserInfoType; /** * @author Sevket Goekay <goekay@dbis.rwth-aachen.de> * @since 18.11.2014 */ @Slf4j @Component public class ChangeBookingStateRequestProcessor implements UserRequestProcessor<ChangeBookingStateRequestType, ChangeBookingStateResponseType> { @Autowired private BookingService bookingService; @Autowired private StationClient stationClient; @Override public Class<ChangeBookingStateRequestType> getProcessingClass() { return ChangeBookingStateRequestType.class; } @Override public ChangeBookingStateResponseType processAnonymously(ChangeBookingStateRequestType request, Optional<Language> lan) { return buildError(ErrorFactory.Auth.notAnonym("Anonymous change booking state request not allowed", null)); } @Override public ChangeBookingStateResponseType processForUser(ChangeBookingStateRequestType request, Optional<Language> lan, UserInfoType userInfo) { try { switch (request.getBookingState()) { case OPEN: return proceedOpen(request, userInfo); case CLOSED: return buildError(ErrorFactory.Sys.notImplemented(null, null)); case SUSPENDED: return buildError(ErrorFactory.Sys.notImplemented(null, null)); default: return buildError(ErrorFactory.Sys.invalidRequest("BookingState is missing", null)); } } catch (DatabaseException e) { return buildError(ErrorFactory.Sys.invalidRequest(e.getMessage(), null)); } catch (IxsiProcessingException e) { return buildError(ErrorFactory.Booking.changeNotPossible(e.getMessage(), e.getMessage())); } } private ChangeBookingStateResponseType proceedOpen(ChangeBookingStateRequestType request, UserInfoType userInfo) { Booking booking = bookingService.get(request.getBookingID(), userInfo.getUserID()); Pedelec pedelec = booking.getReservation().getPedelec(); Integer stationSlotPosition = pedelec.getStationSlot().getStationSlotPosition(); String endpointAddress = pedelec.getStationSlot().getStation().getEndpointAddress(); RemoteAuthorizeDTO dto = RemoteAuthorizeDTO.builder() .cardId(userInfo.getUserID()) .slotPosition(stationSlotPosition) .build(); // throws PsException stationClient.authorizeRemote(endpointAddress, dto); return new ChangeBookingStateResponseType(); } // ------------------------------------------------------------------------- // Error handling // ------------------------------------------------------------------------- @Override public ChangeBookingStateResponseType buildError(ErrorType e) { return new ChangeBookingStateResponseType().withError(e); } }