001package com.gigya.android.sdk.api;
002
003import com.gigya.android.sdk.Config;
004import com.gigya.android.sdk.Gigya;
005import com.gigya.android.sdk.GigyaLogger;
006import com.gigya.android.sdk.network.adapter.RestAdapter;
007import com.gigya.android.sdk.session.ISessionService;
008import com.gigya.android.sdk.utils.AuthUtils;
009import com.gigya.android.sdk.utils.UrlUtils;
010
011import java.util.Map;
012import java.util.TreeMap;
013
014public class GigyaApiRequestFactory implements IApiRequestFactory {
015
016    private static final String LOG_TAG = "GigyaApiRequestFactory";
017
018    final private Config _config;
019    final private ISessionService _sessionService;
020
021    public GigyaApiRequestFactory(Config config, ISessionService sessionService) {
022        _config = config;
023        _sessionService = sessionService;
024    }
025
026    /**
027     * Create a new instance of the GigyaApiRequest structure.
028     *
029     * @param api        Api method.
030     * @param params     Request parameters.
031     * @param httpMethod Request HTTP method.
032     * @return New GigyaApiRequest instance.
033     */
034    public GigyaApiRequest create(String api, Map<String, Object> params, RestAdapter.HttpMethod httpMethod) {
035        TreeMap<String, Object> urlParams = new TreeMap<>();
036        if (params != null) {
037            urlParams.putAll(params);
038        }
039
040        // Add general parameters.
041        urlParams.put("sdk", "Android_" + Gigya.VERSION);
042        urlParams.put("targetEnv", "mobile");
043        urlParams.put("httpStatusCodes", false);
044        urlParams.put("format", "json");
045
046        // Add configuration parameters
047        final String gmid = _config.getGmid();
048        if (gmid != null) {
049            urlParams.put("gmid", gmid);
050        }
051        final String ucid = _config.getUcid();
052        if (ucid != null) {
053            urlParams.put("ucid", ucid);
054        }
055
056        // Generate new GigyaApiRequest entity.
057        return new GigyaApiRequest(httpMethod, api, urlParams);
058    }
059
060    /**
061     * Sign the request prior to dispatching it.
062     *
063     * @param request GigyaApiRequest instance.
064     */
065    @Override
066    public GigyaApiHttpRequest sign(GigyaApiRequest request) {
067
068        // The request will need to be resigned. To avoid signature errors we must remove all
069        // authentication parameters from the original request. Order must be kept prior to signing the request.
070        AuthUtils.removeAuthenticationParameters(request.getParams());
071
072        GigyaLogger.debug(LOG_TAG, "sign: offset for signer = " + _config.getServerOffset());
073
074        // Add authentication parameters. Get SDK Config request is an exception.
075        if (_sessionService.isValid() && !request.isAnonymous()) {
076            final String sessionToken = _sessionService.getSession().getSessionToken();
077            request.getParams().put("oauth_token", sessionToken);
078            final String sessionSecret = _sessionService.getSession().getSessionSecret();
079            AuthUtils.addAuthenticationParameters(
080                    sessionSecret,
081                    request.getMethod().intValue(),
082                    UrlUtils.getBaseUrl(request.getApi(), _config.getApiDomain()),
083                    request.getParams(),
084                    _config.getServerOffset());
085        } else {
086            request.getParams().put("apiKey", _config.getApiKey());
087        }
088
089        GigyaLogger.debug(LOG_TAG, "sign: request parameters:\n" + request.getParams().toString());
090
091        // Encode url & generate encoded parameters.
092        final String encodedParams = UrlUtils.buildEncodedQuery(request.getParams());
093        final String url = UrlUtils.getBaseUrl(request.getApi(),
094                _config.getApiDomain()) + (request.getMethod() == RestAdapter.HttpMethod.GET ? "?" + encodedParams : "");
095
096        // Return a new instance of a signed REST request.
097        return new GigyaApiHttpRequest(request.getMethod(), url, encodedParams);
098    }
099}