Skip to content
Snippets Groups Projects
Commit 1492c739 authored by Tucker Gary Siegel's avatar Tucker Gary Siegel
Browse files

add planting date parameter for gdds

parent 95ba8786
No related branches found
No related tags found
No related merge requests found
package controllers
import (
"github.com/tgs266/dawn-go-common/common"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services"
"github.com/gofiber/fiber/v2"
)
var GetGddValues = services.GetGddValues
// GetDailyGdd godoc
// @Summary Get gdd values
// @Tags Gdd
// @Description get gdd values
// @Accept json
// @Produce json
// @Success 200 {object} models.GddResponse
// @Failure 400 {object} common.StandardError
// @Param year query int true "Year to get gdd for"
// @Param product query string true "Crop to calculate gdd for" Enums(corn, soybean, sunflower, tomato, sugar_beet, peanut, cotton, potato, wheat, pea, oat, spring_wheat, rice, sorghum)
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param accumulate query boolean true "Accumulate gdd values"
// @Router /gdd/daily [get]
func GetDailyGdd(c *fiber.Ctx) error {
ctx := common.DawnCtx{FiberCtx: c}
request := models.BuildGddRequest(ctx.FiberCtx)
return c.Status(fiber.StatusOK).JSON(GetGddValues(ctx, request))
}
// GetNormalGdd godoc
// @Summary Get gdd normals
// @Tags Gdd
// @Description get gdd normals
// @Accept json
// @Produce json
// @Success 200 {object} models.GddResponse
// @Failure 400 {object} common.StandardError
// @Param product query string true "Crop to calculate gdd for" Enums(corn, soybean, sunflower, tomato, sugar_beet, peanut, cotton, potato, wheat, pea, oat, spring_wheat, rice, sorghum)
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param accumulate query boolean true "Accumulate gdd values"
// @Router /gdd/normals [get]
func GetNormalGdd(c *fiber.Ctx) error {
request := models.BuildGddRequest(c)
return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request))
}
package controllers
import (
"github.com/tgs266/dawn-go-common/common"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services"
"github.com/gofiber/fiber/v2"
)
var GetGddValues = services.GetGddValues
// GetDailyGdd godoc
// @Summary Get gdd values
// @Tags Gdd
// @Description get gdd values
// @Accept json
// @Produce json
// @Success 200 {object} models.GddResponse
// @Failure 400 {object} common.StandardError
// @Param year query int true "Year to get gdd for"
// @Param product query string true "Crop to calculate gdd for" Enums(corn, soybean, sunflower, tomato, sugar_beet, peanut, cotton, potato, wheat, pea, oat, spring_wheat, rice, sorghum)
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param accumulate query boolean true "Accumulate gdd values"
// @Param plantingDate query string true "Plant date, ISO8601 or RFC3339 format"
// @Router /gdd/daily [get]
func GetDailyGdd(c *fiber.Ctx) error {
ctx := common.DawnCtx{FiberCtx: c}
request := models.BuildGddRequest(ctx.FiberCtx)
return c.Status(fiber.StatusOK).JSON(GetGddValues(ctx, request))
}
// GetNormalGdd godoc
// @Summary Get gdd normals
// @Tags Gdd
// @Description get gdd normals
// @Accept json
// @Produce json
// @Success 200 {object} models.GddResponse
// @Failure 400 {object} common.StandardError
// @Param product query string true "Crop to calculate gdd for" Enums(corn, soybean, sunflower, tomato, sugar_beet, peanut, cotton, potato, wheat, pea, oat, spring_wheat, rice, sorghum)
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param accumulate query boolean true "Accumulate gdd values"
// @Router /gdd/normals [get]
func GetNormalGdd(c *fiber.Ctx) error {
request := models.BuildGddRequest(c)
return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request))
}
package models
import (
"strconv"
"time"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence/entities"
validation "github.com/go-ozzo/ozzo-validation"
"github.com/gofiber/fiber/v2"
)
type GddResponse struct {
Product string `json:"product"`
ClosestLatitude float64 `json:"closest_latitude"`
ClosestLongitude float64 `json:"closest_longitude"`
GddValues []float64 `json:"gdd_values"`
LastDate time.Time `json:"last_date"`
}
type GddRequest struct {
Year int `json:"year"`
Product string `json:"product"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
Accumulate bool `json:"accumulate"`
}
func (r GddRequest) Validate() error {
return validation.ValidateStruct(&r,
validation.Field(&r.Year, validation.Required, validation.Min(1981), validation.Max(time.Now().Year())),
validation.Field(&r.Product, validation.Required, validation.Length(1, 100)),
validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)),
validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)),
)
}
func (r GddRequest) ValidateNoYear() error {
return validation.ValidateStruct(&r,
validation.Field(&r.Product, validation.Required, validation.Length(1, 100)),
validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)),
validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)),
)
}
var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
year, errYear := strconv.Atoi(c.Query("year", "0"))
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"))
rNew := GddRequest{
Year: year,
Product: product,
Latitude: latitude,
Longitude: longitude,
Accumulate: accumulate,
}
if errYear != nil || errLat != nil || errLon != nil || errBool != nil {
panic(config.BAD_REQUEST)
}
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()))
}
}
return rNew
}
func (r GddRequest) BuildLocation() entities.Location {
l := entities.Location{
Type: "Point",
Coordinates: []float64{r.Longitude, r.Latitude},
}
return l
}
func BuildLocation(lat float64, lng float64) entities.Location {
l := entities.Location{
Type: "Point",
Coordinates: []float64{lng, lat},
}
return l
}
package models
import (
"strconv"
"time"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence/entities"
validation "github.com/go-ozzo/ozzo-validation"
"github.com/gofiber/fiber/v2"
)
type GddResponse struct {
Product string `json:"product"`
ClosestLatitude float64 `json:"closest_latitude"`
ClosestLongitude float64 `json:"closest_longitude"`
GddValues []float64 `json:"gdd_values"`
LastDate time.Time `json:"last_date"`
}
type GddRequest struct {
Year int `json:"year"`
Product string `json:"product"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
Accumulate bool `json:"accumulate"`
PlantingDate time.Time `json:"plantingDate"`
}
func (r GddRequest) Validate() error {
return validation.ValidateStruct(&r,
validation.Field(&r.Year, validation.Required, validation.Min(1981), validation.Max(time.Now().Year())),
validation.Field(&r.Product, validation.Required, validation.Length(1, 100)),
validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)),
validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)),
)
}
func (r GddRequest) ValidateNoYear() error {
return validation.ValidateStruct(&r,
validation.Field(&r.Product, validation.Required, validation.Length(1, 100)),
validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)),
validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)),
)
}
var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
year, errYear := strconv.Atoi(c.Query("year", strconv.Itoa(time.Now().Year())))
product := c.Query("product")
pd := c.Query("plantingDate")
latitude, errLat := strconv.ParseFloat(c.Query("latitude"), 64)
longitude, errLon := strconv.ParseFloat(c.Query("longitude"), 64)
accumulate, errBool := strconv.ParseBool(c.Query("accumulate", "false"))
plantingDate, errDate := time.Parse(time.RFC3339, pd)
rNew := GddRequest{
Year: year,
Product: product,
Latitude: latitude,
Longitude: longitude,
Accumulate: accumulate,
PlantingDate: plantingDate,
}
if errYear != nil || 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"))
}
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()))
}
}
return rNew
}
func (r GddRequest) BuildLocation() entities.Location {
l := entities.Location{
Type: "Point",
Coordinates: []float64{r.Longitude, r.Latitude},
}
return l
}
func BuildLocation(lat float64, lng float64) entities.Location {
l := entities.Location{
Type: "Point",
Coordinates: []float64{lng, lat},
}
return l
}
......@@ -41,6 +41,13 @@ func GetGddValues(ctx common.DawnCtx, request models.GddRequest) models.GddRespo
} else {
gdds = persistence.GddFindFirstByYearAndLocation(request.Year, request.BuildLocation())
}
if !request.PlantingDate.IsZero() && request.Year >= time.Now().Year() {
pdInt := request.PlantingDate.YearDay() - 1
gdds.MaxTemps = gdds.MaxTemps[pdInt:]
gdds.MinTemps = gdds.MinTemps[pdInt:]
}
returnGdds := models.GddResponse{
Product: product.Name,
ClosestLatitude: gdds.Location.Coordinates[1],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment