ll-callmobile-backend
Version:
VoIP Mobile Communications Backend with Supabase, Drizzle ORM, and Dynamic Querying - Deployable as Cloudflare Worker
172 lines • 5.83 kB
JavaScript
"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