2023-12-30 05:29:53 +00:00
// This file isn't processed by Vite, see https://github.com/vikejs/vike/issues/562
// Consequently:
// - When changing this file, you needed to manually restart your server for your changes to take effect.
// - To use your environment variables defined in your .env files, you need to install dotenv, see https://vike.dev/env
// - To use your path aliases defined in your vite.config.js, you need to tell Node.js about them, see https://vike.dev/path-aliases
// If you want Vite to process your server code then use one of these:
// - vavite (https://github.com/cyco130/vavite)
// - See vavite + Vike examples at https://github.com/cyco130/vavite/tree/main/examples
// - vite-node (https://github.com/antfu/vite-node)
// - HatTip (https://github.com/hattipjs/hattip)
// - You can use Bati (https://batijs.github.io/) to scaffold a Vike + HatTip app. Note that Bati generates apps that use the V1 design (https://vike.dev/migration/v1-design) and Vike packages (https://vike.dev/vike-packages)
import config from 'config' ;
import express from 'express' ;
2023-12-31 02:02:03 +00:00
import boolParser from 'express-query-boolean' ;
2023-12-30 05:29:53 +00:00
import Router from 'express-promise-router' ;
2024-02-29 04:08:54 +00:00
import session from 'express-session' ;
import RedisStore from 'connect-redis' ;
2023-12-30 05:29:53 +00:00
import compression from 'compression' ;
import { renderPage } from 'vike/server' ; // eslint-disable-line import/extensions
// import root from './root.js';
2024-02-29 04:08:54 +00:00
import redis from '../redis.js' ;
import errorHandler from './error.js' ;
2024-01-07 05:13:40 +00:00
import { fetchScenesApi } from './scenes.js' ;
import { fetchActorsApi } from './actors.js' ;
2024-02-27 00:20:15 +00:00
import { fetchMoviesApi } from './movies.js' ;
2023-12-30 05:29:53 +00:00
2024-02-29 04:08:54 +00:00
import {
setUserApi ,
loginApi ,
logoutApi ,
2024-02-29 05:00:12 +00:00
signupApi ,
2024-02-29 04:08:54 +00:00
} from './auth.js' ;
2024-03-03 01:33:35 +00:00
import {
createStashApi ,
removeStashApi ,
stashActorApi ,
stashSceneApi ,
stashMovieApi ,
unstashActorApi ,
unstashSceneApi ,
unstashMovieApi ,
updateStashApi ,
} from './stashes.js' ;
2024-01-08 01:21:57 +00:00
import initLogger from '../logger.js' ;
const logger = initLogger ( ) ;
2023-12-30 05:29:53 +00:00
const isProduction = process . env . NODE _ENV === 'production' ;
2024-01-08 01:21:57 +00:00
export default async function initServer ( ) {
2023-12-30 05:29:53 +00:00
const app = express ( ) ;
const router = Router ( ) ;
app . use ( compression ( ) ) ;
app . disable ( 'x-powered-by' ) ;
2023-12-31 02:02:03 +00:00
router . use ( boolParser ( ) ) ;
2023-12-30 05:29:53 +00:00
router . use ( '/' , express . static ( 'public' ) ) ;
router . use ( '/' , express . static ( 'static' ) ) ;
router . use ( '/media' , express . static ( config . media . path ) ) ;
2024-02-29 04:08:54 +00:00
router . use ( express . json ( ) ) ;
const redisStore = new RedisStore ( {
client : redis ,
prefix : 'traxxx:session:' ,
} ) ;
router . use ( session ( {
... config . web . session ,
store : redisStore ,
} ) ) ;
router . use ( setUserApi ) ;
2023-12-30 05:29:53 +00:00
// Vite integration
if ( isProduction ) {
// In production, we need to serve our static assets ourselves.
// (In dev, Vite's middleware serves our static assets.)
const sirv = ( await import ( 'sirv' ) ) . default ;
router . use ( sirv ( 'dist/client' ) ) ;
} else {
// We instantiate Vite's development server and integrate its middleware to our server.
// ⚠️ We instantiate it only in development. (It isn't needed in production and it
// would unnecessarily bloat our production server.)
const vite = await import ( 'vite' ) ;
const viteDevMiddleware = (
await vite . createServer ( {
// root,
server : { middlewareMode : true } ,
} )
) . middlewares ;
router . use ( viteDevMiddleware ) ;
}
2024-02-29 05:00:12 +00:00
// SESSION
router . post ( '/api/session' , loginApi ) ;
router . delete ( '/api/session' , logoutApi ) ;
// USERS
router . post ( '/api/users' , signupApi ) ;
2024-03-03 01:33:35 +00:00
// STASHES
router . post ( '/api/stashes' , createStashApi ) ;
router . patch ( '/api/stashes/:stashId' , updateStashApi ) ;
router . delete ( '/api/stashes/:stashId' , removeStashApi ) ;
router . post ( '/api/stashes/:stashId/actors' , stashActorApi ) ;
router . post ( '/api/stashes/:stashId/scenes' , stashSceneApi ) ;
router . post ( '/api/stashes/:stashId/movies' , stashMovieApi ) ;
router . delete ( '/api/stashes/:stashId/actors/:actorId' , unstashActorApi ) ;
router . delete ( '/api/stashes/:stashId/scenes/:sceneId' , unstashSceneApi ) ;
router . delete ( '/api/stashes/:stashId/movies/:movieId' , unstashMovieApi ) ;
2024-02-29 05:00:12 +00:00
// SCENES
2024-02-27 00:20:15 +00:00
router . get ( '/api/scenes' , fetchScenesApi ) ;
2024-02-29 05:00:12 +00:00
// ACTORS
2023-12-30 05:29:53 +00:00
router . get ( '/api/actors' , fetchActorsApi ) ;
2024-02-29 05:00:12 +00:00
// MOVIES
2024-02-27 00:20:15 +00:00
router . get ( '/api/movies' , fetchMoviesApi ) ;
2024-01-07 05:13:40 +00:00
2023-12-30 05:29:53 +00:00
router . get ( '*' , async ( req , res , next ) => {
const pageContextInit = {
urlOriginal : req . originalUrl ,
2023-12-31 02:02:03 +00:00
urlQuery : req . query , // vike's own query does not apply boolean parser
2024-03-14 23:08:24 +00:00
user : req . user && {
id : req . user . id ,
username : req . user . username ,
email : req . user . email ,
avatar : req . user . avatar ,
stashes : req . user . stashes ,
primaryStash : req . user . primaryStash ,
} ,
2024-02-29 00:40:11 +00:00
env : {
maxAggregateSize : config . database . manticore . maxAggregateSize ,
} ,
2023-12-30 05:29:53 +00:00
} ;
const pageContext = await renderPage ( pageContextInit ) ;
const { httpResponse } = pageContext ;
2024-01-07 05:13:40 +00:00
if ( pageContext . errorWhileRendering ) {
console . error ( pageContext . errorWhileRendering ) ;
}
2023-12-30 05:29:53 +00:00
if ( ! httpResponse ) {
next ( ) ;
return ;
}
const {
body , statusCode , headers , earlyHints ,
} = httpResponse ;
if ( res . writeEarlyHints ) {
res . writeEarlyHints ( { link : earlyHints . map ( ( e ) => e . earlyHintLink ) } ) ;
}
headers . forEach ( ( [ name , value ] ) => res . setHeader ( name , value ) ) ;
res . status ( statusCode ) ;
// For HTTP streams use httpResponse.pipe() instead, see https://vike.dev/stream
res . send ( body ) ;
} ) ;
2024-02-29 04:08:54 +00:00
router . use ( errorHandler ) ;
2023-12-30 05:29:53 +00:00
app . use ( router ) ;
const port = process . env . PORT || config . web . port || 3000 ;
app . listen ( port ) ;
2024-01-08 01:21:57 +00:00
logger . info ( ` Server running at http://localhost: ${ port } ` ) ;
2023-12-30 05:29:53 +00:00
}