| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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"
- )
- // RedeemHandler handles redeem code-related requests
- type RedeemHandler struct {
- redeemService *service.RedeemService
- }
- // NewRedeemHandler creates a new RedeemHandler
- func NewRedeemHandler(redeemService *service.RedeemService) *RedeemHandler {
- return &RedeemHandler{
- redeemService: redeemService,
- }
- }
- // RedeemRequest represents the redeem code request payload
- type RedeemRequest struct {
- Code string `json:"code" binding:"required"`
- }
- // RedeemResponse represents the redeem response
- 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"`
- }
- // Redeem handles redeeming a code
- // POST /api/v1/redeem
- 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))
- }
- // GetHistory returns the user's redemption history
- // GET /api/v1/redeem/history
- func (h *RedeemHandler) GetHistory(c *gin.Context) {
- subject, ok := middleware2.GetAuthSubjectFromContext(c)
- if !ok {
- response.Unauthorized(c, "User not authenticated")
- return
- }
- // Default limit is 25
- 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)
- }
|