Files
qvyun/backend/app/http/orders/controller_order.go
2025-01-21 11:22:22 +08:00

87 lines
2.0 KiB
Go

package orders
import (
"backend/app/http/posts"
"backend/app/http/tenants"
"backend/app/http/users"
"backend/app/requests"
"backend/database/schemas/public/model"
"backend/providers/jwt"
"github.com/gofiber/fiber/v3"
"github.com/jinzhu/copier"
"github.com/samber/lo"
log "github.com/sirupsen/logrus"
)
// @provider
type OrderController struct {
svc *Service
userSvc *users.Service
tenantSvc *tenants.Service
postSvc *posts.Service
log *log.Entry `inject:"false"`
}
func (c *OrderController) Prepare() error {
c.log = log.WithField("module", "orders.OrderController")
return nil
}
// Orders show user orders
// @Router /api/v1/orders [get]
// @Bind claim local
// @Bind pagination query
// @Bind filter query
func (c *OrderController) List(ctx fiber.Ctx, claim *jwt.Claims, pagination *requests.Pagination, filter *UserOrderFilter) (*requests.Pager, error) {
pagination.Format()
pager := &requests.Pager{
Pagination: *pagination,
}
filter.UserID = claim.UserID
orders, total, err := c.svc.GetOrders(ctx.Context(), pagination, filter)
if err != nil {
return nil, err
}
pager.Total = total
pager.Items = lo.FilterMap(orders, func(item model.Orders, _ int) (UserOrder, bool) {
var o UserOrder
if err := copier.Copy(&o, item); err != nil {
return o, false
}
return o, true
})
return pager, nil
}
// Create order
// @Router /api/v1/orders [post]
// @Bind claim local
// @Bind hash path
func (c *OrderController) Create(ctx fiber.Ctx, claim *jwt.Claims, hash string) (*UserOrder, error) {
user, err := c.userSvc.GetUserByID(ctx.Context(), claim.UserID)
if err != nil {
return nil, err
}
post, err := c.postSvc.GetPostByHash(ctx.Context(), *claim.TenantID, hash)
if err != nil {
return nil, err
}
order, err := c.svc.Create(ctx.Context(), user, post)
if err != nil {
return nil, err
}
var userOrder UserOrder
if err := copier.Copy(&userOrder, order); err != nil {
return nil, err
}
return &userOrder, nil
}