Microservicio de SEMS para administrar planes y ciclo de vida de suscripciones.
GET /api/v1/healthGET /health
GET /swagger/index.htmlGET /swagger/doc.json
Flujo recomendado para validar desde Swagger:
- Consultar los planes fijos con
GET /api/v1/subscription-plans - Crear una suscripcion con
POST /api/v1/subscriptions - Consultar con
GET /api/v1/subscriptions/{subscriptionId} - Probar cambio de plan o cancelacion con los
PATCH
Nota:
- Este micro no crea planes por API. El catalogo permitido es fijo y se mantiene con
Free,PlusyPro.
.env: Azure Event Hubs activo por defecto.env.local.azure: copia lista para Azure Event Hubs.env.local.kafka: copia lista para Kafka local enlocalhost:9092
PORT=8080
CONFIG_SERVICE_URL=
KAFKA_BROKERS=
KAFKA_SECURITY_PROTOCOL=
KAFKA_SASL_MECHANISM=
KAFKA_USERNAME=
KAFKA_PASSWORD=
DATABASE_URL=
GIN_MODE=releaseNotas:
- En Azure no uses
localhostpara servicios externos. - El servicio acepta
PORT(y mantiene compatibilidad conSERVER_PORT).
docker build -t subscriptions-service:local .docker compose up -d --buildEsto levanta:
subscriptions-servicepostgreskafka
Valores por defecto importantes:
- app:
http://localhost:8083 - postgres:
localhost:5432 - kafka dentro de la red Docker:
kafka:9092 - config-service externo al compose:
http://host.docker.internal:8090
Si tu config-service corre local en tu máquina, el valor por defecto ya funciona desde el contenedor.
El compose usa variables con prefijo COMPOSE_ para no chocar con tu .env local de go run.
Si quieres cambiar puertos o credenciales, puedes sobrescribir variables al ejecutar:
APP_PORT=8083 \
COMPOSE_CONFIG_SERVICE_URL=http://host.docker.internal:8090 \
POSTGRES_EXPOSE_PORT=5432 \
KAFKA_EXTERNAL_PORT=9092 \
docker compose up -d --buildSi prefieres que este micro no consulte el config-service, puedes dejar COMPOSE_CONFIG_SERVICE_URL vacío y pasar las variables necesarias por entorno.
docker run --rm -p 8080:8080 \
-e PORT=8080 \
-e CONFIG_SERVICE_URL=http://host.docker.internal:8090 \
-e KAFKA_BROKERS=host.docker.internal:9092 \
-e KAFKA_SECURITY_PROTOCOL=PLAINTEXT \
-e DATABASE_URL="postgresql://user:password@host.docker.internal:5432/dbname?sslmode=disable" \
subscriptions-service:localTopic Kafka por defecto de este micro:
subscriptions.events
Eventos publicados dentro del payload:
subscription.createdsubscription.cancelledsubscription.plan.changedsubscription.renewal.requestedsubscription.expiredsubscription.updated
Aclaracion importante:
- El micro no publica
SubscriptionCreatedcomo nombre de evento en Kafka. - El valor real del campo
eventTypeessubscription.createdy variantes equivalentes en minusculas para los otros eventos.
Formato del evento:
{
"eventType": "subscription.created",
"eventId": "550e8400-e29b-41d4-a716-446655440000",
"occurredAt": "2026-06-12T22:30:00Z",
"data": {
"subscriptionId": "sub-123",
"userId": "user-123",
"planId": "plan-456",
"status": "ACTIVE",
"requiresPayment": true,
"amount": 15
}
}Notas de contrato:
- El topic fisico de publicacion es solo
subscriptions.events. eventTypeidentifica el tipo de evento dentro del envelope y no se usa como topic fisico.- Si alguna documentacion previa mencionaba
SubscriptionCreated, debe leerse como desactualizada para este servicio.
az containerapp create \
--name subscriptions-service \
--resource-group <RESOURCE_GROUP> \
--environment <CONTAINERAPPS_ENV> \
--image <ACR_LOGIN_SERVER>/subscriptions-service:latest \
--target-port 8080 \
--ingress external \
--registry-server <ACR_LOGIN_SERVER> \
--env-vars \
PORT=8080 \
GIN_MODE=release \
CONFIG_SERVICE_URL=https://<config-service-url> \
KAFKA_BROKERS=<namespace>.servicebus.windows.net:9093 \
KAFKA_SECURITY_PROTOCOL=SASL_SSL \
KAFKA_SASL_MECHANISM=PLAIN \
KAFKA_USERNAME='$ConnectionString' \
KAFKA_PASSWORD='Endpoint=sb://<namespace>.servicebus.windows.net/;SharedAccessKeyName=<policy>;SharedAccessKey=<key>' \
KAFKA_TOPIC_SUBSCRIPTIONS_EVENTS=subscriptions.events \
DATABASE_URL="<postgres-connection-string>"Recomendado en Azure:
- Definir
KAFKA_PASSWORD,DATABASE_URLy secretos Stripe como secretos de Container Apps. - Referenciar secretos con
secretref:en--env-varscuando aplique.