package org.opentides.social.web.controller;
import javax.servlet.http.HttpServletRequest;
import org.opentides.bean.user.BaseUser;
import org.opentides.social.bean.SocialBaseUser;
import org.opentides.social.bean.SocialCredential;
import org.opentides.social.enums.SocialMediaType;
import org.opentides.social.provider.service.TwitterProviderService;
import org.opentides.social.service.SocialBaseUserService;
import org.opentides.social.service.SocialCredentialService;
import org.opentides.util.UrlUtil;
import org.scribe.model.Token;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Controller for creating and linking of account in Twitter.
*
* @author rabanes
*/
@RequestMapping(value = "/twitter")
@Controller
public class TwitterController {
@Autowired
private TwitterProviderService twitterProviderService;
@Autowired
private SocialBaseUserService socialBaseUserService;
@Autowired
private SocialCredentialService socialCredentialService;
@Value("${twitter.appID}")
private String TWITTER_APP_ID;
@Value("${twitter.clientSecret}")
private String TWITTER_CLIENT_SECRET;
@RequestMapping(value = "/link", method = RequestMethod.GET)
public String link(HttpServletRequest request) {
request.getSession().setAttribute("refererURI", UrlUtil.getRefererURI(request));
return "redirect:/twitter/connect";
}
@RequestMapping(value = "/unlink", method = RequestMethod.GET)
public String unlink(HttpServletRequest request) {
SocialBaseUser currentUser = (SocialBaseUser) socialBaseUserService.getBaseUserService().getCurrentUser();
socialCredentialService.removeSocialCredential(currentUser, SocialMediaType.TWITTER);
request.getSession().setAttribute("refererURI", UrlUtil.getRefererURI(request));
return "redirect:/twitter/callback/link?status=message.unlink-success";
}
@RequestMapping(value = "/connect", method = RequestMethod.GET)
public String connect(ModelMap modelMap, HttpServletRequest request) {
OAuthService service = twitterProviderService.getOAuthService();
// save request token to session (required for Twitter)
Token requestToken = service.getRequestToken();
request.getSession().setAttribute("ATTR_OAUTH_REQUEST_TOKEN", requestToken);
String authorizationURL = service.getAuthorizationUrl(requestToken);
return "redirect:" + authorizationURL;
}
@RequestMapping(value = "/callback", method = RequestMethod.GET)
public String callback(ModelMap modelMap, HttpServletRequest request) {
String oauthVerifier = (String) request.getParameter("oauth_verifier");
// retrieve request token from session then remove
Token requestToken = (Token) request.getSession().getAttribute("ATTR_OAUTH_REQUEST_TOKEN");
request.getSession().removeAttribute("ATTR_OAUTH_REQUEST_TOKEN");
OAuthService service = twitterProviderService.getOAuthService();
Verifier verifier = new Verifier(oauthVerifier);
Token accessToken = service.getAccessToken(requestToken, verifier);
if (accessToken != null) {
SocialMediaType socialType = SocialMediaType.TWITTER;
SocialBaseUser user = socialBaseUserService.getSocialUserByToken(socialType, accessToken);
// Checked if user is linking an account or creating an account
BaseUser currentUser = socialBaseUserService.getBaseUserService().getCurrentUser();
if(currentUser != null) {
if(user == null) {
twitterProviderService.registerTwitterAccount((SocialBaseUser) currentUser, TWITTER_APP_ID, TWITTER_CLIENT_SECRET, accessToken);
return "redirect:/twitter/callback/link?status=message.link-success";
} else {
return "redirect:/twitter/callback/link?status=message.already-link";
}
} else {
if (user == null) {
user = new SocialBaseUser();
twitterProviderService.registerTwitterAccount(user, TWITTER_APP_ID, TWITTER_CLIENT_SECRET, accessToken);
}
}
SocialCredential credential = user.getCredentialByType(socialType);
twitterProviderService.forceLogin(request, credential.getSocialId(), socialType);
}
return "redirect:/";
}
@RequestMapping(value = "/callback/link", method = RequestMethod.GET)
public String linkCallback(ModelMap modelMap, HttpServletRequest request) {
String status = request.getParameter("status");
String refererURI = request.getSession().getAttribute("refererURI").toString();
request.getSession().removeAttribute("refererURI");
modelMap.put("socialType", SocialMediaType.TWITTER.toString().toLowerCase());
modelMap.put("status", status);
modelMap.put("refererURI", refererURI);
return "/base/social-user-link";
}
}