Proyecto de automatizacion de desarrollo

Tiene como objetivo levantar un servidor de Webhooks para servir al desarrollo de shopify de forma local.

Componentes:

  • Servidor de webhooks que emite peticiones
  • Cliente (servidor express) que escucha al servidor para desarrollo

Objetivos:

  • Generar eventos por API REST
  • Subscripción a topics por API REST
  • Documentación de la API REST con Bruno
  • Firma de mesajes con HMAC sha256
  • Generar eventos periodicos
  • Generar ordenes de shopify proceduralmente
  • Generar ciclos de vida realistas create -> update -> delete
  • Dockerizar
  • Añadir clientes iniciales

Webhooks Soportados:

  • orders/create
  • orders/update
  • orders/delete

Propuestas:

Requisitos

  • Docker (linux) o Docker desktop (widows - WSL)
  • Ubuntu 24 o similar

Introduccion

El objetivo es tener un grupo compose con

  • Una BDD para almacenar ejemplos
  • Un servicio que envie peticiones periodicamente

Este grupo tiene definida una red externa en el docker-compose.yaml que tiene que coincidir con la red de los demás compose ejecutados, por ejemplo:

# Esto tiene que aparecer en el yaml del simulador
name: p-simulador-webhooks
networks:
  default:
    name: network-test # Tiene que coincidir con el compose objetivo
    external: true
# Esto en el yaml del microservicio
name: sf-shopify-orders
networks:
  default:
    name: network-test

Ejecución

Para lanzar los contenedores se ejecuta el script run.local.sh que va a lanzar el compose de la carpeta /development/local. Habrá que ver para los demás entornos.

Configuración de envío periódico de webhooks

La configuración de los webhooks se hace en /src/config/initial_hosts.ts.

En la constante INITIAL_EVENTS están los eventos que se van a emitir periodicamente. Tienen la estructura:

export type ScheduledEvent = {
  topic: string;
  numberOfMessages?: number;
  periodMs?: number;
};

Un ejemplo sería:

{
    topic: "order/create", // Emite mensajes de tipo order/create
    numberOfMessages: -1, // Un numero negativo o indefinido de mensajes, indica que se mandan ilimintados
    periodMs: 5000 // 5s entre mensajes, si fuese indefinido el predefinido es 1s
}

El periodo indica el mínimo entre mensajes, puede pasar mas tiempo si la maquina se realentiza o si el event loop queda bloqueado.

Configuración de los host que reciben webhooks

Para añadir un host nuevo se crea un nuevo objeto en la constante INTIAL_HOSTS tal que:

type InitialHost = {
  topic: string;
  host: string;
  port: string;
  endpoint: string;
  method: "POST" | "PUT" | "DELETE";
  secretkey: string;
};

Por ejemplo si corremos el servicio en un contenedor llamado cliente-webhooks se tiene que añadir un objeto:

{
    topic: "order/create",
    host: "localhost",
    port: "3500",
    endpoint: "/order/create",
    method: "POST",
    secretkey: webhooksConfig.apiSecret || "1234",
}

Esta configuración implica que ese host va recibir una petición HTTP cada vez que se emite un mensaje con el topic order/create, se va a enviar al puerto 3500 y al endpoint order/create mediante el método POST. Tiene un campo "opcional" para la clave para la firma HMAC, si se quiere usar tiene que coincidir en el cliente y el servidor, la clave del servidor se puede guardar en el .env o directamente en el objeto NO SE DEBEN USAR CLAVES REALES DE PRODUCCIÓN, con poner "1234" en los dos servicios la firma ya se hace correctamente.

Description
No description provided
Readme 16 MiB
Languages
TypeScript 99.2%
Shell 0.8%