From f09f24692e176848596f6cd922e20d21556cdbc0 Mon Sep 17 00:00:00 2001
From: Tucker Siegel <tgsiegel@terpmail.umd.edu>
Date: Fri, 2 Dec 2022 22:39:57 -0500
Subject: [PATCH] update year rules

---
 controllers/gdd_controller.go    |  2 +-
 controllers/nomads_controller.go |  4 +--
 models/gdd.go                    | 49 +++++++++++++++++++++++++-------
 3 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/controllers/gdd_controller.go b/controllers/gdd_controller.go
index d482652..4d209ff 100644
--- a/controllers/gdd_controller.go
+++ b/controllers/gdd_controller.go
@@ -46,6 +46,6 @@ func GetDailyGdd(c *fiber.Ctx) error {
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/normals [get]
 func GetNormalGdd(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request))
 }
diff --git a/controllers/nomads_controller.go b/controllers/nomads_controller.go
index e795925..c9f8300 100644
--- a/controllers/nomads_controller.go
+++ b/controllers/nomads_controller.go
@@ -23,7 +23,7 @@ import (
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/gefs [get]
 func GetGefsGDD(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetGefsGddValues(request))
 }
 
@@ -41,7 +41,7 @@ func GetGefsGDD(c *fiber.Ctx) error {
 // @Param accumulate query boolean true "Accumulate gdd values"
 // @Router /gdd/cfs [get]
 func GetCfsGDD(c *fiber.Ctx) error {
-	request := models.BuildGddRequest(c)
+	request := models.BuildYearlessGddRequest(c)
 	return c.Status(fiber.StatusOK).JSON(services.GetCfsGddValues(request))
 }
 
diff --git a/models/gdd.go b/models/gdd.go
index 1b4f537..6bd4cc7 100644
--- a/models/gdd.go
+++ b/models/gdd.go
@@ -9,6 +9,7 @@ import (
 
 	validation "github.com/go-ozzo/ozzo-validation"
 	"github.com/gofiber/fiber/v2"
+	"github.com/tgs266/dawn-go-common/errors"
 )
 
 type GddResponse struct {
@@ -54,6 +55,23 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
 	accumulate, errBool := strconv.ParseBool(c.Query("accumulate", "false"))
 	plantingDate, errDate := time.Parse(time.RFC3339, pd)
 
+	if errLat != nil || errLon != nil || errBool != nil {
+		panic(config.BAD_REQUEST)
+	}
+
+	if errYear != nil && errDate != nil {
+		panic(errors.NewBadRequest(nil).PutDetail("reason", "no date or year provided"))
+	}
+
+	// date is provided but year isnt
+	if errYear != nil && errDate == nil {
+		year = plantingDate.Year()
+	}
+
+	if errDate != nil && pd != "" {
+		panic(errors.NewBadRequest(nil).PutDetail("reason", "date must be ISO8601 or RFC3339 format"))
+	}
+
 	rNew := GddRequest{
 		Year:         year,
 		Product:      product,
@@ -63,22 +81,31 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
 		PlantingDate: plantingDate,
 	}
 
-	if errYear != nil || errLat != nil || errLon != nil || errBool != nil {
+	if e := rNew.Validate(); e != nil {
+		panic(errors.NewBadRequest(e).AddLogDetails(e.Error()))
+	}
+	return rNew
+}
+
+var BuildYearlessGddRequest = func(c *fiber.Ctx) GddRequest {
+	product := c.Query("product")
+	latitude, errLat := strconv.ParseFloat(c.Query("latitude"), 64)
+	longitude, errLon := strconv.ParseFloat(c.Query("longitude"), 64)
+	accumulate, errBool := strconv.ParseBool(c.Query("accumulate", "false"))
+
+	if errLat != nil || errLon != nil || errBool != nil {
 		panic(config.BAD_REQUEST)
 	}
 
-	if errDate != nil && pd != "" {
-		panic(config.BAD_REQUEST.PutDetail("reason", "date must be ISO8601 or RFC3339 format"))
+	rNew := GddRequest{
+		Product:    product,
+		Latitude:   latitude,
+		Longitude:  longitude,
+		Accumulate: accumulate,
 	}
 
-	if rNew.Year != 0 {
-		if e := rNew.Validate(); e != nil {
-			panic(config.BAD_REQUEST.AddLogDetails(e.Error()))
-		}
-	} else {
-		if e := rNew.ValidateNoYear(); e != nil {
-			panic(config.BAD_REQUEST.AddLogDetails(e.Error()))
-		}
+	if e := rNew.ValidateNoYear(); e != nil {
+		panic(errors.NewBadRequest(e).AddLogDetails(e.Error()))
 	}
 	return rNew
 }
-- 
GitLab