97 lines
2.7 KiB
Go
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
|
|
}
|