From b40ffad756ef160c3bf8353a7878e683365e405d Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Tue, 30 Aug 2022 09:54:19 +0200
Subject: [PATCH] Improving documentation for the endpoints in POIService

---
 .../nibio/vips/logic/service/POIService.java  | 206 +++++++++---------
 1 file changed, 99 insertions(+), 107 deletions(-)

diff --git a/src/main/java/no/nibio/vips/logic/service/POIService.java b/src/main/java/no/nibio/vips/logic/service/POIService.java
index 7333c185..ce2849c0 100644
--- a/src/main/java/no/nibio/vips/logic/service/POIService.java
+++ b/src/main/java/no/nibio/vips/logic/service/POIService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 NIBIO <http://www.nibio.no/>. 
+ * Copyright (c) 2022 NIBIO <http://www.nibio.no/>. 
  * 
  * This file is part of VIPSLogic.
  * VIPSLogic is free software: you can redistribute it and/or modify
@@ -40,184 +40,176 @@ import javax.ws.rs.core.Response.Status;
 
 import org.jboss.resteasy.spi.HttpRequest;
 import org.locationtech.jts.geom.Coordinate;
-import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.Point;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.webcohesion.enunciate.metadata.Facet;
+import com.webcohesion.enunciate.metadata.rs.TypeHint;
 
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.logic.entity.Country;
-import no.nibio.vips.logic.entity.Observation;
-import no.nibio.vips.logic.entity.ObservationIllustrationPK;
 import no.nibio.vips.logic.entity.Organization;
 import no.nibio.vips.logic.entity.PointOfInterest;
 import no.nibio.vips.logic.entity.PointOfInterestWeatherStation;
-import no.nibio.vips.logic.entity.PolygonService;
 import no.nibio.vips.logic.entity.VipsLogicUser;
 import no.nibio.vips.logic.util.Globals;
 import no.nibio.vips.logic.controller.session.SessionControllerGetter;
 
 /**
- * @copyright 2021 <a href="http://www.nibio.no/">NIBIO</a>
+ * @copyright 2022 <a href="http://www.nibio.no/">NIBIO</a>
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @Path("rest/poi")
 public class POIService {
-	
-	@Context
+
+    @Context
     private HttpRequest httpRequest;
     @Context
     private HttpServletRequest httpServletRequest;
-    
-	
+
     /**
      * Get a list of locations (pois) for a given organization
+     *
      * @param organizationId
-     * @return 
+     * @return
      */
     @GET
     @Path("organization/{organizationId}")
     @Produces("application/json;charset=UTF-8")
-    public Response getPoisForOrganization(@PathParam("organizationId") Integer organizationId)
-    {
+    @TypeHint(PointOfInterestWeatherStation[].class)
+    public Response getPoisForOrganization(@PathParam("organizationId") Integer organizationId) {
         Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId);
         List<PointOfInterestWeatherStation> retVal = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForOrganization(organization, Boolean.TRUE);
         return Response.ok().entity(retVal).build();
     }
-    
+
     /**
-     * 
+     *
      * @param pointOfInterestId
      * @return a particular POI (Point of interest)
      */
     @GET
     @Path("{pointOfInterestId}")
     @Produces("application/json;charset=UTF-8")
-    public Response getPoi(@PathParam("pointOfInterestId") Integer pointOfInterestId)
-    {
+    @TypeHint(PointOfInterest.class)
+    public Response getPoi(@PathParam("pointOfInterestId") Integer pointOfInterestId) {
         PointOfInterest retVal = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(pointOfInterestId);
         return Response.ok().entity(retVal).build();
     }
-    
+
     /**
      * Find a POI (Point of interest) by name
+     *
      * @param poiName
-     * @return 
+     * @return
      */
     @GET
     @Path("name/{poiName}")
     @Produces("application/json;charset=UTF-8")
-    public Response getPoiByName(@PathParam("poiName") String poiName)
-    {
+    @TypeHint(PointOfInterest.class)
+    public Response getPoiByName(@PathParam("poiName") String poiName) {
         PointOfInterest retVal = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(poiName);
         return retVal != null ? Response.ok().entity(retVal).build() : Response.noContent().build();
     }
-    
+
     /**
-     * If used outside of VIPSLogic: Requires a valid UUID to be provided in the Authorization header
-     * @return 
+     * If used outside of VIPSLogic: Requires a valid UUID to be provided in the
+     * Authorization header
+     *
+     * @return
      */
     @GET
     @Path("user")
     @Produces("application/json;charset=UTF-8")
     @Facet("restricted")
-    public Response getPoisForCurrentUser()
-    {
+    @TypeHint(PointOfInterest[].class)
+    public Response getPoisForCurrentUser() {
         VipsLogicUser user = (VipsLogicUser) httpServletRequest.getSession().getAttribute("user");
         // Could be the VIPS obs app or some other client using UUID
-        if(user == null)
-        {
-        	String uuidStr = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
-    		UUID uuid = UUID.fromString(uuidStr);
-    		user = SessionControllerGetter.getUserBean().findVipsLogicUser(uuid);
-    		if(user == null)
-    		{
-    			return Response.status(Status.UNAUTHORIZED).build();
-    		}
+        if (user == null) {
+            String uuidStr = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
+            UUID uuid = UUID.fromString(uuidStr);
+            user = SessionControllerGetter.getUserBean().findVipsLogicUser(uuid);
+            if (user == null) {
+                return Response.status(Status.UNAUTHORIZED).build();
+            }
         }
         List<PointOfInterest> retVal = SessionControllerGetter.getPointOfInterestBean().getRelevantPointOfInterestsForUser(user);
         return Response.ok().entity(retVal).build();
     }
     
+    /**
+     * TODO Add request example
+     * @param poiJson
+     * @return 
+     */
     @POST
     @Path("syncpoifromapp")
     @Consumes("application/json;charset=UTF-8")
     @Produces("application/json;charset=UTF-8")
     public Response syncPOIFromApp(
-    		String poiJson
-    		)
-    {
-    	VipsLogicUser user = SessionControllerGetter.getUserBean().getUserFromUUID(httpServletRequest);
-    	if(user == null)
-    	{
-    		return Response.status(Status.UNAUTHORIZED).build();
-    	}
-    	ObjectMapper oM = new ObjectMapper();
-    	SimpleDateFormat df = new SimpleDateFormat(Globals.defaultTimestampFormat);
-    	try {
-    		Map<Object,Object> mapFromApp = oM.readValue(poiJson, new TypeReference<HashMap<Object,Object>>(){});
-			// Check if it is marked as deleted or not
-			if(mapFromApp.get("deleted") != null && ((Boolean)mapFromApp.get("deleted").equals(true)))
-			{
-				if(SessionControllerGetter.getPointOfInterestBean().getPointOfInterest((Integer)mapFromApp.get("pointOfInterestId")) != null)
-				{
-					SessionControllerGetter.getPointOfInterestBean().deletePoi((Integer)mapFromApp.get("pointOfInterestId"));
-					return Response.ok().build();
-				}
-				else
-				{
-					return Response.status(Status.NOT_FOUND).build();
-				}
-			}
-			else
-			{
-				PointOfInterest mergePoi = ((Integer)mapFromApp.get("pointOfInterestId")) > 0 ? SessionControllerGetter.getPointOfInterestBean().getPointOfInterest((Integer)mapFromApp.get("pointOfInterestId")): PointOfInterest.getInstance((Integer)mapFromApp.get("pointOfInterestTypeId"));
-				// Trying to sync a non-existing observation
-				if(mergePoi == null)
-				{
-					return Response.status(Status.NOT_FOUND).build();
-				}
-				
-				mergePoi.setName((String)mapFromApp.get("name"));
-				mergePoi.setTimeZone(mapFromApp.get("timeZone") != null ? 
-						(String) mapFromApp.get("timeZone") 
-						: user.getOrganizationId().getDefaultTimeZone()
-						);
-				mergePoi.setLongitude((Double) mapFromApp.get("longitude"));
-				mergePoi.setLatitude((Double) mapFromApp.get("latitude"));
-				try {
-					Double altitude = mapFromApp.get("altitude") instanceof Integer ? 
-							((Integer) mapFromApp.get("altitude")).doubleValue()
-							:(Double) mapFromApp.get("altitude");
-					mergePoi.setAltitude(altitude);
-				}
-				catch(NullPointerException | ClassCastException ex)
-				{
-					mergePoi.setAltitude(0.0);
-				}
-				mergePoi.setCountryCode(
-						mapFromApp.get("countryCode") != null ? 
-						new Country((String)(((Map<Object,Object>)mapFromApp.get("countryCode")).get("countryCode")))
-						: user.getOrganizationId().getCountryCode()
-						);
-				mergePoi.setUser(user);
-				mergePoi.setLastEditedTime(new Date());
-				GISUtil gisUtil = new GISUtil();
-				Coordinate coordinate = new Coordinate(mergePoi.getLongitude(), mergePoi.getLatitude(), mergePoi.getAltitude());
-				Point p3d = gisUtil.createPointWGS84(coordinate);
-				mergePoi.setGisGeom(p3d);
-				
-				mergePoi = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(SessionControllerGetter.getPointOfInterestBean().storePoi(mergePoi).getPointOfInterestId());
-				
-				
-				return Response.ok().entity(mergePoi).build();
-			}
-		} catch (IOException e) {
-			return Response.serverError().entity(e).build();
-		}
-    	
+            String poiJson
+    ) {
+        VipsLogicUser user = SessionControllerGetter.getUserBean().getUserFromUUID(httpServletRequest);
+        if (user == null) {
+            return Response.status(Status.UNAUTHORIZED).build();
+        }
+        ObjectMapper oM = new ObjectMapper();
+        SimpleDateFormat df = new SimpleDateFormat(Globals.defaultTimestampFormat);
+        try {
+            Map<Object, Object> mapFromApp = oM.readValue(poiJson, new TypeReference<HashMap<Object, Object>>() {
+            });
+            // Check if it is marked as deleted or not
+            if (mapFromApp.get("deleted") != null && ((Boolean) mapFromApp.get("deleted").equals(true))) {
+                if (SessionControllerGetter.getPointOfInterestBean().getPointOfInterest((Integer) mapFromApp.get("pointOfInterestId")) != null) {
+                    SessionControllerGetter.getPointOfInterestBean().deletePoi((Integer) mapFromApp.get("pointOfInterestId"));
+                    return Response.ok().build();
+                } else {
+                    return Response.status(Status.NOT_FOUND).build();
+                }
+            } else {
+                PointOfInterest mergePoi = ((Integer) mapFromApp.get("pointOfInterestId")) > 0 ? SessionControllerGetter.getPointOfInterestBean().getPointOfInterest((Integer) mapFromApp.get("pointOfInterestId")) : PointOfInterest.getInstance((Integer) mapFromApp.get("pointOfInterestTypeId"));
+                // Trying to sync a non-existing observation
+                if (mergePoi == null) {
+                    return Response.status(Status.NOT_FOUND).build();
+                }
+
+                mergePoi.setName((String) mapFromApp.get("name"));
+                mergePoi.setTimeZone(mapFromApp.get("timeZone") != null
+                        ? (String) mapFromApp.get("timeZone")
+                        : user.getOrganizationId().getDefaultTimeZone()
+                );
+                mergePoi.setLongitude((Double) mapFromApp.get("longitude"));
+                mergePoi.setLatitude((Double) mapFromApp.get("latitude"));
+                try {
+                    Double altitude = mapFromApp.get("altitude") instanceof Integer
+                            ? ((Integer) mapFromApp.get("altitude")).doubleValue()
+                            : (Double) mapFromApp.get("altitude");
+                    mergePoi.setAltitude(altitude);
+                } catch (NullPointerException | ClassCastException ex) {
+                    mergePoi.setAltitude(0.0);
+                }
+                mergePoi.setCountryCode(
+                        mapFromApp.get("countryCode") != null
+                        ? new Country((String) (((Map<Object, Object>) mapFromApp.get("countryCode")).get("countryCode")))
+                        : user.getOrganizationId().getCountryCode()
+                );
+                mergePoi.setUser(user);
+                mergePoi.setLastEditedTime(new Date());
+                GISUtil gisUtil = new GISUtil();
+                Coordinate coordinate = new Coordinate(mergePoi.getLongitude(), mergePoi.getLatitude(), mergePoi.getAltitude());
+                Point p3d = gisUtil.createPointWGS84(coordinate);
+                mergePoi.setGisGeom(p3d);
+
+                mergePoi = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(SessionControllerGetter.getPointOfInterestBean().storePoi(mergePoi).getPointOfInterestId());
+
+                return Response.ok().entity(mergePoi).build();
+            }
+        } catch (IOException e) {
+            return Response.serverError().entity(e).build();
+        }
+
     }
 
 }
-- 
GitLab