Files
hfb_sys/backend/internal/modules/pointsmall/dto.go
T

124 lines
4.9 KiB
Go

package pointsmall
import (
"errors"
"time"
"hfb_sys/backend/internal/model"
)
var (
ErrDependencyUnavailable = errors.New("points mall dependency unavailable")
ErrInvalidInput = errors.New("invalid points mall input")
ErrProductUnavailable = errors.New("points mall product unavailable")
ErrInsufficientPoints = errors.New("insufficient points")
ErrRedeemLimitExceeded = errors.New("redeem limit exceeded")
ErrRedemptionNotPending = errors.New("redemption not pending")
)
type SummaryDTO struct {
AvailablePoints int64 `json:"available_points"`
LifetimePoints int64 `json:"lifetime_points"`
LevelCode string `json:"level_code"`
LevelName string `json:"level_name"`
PointsPerYuan int64 `json:"points_per_yuan"`
PointsMultiplierBps int `json:"points_multiplier_bps"`
}
type ProductDTO struct {
ID uint64 `json:"id"`
Title string `json:"title"`
Subtitle string `json:"subtitle"`
Description string `json:"description"`
CoverURL string `json:"cover_url"`
RedemptionInstructions string `json:"redemption_instructions"`
PointsPrice int64 `json:"points_price"`
Stock int64 `json:"stock"`
RedeemedCount int64 `json:"redeemed_count"`
PerUserLimit int `json:"per_user_limit"`
Status string `json:"status"`
SortOrder int `json:"sort_order"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type ProductRequest struct {
Title string `json:"title" binding:"required,max=128"`
Subtitle string `json:"subtitle" binding:"max=255"`
Description string `json:"description" binding:"required"`
CoverURL string `json:"cover_url"`
RedemptionInstructions string `json:"redemption_instructions" binding:"required"`
PointsPrice int64 `json:"points_price" binding:"required,min=1"`
Stock int64 `json:"stock" binding:"min=0"`
PerUserLimit int `json:"per_user_limit" binding:"required,min=1,max=100"`
Status string `json:"status" binding:"required,oneof=online offline"`
SortOrder int `json:"sort_order"`
}
type RedeemRequest struct {
Quantity int `json:"quantity" binding:"required,min=1,max=10"`
}
type CompleteRedemptionRequest struct {
Remark string `json:"remark" binding:"max=255"`
}
type RedemptionDTO struct {
ID uint64 `json:"id"`
RedemptionNo string `json:"redemption_no"`
UserID uint64 `json:"user_id"`
UserPhone string `json:"user_phone,omitempty"`
UserNickname string `json:"user_nickname,omitempty"`
ProductID uint64 `json:"product_id"`
ProductTitle string `json:"product_title"`
ProductCoverURL string `json:"product_cover_url"`
RedemptionInstructions string `json:"redemption_instructions"`
PointsPrice int64 `json:"points_price"`
Quantity int `json:"quantity"`
TotalPoints int64 `json:"total_points"`
Status string `json:"status"`
AdminRemark string `json:"admin_remark"`
CompletedBy *uint64 `json:"completed_by,omitempty"`
CompletedAt *time.Time `json:"completed_at"`
CreatedAt time.Time `json:"created_at"`
}
func toProductDTO(item model.PointsMallProduct) ProductDTO {
return ProductDTO{
ID: item.ID,
Title: item.Title,
Subtitle: item.Subtitle,
Description: item.Description,
CoverURL: item.CoverURL,
RedemptionInstructions: item.RedemptionInstructions,
PointsPrice: item.PointsPrice,
Stock: item.Stock,
RedeemedCount: item.RedeemedCount,
PerUserLimit: item.PerUserLimit,
Status: item.Status,
SortOrder: item.SortOrder,
CreatedAt: item.CreatedAt,
UpdatedAt: item.UpdatedAt,
}
}
func toRedemptionDTO(item model.PointsMallRedemption) RedemptionDTO {
return RedemptionDTO{
ID: item.ID,
RedemptionNo: item.RedemptionNo,
UserID: item.UserID,
ProductID: item.ProductID,
ProductTitle: item.ProductTitle,
ProductCoverURL: item.ProductCoverURL,
RedemptionInstructions: item.RedemptionInstructions,
PointsPrice: item.PointsPrice,
Quantity: item.Quantity,
TotalPoints: item.TotalPoints,
Status: item.Status,
AdminRemark: item.AdminRemark,
CompletedBy: item.CompletedBy,
CompletedAt: item.CompletedAt,
CreatedAt: item.CreatedAt,
}
}