91 lines
2.1 KiB
JavaScript
91 lines
2.1 KiB
JavaScript
import config from 'config';
|
|
import express from 'express';
|
|
import Router from 'express-promise-router';
|
|
import bodyParser from 'body-parser';
|
|
import session from 'express-session';
|
|
import RedisStore from 'connect-redis';
|
|
import compression from 'compression';
|
|
import sirv from 'sirv';
|
|
import * as vite from 'vite';
|
|
|
|
import { client as redis } from '../redis';
|
|
|
|
import initLogger from '../logger';
|
|
import initDefaultHandler from './default';
|
|
import setIp from './ip';
|
|
import errorHandler from './error';
|
|
|
|
import {
|
|
setUser,
|
|
login,
|
|
logout,
|
|
fetchUser,
|
|
createUser,
|
|
} from './users';
|
|
|
|
import { createShelf } from './shelves';
|
|
|
|
import { createPost, votePost } from './posts';
|
|
import { addComment } from './comments';
|
|
|
|
const logger = initLogger();
|
|
|
|
async function startServer() {
|
|
const app = express();
|
|
const router = Router();
|
|
const sessionStore = new RedisStore({ client: redis });
|
|
|
|
const defaultHandler = await initDefaultHandler();
|
|
|
|
app.disable('x-powered-by');
|
|
app.set('trust proxy', 1);
|
|
|
|
app.use(compression());
|
|
|
|
router.use(session({ ...config.web.session, store: sessionStore }));
|
|
router.use(setIp);
|
|
router.use(setUser);
|
|
router.use(bodyParser.json({ strict: false }));
|
|
|
|
if (process.env.NODE_ENV === 'production') {
|
|
app.use(sirv('dist/client'));
|
|
} else {
|
|
const viteDevMiddleware = (await vite.createServer({
|
|
server: { middlewareMode: true },
|
|
})).middlewares;
|
|
|
|
app.use(viteDevMiddleware);
|
|
}
|
|
|
|
// SESSIONS
|
|
router.get('/api/session', fetchUser);
|
|
router.post('/api/session', login);
|
|
router.delete('/api/session', logout);
|
|
|
|
// USERS
|
|
router.post('/api/users', createUser);
|
|
|
|
// SHELVES
|
|
router.post('/api/shelves', createShelf);
|
|
|
|
// POSTS
|
|
router.post('/api/shelves/:shelfId/posts', createPost);
|
|
router.post('/api/posts/:postId/votes', votePost);
|
|
|
|
// COMMENTS
|
|
router.post('/api/posts/:postId/comments', addComment);
|
|
|
|
router.get('*', defaultHandler);
|
|
router.use(errorHandler);
|
|
|
|
app.use(router);
|
|
|
|
const server = app.listen(process.env.PORT || config.web.port, process.env.HOST || config.web.host, () => {
|
|
const { address, port } = server.address();
|
|
|
|
logger.info(`Server running at ${address}:${port}`);
|
|
});
|
|
}
|
|
|
|
startServer();
|