package com.example.listmaker.server.auth;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.example.listmaker.common.domain.User;
import com.example.listmaker.server.exception.DuplicateUserException;
import com.example.listmaker.server.exception.RestException;
import com.turbomanage.gwt.server.servlet.AuthFilter;
import com.turbomanage.httpclient.BasicHttpClient;
import com.turbomanage.httpclient.HttpResponse;
import com.turbomanage.httpclient.ParameterMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Created by david on 7/18/14.
*/
@Path("auth/f")
public class Facebook extends LoginHelper {
private static final String APP_ID = "FB_APP_ID";
private static final String APP_SECRET = "FB_APP_SECRET";
public static class FBUser {
public String id;
public String email;
public String first_name;
public String gender;
public String last_name;
public String link;
public String locale;
public String name;
public int timezone;
public String updated_time;
public boolean verified;
}
public static class PicData {
public PicInfo data;
}
public static class PicInfo {
public String url;
public String is_silhouette;
}
@GET
@Path("login")
public Response login(
@QueryParam("code") String code,
@Context HttpServletRequest req,
@Context HttpServletResponse res) throws IOException {
// already logged in
if (AuthFilter.getUser() != null) {
try {
return Response.temporaryRedirect(new URI(getAppUrl(req))).build();
} catch (URISyntaxException e) {
throw new RestException(e);
}
}
// exchange code for token
String url = "https://graph.facebook.com/oauth/access_token";
BasicHttpClient httpClient = new BasicHttpClient();
HttpResponse fbResponse = httpClient.get(url, new ParameterMap()
.add("client_id", APP_ID)
.add("client_secret", APP_SECRET)
.add("redirect_uri", getCallbackURI(req))
.add("code", code));
String[] params = fbResponse.getBodyAsString().split("&");
String token = params[0].split("=")[1];
url = "https://graph.facebook.com/me?access_token=" + token;
HttpResponse json = httpClient.get(url, null);
ObjectMapper om = new ObjectMapper();
FBUser fbUser = om.readValue(json.getBodyAsString(), FBUser.class);
String email = fbUser.email;
User user = appUserSvc.getRegisteredUser(email);
if ((user == null) || user.getFacebookId() == null) {
// Register new user
User newUser = getUserInfo(fbUser);
try {
user = registerUser(newUser);
} catch (DuplicateUserException e) {
res.sendRedirect("/s/ar.html");
}
}
AuthFilter.login(user, token);
try {
return Response.temporaryRedirect(new URI(getAppUrl(req))).build();
} catch (URISyntaxException e) {
throw new RestException(e);
}
}
private User getUserInfo(FBUser fbUser) {
User newUser = new User();
newUser.setEmailAddress(fbUser.email);
newUser.setFirstName(fbUser.first_name);
newUser.setLastName(fbUser.last_name);
newUser.setFacebookId(fbUser.id);
BasicHttpClient httpClient = new BasicHttpClient();
String url = "https://graph.facebook.com/" + fbUser.id + "/picture?redirect=0&type=small";
String picData = httpClient.get(url, null).getBodyAsString();
ObjectMapper om = new ObjectMapper();
try {
String imgUrl = om.readValue(picData, PicData.class).data.url;
newUser.setImgUrl(imgUrl);
} catch (IOException e) {
new RestException(e);
}
return newUser;
}
}