import Game from '../models/Game.js' import steamScraper from '../scripts/scraper.js' import asyncHandler from '../middleware/async.js' import ErrorResponse from '../utils/errorResponse.js' const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$') const checkForTwelveRegExp = new RegExp('^[0-9a-fA-F]{12}$') import {decode, isValid} from 'js-base64' /** * games.js * * @description :: Server-side logic for managing games. */ /** * gameController.list() */ export const list = asyncHandler(async (req, res, next) => { return res.status(200).json(res.advancedResults) }) /** * gameController.show() */ export const show = asyncHandler(async (req, res, next) => { const { id } = req.params const gameId = id === id.match(checkForTwelveRegExp) || id.match(checkForHexRegExp) ? '_id' : 'steamId' const game = await Game.findOne({ [gameId]: id }).select('-__v') return res.status(200).json({ success: true, data: game, }) }) /** * gameController.create() */ export const create = asyncHandler(async (req, res, next) => { let oldGame req.body.steamId.length > 0 ? (oldGame = await Game.findOne({ steamId: req.body.steamId })) : (oldGame = await Game.findOne({ title: req.body.title })) if (oldGame) return next( new ErrorResponse(`The game ${oldGame.title} already exists`, 400) ) req.body.createdBy = req.user.id req.body.lastModifiedBy = req.user.id req.body.accessedBy[0].user = req.user.id const data = req.body.scrape === true ? await steamScraper(req.body) : req.body if (req.body.scrape === false) { if (req.body.shortDesc && isValid(req.body.shortDesc)) req.body.shortDesc = decode(req.body.shortDesc) if (req.body.reviews && isValid(req.body.reviews)) req.body.reviews = decode(req.body.reviews) if (req.body.summary && isValid(req.body.summary)) req.body.summary = decode(req.body.summary) isValid(req.body.systemRequirements?.windows?.minimum) ? req.body.systemRequirements.windows.minimum = decode(req.body.systemRequirements.windows.minimum) : '' isValid(req.body.systemRequirements?.windows?.recommended) ? req.body.systemRequirements.windows.recommended = decode(req.body.systemRequirements.windows.recommended) : '' isValid(req.body.systemRequirements?.mac?.minimum) ? req.body.systemRequirements.mac.minimum = decode(req.body.systemRequirements.mac.minimum) : '' isValid(req.body.systemRequirements?.mac?.recommended) ? req.body.systemRequirements.mac.recommended = decode(req.body.systemRequirements.mac.recommended) : '' isValid(req.body.systemRequirements?.linux?.minimum) ? req.body.systemRequirements.linux.minimum = decode(req.body.systemRequirements.linux.minimum) : '' isValid(req.body.systemRequirements?.linux?.recommended) ? req.body.systemRequirements.linux.recommended = decode(req.body.systemRequirements.linux.recommended) : '' } const game = await Game.create(data) res.status(200).json({ success: true, data: game, }) }) /** * gameController.update() */ export const update = asyncHandler(async (req, res, next) => { const { id } = req.params const gameId = id === id.match(checkForTwelveRegExp) || id.match(checkForHexRegExp) ? '_id' : 'steamId' let game = await Game.findOne({ [gameId]: id }) if (!game) return next( ErrorResponse(`A game with the id of ${id} does not exist`, 401), ) req.body.lastModifiedBy = req.user.id if (req.body.shortDesc && isValid(req.body.shortDesc)) req.body.shortDesc = decode(req.body.shortDesc) if (req.body.reviews && isValid(req.body.reviews)) req.body.reviews = decode(req.body.reviews) if (req.body.summary && isValid(req.body.summary)) req.body.summary = decode(req.body.summary) isValid(req.body.systemRequirements?.windows?.minimum) ? req.body.systemRequirements.windows.minimum = decode(req.body.systemRequirements.windows.minimum) : '' isValid(req.body.systemRequirements?.windows?.recommended) ? req.body.systemRequirements.windows.recommended = decode(req.body.systemRequirements.windows.recommended) : '' isValid(req.body.systemRequirements?.mac?.minimum) ? req.body.systemRequirements.mac.minimum = decode(req.body.systemRequirements.mac.minimum) : '' isValid(req.body.systemRequirements?.mac?.recommended) ? req.body.systemRequirements.mac.recommended = decode(req.body.systemRequirements.mac.recommended) : '' isValid(req.body.systemRequirements?.linux?.minimum) ? req.body.systemRequirements.linux.minimum = decode(req.body.systemRequirements.linux.minimum) : '' isValid(req.body.systemRequirements?.linux?.recommended) ? req.body.systemRequirements.linux.recommended = decode(req.body.systemRequirements.linux.recommended) : '' const data = req.body.scrape === true ? await steamScraper(req.body) : req.body game = await Game.findOneAndUpdate({ [gameId]: id }, data, { new: true, runValidators: true, }) res.status(200).json({ success: true, data: game, }) }) /** * gameController.remove() */ export const remove = asyncHandler(async (req, res, next) => { const { id } = req.params const gameId = id === id.match(checkForTwelveRegExp) || id.match(checkForHexRegExp) ? '_id' : 'steamId' await Game.findOneAndDelete({ [gameId]: id }) res.status(200).json({ success: true, data: {} }) })