shack/src/web/server.js

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();