2025-01-31 07:59:21 -05:00

111 lines
2.9 KiB
JavaScript

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('0 0 * * *', 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}`);
});