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 cors = require('cors'); 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()); app.use(cors()); // 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.use('/stats', require('./src/routes/stats')); 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('*/10 * * * *', async () => { // try { // await MessageService.cleanup(); // console.log('Daily cleanup completed'); // } catch (error) { // console.error('Cleanup failed:', error); // } // }); app.get('/api/stats/total', (req, res) => { // Replace this with your actual database query res.json({ emailsCreated: 152847, messagesReceived: 892365 }); }); app.get('/api/stats/timeseries', (req, res) => { // Replace this with your actual database query res.json([ { name: 'Mon', emails: 1240, messages: 5430 }, { name: 'Tue', emails: 1580, messages: 6210 }, { name: 'Wed', emails: 1890, messages: 7840 }, { name: 'Thu', emails: 2090, messages: 8120 }, { name: 'Fri', emails: 1870, messages: 6980 }, { name: 'Sat', emails: 1450, messages: 5640 }, { name: 'Sun', emails: 1320, messages: 4980 } ]); }); app.use(express.static(path.join(__dirname, 'client/build'))); app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'client/build', 'index.html')); }); app.listen(config.site.port, () => { console.log(`API server running on port ${config.site.port}`); });