package handler import ( "net/http" "strings" "github.com/saveinmed/backend-go/internal/domain" ) // CreatePaymentPreference godoc // @Summary Cria preferência de pagamento Mercado Pago com split nativo // @Tags Pagamentos // @Security BearerAuth // @Produce json // @Param id path string true "Order ID" // @Success 201 {object} domain.PaymentPreference // @Router /api/v1/orders/{id}/payment [post] func (h *Handler) CreatePaymentPreference(w http.ResponseWriter, r *http.Request) { if !strings.HasSuffix(r.URL.Path, "/payment") { http.NotFound(w, r) return } id, err := parseUUIDFromPath(r.URL.Path) if err != nil { writeError(w, http.StatusBadRequest, err) return } pref, err := h.svc.CreatePaymentPreference(r.Context(), id) if err != nil { writeError(w, http.StatusInternalServerError, err) return } writeJSON(w, http.StatusCreated, pref) } // CreateShipment godoc // @Summary Gera guia de postagem/transporte // @Tags Logistica // @Security BearerAuth // @Accept json // @Produce json // @Param shipment body createShipmentRequest true "Dados de envio" // @Success 201 {object} domain.Shipment // @Router /api/v1/shipments [post] func (h *Handler) CreateShipment(w http.ResponseWriter, r *http.Request) { var req createShipmentRequest if err := decodeJSON(r.Context(), r, &req); err != nil { writeError(w, http.StatusBadRequest, err) return } shipment := &domain.Shipment{ OrderID: req.OrderID, Carrier: req.Carrier, TrackingCode: req.TrackingCode, ExternalTracking: req.ExternalTracking, } if err := h.svc.CreateShipment(r.Context(), shipment); err != nil { writeError(w, http.StatusInternalServerError, err) return } writeJSON(w, http.StatusCreated, shipment) } // GetShipmentByOrderID godoc // @Summary Rastreia entrega // @Tags Logistica // @Security BearerAuth // @Produce json // @Param order_id path string true "Order ID" // @Success 200 {object} domain.Shipment // @Router /api/v1/shipments/{order_id} [get] func (h *Handler) GetShipmentByOrderID(w http.ResponseWriter, r *http.Request) { orderID, err := parseUUIDFromPath(r.URL.Path) if err != nil { writeError(w, http.StatusBadRequest, err) return } shipment, err := h.svc.GetShipmentByOrderID(r.Context(), orderID) if err != nil { writeError(w, http.StatusNotFound, err) return } writeJSON(w, http.StatusOK, shipment) } // HandlePaymentWebhook godoc // @Summary Recebe notificações do Mercado Pago // @Tags Pagamentos // @Accept json // @Produce json // @Param notification body domain.PaymentWebhookEvent true "Evento do gateway" // @Success 200 {object} domain.PaymentSplitResult // @Router /api/v1/payments/webhook [post] func (h *Handler) HandlePaymentWebhook(w http.ResponseWriter, r *http.Request) { var event domain.PaymentWebhookEvent if err := decodeJSON(r.Context(), r, &event); err != nil { writeError(w, http.StatusBadRequest, err) return } summary, err := h.svc.HandlePaymentWebhook(r.Context(), event) if err != nil { writeError(w, http.StatusInternalServerError, err) return } writeJSON(w, http.StatusOK, summary) }