import express from 'express';
import cors from 'cors';
import { config } from '../config.js';
import { waitForElasticsearch, createIndexIfNotExists } from '../elasticsearch/client.js';
import { initDatabase } from '../elasticsearch/init-database.js';
import routes from './routes.js';
const app = express();
// Middleware
app.use(cors());
app.use(express.json());
// Health check endpoint
app.get('/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// API routes
app.use('/api', routes);
// 404 handler
app.use((req, res) => {
res.status(404).json({
success: false,
error: 'Endpoint not found',
});
});
/**
* Start the server
*/
async function startServer(): Promise<void> {
try {
console.log('Starting CRUD API server...');
// Wait for Elasticsearch
console.log('Waiting for Elasticsearch...');
await waitForElasticsearch();
// Create index
console.log('Creating index if not exists...');
await createIndexIfNotExists();
// Initialize database with cities
console.log('Initializing database...');
await initDatabase();
// Start Express server
app.listen(config.api.port, config.api.host, () => {
console.log(`CRUD API server listening on http://${config.api.host}:${config.api.port}`);
console.log(`Health check: http://${config.api.host}:${config.api.port}/health`);
});
} catch (error) {
console.error('Failed to start server:', error);
process.exit(1);
}
}
// Start server if this script is executed directly
if (import.meta.url === `file://${process.argv[1]}`) {
startServer();
}
export { app, startServer };