158 lines
4.7 KiB
Go
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
|
|
}
|