killbill-aplcache

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
index ad85ec7..6447a94 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/CustomFieldResource.java
@@ -22,6 +22,7 @@ import java.net.URI;
 import java.util.List;
 import java.util.UUID;
 
+import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
@@ -55,6 +56,8 @@ import org.killbill.clock.Clock;
 import org.killbill.commons.metrics.TimedResource;
 
 import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -109,6 +112,47 @@ public class CustomFieldResource extends JaxRsResourceBase {
                                                 nextPageUri);
     }
 
+
+    @TimedResource
+    @GET
+    @Path("/" + SEARCH )
+    @Produces(APPLICATION_JSON)
+    @ApiOperation(value = "Search custom fields by type, name and optional value", response = CustomFieldJson.class, responseContainer = "List")
+    @ApiResponses(value = {})
+    public Response searchCustomFieldsByTypeName(@QueryParam("objectType") final String objectType,
+                                                 @QueryParam("fieldName") final String fieldName,
+                                                 @Nullable @QueryParam("fieldValue") final String fieldValue,
+                                                 @QueryParam(QUERY_SEARCH_OFFSET) @DefaultValue("0") final Long offset,
+                                                 @QueryParam(QUERY_SEARCH_LIMIT) @DefaultValue("100") final Long limit,
+                                                 @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+                                                 @javax.ws.rs.core.Context final HttpServletRequest request) {
+
+        Preconditions.checkNotNull(objectType);
+        Preconditions.checkNotNull(fieldName);
+
+        final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
+        final Pagination<CustomField> customFields = fieldValue != null ?
+                                                     customFieldUserApi.searchCustomFields(fieldName, fieldValue, ObjectType.valueOf(objectType), offset, limit, tenantContext) :
+                                                     customFieldUserApi.searchCustomFields(fieldName,  ObjectType.valueOf(objectType), offset, limit, tenantContext);
+
+        final URI nextPageUri = uriBuilder.nextPage(CustomFieldResource.class, "searchCustomFields", customFields.getNextOffset(), limit, ImmutableMap.<String, String>of("objectType", objectType,
+                                                                                                                                                                          "fieldName", fieldName,
+                                                                                                                                                                          "fieldValue", MoreObjects.firstNonNull(fieldValue, ""),
+                                                                                                                                                                          QUERY_AUDIT, auditMode.getLevel().toString()));
+        return buildStreamingPaginationResponse(customFields,
+                                                new Function<CustomField, CustomFieldJson>() {
+                                                    @Override
+                                                    public CustomFieldJson apply(final CustomField customField) {
+                                                        // TODO Really slow - we should instead try to figure out the account id
+                                                        final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(customField.getId(), ObjectType.CUSTOM_FIELD, auditMode.getLevel(), tenantContext);
+                                                        return new CustomFieldJson(customField, auditLogs);
+                                                    }
+                                                },
+                                                nextPageUri);
+    }
+
+
+
     @TimedResource
     @GET
     @Path("/" + SEARCH + "/{searchKey:" + ANYTHING_PATTERN + "}")
@@ -136,6 +180,8 @@ public class CustomFieldResource extends JaxRsResourceBase {
                                                 nextPageUri);
     }
 
+
+
     @TimedResource
     @GET
     @Path("/{customFieldId:" + UUID_PATTERN + "}/" + AUDIT_LOG_WITH_HISTORY)

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index 1cebe3f..75d763c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.143.11</version>
+        <version>0.143.12</version>
     </parent>
     <artifactId>killbill</artifactId>
     <version>0.20.7-SNAPSHOT</version>
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
index 96cbb8b..d96d583 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
@@ -106,12 +106,30 @@ public class TestCustomField extends TestJaxrsBase {
             doSearchCustomField(customField.getValue(), customField);
         }
 
+        // Search by key
         final CustomFields customFields = customFieldApi.searchCustomFields(ObjectType.ACCOUNT.toString(), requestOptions);
         Assert.assertEquals(customFields.size(), 5);
         Assert.assertEquals(customFields.getPaginationCurrentOffset(), 0);
         Assert.assertEquals(customFields.getPaginationTotalNbRecords(), 5);
         Assert.assertEquals(customFields.getPaginationMaxNbRecords(), 5);
 
+
+        // Search by type, name
+        final CustomFields customFields2 = customFieldApi.searchCustomFieldsByTypeName(ObjectType.ACCOUNT.toString(), input.get(0).getName(), null, requestOptions);
+        Assert.assertEquals(customFields2.size(), 1);
+        Assert.assertEquals(customFields2.getPaginationCurrentOffset(), 0);
+        Assert.assertEquals(customFields2.getPaginationTotalNbRecords(), 1);
+        Assert.assertEquals(customFields2.getPaginationMaxNbRecords(), 5);
+
+
+        // Search by type, name, value
+        final CustomFields customFields3 = customFieldApi.searchCustomFieldsByTypeName(ObjectType.ACCOUNT.toString(), input.get(0).getName(),  input.get(0).getValue(), requestOptions);
+        Assert.assertEquals(customFields3.size(), 1);
+        Assert.assertEquals(customFields3.getPaginationCurrentOffset(), 0);
+        Assert.assertEquals(customFields3.getPaginationTotalNbRecords(), 1);
+        Assert.assertEquals(customFields3.getPaginationMaxNbRecords(), 5);
+
+
         final CustomFields allAccountCustomFields = accountApi.getAllCustomFields(account.getAccountId(), null, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(allAccountCustomFields.size(), 5);