118 lines
2.5 KiB
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)
|
|
}
|