package com.urbanairship.api.reports;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.net.HttpHeaders;
import com.urbanairship.api.client.Request;
import com.urbanairship.api.client.RequestUtils;
import com.urbanairship.api.client.ResponseParser;
import com.urbanairship.api.reports.model.PushDetailResponse;
import com.urbanairship.api.reports.parse.ReportsObjectMapper;
import org.apache.http.entity.ContentType;
import org.codehaus.jackson.type.TypeReference;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PushDetailRequest implements Request<List<PushDetailResponse>> {
private final static String API_PER_PUSH_DETAIL = "/api/reports/perpush/detail/";
private final static String PUSH_IDS_KEY = "push_ids";
private final ImmutableSet.Builder<String> pushIds = new ImmutableSet.Builder<String>();
/**
* Create new push detail request.
*
* @return PushDetailRequest
*/
public static PushDetailRequest newRequest() {
return new PushDetailRequest();
}
/**
* Add a push ID to the request list.
*
* @param pushId String
* @return PerPushDetailRequest
*/
public PushDetailRequest addPushId(String pushId) {
return addPushIds(pushId);
}
/**
* Add multiple push IDs to the request list.
*
* @param pushIds String... of push IDs
* @return PerPushDetailRequest
*/
public PushDetailRequest addPushIds(String... pushIds) {
this.pushIds.addAll(Arrays.asList(pushIds));
return this;
}
/**
* Add a set of push IDs to the request audience.
*
* @param pushIds Set of push IDs
* @return ChannelTagRequest
*/
public PushDetailRequest addPushIds(Set<String> pushIds) {
this.pushIds.addAll(pushIds);
return this;
}
@Override
public ContentType getContentType() {
return ContentType.APPLICATION_JSON;
}
@Override
public Map<String, String> getRequestHeaders() {
Map<String, String> headers = new HashMap<String, String>();
headers.put(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE_JSON);
headers.put(HttpHeaders.ACCEPT, UA_VERSION_JSON);
return headers;
}
@Override
public HttpMethod getHttpMethod() {
return HttpMethod.POST;
}
@Override
public String getRequestBody() {
Preconditions.checkArgument(!pushIds.build().isEmpty(), "Push IDs when making a push detail request");
Map<String, ImmutableSet<String>> payload = new HashMap<String, ImmutableSet<String>>();
payload.put(PUSH_IDS_KEY, pushIds.build());
try {
return ReportsObjectMapper.getInstance().writeValueAsString(payload);
} catch (Exception ex) {
return "{ \"exception\" : \"" + ex.getClass().getName() + "\", \"message\" : \"" + ex.getMessage() + "\" }";
}
}
@Override
public URI getUri(URI baseUri) {
return RequestUtils.resolveURI(baseUri, API_PER_PUSH_DETAIL);
}
@Override
public ResponseParser<List<PushDetailResponse>> getResponseParser() {
return new ResponseParser<List<PushDetailResponse>>() {
@Override
public List<PushDetailResponse> parse(String response) throws IOException {
return ReportsObjectMapper.getInstance().readValue(response, new TypeReference<List<PushDetailResponse>>() {});
}
};
}
}