dashboard cleanup

This commit is contained in:
Boki 2025-06-15 12:50:31 -04:00
parent 660a2a1ec2
commit 56e3938561
36 changed files with 1002 additions and 3481 deletions

View file

@ -2,6 +2,7 @@
* Data Service - Combined live and historical data ingestion with queue-based architecture
*/
import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { Browser } from '@stock-bot/browser';
import { loadEnvVariables } from '@stock-bot/config';
import { getLogger, shutdownLoggers } from '@stock-bot/logger';
@ -16,6 +17,15 @@ import { exchangeRoutes, healthRoutes, queueRoutes } from './routes';
loadEnvVariables();
const app = new Hono();
// Add CORS middleware
app.use('*', cors({
origin: ['http://localhost:4200', 'http://localhost:5173'],
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization'],
credentials: true,
}));
const logger = getLogger('data-service');
const PORT = parseInt(process.env.DATA_SERVICE_PORT || '3002');
let server: ReturnType<typeof Bun.serve> | null = null;

View file

@ -11,6 +11,26 @@ const logger = getLogger('exchange-routes');
export const exchangeRoutes = new Hono();
// Get all master exchanges
exchangeRoutes.get('/api/exchanges', async c => {
try {
await connectMongoDB();
const db = getDatabase();
const collection = db.collection<MasterExchange>('masterExchanges');
const exchanges = await collection.find({}).toArray();
return c.json({
data: exchanges,
count: exchanges.length,
status: 'success',
});
} catch (error) {
logger.error('Error getting all exchanges', { error });
return c.json({ error: 'Internal server error' }, 500);
}
});
// Get master exchange details
exchangeRoutes.get('/api/exchanges/:masterExchangeId', async c => {
try {
@ -91,12 +111,10 @@ exchangeRoutes.get('/api/exchanges/source/:sourceName', async c => {
}));
return c.json({
data: exchanges,
count: exchanges.length,
status: 'success',
data: {
sourceName,
count: exchanges.length,
exchanges,
},
sourceName,
});
} catch (error) {
logger.error('Error getting source exchanges', { error });
@ -104,6 +122,45 @@ exchangeRoutes.get('/api/exchanges/source/:sourceName', async c => {
}
});
// Add source mapping to an exchange
exchangeRoutes.post('/api/exchanges/:masterExchangeId/mappings', async c => {
try {
const masterExchangeId = c.req.param('masterExchangeId');
const { sourceName, sourceData } = await c.req.json();
if (!sourceName || !sourceData || !sourceData.id) {
return c.json({ error: 'sourceName and sourceData with id are required' }, 400);
}
await connectMongoDB();
const db = getDatabase();
const collection = db.collection<MasterExchange>('masterExchanges');
const result = await collection.updateOne(
{ masterExchangeId },
{
$set: {
[`sourceMappings.${sourceName}`]: sourceData,
updatedAt: new Date(),
},
}
);
if (result.matchedCount === 0) {
return c.json({ error: 'Exchange not found' }, 404);
}
return c.json({
status: 'success',
message: 'Source mapping added successfully',
data: { masterExchangeId, sourceName, sourceData },
});
} catch (error) {
logger.error('Error adding source mapping', { error });
return c.json({ error: 'Internal server error' }, 500);
}
});
// Trigger exchange sync
exchangeRoutes.post('/api/exchanges/sync', async c => {
try {