mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +00:00
99 lines
3.1 KiB
Go
99 lines
3.1 KiB
Go
package controllers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/emilybache/gildedrose-refactoring-kata/domains"
|
|
"github.com/emilybache/gildedrose-refactoring-kata/models"
|
|
"github.com/emilybache/gildedrose-refactoring-kata/lib"
|
|
"github.com/emilybache/gildedrose-refactoring-kata/api/middlewares"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type ItemController struct {
|
|
logger lib.Logger
|
|
contentTypeFilterMiddleware middlewares.ContentTypeFilterMiddleware
|
|
itemUpdateServiceProvider domains.ItemUpdateServiceProvider
|
|
}
|
|
|
|
type UpdateQualityRequest struct {
|
|
Days int `json:"days" binding:"gte=0"`
|
|
Items []*models.ItemModel `json:"items" binding:"required"`
|
|
}
|
|
|
|
func NewItemController(
|
|
logger lib.Logger,
|
|
contentTypeFilterMiddleware middlewares.ContentTypeFilterMiddleware,
|
|
itemUpdateServiceProvider domains.ItemUpdateServiceProvider,
|
|
) ItemController {
|
|
return ItemController{
|
|
logger: logger,
|
|
contentTypeFilterMiddleware: contentTypeFilterMiddleware,
|
|
itemUpdateServiceProvider: itemUpdateServiceProvider,
|
|
}
|
|
}
|
|
|
|
func (this *ItemController) Setup(engine *gin.Engine) {
|
|
engine.GET("/status", this.getStatus)
|
|
engine.POST("/update_quality", this.contentTypeFilterMiddleware.Handler("application/json"), this.postUpdateQuality)
|
|
engine.NoRoute(this.invalidPath)
|
|
}
|
|
|
|
func (this *ItemController) invalidPath(ctx *gin.Context) {
|
|
ctx.AbortWithStatus(http.StatusNotFound)
|
|
}
|
|
|
|
// getStatus godoc
|
|
// @Summary Health check (get status)
|
|
// @Schemes
|
|
// @Description Return a simple OK response
|
|
// @Tags health
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 "Service is up and running"
|
|
// @Router /status [get]
|
|
func (this *ItemController) getStatus(ctx *gin.Context) {
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": "ok",
|
|
})
|
|
}
|
|
|
|
// postUpdateQuality godoc
|
|
// @Summary Execute Update Quality for all given items and passed days
|
|
// @Schemes
|
|
// @Description Load a full list of items that will be handled by the service and process them, returning the item list with the updated values for the given days
|
|
// @Tags items
|
|
// @Accept json
|
|
// @Param message body UpdateQualityRequest true "Items info"
|
|
// @Success 200 "Result of items with updated quality"
|
|
// @Failure 400 "Invalid data in the request"
|
|
// @Router /update_quality [post]
|
|
func (this *ItemController) postUpdateQuality(ctx *gin.Context) {
|
|
|
|
var request UpdateQualityRequest
|
|
|
|
if err := ctx.BindJSON(&request); err != nil {
|
|
ctx.AbortWithStatus(http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
var items = make([]*models.Item, len(request.Items))
|
|
for i, item := range request.Items {
|
|
items[i] = models.NewItem(item)
|
|
}
|
|
|
|
for day := 0; day < request.Days; day++ {
|
|
for _, item := range items {
|
|
itemUpdateService := this.itemUpdateServiceProvider.GetUpdateService(item)
|
|
itemUpdateService.UpdateQuality(item)
|
|
}
|
|
}
|
|
|
|
var itemEntities = make([]*models.ItemModel, len(items))
|
|
for i, item := range items {
|
|
itemEntities[i] = item.Model
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, itemEntities)
|
|
}
|