Salta ai contenuti

Panoramica del Backend

Il backend di Rebase è un server Node.js basato su Hono che fornisce:

  • API REST — Endpoint CRUD auto-generati per ogni collezione
  • Autenticazione — Token JWT, Google OAuth, gestione utenti/ruoli
  • Archiviazione — Caricamento/download di file con filesystem locale o S3
  • WebSocket — Sincronizzazione dati in tempo reale tramite PostgreSQL LISTEN/NOTIFY
  • Cronologia delle Entità — Traccia di audit per ogni modifica dei dati
  • Branching del Database — Copie del database istantanee e isolate per dev/staging/testing
  • Cron Job — Attività in background programmate con dashboard di monitoraggio

Tutto viene inizializzato con una singola funzione:

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"
});

Dopo l’inizializzazione, queste rotte vengono montate:

PathPurpose
/api/auth/*Autenticazione (registrazione, login, refresh, Google OAuth)
/api/admin/*Gestione utenti e ruoli (solo per admin)
/api/storage/*Caricamento, download ed eliminazione di file
/api/data/collectionsEndpoint per i metadati delle collezioni
/api/data/:slugOperazioni CRUD per collezione (GET, POST, PUT, DELETE)
/api/data/:slug/:id/historyCronologia delle modifiche delle entità (quando abilitata)
/api/data/docsSpecifica OpenAPI (quando enableSwagger: true)
/api/data/swaggerSwagger UI (modalità sviluppo, quando enableSwagger: true)
/api/functions/*Rotte per funzioni personalizzate (quando functionsDir è impostato)
/api/cron/*Gestione dei Cron job (solo per admin, quando cronsDir è impostato)
WebSocket on upgradeSottoscrizioni in tempo reale
interface RebaseBackendConfig {
// Framework HTTP
app: Hono; // Istanza dell'applicazione Hono
server: Server; // Server HTTP Node.js (per l'attaccamento WebSocket)
basePath?: string; // Prefisso della rotta (predefinito: "/api")
// Collezioni
collections?: EntityCollection[]; // Le tue definizioni di collezione
collectionsDir?: string; // Carica automaticamente le collezioni da una directory
// Bootstrappers (Database, Autenticazione, Tempo reale, ecc.)
bootstrappers: BackendBootstrapper[];
// Autenticazione
auth?: AuthConfig;
// Archiviazione file
storage?: BackendStorageConfig | Record<string, BackendStorageConfig>;
// Cronologia delle entità
history?: boolean | HistoryConfig;
// OpenAPI/Swagger
enableSwagger?: boolean;
// Endpoint API personalizzati
functionsDir?: string; // Carica automaticamente le rotte Hono da una directory
// Attività programmate
cronsDir?: string; // Carica automaticamente i cron job da una directory
// Registrazione
logging?: { level?: "error" | "warn" | "info" | "debug" };
}

initializeRebaseBackend restituisce una RebaseBackendInstance con accesso ai servizi interni:

const instance = await initializeRebaseBackend(config);
// Accesso ai servizi interni
instance.driver // Driver dati predefinito
instance.driverRegistry // Tutti i driver (per multi-database)
instance.realtimeService // Servizio in tempo reale predefinito
instance.userService // Gestione utenti
instance.roleService // Gestione ruoli
instance.storageController // Archiviazione predefinita
instance.storageRegistry // Tutti i backend di archiviazione
instance.collectionRegistry // Metadati delle collezioni
instance.historyService // Cronologia delle entità
instance.cronScheduler // Scheduler di cron job (quando cronsDir è impostato)

Nota: Sebbene l’instance esponga questi servizi interni, il codice dell’applicazione (come funzioni personalizzate e cron job) dovrebbe utilizzare il singleton globale rebase da @rebasepro/server-core per interagire con l’API del backend.

L’API REST viene generata automaticamente dalle tue collezioni. Ogni collezione ottiene questi endpoint:

MethodPathDescription
GET/api/data/:slugElenca entità (con filtro, ordinamento, limite, ricerca)
GET/api/data/:slug/:idOttieni una singola entità
POST/api/data/:slugCrea una nuova entità
PUT/api/data/:slug/:idAggiorna un’entità
DELETE/api/data/:slug/:idElimina un’entità
ParamDescriptionExample
filterCondizioni di filtro codificate in JSON?filter={"active":["==",true]}
orderByCampo di ordinamento?orderBy=created_at
orderDirezione di ordinamento?order=desc
limitDimensione della pagina?limit=25
startAfterCursore per la paginazione?startAfter=encodedCursor
searchRicerca full-text?search=laptop

Il server WebSocket si connette allo stesso server HTTP e fornisce sottoscrizioni in tempo reale:

  • Iscriviti alle modifiche delle collezioni — ricevi notifiche quando qualsiasi entità in una collezione viene creata, aggiornata o eliminata
  • Iscriviti alle modifiche delle entità — ricevi notifiche quando una specifica entità cambia
  • Gestione automatica della riconnessione nell’SDK del client

Il backend utilizza internamente PostgreSQL LISTEN/NOTIFY. Per deploy multi-istanza, fornisci una connectionString nel tuo PostgresBootstrapper per abilitare la trasmissione tra istanze.

Il backend include un gestore degli errori che cattura tutte le eccezioni e restituisce risposte di errore strutturate:

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

Se l’inizializzazione fallisce (ad esempio, errore di connessione al database), il server si avvia comunque ma restituisce 503 per tutte le richieste API, con un messaggio di errore descrittivo nei log.