UNPKG

ll-callmobile-backend

Version:

VoIP Mobile Communications Backend with Supabase, Drizzle ORM, and Dynamic Querying - Deployable as Cloudflare Worker

172 lines 5.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const hono_1 = require("hono"); const DynamicQuery_1 = require("../dynamic-querying/DynamicQuery"); const connection_1 = require("../db/connection"); const app = new hono_1.Hono(); // Map frontend operator symbols to backend operator names const mapOperator = (operator) => { const operatorMap = { '=': 'eq', '!=': 'ne', '>': 'gt', '<': 'lt', '>=': 'gte', '<=': 'lte', 'LIKE': 'like', 'IN': 'in' }; return operatorMap[operator] || operator; }; // GET /query/tables - List available tables for dynamic querying app.get('/query/tables', async (c) => { // These should match the TableName type and DynamicQuery.tableMap const tables = [ { name: 'test_cases', label: 'Test Cases' }, { name: 'clients', label: 'Clients' }, { name: 'vendors', label: 'Vendors' }, { name: 'jobs', label: 'Jobs' } ]; return c.json({ tables }); }); // POST /query - Execute dynamic query app.post('/query', async (c) => { try { const body = await c.req.json(); const db = (0, connection_1.createDb)(c.env.DATABASE_URL); // Validate required fields if (!body.table) { return c.json({ error: 'Table name is required' }, 400); } // Validate table name const tableName = body.table; if (!['test_cases', 'clients', 'vendors', 'jobs'].includes(tableName)) { return c.json({ error: 'Invalid table name' }, 400); } // Create dynamic query instance const dynamicQuery = new DynamicQuery_1.DynamicQuery(db); // Build query options const queryOptions = {}; if (body.select && body.select.length > 0) { queryOptions.select = body.select; } if (body.filters && body.filters.length > 0) { // Convert frontend filters to advanced filters with operator mapping const whereFilters = body.filters.map((filter) => ({ field: filter.field, operator: mapOperator(filter.operator), value: filter.value })); queryOptions.where = whereFilters; } if (body.orderBy && body.orderBy.length > 0) { // Convert frontend orderBy to sort options const orderBy = body.orderBy.map((order) => ({ field: order.field, direction: order.direction })); queryOptions.orderBy = orderBy; } if (body.limit || body.offset) { queryOptions.pagination = { limit: body.limit, offset: body.offset }; } // Execute query const result = await dynamicQuery.query(tableName, queryOptions); return c.json({ success: true, data: result.data, total: result.total, query: body }); } catch (error) { console.error('Dynamic Query API Error:', error); if (error instanceof Error) { return c.json({ error: error.message, success: false }, 500); } return c.json({ error: 'Internal server error', success: false }, 500); } }); // GET /query/:table - Get all records from a table app.get('/query/:table', async (c) => { try { const table = c.req.param('table'); const db = (0, connection_1.createDb)(c.env.DATABASE_URL); // Validate table name if (!['test_cases', 'clients', 'vendors', 'jobs'].includes(table)) { return c.json({ error: 'Invalid table name' }, 400); } // Get query parameters const limit = parseInt(c.req.query('limit') || '10'); const offset = parseInt(c.req.query('offset') || '0'); const select = c.req.query('select')?.split(',') || undefined; const dynamicQuery = new DynamicQuery_1.DynamicQuery(db); const result = await dynamicQuery.query(table, { select, pagination: { limit, offset } }); return c.json({ success: true, data: result.data, total: result.total, table, limit, offset }); } catch (error) { console.error('Dynamic Query API Error:', error); if (error instanceof Error) { return c.json({ error: error.message, success: false }, 500); } return c.json({ error: 'Internal server error', success: false }, 500); } }); // GET /query/:table/count - Count records in a table app.get('/query/:table/count', async (c) => { try { const table = c.req.param('table'); const db = (0, connection_1.createDb)(c.env.DATABASE_URL); // Validate table name if (!['test_cases', 'clients', 'vendors', 'jobs'].includes(table)) { return c.json({ error: 'Invalid table name' }, 400); } const dynamicQuery = new DynamicQuery_1.DynamicQuery(db); const count = await dynamicQuery.count(table); return c.json({ success: true, count, table }); } catch (error) { console.error('Dynamic Query Count API Error:', error); if (error instanceof Error) { return c.json({ error: error.message, success: false }, 500); } return c.json({ error: 'Internal server error', success: false }, 500); } }); exports.default = app; //# sourceMappingURL=dynamicQuery.js.map