import express from 'express'; import { ApolloServer } from '@apollo/server'; import { expressMiddleware } from '@apollo/server/express4'; import { json } from 'body-parser'; import { typeDefs } from './graphql/schema'; import { resolvers } from './graphql/resolvers'; import { createDb } from './db'; import logger from './logger'; import { createPrinter } from './printer'; import { PrintHistoryRepository, StepRepository } from './db/repositories'; import { YamlService } from './yaml-service'; import cors from 'cors'; const app = express(); const port = 4000; //process.env.PORT || 4000; async function startServer() { const db = createDb(); const printHistoryRepo = new PrintHistoryRepository(db); const stepRepo = new StepRepository(db); const printer = createPrinter(printHistoryRepo, stepRepo); const yamlService = new YamlService(db); const server = new ApolloServer({ typeDefs, resolvers, }); await server.start(); // Enable CORS for the frontend app.use(cors({ // origin: 'http://localhost:5173', // allow all origins origin: '*', credentials: true })); app.use(json()); app.use( '/graphql', expressMiddleware(server, { context: async () => ({ db, printer }), }) ); // YAML Export endpoint app.get('/api/yaml/export', async (req, res) => { try { const yamlContent = await yamlService.exportToYaml(); res.setHeader('Content-Type', 'text/yaml'); res.setHeader('Content-Disposition', 'attachment; filename="database-export.yaml"'); res.send(yamlContent); } catch (error) { logger.error('Error exporting YAML:', error); res.status(500).json({ error: 'Failed to export YAML' }); } }); // YAML Import endpoint app.post('/api/yaml/import', async (req, res) => { try { const { yamlContent } = req.body; if (!yamlContent || typeof yamlContent !== 'string') { return res.status(400).json({ error: 'YAML content is required' }); } await yamlService.importFromYaml(yamlContent); res.json({ message: 'Database imported successfully' }); } catch (error) { logger.error('Error importing YAML:', error); res.status(500).json({ error: 'Failed to import YAML' }); } }); const httpServer = app.listen(port, '0.0.0.0', () => { logger.info(`Server running at http://localhost:${port}/graphql`); logger.info(`YAML export endpoint: http://localhost:${port}/api/yaml/export`); logger.info(`YAML import endpoint: http://localhost:${port}/api/yaml/import`); }); // Graceful shutdown process.on('SIGTERM', () => { logger.info('SIGTERM received. Shutting down gracefully...'); httpServer.close(() => { logger.info('Server closed'); process.exit(0); }); }); process.on('SIGINT', () => { logger.info('SIGINT received. Shutting down gracefully...'); httpServer.close(() => { logger.info('Server closed'); process.exit(0); }); }); } startServer().catch((error) => { logger.error('Failed to start server:', error); process.exit(1); });