Merge branch 'main' into feat-build-quests

This commit is contained in:
Chen, Tai-Lin committed 2023-11-17 15:12:32 +08:00
commit 0ac1dbed96
24 files changed
+702 -68

No files matched your search

+3 -7
View File
@@ -1,6 +1,7 @@
import { matchedData } from 'express-validator'
import { User } from '@linux-odyssey/models'
import { genJWT, hashPassword } from '../../utils/auth.js'
import { genJWT } from '../../utils/auth.js'
import { createUser } from '../../models/userManager.js'
import { asyncHandler } from '../../middleware/error.js'
export const issueToken = asyncHandler(async (req, res) => {
@@ -16,12 +17,7 @@ export const issueToken = asyncHandler(async (req, res) => {
export const register = asyncHandler(async (req, res, next) => {
const { username, password, email } = matchedData(req)
const user = new User({
username,
email,
})
user.hashedPassword = await hashPassword(password)
await user.save()
const user = await createUser(username, email, password)
req.login(user, (err) => {
if (err) {
next(err)
@@ -2,7 +2,7 @@ import { Command, Session } from '@linux-odyssey/models'
import { matchedData } from 'express-validator'
import CommandHandler from '../../game/commandHandler.js'
import { pushToSession } from '../socket.js'
import { finishSession } from '../../game/sessionManager.js'
import { finishSession } from '../../models/sessionManager.js'
import { asyncHandler } from '../../middleware/error.js'
const commandCompleteCallbacks = new Map()
@@ -4,7 +4,7 @@ import {
createNewSession,
getOrCreateActiveSession,
isQuestUnlocked,
} from '../../game/sessionManager.js'
} from '../../models/sessionManager.js'
import { asyncHandler } from '../../middleware/error.js'
function sessionSummary(session) {
+5
View File
@@ -46,5 +46,10 @@ const config = {
}
config.baseUrl = get('BASE_URL', `http://${config.host}:${config.port}`)
config.testing = {
enabled: !config.isProduction && process.env.TESTING === 'true',
username: get('TESTING_USERNAME', ''),
password: get('TESTING_PASSWORD', ''),
}
export default config
+5
View File
@@ -15,6 +15,7 @@ import errorHandler from './middleware/error.js'
import { globalRateLimit } from './middleware/rateLimiter.js'
import sessionMiddleware from './middleware/session.js'
import expiryRemovalScheduler from './containers/expiryChecker.js'
import setupTest from './utils/setupTest.js'
async function main() {
if (!config.secret) {
@@ -33,6 +34,10 @@ async function main() {
process.exit(1)
}
if (config.testing.enabled) {
await setupTest()
}
await loadAndUpdateQuests()
expiryRemovalScheduler()
+11 -3
View File
@@ -1,16 +1,24 @@
import rateLimit from 'express-rate-limit'
import config from '../config.js'
export const globalRateLimit = rateLimit({
function createRateLimiter(options) {
if (config.testing.enabled) {
return (req, res, next) => next()
}
return rateLimit(options)
}
export const globalRateLimit = createRateLimiter({
windowMs: 60 * 1000, // 1 minute
max: 100,
})
export const authenticateRateLimit = rateLimit({
export const authenticateRateLimit = createRateLimiter({
windowMs: 2 * 60 * 1000,
max: 5,
})
export const sessionRateLimit = rateLimit({
export const sessionRateLimit = createRateLimiter({
windowMs: 10 * 1000,
max: 1,
keyGenerator: (req) => {
@@ -1,6 +1,6 @@
import { Session, Quest, UserProfile } from '@linux-odyssey/models'
import { createContainer, deleteContainer } from '../containers/docker.js'
import SessionHandler from './sessionHandler.js'
import SessionHandler from '../game/sessionHandler.js'
async function deactivateSessions(user, quest) {
const sessions = await Session.find({
+16
View File
@@ -0,0 +1,16 @@
import { User, UserProfile } from '@linux-odyssey/models'
import { hashPassword } from '../utils/auth.js'
export async function createUser(username, email, password) {
const user = new User({
username,
email,
})
user.hashedPassword = await hashPassword(password)
await user.save()
const userProfile = new UserProfile({
user,
})
await userProfile.save()
}
+22
View File
@@ -0,0 +1,22 @@
import { User } from '@linux-odyssey/models'
import config from '../config.js'
import { createUser } from '../models/userManager.js'
export default async function setupTest() {
console.log('Setting up test account')
if (!(config.testing.username && config.testing.password)) {
throw new Error(
'No testing account found! Please set TESTING_USERNAME and TESTING_PASSWORD in .env'
)
}
const { username, password } = config.testing
const email = `${username}@example.com`
if (await User.exists({ username })) {
console.log('Testing account already exists')
return
}
await createUser(username, email, password)
console.log('Created testing account')
}