UNPKG

drizzle-cube

Version:

Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.

89 lines (88 loc) 3.37 kB
import { FastifyPluginCallback, FastifyRequest, FastifyInstance } from 'fastify'; import { FastifyCorsOptions } from '@fastify/cors'; import { SemanticQuery, SecurityContext, DatabaseExecutor, DrizzleDatabase, Cube } from '../../server'; import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; import { MySql2Database } from 'drizzle-orm/mysql2'; import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'; export interface FastifyAdapterOptions { /** * Array of cube definitions to register */ cubes: Cube[]; /** * Drizzle database instance (REQUIRED) * This is the core of drizzle-cube - Drizzle ORM integration * Accepts PostgreSQL, MySQL, or SQLite database instances */ drizzle: PostgresJsDatabase<any> | MySql2Database<any> | BetterSQLite3Database<any> | DrizzleDatabase; /** * Database schema for type inference (RECOMMENDED) * Provides full type safety for cube definitions */ schema?: any; /** * Extract security context from incoming HTTP request. * Called for EVERY API request to determine user permissions and multi-tenant isolation. * * This is your security boundary - ensure proper authentication and authorization here. * * @param request - Fastify Request object containing the incoming HTTP request * @returns Security context with organisationId, userId, roles, etc. * * @example * extractSecurityContext: async (request) => { * // Extract JWT from Authorization header * const token = request.headers.authorization?.replace('Bearer ', '') * const decoded = await verifyJWT(token) * * // Return context that will be available in all cube SQL functions * return { * organisationId: decoded.orgId, * userId: decoded.userId, * roles: decoded.roles * } * } */ extractSecurityContext: (request: FastifyRequest) => SecurityContext | Promise<SecurityContext>; /** * Database engine type (optional - auto-detected if not provided) */ engineType?: 'postgres' | 'mysql' | 'sqlite'; /** * CORS configuration (optional) */ cors?: FastifyCorsOptions; /** * API base path (default: '/cubejs-api/v1') */ basePath?: string; /** * JSON body parser limit (default: 10485760 - 10MB) */ bodyLimit?: number; } /** * Fastify plugin for Cube.js-compatible API */ export declare const cubePlugin: FastifyPluginCallback<FastifyAdapterOptions>; /** * Helper function to register cube routes on an existing Fastify instance */ export declare function registerCubeRoutes(fastify: FastifyInstance, options: FastifyAdapterOptions): Promise<void>; /** * Create a complete Fastify instance with Cube.js routes * * @example * const app = createCubeApp({ * cubes: [salesCube, employeesCube], * drizzle: db, * schema, * extractSecurityContext: async (request) => { * const token = request.headers.authorization?.replace('Bearer ', '') * const decoded = await verifyJWT(token) * return { organisationId: decoded.orgId, userId: decoded.userId } * } * }) */ export declare function createCubeApp(options: FastifyAdapterOptions): FastifyInstance; export type { SecurityContext, DatabaseExecutor, SemanticQuery, DrizzleDatabase, FastifyCorsOptions };