104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
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);
|
|
}); |