From 31483591f197dce5aeb618f5d27e10641c7d8451 Mon Sep 17 00:00:00 2001 From: lizandrogd <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 12 May 2025 14:36:23 -0500 Subject: [PATCH] dlocal services --- pkg/services/dlocal_service.go | 50 +++++++++++++++++++++++ rest/controllers/api/dlocal_controller.go | 26 ++++++++++++ rest/routes/api.go | 1 + 3 files changed, 77 insertions(+) diff --git a/pkg/services/dlocal_service.go b/pkg/services/dlocal_service.go index 639144a..5bd6b8c 100644 --- a/pkg/services/dlocal_service.go +++ b/pkg/services/dlocal_service.go @@ -412,3 +412,53 @@ func SeePlanes(cfg models.DlocalApi) ([]byte, error) { return body, nil } + +func SeeSubscription(cfg models.DlocalApi, subscriptionId string, invoiceId string) ([]byte, error) { + // Determinar la URL base según el modo + baseURL := cfg.UrlDev + accessKeyID := cfg.AccessKeyIDdev + accessKeySecret := cfg.AccessKeySecretdev + + if cfg.Modo == "prod" { + baseURL = cfg.UrlProd + accessKeyID = cfg.AccessKeyID + accessKeySecret = cfg.AccessKeySecret + } + + // Construir la URL completa para el endpoint + url := fmt.Sprintf("%s/v1/subscription/%s/execution/%s", baseURL, subscriptionId, invoiceId) + + // Crear la solicitud HTTP + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("error al crear la solicitud: %w", err) + } + + // Establecer encabezados + req.Header.Set("Content-Type", "application/json") + // En DLocal se usa generalmente Basic Auth codificado en base64, pero si realmente usan Bearer personalizado: + authToken := fmt.Sprintf("Bearer %s:%s", accessKeyID, accessKeySecret) + req.Header.Set("Authorization", authToken) + + // Cliente HTTP con timeout + client := &http.Client{Timeout: 30 * time.Second} + + // Ejecutar solicitud + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("error al enviar la solicitud: %w", err) + } + defer resp.Body.Close() + + // Leer respuesta + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("error al leer la respuesta: %w", err) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("respuesta no exitosa (%d): %s", resp.StatusCode, string(body)) + } + + return body, nil +} diff --git a/rest/controllers/api/dlocal_controller.go b/rest/controllers/api/dlocal_controller.go index 16e0f38..cd4be43 100644 --- a/rest/controllers/api/dlocal_controller.go +++ b/rest/controllers/api/dlocal_controller.go @@ -159,3 +159,29 @@ func SeePlanes(c *fiber.Ctx) error { "response": string(response), }) } +func SeeSubscription(c *fiber.Ctx) error { + subscriptionId := c.Params("subscriptionId") + invoiceId := c.Params("invoiceId") + + // Obtener la configuración activa de DlocalApi + dlocalConfig, err := models.GetLastActiveDlocalApi() + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error al obtener la configuración activa de DlocalApi.", + }) + } + + // Llamar al servicio para ver suscripción + response, err := services.SeeSubscription(*dlocalConfig, subscriptionId, invoiceId) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": fmt.Sprintf("Error al obtener la suscripción: %v", err), + }) + } + + // Devolver la respuesta exitosa + return c.Status(fiber.StatusOK).JSON(fiber.Map{ + "message": "Suscripción obtenida exitosamente.", + "response": string(response), + }) +} diff --git a/rest/routes/api.go b/rest/routes/api.go index 7a5498c..c65c3de 100755 --- a/rest/routes/api.go +++ b/rest/routes/api.go @@ -19,6 +19,7 @@ func v1AuthRoutes(api fiber.Router) { api.Patch("/dlocal/subscription/actualizar-plan/:planID", apiControllers.UpdatedPlan) api.Patch("/dlocal/subscription/plan/:planId/subscription/:subscriptionId/deactivate", apiControllers.DeactivatePlan) api.Get("/dlocal/subscription/plan/all", apiControllers.SeePlanes) + api.Get("/dlocal/subscription/:subscriptionId/execution/:invoiceId", apiControllers.SeeSubscription) } func v1Routes(api fiber.Router) {