Github user bbende commented on a diff in the pull request:
https://github.com/apache/nifi-registry/pull/22#discussion_r145762243
--- Diff:
nifi-registry-web-api/src/main/java/org/apache/nifi/registry/web/api/FlowResource.java
---
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.nifi.registry.web.api;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.nifi.registry.authorization.Authorizer;
+import org.apache.nifi.registry.field.Fields;
+import org.apache.nifi.registry.service.AuthorizationService;
+import org.apache.nifi.registry.service.RegistryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Set;
+
+@Component
+@Path("/flows")
+@Api(
+ value = "/flows",
+ description = "Gets metadata about flows."
+)
+public class FlowResource extends AuthorizableApplicationResource {
+
+ private final RegistryService registryService;
+
+ @Autowired
+ public FlowResource(
+ final RegistryService registryService,
+ final AuthorizationService authorizationService,
+ final Authorizer authorizer) {
+ super(authorizer, authorizationService);
+ this.registryService = registryService;
+ }
+
+ @GET
+ @Path("fields")
+ @Consumes(MediaType.WILDCARD)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiOperation(
+ value = "Retrieves the available field names that can be used
for searching or sorting on flows.",
+ response = Fields.class
+ )
+ public Response getAvailableFlowFields() {
+ final Set<String> flowFields = registryService.getFlowFields();
+ final Fields fields = new Fields(flowFields);
+ return Response.status(Response.Status.OK).entity(fields).build();
+ }
+
+}
--- End diff --
I like the idea of possibly combining them all into one call under
/fields... the way it was currently done was simply to align with the resource
type being returned by the REST end-point, but maybe that is not the easiest to
maintain.
The reason I wanted to make it dynamic was because I envisioned someone
later modifying the DB entities and having no idea that there were these
end-points that returned field names, and now either fields are missing, or
fields are present that were removed, etc.
A different option I considered was not having any of the /fields
end-points and relying on the names in the entities returned from the REST API,
but since the DB and REST layer are using different objects we would then need
to maintain a mapping of field names between the two, which also seems error
prone.
I'm kind of torn because it feels awkward right now to return entities with
certain fields, and then say oh sorry these are the actual names you can
search/sort on. Let me keep thinking about it.
---