From fb514b4192c97bb2e57ab258a10b8de214b3d9a7 Mon Sep 17 00:00:00 2001
From: Tucker Gary Siegel <tgsiegel@terpmail.umd.edu>
Date: Wed, 18 Aug 2021 18:26:29 -0400
Subject: [PATCH] add more functionality to custom logger

---
 config/local                            |  4 +-
 controllers/data_download_controller.go |  2 +-
 controllers/gdd_controller.go           |  2 +-
 docs/docs.go                            | 10 +---
 docs/swagger.json                       | 10 +---
 docs/swagger.yaml                       |  8 +--
 logger/logger.go                        | 68 ++++++++++++++++++++++---
 main.go                                 |  8 +--
 models/csv.go                           | 16 ------
 services/data_download_service.go       | 23 +++++----
 services/gdd_service.go                 |  4 +-
 11 files changed, 92 insertions(+), 63 deletions(-)

diff --git a/config/local b/config/local
index 354c498..62da6fc 100644
--- a/config/local
+++ b/config/local
@@ -1,6 +1,8 @@
 app:
   name: gdd-service
   # logType: json
+  logLevel: debug
+  swagger: true
 
 server:
   host: "localhost"
@@ -9,4 +11,4 @@ server:
 
 db:
   uri: "mongodb://127.0.0.1:27017/"
-  database: "gdd-service"
+  database: "weather-service"
diff --git a/controllers/data_download_controller.go b/controllers/data_download_controller.go
index d94b065..c1a289b 100644
--- a/controllers/data_download_controller.go
+++ b/controllers/data_download_controller.go
@@ -36,7 +36,7 @@ import (
 // @Router /api/weather/gdd/csv [get]
 func GetCSVFile(c *fiber.Ctx) error {
 	request := models.CSVRequest{}.Build(c)
-	fileText := services.GetDataDownload(request)
+	fileText := services.GetDataDownload(c, request)
 	e := c.Status(fiber.StatusOK).SendString(fileText)
 	return e
 }
diff --git a/controllers/gdd_controller.go b/controllers/gdd_controller.go
index 8619d73..3d40f8a 100644
--- a/controllers/gdd_controller.go
+++ b/controllers/gdd_controller.go
@@ -23,7 +23,7 @@ import (
 // @Router /api/weather/gdd/daily [get]
 func GetDailyGdd(c *fiber.Ctx) error {
 	request := models.GddRequest{}.Build(c)
-	return c.Status(fiber.StatusOK).JSON(services.GetGddValues(request))
+	return c.Status(fiber.StatusOK).JSON(services.GetGddValues(c, request))
 }
 
 // GetNormalGdd godoc
diff --git a/docs/docs.go b/docs/docs.go
index 9f7bc0f..442c8e0 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -416,12 +416,6 @@ var doc = `{
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "description": "OK",
-                        "schema": {
-                            "$ref": "#/definitions/errors.StandardError"
-                        }
-                    },
                     "400": {
                         "description": "Bad Request",
                         "schema": {
@@ -864,8 +858,8 @@ var SwaggerInfo = swaggerInfo{
 	Host:        "localhost:8080",
 	BasePath:    "/",
 	Schemes:     []string{},
-	Title:       "Dawn Weather Server",
-	Description: "All operations for weather data",
+	Title:       "Dawn GDD Service",
+	Description: "All operations for GDD/Freezing Date data",
 }
 
 type s struct{}
diff --git a/docs/swagger.json b/docs/swagger.json
index 8ad4255..d024431 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1,8 +1,8 @@
 {
     "swagger": "2.0",
     "info": {
-        "description": "All operations for weather data",
-        "title": "Dawn Weather Server",
+        "description": "All operations for GDD/Freezing Date data",
+        "title": "Dawn GDD Service",
         "contact": {
             "name": "API Support",
             "email": "tgsiegel@umd.edu"
@@ -401,12 +401,6 @@
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "description": "OK",
-                        "schema": {
-                            "$ref": "#/definitions/errors.StandardError"
-                        }
-                    },
                     "400": {
                         "description": "Bad Request",
                         "schema": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index f1fff78..6ed4fc3 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -123,8 +123,8 @@ info:
   contact:
     email: tgsiegel@umd.edu
     name: API Support
-  description: All operations for weather data
-  title: Dawn Weather Server
+  description: All operations for GDD/Freezing Date data
+  title: Dawn GDD Service
   version: "1.0"
 paths:
   /api/weather/freezing-dates:
@@ -400,10 +400,6 @@ paths:
       produces:
       - text/csv
       responses:
-        "200":
-          description: OK
-          schema:
-            $ref: '#/definitions/errors.StandardError'
         "400":
           description: Bad Request
           schema:
diff --git a/logger/logger.go b/logger/logger.go
index 883308d..4957fe5 100644
--- a/logger/logger.go
+++ b/logger/logger.go
@@ -13,7 +13,7 @@ import (
 	"github.com/valyala/fasthttp"
 )
 
-type LogMessage struct {
+type RequestLog struct {
 	Date       string
 	PID        string
 	RequestId  string
@@ -27,6 +27,26 @@ type Request struct {
 	Headers fasthttp.RequestHeader
 }
 
+type MessageLog struct {
+	Date      string
+	PID       string
+	RequestId string
+	Message   string
+}
+
+func buildMessageLog(c *fiber.Ctx, message string) MessageLog {
+	const layout = "2006-01-02 03:04:05"
+	requestId := c.Locals("requestId")
+
+	messageLog := MessageLog{
+		Date:      time.Now().UTC().Format(layout),
+		RequestId: fmt.Sprintf("%s", requestId),
+		PID:       strconv.Itoa(os.Getpid()),
+		Message:   message,
+	}
+	return messageLog
+}
+
 func cleanRequest(c *fiber.Ctx, r *fasthttp.Request) Request {
 	headers := fasthttp.AcquireRequest().Header
 	r.Header.CopyTo(&headers)
@@ -36,11 +56,11 @@ func cleanRequest(c *fiber.Ctx, r *fasthttp.Request) Request {
 	}
 }
 
-func BuildMessage(c *fiber.Ctx) LogMessage {
+func BuildMessage(c *fiber.Ctx) RequestLog {
 	const layout = "2006-01-02 03:04:05"
 	requestId := c.Locals("requestId")
 
-	message := LogMessage{
+	message := RequestLog{
 		Date:       time.Now().UTC().Format(layout),
 		RequestId:  fmt.Sprintf("%s", requestId),
 		StatusCode: strconv.Itoa(c.Response().StatusCode()),
@@ -51,18 +71,17 @@ func BuildMessage(c *fiber.Ctx) LogMessage {
 	return message
 }
 
-func Log(message LogMessage) {
+func LogRequest(message RequestLog) {
 	logString := ""
 	if viper.GetString("app.logType") == "json" {
 		tempLogString, _ := json.MarshalIndent(message, "", "  ")
 		logString = string(tempLogString)
 	} else {
-		logString = fmt.Sprintf("%s %s %s %s - %s %s", message.Date, message.PID, message.RequestId, message.StatusCode, message.Method, message.Path) //strconv.Itoa(os.Getpid()) + " " + fmt.Sprintf("%s", requestId) + " " + strconv.Itoa(err.Code) + " - " + c.Method() + " " + c.Route().Path + " - " + err.Error()
+		logString = fmt.Sprintf("%s %s %s %s - %s %s", message.Date, message.PID, message.RequestId, message.StatusCode, message.Method, message.Path)
 		if message.Error != nil {
 			logString += " - " + message.Error.Error()
 		}
 	}
-
 	fmt.Println(logString)
 }
 
@@ -79,7 +98,7 @@ func New() fiber.Handler {
 			message.Error = dawnError
 		}
 
-		Log(message)
+		LogRequest(message)
 
 		if chainErr != nil {
 			if err := errHandler(c, chainErr); err != nil {
@@ -101,3 +120,38 @@ func ErrorHandler(ctx *fiber.Ctx, err error) *errors.DawnError {
 
 	return returnError
 }
+
+/// LOG LEVELS
+
+func stringToLevel(str string) int {
+	switch str {
+	case "DEBUG":
+		return 1
+	case "INFO":
+		return 2
+	}
+	return 1
+}
+
+func DEBUG(c *fiber.Ctx, message string) {
+	if stringToLevel("DEBUG") >= stringToLevel(viper.GetString("app.logLevel")) {
+		_log(c, message)
+	}
+}
+func INFO(c *fiber.Ctx, message string) {
+	if stringToLevel("INFO") >= stringToLevel(viper.GetString("app.logLevel")) {
+		_log(c, message)
+	}
+}
+
+func _log(c *fiber.Ctx, message string) {
+	lg := buildMessageLog(c, message)
+	logString := ""
+	if viper.GetString("app.logType") == "json" {
+		tempLogString, _ := json.MarshalIndent(lg, "", "  ")
+		logString = string(tempLogString)
+	} else {
+		logString = fmt.Sprintf("%s %s %s %s", lg.Date, lg.PID, lg.RequestId, lg.Message)
+	}
+	fmt.Println(logString)
+}
diff --git a/main.go b/main.go
index 44eb83a..9da86f9 100644
--- a/main.go
+++ b/main.go
@@ -25,8 +25,10 @@ func registerRoutes(app *fiber.App) {
 }
 
 func registerSwagger(app *fiber.App) {
-	app.Get(viper.GetString("server.context-path")+"/gdd-swagger/*", swagger.Handler)
-	app.Get(viper.GetString("server.context-path")+"/gdd-swagger/*", swagger.New())
+	if viper.GetBool("swagger") {
+		app.Get(viper.GetString("server.context-path")+"/gdd-swagger/*", swagger.Handler)
+		app.Get(viper.GetString("server.context-path")+"/gdd-swagger/*", swagger.New())
+	}
 }
 
 func registerCors(app *fiber.App) {
@@ -74,7 +76,7 @@ func createFiberConfig() fiber.Config {
 			logMessage.Error = err.(*errors.DawnError)
 			logMessage.StatusCode = strconv.Itoa(code)
 
-			logger.Log(logMessage)
+			logger.LogRequest(logMessage)
 
 			if code == 500 {
 				message = errors.INTERNAL_SERVER_STANDARD_ERROR.BuildStandardError(ctx)
diff --git a/models/csv.go b/models/csv.go
index de0d5ba..6ab7f10 100644
--- a/models/csv.go
+++ b/models/csv.go
@@ -9,14 +9,6 @@ import (
 	"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 CSVRequest struct {
 	Analog         bool    `json:"analog"`
 	Cfs            bool    `json:"cfs"`
@@ -48,14 +40,6 @@ func (r CSVRequest) Validate() error {
 	)
 }
 
-// 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)),
-// 	)
-// }
-
 func parseBool(str string) bool {
 	a, e := strconv.ParseBool(str)
 	if e != nil {
diff --git a/services/data_download_service.go b/services/data_download_service.go
index 5ccf021..0bc4f0a 100644
--- a/services/data_download_service.go
+++ b/services/data_download_service.go
@@ -16,6 +16,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/gofiber/fiber/v2"
 	"github.com/google/uuid"
 )
 
@@ -91,7 +92,7 @@ func fillDates() []time.Time {
 	return dates
 }
 
-func getPrimary(request models.CSVRequest, dates []time.Time) []float64 {
+func getPrimary(c *fiber.Ctx, request models.CSVRequest, dates []time.Time) []float64 {
 	gddRequest := models.GddRequest{
 		Year:       request.Year,
 		Product:    request.Product,
@@ -100,7 +101,7 @@ func getPrimary(request models.CSVRequest, dates []time.Time) []float64 {
 		Accumulate: true,
 	}
 
-	gddValues := GetGddValues(gddRequest).GddValues
+	gddValues := GetGddValues(c, gddRequest).GddValues
 	for len(gddValues) < 365 {
 		gddValues = append(gddValues, math.NaN())
 	}
@@ -123,7 +124,7 @@ func getNormals(request models.CSVRequest, dates []time.Time) []float64 {
 	return gddValues
 }
 
-func getAnalogYear(request models.CSVRequest, dates []time.Time) []float64 {
+func getAnalogYear(c *fiber.Ctx, request models.CSVRequest, dates []time.Time) []float64 {
 
 	location := entities.Location{
 		Type:        "Point",
@@ -229,7 +230,7 @@ func getFreezingDates(request models.CSVRequest, dates []time.Time) [][]int {
 	return [][]int{firstFreezingValues, lastFreezingValues}
 }
 
-func getComparisonYear(request models.CSVRequest, dates []time.Time) []float64 {
+func getComparisonYear(c *fiber.Ctx, request models.CSVRequest, dates []time.Time) []float64 {
 	gddRequest := models.GddRequest{
 		Year:       request.ComparisonYear,
 		Product:    request.Product,
@@ -238,7 +239,7 @@ func getComparisonYear(request models.CSVRequest, dates []time.Time) []float64 {
 		Accumulate: true,
 	}
 
-	gddValues := GetGddValues(gddRequest).GddValues
+	gddValues := GetGddValues(c, gddRequest).GddValues
 	for len(gddValues) < 365 {
 		gddValues = append(gddValues, math.NaN())
 	}
@@ -345,13 +346,13 @@ func getGefsData(request models.CSVRequest, dates []time.Time) []float64 {
 	return fullGddValues
 }
 
-func pullData(request models.CSVRequest) CSVData {
+func pullData(c *fiber.Ctx, request models.CSVRequest) CSVData {
 	returnData := CSVData{}
 	dates := fillDates()
 	returnData.Date = dates
 
 	if request.Analog {
-		returnData.Analog = getAnalogYear(request, dates)
+		returnData.Analog = getAnalogYear(c, request, dates)
 	}
 	if request.Cfs || request.CfsLower || request.CfsUpper {
 		t := getCfsData(request, dates)
@@ -360,7 +361,7 @@ func pullData(request models.CSVRequest) CSVData {
 		returnData.CfsUpper = t[2]
 	}
 	if request.Comparison {
-		returnData.Comparison = getComparisonYear(request, dates)
+		returnData.Comparison = getComparisonYear(c, request, dates)
 	}
 	if request.FirstFreezing || request.LastFreezing {
 		t := getFreezingDates(request, dates)
@@ -379,7 +380,7 @@ func pullData(request models.CSVRequest) CSVData {
 		returnData.Normals = getNormals(request, dates)
 	}
 	if request.Primary {
-		returnData.Primary = getPrimary(request, dates)
+		returnData.Primary = getPrimary(c, request, dates)
 	}
 
 	return returnData
@@ -423,7 +424,7 @@ func createRecords(keys []string, data CSVData) [][]string {
 	return records
 }
 
-func GetDataDownload(request models.CSVRequest) string {
+func GetDataDownload(c *fiber.Ctx, request models.CSVRequest) string {
 
 	fileId := uuid.New()
 
@@ -437,7 +438,7 @@ func GetDataDownload(request models.CSVRequest) string {
 
 	keys := fillKeys(request)
 
-	data := pullData(request)
+	data := pullData(c, request)
 
 	records := createRecords(keys, data)
 
diff --git a/services/gdd_service.go b/services/gdd_service.go
index 50b688c..4f70be9 100644
--- a/services/gdd_service.go
+++ b/services/gdd_service.go
@@ -7,9 +7,11 @@ import (
 	"dawn-weather/persistence/entities"
 	"dawn-weather/utils"
 	"time"
+
+	"github.com/gofiber/fiber/v2"
 )
 
-func GetGddValues(request models.GddRequest) models.GddResponse {
+func GetGddValues(c *fiber.Ctx, request models.GddRequest) models.GddResponse {
 	product := enums.GetProductFromString(request.Product)
 	var gdds entities.Gdd
 	if request.Year == time.Now().Year() {
-- 
GitLab