declare global { namespace Express { interface Request { user?: any; } } } import cookie = require('@speedcubing/cookie'); import cors = require('cors'); import express = require('express'); import session = require('express-session'); // Config packages import './config/dotenv'; import { configureMongoose } from './config/mongoose'; // Middleware import { authMiddleware } from './auth/middleware'; // Models import { User } from './models/user'; // Routes import { viewProfile } from './routes/profile'; // API Endpoints import { authCreate } from './auth/create'; import { authLogin } from './auth/login'; import { authLogout } from './auth/logout'; import { getUserByUsername, getUserByUuid } from './api/getUser'; import { getTokens } from './api/getTokens'; import { verifyToken } from './api/verifyToken'; // Configure Express app const app = express(); app.engine('cookie', cookie.engine); app.set('views', cookie.getViewFolder()); app.set('view engine', 'cookie'); app.use(cors()); app.use(express.static(cookie.getStaticFolder())); app.use(express.json()); app.use(session({ secret: process.env.auth_secret, resave: false, saveUninitialized: true })); app.use(authMiddleware({ async serialize(user) { return user.uuid; }, deserialize(uuid) { return new Promise((res, rej) => { User.findOne({ uuid }, (err, user) => { if (err) return rej(err); if (user) return res(user); else return res(null); }); }); } })); // Routes app.get('/', (req, res) => { res.render('pages/index.ejs', { locals: { user: req.user } }) }); app.get('/profile/@:username', viewProfile); // API Routes app.post('/api/auth/create', authCreate); app.post('/api/auth/login', authLogin); app.post('/api/auth/logout', authLogout); app.get('/api/get_info', getTokens); app.get('/api/get_user_by_uuid/:uuid', getUserByUuid); app.get('/api/get_user_by_username/:username', getUserByUsername); // Start Mongoose and Express server configureMongoose(app);