relynolli-server/handlers/catalog/endpoints/catalog.go

118 lines
2.5 KiB
Go

package endpoints
import (
"context"
"fmt"
"relynolli-server/models"
"relynolli-server/status"
"relynolli-server/storage"
"time"
cmap "github.com/orcaman/concurrent-map/v2"
"github.com/gin-gonic/gin"
// "relynolli-server/models"
// "relynolli-server/services"
// "strconv"
)
type GetCatalogItemsRequest struct {
Limit int `form:"limit" `
Page int `form:"page"`
}
func (h *handlers) GetCatalogItems(c *gin.Context) {
queries := cmap.New[[]string]()
for key, val := range c.Request.URL.Query() {
queries.Set(key, val)
}
ctx := context.Background()
meta := models.Meta{
RequestStarted: time.Now().Unix(),
}
LPQuery := new(GetCatalogItemsRequest)
LPError := c.ShouldBindQuery(LPQuery)
if LPError != nil {
meta.RequestFinished = time.Now().Unix()
c.JSON(400, models.Response{
Status: status.STATUS_BAD_REQUEST,
Info: "Limit and page query params should be integer numbers",
Meta: &meta,
})
return
}
if LPQuery.Page == 0 {
LPQuery.Page = 1
}
if LPQuery.Limit == 0 {
LPQuery.Limit = 10
}
s := storage.NewStorageCatalog()
count, items, err := s.GetCatalogItems(ctx, queries, LPQuery.Limit, (LPQuery.Page-1)*LPQuery.Limit)
if err != nil {
meta.RequestFinished = time.Now().Unix()
c.JSON(500,
models.Response{
Status: status.STATUS_SERVER_ERROR,
Info: fmt.Sprintf("Cannot resolve request. Details: %s", err.Error()),
Meta: &meta})
}
meta.Limit = LPQuery.Limit
meta.Page = LPQuery.Page
meta.RequestFinished = time.Now().Unix()
meta.Count = count
c.JSON(200, models.Response{
Status: status.STATUS_OK,
Data: items,
Meta: &meta,
})
}
type catalogItemReq struct {
Code string `uri:"code"`
}
func (h *handlers) GetCatalogItem(c *gin.Context) {
ctx := context.Background()
meta := models.Meta{
RequestStarted: time.Now().Unix(),
}
s := storage.NewStorageCatalog()
path := new(catalogItemReq)
var err error = nil
var statusCode int = 200
var response models.Response = models.Response{
Status: status.STATUS_OK,
Meta: &meta,
}
err = c.ShouldBindUri(path)
if err != nil {
response.Info = fmt.Sprintf("Error: %s", err.Error())
response.Status = status.STATUS_BAD_REQUEST
meta.RequestFinished = time.Now().Unix()
statusCode = 400
c.JSON(statusCode, response)
return
}
data, err := s.GetCatalogItemByCode(ctx, path.Code)
response.Data = data
meta.RequestFinished = time.Now().Unix()
if data == nil {
statusCode = 404
response.Status = status.STATUS_NOT_FOUND
}
c.JSON(statusCode, response)
}