package org.fluxtream.core.api;
import com.google.gson.Gson;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.types.User;
import org.fluxtream.core.Configuration;
import org.fluxtream.core.connectors.Connector;
import org.fluxtream.core.domain.ApiKey;
import org.fluxtream.core.domain.Guest;
import org.fluxtream.core.mvc.models.StatusModel;
import org.fluxtream.core.services.GuestService;
import org.fluxtream.core.services.impl.ExistingEmailException;
import org.fluxtream.core.services.impl.UsernameAlreadyTakenException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import static org.fluxtream.core.utils.Utils.generateSecureRandomString;
/**
* User: candide
* Date: 09/09/13
* Time: 12:13
*/
@Path("/v1/facebook")
@Component("RESTFacebookLoginController")
@Scope("request")
public class FacebookLoginController {
@Autowired
Configuration env;
@Autowired
GuestService guestService;
Gson gson = new Gson();
@POST
@Produces({ MediaType.APPLICATION_JSON })
@Path("/login")
public Response facebookLogin(@QueryParam("access_token") String access_token) {
String appId = env.get("facebook.appId");
String appSecret = env.get("facebook.appSecret");
try {
FacebookClient facebookClient = new DefaultFacebookClient(access_token);
User user = facebookClient.fetchObject("me", User.class);
String me = "";
try {
me = gson.toJson(user);
} catch (Exception e) {
e.printStackTrace();
}
Guest guest = guestService.getGuest(user.getUsername());
final String autoLoginToken = generateSecureRandomString();
if (guest==null) {
FacebookClient.AccessToken accessToken =
new DefaultFacebookClient().obtainExtendedAccessToken(appId, appSecret, access_token);
String firstname = user.getFirstName();
String lastname = user.getLastName();
guest = guestService.createGuest(user.getUsername(), firstname!=null?firstname:"",
lastname!=null?lastname:"",
null, user.getEmail(),
Guest.RegistrationMethod.REGISTRATION_METHOD_FACEBOOK, null);
final ApiKey apiKey = guestService.createApiKey(guest.getId(), Connector.getConnector("facebook"));
guestService.setApiKeyAttribute(apiKey, "accessToken", accessToken.getAccessToken());
guestService.setApiKeyAttribute(apiKey, "expires", String.valueOf(accessToken.getExpires().getTime()));
guestService.setApiKeyAttribute(apiKey, "me", me);
final String message = "Facebook guest creation success!";
return Response.ok(getStatusModel(guest, autoLoginToken, message)).build();
} else {
final String message = "Facebook auto-login success!";
return Response.ok(getStatusModel(guest, autoLoginToken, message)).build();
}
} catch(ExistingEmailException e) {
return Response.status(Response.Status.BAD_REQUEST).entity("We already have a user under this email address.").build();
} catch(UsernameAlreadyTakenException e) {
return Response.status(Response.Status.BAD_REQUEST).entity("Sorry, this username is already taken").build();
}
}
private StatusModel getStatusModel(final Guest guest, final String autoLoginToken, final String message) {
guestService.setAutoLoginToken(guest.getId(), autoLoginToken);
final StatusModel result = new StatusModel(true, message);
result.payload = autoLoginToken;
return result;
}
}