package handlers import ( "platform/pkg/u" "platform/web/auth" "platform/web/core" resource2 "platform/web/domains/resource" trade2 "platform/web/domains/trade" g "platform/web/globals" "platform/web/globals/orm" q "platform/web/queries" s "platform/web/services" "time" "github.com/gofiber/fiber/v2" ) // region 查询套餐 type ListResourceShortReq struct { core.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"` } func ListResourceShort(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(ListResourceShortReq) if err := c.BodyParser(req); err != nil { return err } // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authContext.Payload.Id), q.Resource.Type.Eq(int32(resource2.TypeShort)), ) 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.ResourceShort.As(q.Resource.Short.Name()).Type.Eq(int32(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) } if req.CreateBefore != nil { do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) } if req.ExpireAfter != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) } if req.ExpireBefore != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) } resource, err := q.Resource.Debug().Where(do). Joins(q.Resource.Short). 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(core.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: resource, }) } type ListResourceLongReq struct { core.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"` } func ListResourceLong(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(ListResourceLongReq) if err := c.BodyParser(req); err != nil { return err } // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authContext.Payload.Id), q.Resource.Type.Eq(int32(resource2.TypeLong)), ) 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.ResourceLong.As(q.Resource.Long.Name()).Type.Eq(int32(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) } if req.CreateBefore != nil { do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) } if req.ExpireAfter != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) } if req.ExpireBefore != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) } resource, err := q.Resource.Debug().Where(do). Joins(q.Resource.Long). 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(core.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: resource, }) } type AllResourceReq struct { } func AllActiveResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 查询套餐列表 var now = time.Now() var short = q.ResourceShort.As(q.Resource.Short.Name()) var long = q.ResourceLong.As(q.Resource.Long.Name()) resources, err := q.Resource. Joins( q.Resource.Short, q.Resource.Long, ). Where( q.Resource.UserID.Eq(authCtx.Payload.Id), q.Resource.Active.Is(true), q.Resource.Where( q.Resource.Type.Eq(int32(resource2.TypeShort)), q.ResourceShort.As(q.Resource.Short.Name()).Where( short.Type.Eq(int32(resource2.ModeTime)), short.Expire.Gte(orm.LocalDateTime(now)), q.ResourceShort.As(q.Resource.Short.Name()). Where(short.DailyLast.Lt(orm.LocalDateTime(u.Today()))). Or(short.DailyLimit.GtCol(short.DailyUsed)), ).Or( short.Type.Eq(int32(resource2.ModeCount)), short.Quota.GtCol(short.Used), ), ).Or( q.Resource.Type.Eq(int32(resource2.TypeLong)), q.ResourceLong.As(q.Resource.Long.Name()).Where( long.Type.Eq(int32(resource2.ModeTime)), long.Expire.Gte(orm.LocalDateTime(now)), q.ResourceLong.As(q.Resource.Long.Name()). Where(long.DailyLast.Lt(orm.LocalDateTime(u.Today()))). Or(long.DailyLimit.GtCol(long.DailyUsed)), ).Or( long.Type.Eq(int32(resource2.ModeCount)), long.Quota.GtCol(long.Used), ), ), ). Order(q.Resource.CreatedAt.Desc()). Find() if err != nil { return err } return c.JSON(resources) } // endregion // region 创建套餐 type CreateResourceReq struct { s.CreateResourceSerializer } func CreateResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(CreateResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 创建套餐 err = s.Resource.CreateResource(authCtx.Payload.Id, time.Now(), &req.CreateResourceSerializer) if err != nil { return err } return nil } type PrepareResourceReq struct { Method trade2.Method `json:"method" validate:"required"` s.CreateResourceSerializer } type PrepareResourceResp struct { TradeNo string `json:"trade_no"` PayURL string `json:"pay_url"` } func PrepareCreateResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(PrepareResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 准备创建套餐 result, err := s.Resource.PrepareResource(authCtx.Payload.Id, time.Now(), &req.CreateResourceSerializer) if err != nil { return err } return c.JSON(PrepareResourceResp{ TradeNo: result.TradeNo, PayURL: result.PayURL, }) } type CompleteResourceReq struct { TradeNo string `json:"trade_no" validate:"required"` } func CompleteCreateResource(c *fiber.Ctx) error { // 检查权限 _, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(CompleteResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 完成创建套餐 var now = time.Now() err = s.Resource.CompleteResource(req.TradeNo, now) if err != nil { return err } return nil } // endregion func ResourcePrice(c *fiber.Ctx) error { // 检查权限 _, err := auth.NewProtect(c).Payload(auth.PayloadInternalServer).Do() if err != nil { return err } // 解析请求参数 var req = new(s.CreateResourceSerializer) if err := g.Validator.Validate(c, req); err != nil { return err } data, err := req.ToData() if err != nil { return err } return c.JSON(fiber.Map{ "price": data.GetPrice().StringFixed(2), }) }