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.ixsi.ErrorFactory; import de.rwth.idsg.bikeman.ixsi.IxsiCodeException; import de.rwth.idsg.bikeman.ixsi.IxsiProcessingException; import de.rwth.idsg.bikeman.ixsi.processor.api.UserRequestProcessor; import de.rwth.idsg.bikeman.ixsi.service.AvailabilityPushService; import de.rwth.idsg.bikeman.ixsi.service.BookingCheckService; import de.rwth.idsg.bikeman.ixsi.service.BookingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import xjc.schema.ixsi.BookingRequestType; import xjc.schema.ixsi.BookingResponseType; import xjc.schema.ixsi.BookingType; import xjc.schema.ixsi.ErrorType; import xjc.schema.ixsi.Language; import xjc.schema.ixsi.TimePeriodType; import xjc.schema.ixsi.UserInfoType; /** * @author Sevket Goekay <goekay@dbis.rwth-aachen.de> * @since 26.09.2014 */ @Component public class BookingRequestProcessor implements UserRequestProcessor<BookingRequestType, BookingResponseType> { @Autowired private BookingService bookingService; @Autowired private AvailabilityPushService availabilityPushService; @Autowired private BookingCheckService bookingCheckService; @Override public Class<BookingRequestType> getProcessingClass() { return BookingRequestType.class; } @Override public BookingResponseType processAnonymously(BookingRequestType request, Optional<Language> lan) { return buildError(ErrorFactory.Auth.notAnonym("Anonymous booking makes no sense", null)); } @Override public BookingResponseType processForUser(BookingRequestType request, Optional<Language> lan, UserInfoType userInfo) { try { Booking createdBooking = bookingService.createBookingForUser( request.getBookingTargetID().getBookeeID(), userInfo.getUserID(), request.getTimePeriodProposal() ); TimePeriodType timePeriod = new TimePeriodType() .withBegin(createdBooking.getReservation().getStartDateTime().toDateTime()) .withEnd(createdBooking.getReservation().getEndDateTime().toDateTime()); String placeId = createdBooking.getReservation() .getPedelec() .getStationSlot() .getStation() .getManufacturerId(); availabilityPushService.placedBooking(request.getBookingTargetID().getBookeeID(), placeId, timePeriod); bookingCheckService.placedBooking(createdBooking); BookingType booking = new BookingType() .withID(String.valueOf(createdBooking.getIxsiBookingId())) .withTimePeriod(timePeriod); return new BookingResponseType().withBooking(booking); } catch (IxsiCodeException e) { return buildError(ErrorFactory.buildFromException(e)); } catch (IxsiProcessingException e) { return buildError(ErrorFactory.Booking.targetNotAvail(e.getMessage(), e.getMessage())); } catch (Exception e) { return buildError(ErrorFactory.Sys.backendFailed(e.getMessage(), "Booking not possible due to backend error")); } } // ------------------------------------------------------------------------- // Error handling // ------------------------------------------------------------------------- @Override public BookingResponseType buildError(ErrorType e) { return new BookingResponseType().withError(e); } }