task_receipts/server/src/index.ts

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);
});