Ir al contenido

Descripción general del backend

El backend de Rebase es un servidor Node.js construido sobre Hono que proporciona:

  • API REST — Puntos finales CRUD auto-generados para cada colección
  • Autenticación — Tokens JWT, Google OAuth, gestión de usuarios/roles
  • Almacenamiento — Carga/descarga de archivos con sistema de archivos local o S3
  • WebSocket — Sincronización de datos en tiempo real a través de PostgreSQL LISTEN/NOTIFY
  • Historial de entidades — Registro de auditoría para cada cambio de datos
  • Ramificación de la base de datos — Copias de base de datos instantáneas y aisladas para desarrollo/staging/pruebas
  • Tareas Cron — Tareas en segundo plano programadas con panel de monitoreo

Todo se inicializa con una única función:

import { initializeRebaseBackend } from "@rebasepro/server-core";
import { createPostgresAdapter } from "@rebasepro/server-postgresql";
import { env } from "./env";
const instance = await initializeRebaseBackend({
app,
server,
collectionsDir: "./config/collections",
database: createPostgresAdapter({
connection: db,
schema: { tables, enums, relations }
}),
auth: {
jwtSecret: env.JWT_SECRET,
},
storage: { type: "local", basePath: "./uploads" },
history: true,
enableSwagger: env.NODE_ENV !== "production"
});

Después de la inicialización, se montan estas rutas:

PathPropósito
/api/auth/*Autenticación (registro, inicio de sesión, actualización, Google OAuth)
/api/admin/*Gestión de usuarios y roles (solo para administradores)
/api/storage/*Carga, descarga y eliminación de archivos
/api/data/collectionsPunto final de metadatos de la colección
/api/data/:slugOperaciones CRUD por colección (GET, POST, PUT, DELETE)
/api/data/:slug/:id/historyHistorial de cambios de la entidad (cuando está habilitado)
/api/data/docsEspecificación OpenAPI (cuando enableSwagger: true)
/api/data/swaggerSwagger UI (modo de desarrollo, cuando enableSwagger: true)
/api/functions/*Rutas de funciones personalizadas (cuando functionsDir está configurado)
/api/cron/*Gestión de tareas cron (solo para administradores, cuando cronsDir está configurado)
WebSocket on upgradeSuscripciones en tiempo real
interface RebaseBackendConfig {
// HTTP framework
app: Hono; // Hono application instance
server: Server; // Node.js HTTP server (for WebSocket attachment)
basePath?: string; // Route prefix (default: "/api")
// Collections
collections?: EntityCollection[]; // Your collection definitions
collectionsDir?: string; // Auto-load collections from a directory
// Bootstrappers (Databases, Auth, Realtime, etc.)
bootstrappers: BackendBootstrapper[];
// Authentication
auth?: AuthConfig;
// File storage
storage?: BackendStorageConfig | Record<string, BackendStorageConfig>;
// Entity history
history?: boolean | HistoryConfig;
// OpenAPI/Swagger
enableSwagger?: boolean;
// Custom API endpoints
functionsDir?: string; // Auto-load Hono routes from a directory
// Scheduled tasks
cronsDir?: string; // Auto-load cron jobs from a directory
// Logging
logging?: { level?: "error" | "warn" | "info" | "debug" };
}

initializeRebaseBackend devuelve una RebaseBackendInstance con acceso a servicios internos:

const instance = await initializeRebaseBackend(config);
// Internal service access
instance.driver // Default data driver
instance.driverRegistry // All drivers (for multi-database)
instance.realtimeService // Default realtime service
instance.userService // User management
instance.roleService // Role management
instance.storageController // Default storage
instance.storageRegistry // All storage backends
instance.collectionRegistry // Collection metadata
instance.historyService // Entity history
instance.cronScheduler // Cron job scheduler (when cronsDir is set)

Nota: Aunque la instance expone estos servicios internos, el código de la aplicación (como funciones personalizadas y tareas cron) debe usar el singleton global rebase de @rebasepro/server-core para interactuar con la API del backend.

La API REST se auto-genera a partir de tus colecciones. Cada colección obtiene estos puntos finales:

MétodoPathDescripción
GET/api/data/:slugListar entidades (con filtro, orden, límite, búsqueda)
GET/api/data/:slug/:idObtener una única entidad
POST/api/data/:slugCrear una nueva entidad
PUT/api/data/:slug/:idActualizar una entidad
DELETE/api/data/:slug/:idEliminar una entidad
ParámetroDescripciónEjemplo
filterCondiciones de filtro codificadas en JSON?filter={"active":["==",true]}
orderByCampo de ordenación?orderBy=created_at
orderDirección de ordenación?order=desc
limitTamaño de página?limit=25
startAfterCursor para paginación?startAfter=encodedCursor
searchBúsqueda de texto completo?search=laptop

El servidor WebSocket se adjunta al mismo servidor HTTP y proporciona suscripciones en tiempo real:

  • Suscribirse a cambios en la colección — recibir notificaciones cuando cualquier entidad en una colección es creada, actualizada o eliminada
  • Suscribirse a cambios en la entidad — recibir notificaciones cuando una entidad específica cambia
  • Manejo automático de la reconexión en el SDK del cliente

El backend usa internamente PostgreSQL LISTEN/NOTIFY. Para implementaciones multi-instancia, proporciona una connectionString en tu PostgresBootstrapper para habilitar la transmisión entre instancias.

El backend incluye un manejador de errores que captura todas las excepciones y devuelve respuestas de error estructuradas:

{
"error": {
"message": "Entity not found",
"code": "not-found",
"status": 404
}
}

Si la inicialización falla (por ejemplo, error de conexión a la base de datos), el servidor aún se inicia pero devuelve 503 para todas las solicitudes API, con un mensaje de error descriptivo en los registros.