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

158 lines
4.7 KiB
Go

package handlers
import (
"bytes"
"context"
"daemonService/internal/controllers"
"daemonService/internal/models"
"daemonService/internal/models/obtencionCodigos"
"daemonService/internal/services"
"fmt"
"io"
"log"
"net/http"
"time"
"github.com/gorilla/mux"
)
type ServiceHandler struct {
services []models.SoapService
serviceCuis []obtencionCodigos.CuisService
isCron bool
}
func NewServiceHandler(services []models.SoapService, serviceCuis []obtencionCodigos.CuisService, isCron bool) *ServiceHandler {
return &ServiceHandler{
services: services,
serviceCuis: serviceCuis,
isCron: isCron,
}
}
func (h *ServiceHandler) ListServices(w http.ResponseWriter, r *http.Request) {
serviceNames := make([]string, len(h.services))
for i, svc := range h.services {
serviceNames[i] = svc.GetName()
}
controllers.RespondWithSuccess(w, http.StatusOK, "Lista de servicios disponibles", serviceNames)
}
func (h *ServiceHandler) RunAllServices(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute)
defer cancel()
go func() {
errors := services.RunAllServices(ctx, h.services, h.isCron)
log.Printf("All services execution completed with %d errors", len(errors))
}()
controllers.RespondWithSuccess(w, http.StatusAccepted, "Se inició la ejecución de todos los servicios.", nil)
}
func (h *ServiceHandler) RunService(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
serviceName := vars["name"]
bodyStr, err := h.readRequestBody(r)
if err != nil {
controllers.RespondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Error al leer el request body: %v", err))
return
}
fmt.Println("Request body:", bodyStr)
service, found := h.findServiceByName(serviceName)
if !found {
controllers.RespondWithError(w, http.StatusNotFound, fmt.Sprintf("Servicio no encontrado: %s", serviceName))
return
}
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute)
defer cancel()
respChannel := make(chan interface{}, 1)
go func() {
resp := h.executeService(ctx, service, r, serviceName)
respChannel <- resp
}()
resp := <-respChannel
//controllers.RespondWithSuccess(w, http.StatusAccepted, fmt.Sprintf("Service %s execution initiated", serviceName), resp)
controllers.RespondWithSuccess(w, 200, fmt.Sprintf("Listado del servicio %s", serviceName), resp)
}
func (h *ServiceHandler) readRequestBody(r *http.Request) (string, error) {
body, err := io.ReadAll(r.Body)
if err != nil {
return "", err
}
r.Body.Close()
r.Body = io.NopCloser(bytes.NewBuffer(body))
return string(body), nil
}
func (h *ServiceHandler) findServiceByName(name string) (models.SoapService, bool) {
for _, svc := range h.services {
if svc.GetName() == name {
return svc, true
}
}
return nil, false
}
func (h *ServiceHandler) executeService(ctx context.Context, service models.SoapService, r *http.Request, serviceName string) interface{} {
resp, err := service.Execute(ctx, r, h.isCron)
if err != nil {
log.Printf("Error al ejecutar el servicio %s: %v", serviceName, err)
return nil
} else {
log.Printf("Servicio %s ejecutado satisfactoriamente", serviceName)
return resp
}
}
// registrar empresa -------------------------------------------------------------------------------------------------------
func (h *ServiceHandler) RunGetCodeService(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
serviceName := vars["obtenerCodigo"]
service, found := h.findGetCodeByName(serviceName)
if !found {
controllers.RespondWithError(w, http.StatusNotFound, fmt.Sprintf("Servicio no encontrado: %s", serviceName))
return
}
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute)
defer cancel()
respChannel := make(chan interface{}, 1)
go func() {
respCuis := h.executeGetCodeService(ctx, service, w, r, serviceName)
respChannel <- respCuis
}()
respCuis := <-respChannel
controllers.RespondCuisWithSuccess(w, http.StatusAccepted, fmt.Sprintf("Servicio %s ejecucion iniciada", respCuis), respCuis)
}
func (h *ServiceHandler) executeGetCodeService(ctx context.Context, service obtencionCodigos.CuisService, w http.ResponseWriter, r *http.Request, serviceName string) interface{} {
//var result interface{}
respCuis, err := service.ExecuteGetCode(ctx, w, r, h.isCron)
if err != nil {
log.Printf("Error ejecutando servicio %s: %v", serviceName, err)
return err // o podrías retornar el error
} else {
log.Printf("Servicio %s ejecutado satisfactoriamente", serviceName)
return respCuis // Aquí retornarías el resultado del servicio
}
}
func (h *ServiceHandler) findGetCodeByName(name string) (obtencionCodigos.CuisService, bool) {
for _, svc := range h.serviceCuis {
if svc.GetName() == name {
return svc, true
}
}
return nil, false
}