get single merch
This commit is contained in:
parent
ec4fe5151e
commit
7922c00238
4 changed files with 117 additions and 7 deletions
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
"merch-api/pkg/responses"
|
"merch-api/pkg/responses"
|
||||||
"merch-api/pkg/utils"
|
"merch-api/pkg/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
@ -87,7 +88,37 @@ func (co *controller) create(c *gin.Context) {
|
||||||
c.Status(http.StatusCreated)
|
c.Status(http.StatusCreated)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (co *controller) getOne(c *gin.Context) {}
|
// getOne godoc
|
||||||
|
//
|
||||||
|
// @Summary Получить всю информацию про мерч
|
||||||
|
// @Description Получить всю информацию про мерч по его uuid
|
||||||
|
// @Tags Merch
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Produce json
|
||||||
|
// @Param uuid path string true "merch_uuid"
|
||||||
|
// @Success 200 {object} singleMerchResponse
|
||||||
|
//
|
||||||
|
// @Failure 400 {object} responses.BadRequest
|
||||||
|
// @Failure 401 {object} responses.Unauthorized
|
||||||
|
// @Failure 500 {object} responses.InternalServerError
|
||||||
|
//
|
||||||
|
// @Router /merch/{uuid} [get]
|
||||||
|
func (co *controller) getOne(c *gin.Context) {
|
||||||
|
merchUuid := c.Param("uuid")
|
||||||
|
if merchUuid == "" {
|
||||||
|
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: "MerchUuid is empty"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := co.service.getSingleMerch(c, getUserId(c), merchUuid)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusBadRequest, responses.InternalServerError{Error: err.Error()})
|
||||||
|
log.WithError(err).Error("Merch | Failed to get single merch")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, response)
|
||||||
|
}
|
||||||
|
|
||||||
// getMany godoc
|
// getMany godoc
|
||||||
//
|
//
|
||||||
|
|
@ -95,7 +126,7 @@ func (co *controller) getOne(c *gin.Context) {}
|
||||||
// @Description Get all merch without origins
|
// @Description Get all merch without origins
|
||||||
// @Tags Merch
|
// @Tags Merch
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} ListResponse
|
// @Success 200 {array} listResponse
|
||||||
// @Success 204
|
// @Success 204
|
||||||
// @Failure 400 {object} responses.BadRequest
|
// @Failure 400 {object} responses.BadRequest
|
||||||
// @Failure 401 {object} responses.Unauthorized
|
// @Failure 401 {object} responses.Unauthorized
|
||||||
|
|
|
||||||
|
|
@ -46,12 +46,18 @@ type extraDataDTO struct {
|
||||||
Links []originLink `json:"links"`
|
Links []originLink `json:"links"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ListResponse struct {
|
type listResponse struct {
|
||||||
MerchUuid string `json:"merch_uuid"`
|
MerchUuid string `json:"merch_uuid"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Labels []string `json:"labels,omitempty"`
|
Labels []string `json:"labels,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type singleMerchResponse struct {
|
||||||
|
MerchUuid string `json:"merch_uuid"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Origins []originLink `json:"origins"`
|
||||||
|
}
|
||||||
|
|
||||||
type getMerchInternal struct {
|
type getMerchInternal struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
MerchUuid string `json:"merch_uuid"`
|
MerchUuid string `json:"merch_uuid"`
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@ type MerchRepo interface {
|
||||||
// createMerch creates new merch record and inserts extra data if given
|
// createMerch creates new merch record and inserts extra data if given
|
||||||
createMerch(ctx context.Context, merch *Merch, extra []ExtraData) error
|
createMerch(ctx context.Context, merch *Merch, extra []ExtraData) error
|
||||||
|
|
||||||
|
getSingleMerch(ctx context.Context, userId int64, merchUuid string) (*Merch, error)
|
||||||
|
getSingleMerchExtraData(ctx context.Context, merchId int64) ([]originLink, error)
|
||||||
|
|
||||||
// getMany returns list of only main merch record, without origins extra data
|
// getMany returns list of only main merch record, without origins extra data
|
||||||
getMany(ctx context.Context, userId int64) ([]getMerchInternal, error)
|
getMany(ctx context.Context, userId int64) ([]getMerchInternal, error)
|
||||||
|
|
||||||
|
|
@ -75,6 +78,50 @@ func (r *repo) createMerch(ctx context.Context, merch *Merch, extra []ExtraData)
|
||||||
return tx.Commit(ctx)
|
return tx.Commit(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *repo) getSingleMerch(ctx context.Context, userId int64, merchUuid string) (*Merch, error) {
|
||||||
|
q := `SELECT id, name FROM merch WHERE merch_uuid = $1 AND user_id = $2 AND deleted_at IS NULL`
|
||||||
|
|
||||||
|
var m Merch
|
||||||
|
|
||||||
|
if err := r.db.QueryRow(ctx, q, merchUuid, userId).Scan(&m.Id, &m.Name); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *repo) getSingleMerchExtraData(ctx context.Context, merchId int64) ([]originLink, error) {
|
||||||
|
q := `
|
||||||
|
SELECT mo.name, med.url
|
||||||
|
FROM merch_extra_data AS med
|
||||||
|
JOIN merch_origins AS mo ON mo.id = med.origin_id
|
||||||
|
WHERE med.merch_id = $1
|
||||||
|
AND med.deleted_at IS NULL
|
||||||
|
AND mo.deleted_at IS NULL
|
||||||
|
`
|
||||||
|
|
||||||
|
rows, err := r.db.Query(ctx, q, merchId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result []originLink
|
||||||
|
for rows.Next() {
|
||||||
|
var o originLink
|
||||||
|
if err = rows.Scan(&o.Origin, &o.Link); err != nil {
|
||||||
|
rows.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result = append(result, o)
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.Close()
|
||||||
|
if err = rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (r *repo) getMany(ctx context.Context, userId int64) ([]getMerchInternal, error) {
|
func (r *repo) getMany(ctx context.Context, userId int64) ([]getMerchInternal, error) {
|
||||||
q := `SELECT id, merch_uuid, name FROM merch WHERE deleted_at IS NULL AND user_id = $1`
|
q := `SELECT id, merch_uuid, name FROM merch WHERE deleted_at IS NULL AND user_id = $1`
|
||||||
|
|
||||||
|
|
@ -82,16 +129,18 @@ func (r *repo) getMany(ctx context.Context, userId int64) ([]getMerchInternal, e
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
var result []getMerchInternal
|
var result []getMerchInternal
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var m getMerchInternal
|
var m getMerchInternal
|
||||||
if err = rows.Scan(&m.Id, &m.MerchUuid, &m.Name); err != nil {
|
if err = rows.Scan(&m.Id, &m.MerchUuid, &m.Name); err != nil {
|
||||||
|
rows.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result = append(result, m)
|
result = append(result, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rows.Close()
|
||||||
if err = rows.Err(); err != nil {
|
if err = rows.Err(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,31 @@ func (s *service) createMerch(ctx context.Context, userId int64, payload *newMer
|
||||||
return s.repo.createMerch(ctx, newMerch, merchExtra)
|
return s.repo.createMerch(ctx, newMerch, merchExtra)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) getMany(ctx context.Context, userId int64) ([]ListResponse, error) {
|
func (s *service) getSingleMerch(ctx context.Context, userId int64, merchUuid string) (*singleMerchResponse, error) {
|
||||||
|
merch, err := s.repo.getSingleMerch(ctx, userId, merchUuid)
|
||||||
|
if err != nil {
|
||||||
|
logErr(serviceLogHeader, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if merch == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
links, err := s.repo.getSingleMerchExtraData(ctx, merch.Id)
|
||||||
|
if err != nil {
|
||||||
|
logErr(serviceLogHeader, err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &singleMerchResponse{
|
||||||
|
MerchUuid: merch.MerchUuid,
|
||||||
|
Name: merch.Name,
|
||||||
|
Origins: links,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) getMany(ctx context.Context, userId int64) ([]listResponse, error) {
|
||||||
allUserMerch, err := s.repo.getMany(ctx, userId)
|
allUserMerch, err := s.repo.getMany(ctx, userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -70,9 +94,9 @@ func (s *service) getMany(ctx context.Context, userId int64) ([]ListResponse, er
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var response []ListResponse
|
var response []listResponse
|
||||||
for _, m := range allUserMerch {
|
for _, m := range allUserMerch {
|
||||||
response = append(response, ListResponse{
|
response = append(response, listResponse{
|
||||||
MerchUuid: m.MerchUuid,
|
MerchUuid: m.MerchUuid,
|
||||||
Name: m.Name,
|
Name: m.Name,
|
||||||
Labels: cardLabels[m.Id],
|
Labels: cardLabels[m.Id],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue