saveinmed/backend-old/internal/payments/mock.go
NANDO9322 78a95e3263 feat: reestruturação do checkout, correções de pagamento e melhorias visuais
Backend:
- Renomeado BACKEND_URL para BACKEND_HOST no .env e nas configs para consistência.
- Atualizado MercadoPagoGateway para usar o BACKEND_HOST correto na notification_url.
- Atualizado payment_handler para receber e processar informações do Pagador (email/doc).
- Corrigido erro 500 ao buscar dados de compradores B2B.

Frontend:
- Criado componente Header reutilizável e aplicado nas páginas internas.
- Implementada nova página "Meus Pedidos" com lógica de listagem correta.
- Implementada página de "Detalhes do Pedido" (/pedidos/[id]) com alto contraste visual.
- Melhorada a legibilidade da página de detalhes (textos pretos/escuros).
- Corrigido bug onde pagamentos rejeitados eram tratados como sucesso (agora verifica status 'rejected' no serviço).
- Adicionado componente <Toaster /> ao layout principal para corrigir notificações invisíveis.
- Adicionado feedback visual persistente de erro na tela de checkout para falhas de pagamento.
2026-01-28 16:37:21 -03:00

90 lines
2.3 KiB
Go

package payments
import (
"context"
"fmt"
"time"
"github.com/gofrs/uuid/v5"
"github.com/saveinmed/backend-go/internal/domain"
)
// MockGateway provides a fictional payment gateway for testing and development.
// All payments are automatically approved after a short delay.
type MockGateway struct {
MarketplaceCommission float64
AutoApprove bool // If true, payments are auto-approved
}
func NewMockGateway(commission float64, autoApprove bool) *MockGateway {
return &MockGateway{
MarketplaceCommission: commission,
AutoApprove: autoApprove,
}
}
func (g *MockGateway) CreatePreference(ctx context.Context, order *domain.Order, payer *domain.User, sellerAcc *domain.SellerPaymentAccount) (*domain.PaymentPreference, error) {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
fee := int64(float64(order.TotalCents) * (g.MarketplaceCommission / 100))
// Generate a mock payment ID
mockPaymentID := uuid.Must(uuid.NewV7())
status := "pending"
if g.AutoApprove {
status = "approved"
}
pref := &domain.PaymentPreference{
OrderID: order.ID,
Gateway: "mock",
CommissionPct: g.MarketplaceCommission,
MarketplaceFee: fee,
SellerReceivable: order.TotalCents - fee,
PaymentURL: fmt.Sprintf("/mock-payment/%s?status=%s", mockPaymentID.String(), status),
}
// Simulate minimal latency
time.Sleep(5 * time.Millisecond)
return pref, nil
}
// ConfirmPayment simulates payment confirmation for the mock gateway.
func (g *MockGateway) ConfirmPayment(ctx context.Context, paymentID string) (*domain.PaymentResult, error) {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
// Always approve in mock mode
return &domain.PaymentResult{
PaymentID: paymentID,
Status: "approved",
Gateway: "mock",
Message: "Pagamento fictício aprovado automaticamente",
ConfirmedAt: time.Now(),
}, nil
}
// RefundPayment simulates a refund for the mock gateway.
func (g *MockGateway) RefundPayment(ctx context.Context, paymentID string, amountCents int64) (*domain.RefundResult, error) {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
return &domain.RefundResult{
RefundID: uuid.Must(uuid.NewV7()).String(),
PaymentID: paymentID,
AmountCents: amountCents,
Status: "refunded",
RefundedAt: time.Now(),
}, nil
}