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

94 lines
2.4 KiB
Go

package api1
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 API1
type Client interface {
GetData(ctx context.Context, request GetDataRequest) (*GetDataResponse, error)
// Agregar más métodos según sea necesario
}
// client implementa la interfaz Client
type client struct {
soapClient soap.Client
logger logger.Logger
}
// NewClient crea un nuevo cliente para API1
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,
}
}
// GetData realiza una solicitud GetData a API1
func (c *client) GetData(ctx context.Context, request GetDataRequest) (*GetDataResponse, 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 := GetDataSoapRequest{
Request: request,
}
// Registrar solicitud
c.logger.Debug("Enviando solicitud GetData a API1",
logger.NewField("request_id", requestID),
logger.NewField("parameters", request),
)
// Respuesta
response := &GetDataSoapResponse{}
// Realizar llamada SOAP
startTime := time.Now()
err := c.soapClient.Call(ctx, "GetData", soapRequest, response)
duration := time.Since(startTime)
// Manejar error
if err != nil {
c.logger.Error("Error al realizar solicitud GetData a API1",
logger.NewField("request_id", requestID),
logger.NewField("error", err),
logger.NewField("duration_ms", duration.Milliseconds()),
)
return nil, errors.Wrap(err, "error en solicitud GetData a API1")
}
// Registrar respuesta exitosa
c.logger.Debug("Respuesta recibida de API1 para GetData",
logger.NewField("request_id", requestID),
logger.NewField("duration_ms", duration.Milliseconds()),
logger.NewField("status", response.Response.Status),
)
return &response.Response, nil
}