111 lines
2.9 KiB
JavaScript
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('*/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}`);
|
|
}); |