redeem_handler.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package handler
  2. import (
  3. "github.com/Wei-Shaw/sub2api/internal/handler/dto"
  4. "github.com/Wei-Shaw/sub2api/internal/pkg/response"
  5. middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware"
  6. "github.com/Wei-Shaw/sub2api/internal/service"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // RedeemHandler handles redeem code-related requests
  10. type RedeemHandler struct {
  11. redeemService *service.RedeemService
  12. }
  13. // NewRedeemHandler creates a new RedeemHandler
  14. func NewRedeemHandler(redeemService *service.RedeemService) *RedeemHandler {
  15. return &RedeemHandler{
  16. redeemService: redeemService,
  17. }
  18. }
  19. // RedeemRequest represents the redeem code request payload
  20. type RedeemRequest struct {
  21. Code string `json:"code" binding:"required"`
  22. }
  23. // RedeemResponse represents the redeem response
  24. type RedeemResponse struct {
  25. Message string `json:"message"`
  26. Type string `json:"type"`
  27. Value float64 `json:"value"`
  28. NewBalance *float64 `json:"new_balance,omitempty"`
  29. NewConcurrency *int `json:"new_concurrency,omitempty"`
  30. }
  31. // Redeem handles redeeming a code
  32. // POST /api/v1/redeem
  33. func (h *RedeemHandler) Redeem(c *gin.Context) {
  34. subject, ok := middleware2.GetAuthSubjectFromContext(c)
  35. if !ok {
  36. response.Unauthorized(c, "User not authenticated")
  37. return
  38. }
  39. var req RedeemRequest
  40. if err := c.ShouldBindJSON(&req); err != nil {
  41. response.BadRequest(c, "Invalid request: "+err.Error())
  42. return
  43. }
  44. result, err := h.redeemService.Redeem(c.Request.Context(), subject.UserID, req.Code)
  45. if err != nil {
  46. response.ErrorFrom(c, err)
  47. return
  48. }
  49. response.Success(c, dto.RedeemCodeFromService(result))
  50. }
  51. // GetHistory returns the user's redemption history
  52. // GET /api/v1/redeem/history
  53. func (h *RedeemHandler) GetHistory(c *gin.Context) {
  54. subject, ok := middleware2.GetAuthSubjectFromContext(c)
  55. if !ok {
  56. response.Unauthorized(c, "User not authenticated")
  57. return
  58. }
  59. // Default limit is 25
  60. limit := 25
  61. codes, err := h.redeemService.GetUserHistory(c.Request.Context(), subject.UserID, limit)
  62. if err != nil {
  63. response.ErrorFrom(c, err)
  64. return
  65. }
  66. out := make([]dto.RedeemCode, 0, len(codes))
  67. for i := range codes {
  68. out = append(out, *dto.RedeemCodeFromService(&codes[i]))
  69. }
  70. response.Success(c, out)
  71. }