package com.integralblue.availability.controller;
import java.util.Optional;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.MediaType;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.integralblue.availability.model.slack.SlashSlackMessage;
import com.integralblue.availability.properties.SlackProperties;
import com.integralblue.availability.service.SlackMessageService;
import com.ullink.slack.simpleslackapi.SlackSession;
import lombok.extern.slf4j.Slf4j;
@ConditionalOnProperty(value = "slack.slashCommandToken")
@Controller
@Slf4j
public class SlackController {
@Autowired
private SlackProperties slackProperties;
@Autowired
private SlackMessageService slackMessageService;
@Autowired(required=false)
private SlackSession slackSession;
@RequestMapping(value="/slack/availability",method=RequestMethod.GET,produces=MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String getAvailability(@Valid SlashSlackMessage message, Model model) {
log.debug("Incoming Slack request: {}", message.toString());
if (!message.getToken().equals(slackProperties.getSlashCommandToken())) {
throw new AccessDeniedException("Token in request " + message.getToken() + " did not match configured token.");
}
return slackMessageService.respondToMessage(Optional.of(slackSession).map(slackSession -> slackSession.findUserById(message.getUserId())), message.getText());
}
}