Skip to content

Commit 23da378

Browse files
authored
Merge pull request #394 from turo/b/dunlop-14219_get_all_zendesk_tickets
feat(searchPagination): add pagination search api for tickets
2 parents 65fa481 + cade7a7 commit 23da378

File tree

3 files changed

+164
-23
lines changed

3 files changed

+164
-23
lines changed

src/main/java/org/zendesk/client/v2/Zendesk.java

Lines changed: 96 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.zendesk.client.v2.model.Ticket;
4848
import org.zendesk.client.v2.model.TicketForm;
4949
import org.zendesk.client.v2.model.TicketImport;
50+
import org.zendesk.client.v2.model.TicketPage;
5051
import org.zendesk.client.v2.model.TicketResult;
5152
import org.zendesk.client.v2.model.Topic;
5253
import org.zendesk.client.v2.model.Trigger;
@@ -90,6 +91,7 @@
9091
import java.util.Map;
9192
import java.util.NoSuchElementException;
9293
import java.util.Objects;
94+
import java.util.Optional;
9395
import java.util.concurrent.ExecutionException;
9496
import java.util.concurrent.TimeUnit;
9597
import java.util.regex.Pattern;
@@ -1719,37 +1721,75 @@ public <T extends SearchResultEntity> Iterable<T> getSearchResults(Class<T> type
17191721

17201722

17211723
public <T extends SearchResultEntity> Iterable<T> getSearchResults(Class<T> type, String query, Map<String, Object> params) {
1722-
String typeName = null;
1723-
for (Map.Entry<String, Class<? extends SearchResultEntity>> entry : searchResultTypes.entrySet()) {
1724-
if (type.equals(entry.getValue())) {
1725-
typeName = entry.getKey();
1726-
break;
1727-
}
1728-
}
1724+
String typeName = getTypeName(type);
1725+
17291726
if (typeName == null) {
17301727
return Collections.emptyList();
17311728
}
17321729

1733-
StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace
1734-
1735-
//we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri
1736-
for (String paramName : params.keySet()) {
1737-
uriTemplate.append(",")
1738-
.append(paramName);
1739-
}
1740-
1741-
uriTemplate.append("}");
1742-
1743-
TemplateUri templateUri = tmpl(uriTemplate.toString())
1744-
.set("query", query + "+type:" + typeName);
1745-
1746-
if(params != null) {
1747-
templateUri.set(params);
1748-
}
1730+
TemplateUri templateUri = getSearchUri(params, query, typeName);
17491731

17501732
return new PagedIterable<>(templateUri, handleList(type, "results"));
17511733
}
1734+
1735+
/**
1736+
* Search API implementation with pagination support.
1737+
*
1738+
* @param String query string used filter a type given by searchType
1739+
* @param Map<String, Object> additional parameters other than filter string like per_page, page etc
1740+
* @param String name of any field of the searchType
1741+
* @param SortOrder
1742+
* @param Class<?> type of search entity like Ticket, User etc
1743+
* @param Class<T> page return type to which the search result will be deserialized
1744+
*/
1745+
public <T> Optional<T> getSearchResults(
1746+
final Class<?> searchType,
1747+
final Class<T> pageType,
1748+
final String query,
1749+
final Map<String, Object> queryParams,
1750+
final String sortBy,
1751+
final SortOrder sortOrder
1752+
) {
1753+
1754+
String typeName = getTypeName(searchType);
1755+
1756+
if (typeName == null) {
1757+
return Optional.empty();
1758+
}
1759+
1760+
final Map<String, Object> paramsMap = new HashMap<>();
1761+
1762+
if(queryParams != null) {
1763+
paramsMap.putAll(queryParams);
1764+
}
1765+
1766+
if(sortBy!=null && sortOrder!=null) {
1767+
paramsMap.put("sort_by", sortBy);
1768+
paramsMap.put("sort_order", sortOrder.getQueryParameter());
1769+
}
17521770

1771+
final TemplateUri templateUri = getSearchUri(paramsMap, query, typeName);
1772+
1773+
return Optional.of(complete(submit(req("GET", templateUri.toString()), handle(pageType))));
1774+
}
1775+
1776+
/**
1777+
* Ticket Search API implementation with pagination support.
1778+
*
1779+
* @param String query string used filter a type given by searchType
1780+
* @param Map<String, Object> additional parameters other than filter string like per_page, page etc
1781+
* @param String name of any field of the searchType
1782+
* @param SortOrder
1783+
*/
1784+
public Optional<TicketPage> getSearchTicketResults(
1785+
final String query,
1786+
final Map<String, Object> queryParams,
1787+
final String sortBy,
1788+
final SortOrder sortOrder) {
1789+
1790+
return getSearchResults(Ticket.class, TicketPage.class, query, queryParams, sortBy, sortOrder);
1791+
}
1792+
17531793
public void notifyApp(String json) {
17541794
complete(submit(req("POST", cnst("/apps/notify.json"), JSON, json.getBytes()), handleStatus()));
17551795
}
@@ -2902,7 +2942,40 @@ private static List<String> statusArray(Status... statuses) {
29022942
}
29032943
return result;
29042944
}
2945+
2946+
private static String getTypeName(final Class<?> type) {
2947+
String typeName = null;
2948+
for (final Map.Entry<String, Class<? extends SearchResultEntity>> entry : searchResultTypes.entrySet()) {
2949+
if (type.equals(entry.getValue())) {
2950+
typeName = entry.getKey();
2951+
break;
2952+
}
2953+
}
2954+
return typeName;
2955+
}
2956+
2957+
private TemplateUri getSearchUri(Map<String, Object> params, String query , String typeName) {
2958+
2959+
StringBuilder uriTemplate = new StringBuilder("/search.json{?query"); //leave off ending curly brace
29052960

2961+
//we have to add each param name to the template so that when we call set() with a map, the entries get put in the uri
2962+
for (String paramName : params.keySet()) {
2963+
uriTemplate.append(",")
2964+
.append(paramName);
2965+
}
2966+
2967+
uriTemplate.append("}");
2968+
2969+
TemplateUri templateUri = tmpl(uriTemplate.toString())
2970+
.set("query", query + "+type:" + typeName);
2971+
2972+
if(params != null) {
2973+
templateUri.set(params);
2974+
}
2975+
2976+
return templateUri;
2977+
}
2978+
29062979
public static ObjectMapper createMapper() {
29072980
ObjectMapper mapper = new ObjectMapper();
29082981
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.zendesk.client.v2.model;
2+
3+
import java.io.Serializable;
4+
import java.util.List;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
7+
/**
8+
* This is the base class for implementing pagination on any SearchResultEntity
9+
*/
10+
public abstract class Page<T extends SearchResultEntity> implements Serializable {
11+
12+
private static final long serialVersionUID = 456807064715979598L;
13+
14+
private @JsonProperty("next_page") String nextPage;
15+
16+
private @JsonProperty("previous_page") String previousPage;
17+
18+
private List<T> results;
19+
20+
private int count;
21+
22+
public abstract Class<T> getTargetClass();
23+
24+
public List<T> getResults(){
25+
return results;
26+
}
27+
28+
public void setResults(final List<T> results) {
29+
this.results = results;
30+
}
31+
32+
public String getNextPage() {
33+
return nextPage;
34+
}
35+
36+
public void setNextPage(final String nextPage) {
37+
this.nextPage = nextPage;
38+
}
39+
40+
public String getPreviousPage() {
41+
return previousPage;
42+
}
43+
44+
public void setPreviousPage(final String previousPage) {
45+
this.previousPage = previousPage;
46+
}
47+
48+
public int getCount() {
49+
return count;
50+
}
51+
52+
public void setCount(final int count) {
53+
this.count = count;
54+
}
55+
56+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.zendesk.client.v2.model;
2+
3+
4+
public class TicketPage extends Page<Ticket> {
5+
6+
private static final long serialVersionUID = 434807064715979598L;
7+
8+
@Override
9+
public Class<Ticket> getTargetClass() {
10+
return Ticket.class;
11+
}
12+
}

0 commit comments

Comments
 (0)