package handlers import ( "platform/pkg/u" "platform/web/auth" "platform/web/common" q "platform/web/queries" s "platform/web/services" "time" "github.com/gofiber/fiber/v2" ) // region ListResourcePss type ListResourcePssReq struct { common.PageReq ResourceNo *string `json:"resource_no"` Active *bool `json:"active"` Type *int `json:"type"` CreateAfter *time.Time `json:"create_after"` CreateBefore *time.Time `json:"create_before"` ExpireAfter *time.Time `json:"expire_after"` ExpireBefore *time.Time `json:"expire_before"` } // ListResourcePss 获取套餐列表 func ListResourcePss(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(ListResourcePssReq) if err := c.BodyParser(req); err != nil { return err } // 查询套餐列表 do := q.Resource. Joins(q.Resource.Pss). Where(q.Resource.UserID.Eq(authContext.Payload.Id)) if req.ResourceNo != nil && *req.ResourceNo != "" { do.Where(q.Resource.ResourceNo.Eq(*req.ResourceNo)) } if req.Active != nil { do.Where(q.Resource.Active.Is(*req.Active)) } if req.Type != nil { do.Where(q.ResourcePss.As(q.Resource.Pss.Name()).Type.Eq(int32(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Resource.CreatedAt.Gte(common.LocalDateTime(*req.CreateAfter))) } if req.CreateBefore != nil { do.Where(q.Resource.CreatedAt.Lte(common.LocalDateTime(*req.CreateBefore))) } if req.ExpireAfter != nil { do.Where(q.ResourcePss.As(q.Resource.Pss.Name()).Expire.Gte(common.LocalDateTime(*req.ExpireAfter))) } if req.ExpireBefore != nil { do.Where(q.ResourcePss.As(q.Resource.Pss.Name()).Expire.Lte(common.LocalDateTime(*req.ExpireBefore))) } resource, err := q.Resource.Where(do). Order(q.Resource.CreatedAt.Desc()). Offset(req.GetOffset()). Limit(req.GetLimit()). Find() if err != nil { return err } var total int64 if len(resource) < req.GetLimit() { total = int64(len(resource) + req.GetOffset()) } else { total, err = q.Resource.Where(do).Count() if err != nil { return err } } return c.JSON(common.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: resource, }) } // endregion // region AllResource type AllResourceReq struct { } func AllResource(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 查询套餐列表 pss := q.ResourcePss.As(q.Resource.Pss.Name()) do := q.Resource.Debug(). Joins(q.Resource.Pss). Where( q.Resource.UserID.Eq(authContext.Payload.Id), q.Resource.Active.Is(true), q.Resource.Where( pss.Type.Eq(1), pss.Expire.Gte(common.LocalDateTime(time.Now())), ).Or( pss.Type.Eq(2), pss.Quota.GtCol(pss.Used), ), q.Resource.Where( pss.DailyLast.Lt(common.LocalDateTime(u.Today())), ).Or( pss.DailyUsed.LtCol(pss.DailyLimit), ), ) resources, err := do.Debug(). Order(q.Resource.CreatedAt.Desc()). Find() if err != nil { return err } return c.JSON(resources) } // endregion // region CompleteResource type CreateResourceReq struct { s.CreateResourceData } type CreateResourceResp struct { TradeNo string `json:"trade_no"` PayURL string `json:"pay_url"` } type PaidCreateResourceReq struct { TradeNo string `json:"trade_no" validate:"required"` } func PrepareResourceByAlipay(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(CreateResourceReq) if err := c.BodyParser(req); err != nil { return err } // 保存交易信息 result, err := s.Resource.PrepareResource( c.Context(), &req.CreateResourceData, authContext.Payload.Id, s.TransactionMethodAlipay, ) if err != nil { return err } // 返回结果 return c.JSON(CreateResourceResp{ TradeNo: result.TradeNo, PayURL: result.PayURL, }) } func PrepareResourceByWechat(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(CreateResourceReq) if err := c.BodyParser(req); err != nil { return err } // 保存交易信息 result, err := s.Resource.PrepareResource( c.Context(), &req.CreateResourceData, authContext.Payload.Id, s.TransactionMethodWeChat, ) if err != nil { return err } // 返回结果 return c.JSON(CreateResourceResp{ TradeNo: result.TradeNo, PayURL: result.PayURL, }) } func CreateResourceByAlipay(c *fiber.Ctx) error { // 检查权限 _, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(PaidCreateResourceReq) if err := c.BodyParser(req); err != nil { return err } // 验证支付结果 result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{ TradeNo: req.TradeNo, Method: s.TransactionMethodAlipay, }) if err != nil { return err } // 完成套餐创建 err = s.Resource.CompleteResource(c.Context(), req.TradeNo, result) if err != nil { return err } return nil } func CreateResourceByWechat(c *fiber.Ctx) error { // 检查权限 _, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(PaidCreateResourceReq) if err := c.BodyParser(req); err != nil { return err } // 验证支付结果 result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{ TradeNo: req.TradeNo, Method: s.TransactionMethodWeChat, }) if err != nil { return err } // 完成套餐创建 err = s.Resource.CompleteResource(c.Context(), req.TradeNo, result) if err != nil { return err } return nil } func CreateResourceByBalance(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.Protect(c, []s.PayloadType{s.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(CreateResourceReq) if err := c.BodyParser(req); err != nil { return err } // 创建套餐 err = s.Resource.CreateResource(&req.CreateResourceData, authCtx.Payload.Id) if err != nil { return err } return nil } // endregion