diff --git a/config/local b/config/local index 354c4982d28d4296693d976b9ee2677ad1fc3071..62da6fcdf56c59bae47ebd5da1a0ea1046e38143 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 d94b0655bf0df3f33531cf350bffb8fdc786199f..c1a289b988bf640c7cdc8a1936f60409cc71fbfc 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 8619d734eddadf1665b02f300bf244ef54589f42..3d40f8a3852054a4c53c7445c1a60a49c4580eb2 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 9f7bc0f339ecf1e4bd57d9a3c515ed5a7b5786d5..442c8e0638be54f1973c8fe6b3dc935432b4c4c8 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 8ad42559d8cc70fa7d056061fa67bed8da4ace11..d024431328a0100adad4367924aa3bf55d3021dc 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 f1fff78dcb5ef60d5ecfe21b1f3f4b90e91e173d..6ed4fc3d15a8b09a7bda8db8d8202dd0934e2a6c 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 883308d525ddfd2c3de6eac92b6a156b5dacd128..4957fe51d94515e11347abf226b5dc9e2c8ec426 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 44eb83a6d1bc4ef7973705b972032b62da34ba0a..9da86f98a554f456ccbfc36ea4b41a4a3ddafd7d 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 de0d5bacd4470a22c1874f2d5a0db38c62d29f40..6ab7f102345962264cdbcd042417277a96be559c 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 5ccf021bd7dffe6e21dca26126fb81d72c7ecf5e..0bc4f0a331dd69ac3163abadc3968a8b472fa863 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 50b688cb9b34c3ff475504c728c0950f11edba58..4f70be9c3d61eb6d2628ab3013de4c4c900a052e 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() {