/* * Copyright (C) 2014 SCVNGR, Inc. d/b/a LevelUp * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.scvngr.levelup.core.net.request.factory; import android.content.Context; import android.support.annotation.NonNull; import com.scvngr.levelup.core.annotation.AccessTokenRequired; import com.scvngr.levelup.core.annotation.LevelUpApi; import com.scvngr.levelup.core.annotation.LevelUpApi.Contract; import com.scvngr.levelup.core.annotation.RequiresPermission; import com.scvngr.levelup.core.annotation.VisibleForTesting; import com.scvngr.levelup.core.annotation.VisibleForTesting.Visibility; import com.scvngr.levelup.core.net.AbstractRequest; import com.scvngr.levelup.core.net.AccessTokenRetriever; import com.scvngr.levelup.core.net.HttpMethod; import com.scvngr.levelup.core.net.JSONObjectRequestBody; import com.scvngr.levelup.core.net.LevelUpRequest; import com.scvngr.levelup.core.net.Permissions; import com.scvngr.levelup.core.util.LogManager; import com.scvngr.levelup.core.util.NullUtils; import net.jcip.annotations.Immutable; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * Builds requests to claim {@link com.scvngr.levelup.core.model.Campaign}s. */ @Immutable @LevelUpApi(contract = Contract.PUBLIC) public final class ClaimRequestFactory extends AbstractRequestFactory { /** * Outer parameter key for LegacyLoyalty. */ @VisibleForTesting(visibility = Visibility.PRIVATE) @NonNull /* package */static final String OUTER_PARAM_LEGACY_LOYALTY = "legacy_loyalty"; /** * Parameter key for legacy loyalty card number. */ @VisibleForTesting(visibility = Visibility.PRIVATE) @NonNull /* package */static final String PARAM_LEGACY_ID = "legacy_id"; /** * @param context the Application context. * @param retriever the implementation of {@link AccessTokenRetriever} to use to get the * {@link com.scvngr.levelup.core.model.User}'s * {@link com.scvngr.levelup.core.model.AccessToken}. */ public ClaimRequestFactory(@NonNull final Context context, @NonNull final AccessTokenRetriever retriever) { super(context, retriever); } /** * Build a request to claim a "Legacy Loyalty" campaign. A Legacy Loyalty campaign transfers a * user's loyalty data from their old loyalty system to LevelUp. * * @param loyaltyCampaignId the web service ID of the legacy loyalty campaign. * @param loyaltyId the user's ID from their legacy loyalty program. * @return the {@link AbstractRequest} to use to claim the legacy loyalty campaign. */ @NonNull @LevelUpApi(contract = Contract.PUBLIC) @RequiresPermission(Permissions.PERMISSION_MANAGE_USER_CAMPAIGNS) @AccessTokenRequired public AbstractRequest buildClaimLegacyLoyaltyRequest(final int loyaltyCampaignId, @NonNull final String loyaltyId) { final JSONObject object = new JSONObject(); final JSONObject legacyLoyaltyObject = new JSONObject(); try { legacyLoyaltyObject.put(PARAM_LEGACY_ID, loyaltyId); object.put(OUTER_PARAM_LEGACY_LOYALTY, legacyLoyaltyObject); } catch (final JSONException e) { LogManager.e("Error Building legacy Loyalty claim request", e); } return new LevelUpRequest(getContext(), HttpMethod.POST, LevelUpRequest.API_VERSION_CODE_V15, NullUtils.format("loyalties/legacy/%d/claims", loyaltyCampaignId), null, new JSONObjectRequestBody(object), getAccessTokenRetriever()); } /** * Build a request to claim a generic campaign by its cohort code. * * @param code the code to claim. * @return the {@link AbstractRequest} to use to claim the * {@link com.scvngr.levelup.core.model.Campaign}. */ @NonNull @LevelUpApi(contract = Contract.PUBLIC) @RequiresPermission(Permissions.PERMISSION_MANAGE_USER_CAMPAIGNS) @AccessTokenRequired public AbstractRequest buildClaimCampaignRequest(@NonNull final String code) { String codeToClaim = code; try { codeToClaim = URLEncoder.encode(code, "UTF-8"); } catch (final UnsupportedEncodingException e) { LogManager.e("Unsupported encoding when encoding code to claim", e); } return new LevelUpRequest(getContext(), HttpMethod.POST, LevelUpRequest.API_VERSION_CODE_V15, NullUtils.format( "codes/%s/claims", codeToClaim), null, null, getAccessTokenRetriever()); } }