services/api/src/server.js

Overview

Este archivo arranca la API de Somos Plano. Primero conecta con la base de datos, luego revisa variables de entorno críticas y, al final, levanta el servidor HTTP con app.listen.

También actúa como punto de validación operativa. Si detecta configuraciones incompletas, escribe advertencias en consola antes de aceptar tráfico.

[!IMPORTANT] El arranque solo se completa si connectToDatabase() termina sin error. Si falla, el proceso termina con process.exit(1).

How it works

flowchart TD
    Start([Inicio]) --> Bootstrap[bootstrap]
    Bootstrap --> DB[connectToDatabase]
    DB --> Stripe[warnIfStripeMisconfigured]
    Stripe --> ImageKit[warnIfImageKitMisconfigured]
    ImageKit --> Google[warnIfGoogleAuthMisconfigured]
    Google --> Phone[warnIfPhoneVerificationMisconfigured]
    Phone --> Listen[app listen]
    Listen --> Ready[API en escucha]

    DB --> Error[catch error]
    Error --> Log1[console error]
    Log1 --> Log2[console error detalle]
    Log2 --> Exit[process exit 1]

El flujo es lineal y determinista. La base de datos se conecta antes de anunciar que la API está disponible. Después, el archivo revisa servicios externos que afectan autenticación, subida de archivos y pagos. Si todo va bien, el servidor empieza a escuchar en env.port.

Key components

{
    "title": "bootstrap",
    "content": "Funci\u00f3n as\u00edncrona que coordina el arranque de la API. Conecta la base de datos, ejecuta validaciones de entorno y llama a app.listen.",
    "type": "function",
    "filePath": "services/api/src/server.js",
    "badges": [
        "public"
    ]
}
{
    "title": "warnIfGoogleAuthMisconfigured",
    "content": "Verifica si falta env.googleClientId. Si no existe, escribe una advertencia sobre POST /api/auth/google y el c\u00f3digo GOOGLE_AUTH_NOT_CONFIGURED.",
    "type": "function",
    "filePath": "services/api/src/server.js",
    "badges": [
        "public"
    ]
}
{
    "title": "warnIfPhoneVerificationMisconfigured",
    "content": "Comprueba la configuraci\u00f3n de Twilio Verify. Agrupa variables faltantes y avisa que POST /api/auth/phone/verify/start y /check responder\u00e1n 503.",
    "type": "function",
    "filePath": "services/api/src/server.js",
    "badges": [
        "public"
    ]
}
{
    "title": "warnIfImageKitMisconfigured",
    "content": "Detecta si falta env.imagekitPrivateKey. Si no est\u00e1 presente, advierte que las subidas de fotos, video y documento fuente fallar\u00e1n.",
    "type": "function",
    "filePath": "services/api/src/server.js",
    "badges": [
        "public"
    ]
}
{
    "title": "warnIfStripeMisconfigured",
    "content": "Revisa credenciales y Price IDs de Stripe. Informa fallos de checkout de planes cuando faltan claves o identificadores necesarios.",
    "type": "function",
    "filePath": "services/api/src/server.js",
    "badges": [
        "public"
    ]
}
{
    "title": "connectToDatabase",
    "content": "Funci\u00f3n importada desde services/api/src/config/db.js. Se ejecuta al inicio para establecer la conexi\u00f3n de persistencia antes de escuchar peticiones.",
    "type": "function",
    "filePath": "services/api/src/config/db.js",
    "badges": [
        "public"
    ]
}

Data & fields

[
    {
        "name": "env.port",
        "type": "number | string",
        "required": true,
        "description": "Puerto donde escucha app.listen. También se imprime en el mensaje de arranque."
    },
    {
        "name": "env.googleClientId",
        "type": "string",
        "description": "Habilita la autenticación con Google. Si falta, POST /api/auth/google queda bloqueado con 503."
    },
    {
        "name": "env.twilioAccountSid",
        "type": "string",
        "description": "Parte de la configuración necesaria para Twilio Verify."
    },
    {
        "name": "env.twilioApiKeySid",
        "type": "string",
        "description": "Clave usada junto con Twilio Verify para verificar teléfonos."
    },
    {
        "name": "env.twilioApiKeySecret",
        "type": "string",
        "description": "Se usa con Twilio Verify. Su ausencia contribuye a la desactivación de la verificación telefónica."
    },
    {
        "name": "env.twilioVerifyServiceSid",
        "type": "string",
        "description": "Identificador del servicio Twilio Verify. Si falta, el inicio y la comprobación de verificación telefónica fallan según la advertencia."
    },
    {
        "name": "env.imagekitPrivateKey",
        "type": "string",
        "description": "Clave privada necesaria para subidas de archivos. Si falta, el archivo advierte que la subida será indisponible."
    },
    {
        "name": "env.stripeSecretKey",
        "type": "string",
        "description": "Clave secreta de Stripe para checkout de planes."
    },
    {
        "name": "env.stripeWebhookSecret",
        "type": "string",
        "description": "Secreto del webhook de Stripe. Su ausencia también bloquea el flujo de checkout según el arranque."
    },
    {
        "name": "env.stripePriceProfessionalMonthly",
        "type": "string",
        "description": "Price ID mensual para el plan Professional."
    },
    {
        "name": "env.stripePriceCreatorMonthly",
        "type": "string",
        "description": "Price ID mensual para el plan Creator."
    }
]
  • Variables críticas de proceso

    • env.port define el puerto final del servidor.
    • connectToDatabase() debe completar antes de app.listen.
  • Variables que solo generan advertencias

    • env.googleClientId
    • env.twilioAccountSid
    • env.twilioApiKeySid
    • env.twilioApiKeySecret
    • env.twilioVerifyServiceSid
    • env.imagekitPrivateKey
    • env.stripeSecretKey
    • env.stripeWebhookSecret
    • env.stripePriceProfessionalMonthly
    • env.stripePriceCreatorMonthly
  • Efecto de las advertencias

    • No detienen el proceso por sí solas.
    • Informan de rutas o flujos que quedarán en estado no funcional.

Behaviors

  • warnIfGoogleAuthMisconfigured — imprime una advertencia si falta env.googleClientId.
  • warnIfPhoneVerificationMisconfigured — recopila claves Twilio faltantes y avisa sobre la verificación telefónica.
  • warnIfImageKitMisconfigured — avisa si falta la clave privada de ImageKit.
  • warnIfStripeMisconfigured — revisa credenciales y Price IDs de Stripe, y avisa sobre fallos de checkout.
  • bootstrap — ejecuta el arranque completo de la API y termina el proceso ante errores de infraestructura.

Workflows

Secuencia de arranque

1. Conectar base de datos | `bootstrap()` llama a `connectToDatabase()` antes de iniciar el servidor.
2. Validar integraciones | Se ejecutan las comprobaciones de Stripe, ImageKit, Google Auth y Twilio Verify.
3. Levantar el servidor | `app.listen(env.port)` abre el puerto configurado.
4. Registrar estado | La consola informa que la API corre en `http://localhost:${env.port}`.

El archivo sigue un orden fijo. Primero resuelve la dependencia de persistencia y después publica el servicio HTTP. Las advertencias solo informan estado, pero no detienen el arranque salvo el fallo de base de datos.

Gotchas & edge cases

[!WARNING] Si connectToDatabase() falla, la API no arranca. El proceso imprime dos errores y luego ejecuta process.exit(1).

[!WARNING] warnIfStripeMisconfigured() separa dos tipos de problema. Las claves ausentes bloquean el checkout, y los Price IDs faltantes también bloquean la suscripción.

[!WARNING] warnIfPhoneVerificationMisconfigured() acumula varias variables faltantes. La advertencia final enumera todas las claves que faltan en una sola línea.

[!NOTE] Las advertencias de este archivo anticipan fallos en rutas concretas. Por ejemplo, menciona POST /api/auth/google, POST /api/auth/phone/verify/start, POST /api/auth/phone/verify/check y POST /api/listings/:id/source-documents.

[!IMPORTANT] La falta de env.imagekitPrivateKey afecta subidas de archivos. El mensaje indica impacto en fotos, video y documento fuente.

Este archivo depende directamente de tres módulos locales: services/api/src/app.js, services/api/src/config/env.js y services/api/src/config/db.js. app aporta la aplicación HTTP, env aporta la configuración, y connectToDatabase() resuelve la conexión inicial.

También se relaciona con varios flujos de producto que aparecen en sus advertencias. Esos flujos incluyen autenticación con Google, verificación telefónica con Twilio Verify, almacenamiento con ImageKit y checkout de planes con Stripe.