get prices for single entity
This commit is contained in:
parent
b434c4172f
commit
77c678dd7a
3 changed files with 105 additions and 14 deletions
|
|
@ -32,6 +32,7 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref
|
||||||
|
|
||||||
chartsGroup := r.Group("/prices", authMW)
|
chartsGroup := r.Group("/prices", authMW)
|
||||||
chartsGroup.GET("", h.controller.getChartsPrices)
|
chartsGroup.GET("", h.controller.getChartsPrices)
|
||||||
|
chartsGroup.GET("/:uuid", h.controller.getDistinctPrices)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,7 +197,7 @@ func (co *controller) deleteMerch(c *gin.Context) {
|
||||||
// @Description Получить цены мерча за период
|
// @Description Получить цены мерча за период
|
||||||
// @Tags Merch
|
// @Tags Merch
|
||||||
// @Security BearerAuth
|
// @Security BearerAuth
|
||||||
// @Param days query string false "merch_uuid"
|
// @Param days query string false "period in days"
|
||||||
// @Success 200 {array} PricesResponse
|
// @Success 200 {array} PricesResponse
|
||||||
// @Failure 400 {object} responses.ErrorResponse400
|
// @Failure 400 {object} responses.ErrorResponse400
|
||||||
// @Failure 500 {object} responses.ErrorResponse500
|
// @Failure 500 {object} responses.ErrorResponse500
|
||||||
|
|
@ -220,3 +221,39 @@ func (co *controller) getChartsPrices(c *gin.Context) {
|
||||||
|
|
||||||
c.JSON(http.StatusOK, response)
|
c.JSON(http.StatusOK, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Summary Получить перепады цен мерча за период по его merch_uuid
|
||||||
|
// @Description Получить перепады цен мерча за период по его merch_uuid
|
||||||
|
// @Tags Merch
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Param uuid path string true "merch_uuid"
|
||||||
|
// @Param days query string false "period in days"
|
||||||
|
// @Success 200 {object} PricesResponse
|
||||||
|
// @Failure 400 {object} responses.ErrorResponse400
|
||||||
|
// @Failure 500 {object} responses.ErrorResponse500
|
||||||
|
// @Router /prices/{uuid} [get]
|
||||||
|
func (co *controller) getDistinctPrices(c *gin.Context) {
|
||||||
|
daysQuery := strings.ToLower(c.DefaultQuery("days", ""))
|
||||||
|
|
||||||
|
userUuid, err := co.utils.GetUserUuidFromContext(c)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()})
|
||||||
|
log.WithError(err).Error("Merch | Failed to get user uuid from context")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
merchUuid := c.Param("uuid")
|
||||||
|
if merchUuid == "" {
|
||||||
|
c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: "MerchUuid is empty"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := co.service.getDistinctPrices(userUuid, merchUuid, daysQuery)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, responses.ErrorResponse500{Error: err.Error()})
|
||||||
|
log.WithError(err).Error("Merch | Failed to get single merch")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, response)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ type repository interface {
|
||||||
|
|
||||||
type prices interface {
|
type prices interface {
|
||||||
getPricesWithDays(userUuid string, period time.Time) ([]Price, error)
|
getPricesWithDays(userUuid string, period time.Time) ([]Price, error)
|
||||||
|
getDistinctPrices(userUuid, merchUuid string, period time.Time) (prices []Price, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Repo) addMerch(bundle merchBundle) error {
|
func (r *Repo) addMerch(bundle merchBundle) error {
|
||||||
|
|
@ -198,3 +199,27 @@ func (r *Repo) getPricesWithDays(userUuid string, period time.Time) (prices []Pr
|
||||||
}
|
}
|
||||||
return prices, nil
|
return prices, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Repo) getDistinctPrices(userUuid, merchUuid string, period time.Time) (prices []Price, err error) {
|
||||||
|
err = r.db.Raw(`
|
||||||
|
SELECT price, created_at, origin
|
||||||
|
FROM (
|
||||||
|
SELECT DISTINCT ON (price) price, created_at, origin
|
||||||
|
FROM prices
|
||||||
|
WHERE merch_uuid = ?
|
||||||
|
AND created_at > ?
|
||||||
|
AND deleted_at IS NULL
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM merch
|
||||||
|
WHERE merch_uuid = ?
|
||||||
|
AND user_uuid = ?
|
||||||
|
)
|
||||||
|
) AS up
|
||||||
|
ORDER BY created_at;`, merchUuid, period, merchUuid, userUuid).Scan(&prices).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return prices, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"strconv"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -98,18 +97,7 @@ func (s *service) getPrices(userUuid string, days string) ([]PricesResponse, err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
daysInt, err := strconv.Atoi(days)
|
pricesList, err := s.repo.getPricesWithDays(userUuid, getPeriod(days))
|
||||||
if err != nil {
|
|
||||||
daysInt = 7
|
|
||||||
}
|
|
||||||
|
|
||||||
if daysInt > 365 {
|
|
||||||
daysInt = 7
|
|
||||||
}
|
|
||||||
|
|
||||||
period := time.Now().UTC().Add(-(time.Duration(daysInt) * time.Hour * 24))
|
|
||||||
|
|
||||||
pricesList, err := s.repo.getPricesWithDays(userUuid, period)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -142,3 +130,44 @@ func (s *service) getPrices(userUuid string, days string) ([]PricesResponse, err
|
||||||
|
|
||||||
return response, nil
|
return response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *service) getDistinctPrices(userUuid, merchUuid, days string) (PricesResponse, error) {
|
||||||
|
result, err := s.repo.getDistinctPrices(userUuid, merchUuid, getPeriod(days))
|
||||||
|
if err != nil {
|
||||||
|
return PricesResponse{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if result == nil {
|
||||||
|
return PricesResponse{}, errors.New("no prices found")
|
||||||
|
}
|
||||||
|
|
||||||
|
originSurugaya := OriginWithPrices{
|
||||||
|
Origin: surugaya,
|
||||||
|
Prices: []PriceEntry{},
|
||||||
|
}
|
||||||
|
|
||||||
|
originMandarake := OriginWithPrices{
|
||||||
|
Origin: mandarake,
|
||||||
|
Prices: []PriceEntry{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range result {
|
||||||
|
switch item.Origin {
|
||||||
|
case surugaya:
|
||||||
|
originSurugaya.Prices = append(originSurugaya.Prices, PriceEntry{
|
||||||
|
CreatedAt: item.CreatedAt.Unix(),
|
||||||
|
Value: item.Price,
|
||||||
|
})
|
||||||
|
case mandarake:
|
||||||
|
originMandarake.Prices = append(originMandarake.Prices, PriceEntry{
|
||||||
|
CreatedAt: item.CreatedAt.Unix(),
|
||||||
|
Value: item.Price,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PricesResponse{
|
||||||
|
MerchUuid: merchUuid,
|
||||||
|
Origins: []OriginWithPrices{originSurugaya, originMandarake},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue