100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
package admin
|
||
|
||
import (
|
||
"github.com/gofiber/fiber/v2"
|
||
|
||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||
assetSvc "github.com/break/junhong_cmp_fiber/internal/service/asset"
|
||
assetWalletSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_wallet"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||
"github.com/break/junhong_cmp_fiber/pkg/middleware"
|
||
"github.com/break/junhong_cmp_fiber/pkg/response"
|
||
)
|
||
|
||
// AssetWalletHandler 资产钱包处理器
|
||
// 提供管理端资产(卡/设备)钱包概况和流水查询接口
|
||
type AssetWalletHandler struct {
|
||
service *assetWalletSvc.Service
|
||
assetService *assetSvc.Service
|
||
}
|
||
|
||
// NewAssetWalletHandler 创建资产钱包处理器
|
||
func NewAssetWalletHandler(svc *assetWalletSvc.Service) *AssetWalletHandler {
|
||
return &AssetWalletHandler{service: svc}
|
||
}
|
||
|
||
// SetAssetService 注入资产解析服务(用于通过标识符解析资产类型和ID)
|
||
func (h *AssetWalletHandler) SetAssetService(svc *assetSvc.Service) {
|
||
h.assetService = svc
|
||
}
|
||
|
||
// GetWallet 查询资产钱包概况
|
||
// GET /api/admin/assets/:identifier/wallet
|
||
func (h *AssetWalletHandler) GetWallet(c *fiber.Ctx) error {
|
||
userType := middleware.GetUserTypeFromContext(c.UserContext())
|
||
if userType == constants.UserTypeEnterprise {
|
||
return errors.New(errors.CodeForbidden, "企业账号无权查看钱包信息")
|
||
}
|
||
|
||
identifier := c.Params("identifier")
|
||
if identifier == "" {
|
||
return errors.New(errors.CodeInvalidParam, "标识符不能为空")
|
||
}
|
||
|
||
if h.assetService == nil {
|
||
return errors.New(errors.CodeInternalError, "资产服务未配置")
|
||
}
|
||
|
||
asset, err := h.assetService.Resolve(c.UserContext(), identifier, false)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
result, err := h.service.GetWallet(c.UserContext(), asset.AssetType, asset.AssetID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, result)
|
||
}
|
||
|
||
// ListTransactions 查询资产钱包流水列表
|
||
// GET /api/admin/assets/:identifier/wallet/transactions
|
||
func (h *AssetWalletHandler) ListTransactions(c *fiber.Ctx) error {
|
||
userType := middleware.GetUserTypeFromContext(c.UserContext())
|
||
if userType == constants.UserTypeEnterprise {
|
||
return errors.New(errors.CodeForbidden, "企业账号无权查看钱包信息")
|
||
}
|
||
|
||
identifier := c.Params("identifier")
|
||
if identifier == "" {
|
||
return errors.New(errors.CodeInvalidParam, "标识符不能为空")
|
||
}
|
||
|
||
if h.assetService == nil {
|
||
return errors.New(errors.CodeInternalError, "资产服务未配置")
|
||
}
|
||
|
||
asset, err := h.assetService.Resolve(c.UserContext(), identifier, false)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
var req dto.AssetWalletTransactionListRequest
|
||
if err := c.QueryParser(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam)
|
||
}
|
||
|
||
if req.PageSize > 100 {
|
||
return errors.New(errors.CodeInvalidParam, "每页数量不能超过100")
|
||
}
|
||
|
||
result, err := h.service.ListTransactions(c.UserContext(), asset.AssetType, asset.AssetID, &req)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, result)
|
||
}
|