| package handler |
|
|
| import ( |
| "github.com/Wei-Shaw/sub2api/internal/handler/dto" |
| "github.com/Wei-Shaw/sub2api/internal/pkg/response" |
| middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware" |
| "github.com/Wei-Shaw/sub2api/internal/service" |
|
|
| "github.com/gin-gonic/gin" |
| ) |
|
|
| |
| type RedeemHandler struct { |
| redeemService *service.RedeemService |
| } |
|
|
| |
| func NewRedeemHandler(redeemService *service.RedeemService) *RedeemHandler { |
| return &RedeemHandler{ |
| redeemService: redeemService, |
| } |
| } |
|
|
| |
| type RedeemRequest struct { |
| Code string `json:"code" binding:"required"` |
| } |
|
|
| |
| type RedeemResponse struct { |
| Message string `json:"message"` |
| Type string `json:"type"` |
| Value float64 `json:"value"` |
| NewBalance *float64 `json:"new_balance,omitempty"` |
| NewConcurrency *int `json:"new_concurrency,omitempty"` |
| } |
|
|
| |
| |
| func (h *RedeemHandler) Redeem(c *gin.Context) { |
| subject, ok := middleware2.GetAuthSubjectFromContext(c) |
| if !ok { |
| response.Unauthorized(c, "User not authenticated") |
| return |
| } |
|
|
| var req RedeemRequest |
| if err := c.ShouldBindJSON(&req); err != nil { |
| response.BadRequest(c, "Invalid request: "+err.Error()) |
| return |
| } |
|
|
| result, err := h.redeemService.Redeem(c.Request.Context(), subject.UserID, req.Code) |
| if err != nil { |
| response.ErrorFrom(c, err) |
| return |
| } |
|
|
| response.Success(c, dto.RedeemCodeFromService(result)) |
| } |
|
|
| |
| |
| func (h *RedeemHandler) GetHistory(c *gin.Context) { |
| subject, ok := middleware2.GetAuthSubjectFromContext(c) |
| if !ok { |
| response.Unauthorized(c, "User not authenticated") |
| return |
| } |
|
|
| |
| limit := 25 |
|
|
| codes, err := h.redeemService.GetUserHistory(c.Request.Context(), subject.UserID, limit) |
| if err != nil { |
| response.ErrorFrom(c, err) |
| return |
| } |
|
|
| out := make([]dto.RedeemCode, 0, len(codes)) |
| for i := range codes { |
| out = append(out, *dto.RedeemCodeFromService(&codes[i])) |
| } |
| response.Success(c, out) |
| } |
|
|