Package org.fluxtream.core.api

Source Code of org.fluxtream.core.api.FacebookLoginController

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;
    }
}
TOP

Related Classes of org.fluxtream.core.api.FacebookLoginController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.