From ce53fde40de5ec24bdfd543e7e343afb268ae29a Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Mon, 21 Nov 2022 13:00:47 -0700
Subject: [PATCH] add test sites service and controller

---
 .../nshmp/netcdf/www/TestSitesController.java | 91 +++++++++++++++++++
 .../nshmp/netcdf/www/TestSitesService.java    | 49 ++++++++++
 2 files changed, 140 insertions(+)
 create mode 100644 src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java
 create mode 100644 src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java

diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java
new file mode 100644
index 0000000..4a1b436
--- /dev/null
+++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java
@@ -0,0 +1,91 @@
+package gov.usgs.earthquake.nshmp.netcdf.www;
+
+import java.nio.file.Path;
+
+import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection;
+import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesHazardCurves;
+import gov.usgs.earthquake.nshmp.netcdf.www.TestSitesService.RequestData;
+import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
+
+import io.micronaut.context.annotation.Value;
+import io.micronaut.context.event.StartupEvent;
+import io.micronaut.core.annotation.Nullable;
+import io.micronaut.http.HttpRequest;
+import io.micronaut.http.HttpResponse;
+import io.micronaut.http.MediaType;
+import io.micronaut.http.annotation.Controller;
+import io.micronaut.http.annotation.Get;
+import io.micronaut.http.annotation.PathVariable;
+import io.micronaut.http.annotation.QueryValue;
+import io.micronaut.runtime.event.annotation.EventListener;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.inject.Inject;
+
+@Tag(name = TestSitesService.NAME)
+@Controller("/sites")
+public class TestSitesController {
+
+  @Inject
+  private NshmpMicronautServlet servlet;
+
+  /**
+   * The path to a hazard NetCDF file
+   */
+  @Value("${nshmp-ws-static.netcdf-path}")
+  Path netcdfPath;
+
+  NetcdfServiceHazardCurves service;
+
+  /**
+   * Read in data type and return the appropriate service to use.
+   */
+  @EventListener
+  void startup(StartupEvent event) {
+    var netcdfDataFiles = new NetcdfDataFilesHazardCurves(netcdfPath);
+    service = new NetcdfServiceHazardCurves(netcdfDataFiles);
+  }
+
+  @Operation(
+      summary = "Get the GeoJSON Feature Collection of test sites",
+      description = "Returns the feature collection of test sites",
+      operationId = "test-sites")
+  @ApiResponse(
+      description = "NSHM test sites",
+      responseCode = "200",
+      content = @Content(
+          schema = @Schema(implementation = Response.class)))
+  @Get(uri = "{?raw}", produces = MediaType.APPLICATION_JSON)
+  public HttpResponse<String> doGet(
+      HttpRequest<?> http,
+      @QueryValue(defaultValue = "false") @Nullable Boolean raw) {
+    try {
+      return HttpResponse.ok(TestSitesService.handleSites(http, service.netcdf(), raw));
+    } catch (Exception e) {
+      return NetcdfWsUtils.handleError(e, TestSitesService.NAME, http.getUri().toString());
+    }
+  }
+
+  @Operation(
+      summary = "Get the GeoJSON Feature Collection of test sites",
+      description = "Returns the feature collection of test sites",
+      operationId = "test-sites-slash")
+  @ApiResponse(
+      description = "NSHM test sites",
+      responseCode = "200",
+      content = @Content(
+          schema = @Schema(implementation = Response.class)))
+  @Get(uri = "/{raw}", produces = MediaType.APPLICATION_JSON)
+  public HttpResponse<String> doGetSlash(
+      HttpRequest<?> http,
+      @PathVariable(defaultValue = "false") @Nullable Boolean raw) {
+    return doGet(http, raw);
+  }
+
+  // Swagger schema
+  private static class Response extends ResponseBody<RequestData, FeatureCollection> {};
+}
diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java
new file mode 100644
index 0000000..771ef45
--- /dev/null
+++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java
@@ -0,0 +1,49 @@
+package gov.usgs.earthquake.nshmp.netcdf.www;
+
+import com.google.gson.JsonElement;
+
+import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection;
+import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves;
+import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
+import gov.usgs.earthquake.nshmp.www.ResponseBody;
+import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
+
+import io.micronaut.http.HttpRequest;
+import jakarta.inject.Singleton;
+
+/**
+ * Test sites handler for {@link TestSitesController}.
+ *
+ * @author U.S. Geological Survey
+ */
+@Singleton
+public class TestSitesService {
+  static final String NAME = "Test Sites";
+
+  static String handleSites(HttpRequest<?> http, NetcdfHazardCurves netcdf, Boolean raw) {
+    RequestData requestData = new RequestData(raw);
+    FeatureCollection sites = netcdf.netcdfData().sites();
+
+    if (requestData.raw) {
+      return sites.toJson();
+    } else {
+      var response = ResponseBody.<RequestData, JsonElement> success()
+          .name(NAME)
+          .url(http.getUri().toString())
+          .metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
+          .request(requestData)
+          .response(sites.toJsonTree())
+          .build();
+
+      return NetcdfWsUtils.GSON.toJson(response);
+    }
+  }
+
+  static class RequestData {
+    public boolean raw;
+
+    RequestData(Boolean raw) {
+      this.raw = raw == null ? false : raw;
+    }
+  }
+}
-- 
GitLab