· 6 years ago · Mar 17, 2020, 03:48 AM
1package paroxayte.be.fdc.search;
2
3import com.fasterxml.jackson.annotation.JsonFormat;
4import com.fasterxml.jackson.annotation.JsonGetter;
5import com.fasterxml.jackson.databind.JsonNode;
6import com.fasterxml.jackson.databind.ObjectMapper;
7import com.fasterxml.jackson.databind.node.ObjectNode;
8
9import paroxayte.util.Json;
10
11import java.util.List;
12
13public final class SearchRequest implements Json {
14
15 public final String brandOwner;
16 public final String generalSearchInput;
17 public final List<String> includeDataTypeList;
18 public final List<String> ingredients;
19 @JsonFormat(shape = JsonFormat.Shape.STRING)
20 public final int pageNumber;
21 @JsonFormat(shape = JsonFormat.Shape.STRING)
22 public final boolean requireAllWords;
23 public final SortDirection sortDirection;
24 public final SortField sortField;
25
26 public SearchRequest( String brandOwner
27 , String generalSearchInput
28 , List<String> includeDataTypeList
29 , List<String> ingredients
30 , int pageNumber
31 , boolean requireAllWords
32 , SortDirection sortDirection
33 , SortField sortField
34 ) {
35 this.brandOwner = brandOwner;
36 this.generalSearchInput = generalSearchInput;
37 this.includeDataTypeList = includeDataTypeList;
38 this.ingredients = ingredients;
39 this.pageNumber = pageNumber;
40 this.requireAllWords = requireAllWords;
41 this.sortDirection = sortDirection;
42 this.sortField = sortField;
43 }
44
45 @JsonGetter("sortDirection")
46 private String fmtSortDirection() {
47 switch(sortDirection) {
48 case ASCENDING : return "asc";
49 case DESCENDING : return "desc";
50 default : throw new IllegalStateException("unreachable case");
51 }
52 }
53
54 @JsonGetter("sortField")
55 private String fmtSortField() {
56 switch(sortField) {
57 case DESCRIPTION : return "lowercaseDescription.keyword";
58 case TYPE : return "dataType.keyword";
59 case DATE : return "publishedDate";
60 case FDC_ID : return "fdcId";
61 default : throw new IllegalStateException("unreachable case");
62 }
63 }
64
65 // injects api key durring serialization from FDC_TOKEN env
66 @Override
67 public JsonNode toJson() {
68 var mapper = new ObjectMapper();
69 var json = (ObjectNode)mapper.valueToTree(this);
70 json.put("api_key", System.getenv("FDC_TOKEN"));
71 return json;
72 }
73
74}