From 69e2abe92fcfee7cb60ce9d9acb667907fe63a3e Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Wed, 13 Oct 2021 15:37:13 +1100 Subject: [PATCH] Add logic to save api value --- handlers/badges.go | 43 ++++++++++++++++++++++++++++++++++++++-- main.go | 2 ++ models/api_value.go | 2 +- models/user_api_token.go | 10 ++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 models/user_api_token.go diff --git a/handlers/badges.go b/handlers/badges.go index c8a13c8..1bb647e 100644 --- a/handlers/badges.go +++ b/handlers/badges.go @@ -68,6 +68,10 @@ type BadgesHandler struct { type ColorScheme string +type APIValueRequest struct { + Value string +} + func (handler *BadgesHandler) ValidateBadge(c *gin.Context) { queryName := c.Param("name") @@ -109,6 +113,34 @@ func (handler *BadgesHandler) GetBadgeValue(c *gin.Context) { } } +func (handler *BadgesHandler) UpdateBadgeValue(c *gin.Context) { + request := APIValueRequest{} + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"}) + return + } + + queryName := c.Param("name") + + badge, err := handler.queryBadgeFromDB(queryName) + if err != nil { + if err == gorm.ErrRecordNotFound { + c.JSON(http.StatusNotFound, gin.H{"error": "Badge name is invalid"}) + return + } + sentry.CaptureException(err) + return + } + + if err := handler.saveBadgeValue(&request, badge); err != nil { + logrus.Error(err) + sentry.CaptureException(err) + c.JSON(http.StatusInternalServerError, gin.H{"error": ErrorMessageInternalError}) + return + } + logrus.Infof("API value for Badge %s updated", badge.ULID) +} + func (handler *BadgesHandler) GetBadgeWithColorScheme(c *gin.Context) { color := c.Param("color") var colorScheme ColorScheme @@ -135,6 +167,13 @@ func (handler *BadgesHandler) GetBadgeWithColorScheme(c *gin.Context) { } } +func (handler *BadgesHandler) saveBadgeValue(request *APIValueRequest, badge *models.Badge) error { + return handler.DB.Save(&models.BadgeAPIValue{ + BadgeULID: badge.ULID, + Value: request.Value, + }).Error +} + func (handler *BadgesHandler) generateBadgeValue(c *gin.Context) error { startTime := time.Now() _, internalRequest := c.GetQuery("i") @@ -335,7 +374,7 @@ func (handler *BadgesHandler) queryBadgeValue(badge *models.Badge, internalReque logrus.Error(err.Error()) return nil, err } - + handler.DB.Save(&models.ViewRecord{ULID: badge.ULID}) return &Metric{ Label: badge.Label, TextValue: value.Value, @@ -365,7 +404,7 @@ func (handler *BadgesHandler) queryMetric(badge *models.Badge, internalRequest b func (handler *BadgesHandler) fetchBadgeValueFromDB(badge *models.Badge) (*models.BadgeAPIValue, error) { var badgeValue models.BadgeAPIValue - err := handler.DB.Find(&badgeValue, "ulid = ?", badge.ULID).Error + err := handler.DB.Order("id DESC").First(&badgeValue, "ulid = ?", badge.ULID).Error if err != nil { if err != gorm.ErrRecordNotFound { return nil, err diff --git a/main.go b/main.go index d47de15..1d22817 100644 --- a/main.go +++ b/main.go @@ -63,6 +63,7 @@ func main() { &models.FeatureToggle{}, &models.BadgeViewCount{}, &models.BadgeAPIValue{}, + &models.UserAPIToken{}, ) client, err := api.NewClient(api.Config{ @@ -92,6 +93,7 @@ func main() { r.GET("/svg/:name", handler.GetBadge) r.GET("/val/:name", handler.GetBadgeValue) + r.PUT("/val/:name", handler.UpdateBadgeValue) r.GET("/badges/:name/:color", handler.GetBadgeWithColorScheme) diff --git a/models/api_value.go b/models/api_value.go index cbaa155..7cfed4f 100644 --- a/models/api_value.go +++ b/models/api_value.go @@ -4,6 +4,6 @@ import "github.com/jinzhu/gorm" type BadgeAPIValue struct { gorm.Model - BadgeULID string `gorm:"column:ulid;type:varchar;not null;unique_index" json:"ulid"` + BadgeULID string `gorm:"column:ulid;type:varchar;not null" json:"ulid"` Value string `gorm:"not null;" json:"value"` } diff --git a/models/user_api_token.go b/models/user_api_token.go new file mode 100644 index 0000000..2969f0e --- /dev/null +++ b/models/user_api_token.go @@ -0,0 +1,10 @@ +package models + +import "github.com/jinzhu/gorm" + +type UserAPIToken struct { + gorm.Model + Token string + ExpiresAt string + UserID int +}