package app import ( "context" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" packagesilenceapp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence" "github.com/break/junhong_cmp_fiber/internal/middleware" "github.com/break/junhong_cmp_fiber/internal/model/dto" packagesilencequery "github.com/break/junhong_cmp_fiber/internal/query/packagesilence" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/response" ) // ClientPackageSilenceHandler H5 沉默期延期:资格、试算、自助下单、我的延期订单与沉默期流水。 // 资产归属由用例按当前客户校验;金额与月数全部由后端计算。 type ClientPackageSilenceHandler struct { extensions *packagesilenceapp.ExtensionService query *packagesilencequery.Query validator *validator.Validate } // NewClientPackageSilenceHandler 创建 H5 沉默期 Handler。 func NewClientPackageSilenceHandler(extensions *packagesilenceapp.ExtensionService, query *packagesilencequery.Query, validator *validator.Validate) *ClientPackageSilenceHandler { return &ClientPackageSilenceHandler{extensions: extensions, query: query, validator: validator} } // customerContext 返回当前客户 ID 与跳过后台数据范围的上下文(资产归属另行校验)。 func (h *ClientPackageSilenceHandler) customerContext(c *fiber.Ctx) (context.Context, uint, error) { customerID, ok := middleware.GetCustomerID(c) if !ok || customerID == 0 { return nil, 0, errors.New(errors.CodeUnauthorized) } ctx := context.WithValue(c.UserContext(), constants.ContextKeySubordinateShopIDs, []uint{}) return ctx, customerID, nil } func (h *ClientPackageSilenceHandler) validate(req any) error { if h.validator == nil { return nil } if err := h.validator.Struct(req); err != nil { return errors.New(errors.CodeInvalidParam, "请求参数不合法") } return nil } // Eligibility 延期资格。GET /api/c/v1/package-silence/eligibility func (h *ClientPackageSilenceHandler) Eligibility(c *fiber.Ctx) error { var req dto.SilenceEligibilityRequest if err := c.QueryParser(&req); err != nil { return errors.New(errors.CodeInvalidParam) } if err := h.validate(&req); err != nil { return err } ctx, customerID, err := h.customerContext(c) if err != nil { return err } result, err := h.extensions.Eligibility(ctx, req.PackageUsageID, packagesilenceapp.Scope{CustomerID: customerID}) if err != nil { return err } return response.Success(c, result) } // Quote 按天数试算。GET /api/c/v1/package-silence/quote func (h *ClientPackageSilenceHandler) Quote(c *fiber.Ctx) error { var req dto.SilenceQuoteRequest if err := c.QueryParser(&req); err != nil { return errors.New(errors.CodeInvalidParam) } if err := h.validate(&req); err != nil { return err } ctx, customerID, err := h.customerContext(c) if err != nil { return err } result, err := h.extensions.Quote(ctx, req.PackageUsageID, req.Days, packagesilenceapp.Scope{CustomerID: customerID}) if err != nil { return err } return response.Success(c, result) } // CreateOrder 客户自助下单付费延期。POST /api/c/v1/package-silence/orders func (h *ClientPackageSilenceHandler) CreateOrder(c *fiber.Ctx) error { var req dto.SilenceOnlineOrderRequest if err := c.BodyParser(&req); err != nil { return errors.New(errors.CodeInvalidParam) } if err := h.validate(&req); err != nil { return err } ctx, customerID, err := h.customerContext(c) if err != nil { return err } req.EvidenceRefs = nil result, err := h.extensions.CreateOnlineOrder(ctx, packagesilenceapp.OnlineOrderCommand{ Request: req, Scope: packagesilenceapp.Scope{CustomerID: customerID}, PayerClientIP: c.IP(), }) if err != nil { return err } return response.Success(c, result) } // ListOrders 我的延期订单。GET /api/c/v1/package-silence/orders func (h *ClientPackageSilenceHandler) ListOrders(c *fiber.Ctx) error { var req dto.SilenceOrderListRequest if err := c.QueryParser(&req); err != nil { return errors.New(errors.CodeInvalidParam) } ctx, customerID, err := h.customerContext(c) if err != nil { return err } result, err := h.query.ListOrders(ctx, packagesilencequery.OrderFilter{Request: req, CustomerID: customerID}) if err != nil { return err } return response.Success(c, result) } // GetOrder 我的延期订单详情。GET /api/c/v1/package-silence/orders/:id func (h *ClientPackageSilenceHandler) GetOrder(c *fiber.Ctx) error { id, err := c.ParamsInt("id") if err != nil || id <= 0 { return errors.New(errors.CodeInvalidParam) } ctx, customerID, err := h.customerContext(c) if err != nil { return err } result, err := h.query.GetOrder(ctx, uint(id), customerID) if err != nil { return err } return response.Success(c, result) } // ListRecords 套餐沉默期流水。GET /api/c/v1/package-silence/records func (h *ClientPackageSilenceHandler) ListRecords(c *fiber.Ctx) error { var req dto.SilenceRecordListRequest if err := c.QueryParser(&req); err != nil { return errors.New(errors.CodeInvalidParam) } if err := h.validate(&req); err != nil { return err } ctx, customerID, err := h.customerContext(c) if err != nil { return err } result, err := h.extensions.Records(ctx, req.PackageUsageID, packagesilenceapp.Scope{CustomerID: customerID}) if err != nil { return err } return response.Success(c, result) }