2025-05-17 11:36:26 -04:00

97 lines
2.7 KiB
Go

package api2
import (
"context"
"time"
"api-soap-facturacion/internal/config"
"api-soap-facturacion/internal/logger"
"api-soap-facturacion/pkg/errors"
"api-soap-facturacion/pkg/soap"
"github.com/google/uuid"
)
// Client es la interfaz para el cliente de API2
type Client interface {
ProcessTransaction(ctx context.Context, request TransactionRequest) (*TransactionResponse, error)
// Agregar más métodos según sea necesario
}
// client implementa la interfaz Client
type client struct {
soapClient soap.Client
logger logger.Logger
}
// crea un nuevo cliente para API2
func NewClient(config config.APIConfig, log logger.Logger) Client {
// Configurar cliente SOAP
options := soap.ClientOptions{
Endpoint: config.Endpoint,
Username: config.Username,
Password: config.Password,
Timeout: config.Timeout * time.Second,
Headers: map[string]string{
"User-Agent": "soap-api-client/1.0",
},
}
return &client{
soapClient: soap.NewClient(options),
logger: log,
}
}
// ProcessTransaction realiza una solicitud de procesamiento de transacción a API2
func (c *client) ProcessTransaction(ctx context.Context, request TransactionRequest) (*TransactionResponse, error) {
// Generar ID de solicitud si no existe
var requestID string
if id, ok := ctx.Value(soap.RequestIDKey{}).(string); ok {
requestID = id
} else {
requestID = uuid.New().String()
ctx = context.WithValue(ctx, soap.RequestIDKey{}, requestID)
}
// Crear request
soapRequest := TransactionSoapRequest{
Request: request,
}
// Registrar solicitud
c.logger.Debug("Enviando solicitud de transacción a API2",
logger.NewField("request_id", requestID),
logger.NewField("transaction_id", request.TransactionID),
logger.NewField("amount", request.Amount),
)
// Respuesta
response := &TransactionSoapResponse{}
// Realizar llamada SOAP
startTime := time.Now()
err := c.soapClient.Call(ctx, "ProcessTransaction", soapRequest, response)
duration := time.Since(startTime)
// Manejar error
if err != nil {
c.logger.Error("Error al realizar solicitud de transacción a API2",
logger.NewField("request_id", requestID),
logger.NewField("transaction_id", request.TransactionID),
logger.NewField("error", err),
logger.NewField("duration_ms", duration.Milliseconds()),
)
return nil, errors.Wrap(err, "error en solicitud de transacción a API2")
}
// Registrar respuesta exitosa
c.logger.Debug("Respuesta recibida de API2 para transacción",
logger.NewField("request_id", requestID),
logger.NewField("transaction_id", request.TransactionID),
logger.NewField("duration_ms", duration.Milliseconds()),
logger.NewField("result_code", response.Response.ResultCode),
)
return &response.Response, nil
}