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.