package com.integralblue.availability.controller; import java.net.URI; import java.util.Arrays; import java.util.Date; import java.util.Optional; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat.ISO; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.integralblue.availability.NotFoundException; import com.integralblue.availability.model.Availability; import com.integralblue.availability.service.AvailabilityService; import lombok.NonNull; @Controller public class AvailabilityController { private static final String DEFAULT_FREE_URL = "/images/free.png"; private static final String DEFAULT_BUSY_URL = "/images/busy.png"; private static final String DEFAULT_TENTATIVE_URL = "/images/tentative.png"; @Autowired @Qualifier("exchangeAvailabilityService") private AvailabilityService availabilityService; @RequestMapping(value="/user/{emailAddresses}/availability",method=RequestMethod.GET,produces=MediaType.TEXT_HTML_VALUE) public String getAvailabilityView(Model model, @PathVariable("emailAddresses") String[] emailAddresses){ model.addAttribute("emailAddresses", Arrays.asList(emailAddresses)); return "availability"; } @ResponseBody @RequestMapping(value="/user/{emailAddress}/availability",method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE) public Availability getAvailability(@PathVariable String emailAddress, @RequestParam(value="start") @DateTimeFormat(iso=ISO.DATE_TIME) Date start, @RequestParam(value="end") @DateTimeFormat(iso=ISO.DATE_TIME) Date end, @RequestParam Integer timezoneOffset){ Assert.isTrue(!start.after(end), "start cannot be after end"); start = DateUtils.addMinutes(start, timezoneOffset); end = DateUtils.addMinutes(end, timezoneOffset); return availabilityService.getAvailability(emailAddress, start, end).orElseThrow(NotFoundException::new); } @RequestMapping(value="/user/{emailAddress}/availability/redirect",method=RequestMethod.GET) public ResponseEntity<Void> getAvailability(@NonNull HttpServletResponse response, @PathVariable String emailAddress, @RequestParam(required=false,value="free",defaultValue=DEFAULT_FREE_URL) String freeUrl, @RequestParam(value="busy",defaultValue=DEFAULT_BUSY_URL) String busyUrl, @RequestParam(value="tentative",defaultValue=DEFAULT_TENTATIVE_URL) String tentativeUrl, @RequestParam(value="date",required=false) Optional<Date> date){ final Optional<Availability> optionalAvailability = availabilityService.getAvailability(emailAddress, date.orElse(new Date()), date.orElse(new Date())); if(optionalAvailability.isPresent()){ String url; switch(optionalAvailability.get().getStatusAtStart()){ case FREE: url=freeUrl; break; case BUSY: url=busyUrl; break; case TENTATIVE: url=tentativeUrl; break; default: throw new IllegalStateException(); } return ResponseEntity.status(HttpStatus.TEMPORARY_REDIRECT).location(URI.create(url)).build(); }else{ throw new NotFoundException(); } } }