public_experience_handler.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package handlers
  2. import (
  3. "net/http"
  4. "strconv"
  5. "cmr-backend/internal/apperr"
  6. "cmr-backend/internal/httpx"
  7. "cmr-backend/internal/service"
  8. )
  9. type PublicExperienceHandler struct {
  10. service *service.PublicExperienceService
  11. }
  12. func NewPublicExperienceHandler(service *service.PublicExperienceService) *PublicExperienceHandler {
  13. return &PublicExperienceHandler{service: service}
  14. }
  15. func (h *PublicExperienceHandler) ListMaps(w http.ResponseWriter, r *http.Request) {
  16. limit := 20
  17. if raw := r.URL.Query().Get("limit"); raw != "" {
  18. if parsed, err := strconv.Atoi(raw); err == nil {
  19. limit = parsed
  20. }
  21. }
  22. result, err := h.service.ListMaps(r.Context(), service.ListExperienceMapsInput{Limit: limit})
  23. if err != nil {
  24. httpx.WriteError(w, err)
  25. return
  26. }
  27. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  28. }
  29. func (h *PublicExperienceHandler) GetMapDetail(w http.ResponseWriter, r *http.Request) {
  30. result, err := h.service.GetMapDetail(r.Context(), r.PathValue("mapAssetPublicID"))
  31. if err != nil {
  32. httpx.WriteError(w, err)
  33. return
  34. }
  35. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  36. }
  37. func (h *PublicExperienceHandler) GetEventDetail(w http.ResponseWriter, r *http.Request) {
  38. result, err := h.service.GetEventDetail(r.Context(), r.PathValue("eventPublicID"))
  39. if err != nil {
  40. httpx.WriteError(w, err)
  41. return
  42. }
  43. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  44. }
  45. func (h *PublicExperienceHandler) GetEventPlay(w http.ResponseWriter, r *http.Request) {
  46. result, err := h.service.GetEventPlay(r.Context(), service.PublicEventPlayInput{
  47. EventPublicID: r.PathValue("eventPublicID"),
  48. })
  49. if err != nil {
  50. httpx.WriteError(w, err)
  51. return
  52. }
  53. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  54. }
  55. func (h *PublicExperienceHandler) Launch(w http.ResponseWriter, r *http.Request) {
  56. var req service.PublicLaunchEventInput
  57. if err := httpx.DecodeJSON(r, &req); err != nil {
  58. httpx.WriteError(w, apperr.New(http.StatusBadRequest, "invalid_json", "invalid request body"))
  59. return
  60. }
  61. req.EventPublicID = r.PathValue("eventPublicID")
  62. result, err := h.service.LaunchEvent(r.Context(), req)
  63. if err != nil {
  64. httpx.WriteError(w, err)
  65. return
  66. }
  67. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  68. }