const express = require('express'); const { Model } = require('objection'); const Knex = require('knex'); const cron = require('node-cron'); const knexConfig = require('./src/config/database'); const MessageService = require('./src/email_server/services/MessageService'); const swaggerJsdoc = require('swagger-jsdoc'); const swaggerUi = require('swagger-ui-express'); const config = require('./src/config/main'); const path = require('path'); const swaggerOptions = { definition: { openapi: '3.1.0', info: { title: '2weekmail API', version: '1.0.0', description: 'Documentation for the 2weekmail API', }, security: [ { bearerAuth: [] } ], servers: [ { url: 'https://2weekmail.fyi', description: 'Production server', }, ], }, apis: ['./src/routes/*.js'], }; const swaggerSpec = swaggerJsdoc(swaggerOptions); // Initialize Knex const knex = Knex(knexConfig.development); Model.knex(knex); const app = express(); app.use(express.json()); // Routes app.use('/auth', require('./src/routes/auth')); app.use('/admin', require('./src/routes/admin')); app.use('/messages', require('./src/routes/messages')); app.use('/email', require('./src/routes/email')); app.use('/test', require('./src/routes/test')); app.use('/', require('./src/routes/index')); app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); app.get('/favicon.svg', (req, res) => { res.sendFile(path.join(__dirname, './images/favicon.svg')); }); app.get('/og-image.svg', (req, res) => { res.sendFile(path.join(__dirname, './images/og-image.svg')); }); app.get('/twitter-card.svg', (req, res) => { res.sendFile(path.join(__dirname, './images/twitter-card.svg')); }); // Schedule cleanup job cron.schedule('0 0 * * *', async () => { try { await MessageService.cleanup(); console.log('Daily cleanup completed'); } catch (error) { console.error('Cleanup failed:', error); } }); app.listen(config.site.port, () => { console.log(`API server running on port ${config.site.port}`); });