From 9f21d37002db06c764eb5fd2ded8190d67355423 Mon Sep 17 00:00:00 2001 From: Nikola Petrov Date: Wed, 2 Aug 2023 18:28:58 +0200 Subject: [PATCH] add game support for games --- app.js | 6 +- controllers/gameController.js | 122 ++++++++++++++++++++++++++++++++++ models/gameModel.js | 11 +++ models/userModel.js | 2 + routes/api/apiRouter.js | 17 +++++ routes/api/gameRouter.js | 11 +++ views/list.hbs | 46 ++++++++----- 7 files changed, 196 insertions(+), 19 deletions(-) create mode 100644 controllers/gameController.js create mode 100644 models/gameModel.js create mode 100644 routes/api/apiRouter.js create mode 100644 routes/api/gameRouter.js diff --git a/app.js b/app.js index 0a8e184..a29b612 100644 --- a/app.js +++ b/app.js @@ -51,14 +51,12 @@ app.use(function (req, res, next) { var mainRouter = require('./routes/main'); var listRouter = require('./routes/list'); -var photosRouter = require('./routes/api/photoRouter'); -var movieRouter = require('./routes/api/movieRouter'); +var apiRouter = require('./routes/api/apiRouter'); var mailRouter = require('./routes/mail'); app.use('/', mainRouter); app.use('/list', listRouter); -app.use('/api/photos', photosRouter); -app.use('/api/movies', movieRouter); +app.use('/api', apiRouter); app.use('/mail', mailRouter); // catch 404 and forward to error handler diff --git a/controllers/gameController.js b/controllers/gameController.js new file mode 100644 index 0000000..223e889 --- /dev/null +++ b/controllers/gameController.js @@ -0,0 +1,122 @@ +var UserModel = require('../models/userModel'); +var GameModel = require('../models/gameModel'); + + +module.exports = { + + list: function (req, res) { + GameModel.find({}, { _id: 0, __v: 0 }) + .then(games => { + return res.json(games); + }) + .catch(err => { + return res.status(500).json({ + message: 'Error when getting games.', + error: err + }); + }); + }, + + + + create: async function (req, res) { + const gameCode = req.body.code; + const passp = req.body.pass; + + try { + + const userFound = await UserModel.findOne({ pass: passp }); + if (!userFound) { + return res.status(404).json({ message: 'Wrong password' }); + } + + const gameFound = await GameModel.findOne({ code: gameCode }); + if (gameFound) { + return res.status(409).json({ message: 'Game already exists' }); + } + + const uri = "https://id.twitch.tv/oauth2/token?client_id=" +userFound.client_id+ "&client_secret=" + userFound.client_secret+ "&grant_type=client_credentials"; + var response = await fetch(uri, { method: 'POST' }); + var mData = await response.json(); + + var mheaders = { + 'Accept': 'application/json', + 'Client-ID': userFound.client_id, + 'Authorization': 'Bearer ' + mData.access_token + } + + response = await fetch( + "https://api.igdb.com/v4/games", + { + method: 'POST', + headers: mheaders, + body: `fields name; where id = ${gameCode};` + } + ) + const gameData = await response.json() + if (gameData.length == 0) { + return res.status(404).json({ message: 'wrong code' }); + } + + response = await fetch( + "https://api.igdb.com/v4/covers", + { + method: 'POST', + headers: mheaders, + body: `fields image_id; where game = ${gameCode};` + } + ) + const coverData = await response.json() + + response = await fetch( + "https://api.igdb.com/v4/release_dates", + { + method: 'POST', + headers: mheaders, + body: `fields human; where game = ${gameCode};` + } + ) + const releasedData = await response.json() + + const game = new GameModel({ + code: gameCode, + title: gameData[0].name, + released: releasedData[0].human, + webImg: `https://images.igdb.com/igdb/image/upload/t_cover_big/${coverData[0].image_id}.jpg`, + }); + + const savedGame = await game.save(); + return res.status(201).json(game); + + } catch (error) { + + return res.status(500).json({ message: 'Error when creating game', error: error }); + } + }, + + remove: async function (req, res) { + var id = req.body.code; + const passp = req.body.pass; + + try { + const userFound = await UserModel.findOne({ pass: passp }); + if (!userFound) { + return res.status(404).json({ message: 'Wrong password' }); + } + + const movie = await GameModel.findOneAndDelete({ code: id }); + if (!movie) { + return res.status(404).json({ message: 'No such game' }); + } + + return res.status(204).json(); + } + catch (err) { + return res.status(500).json({ message: 'Error when deleting the game.' }); + } + } + +}; + + + diff --git a/models/gameModel.js b/models/gameModel.js new file mode 100644 index 0000000..5ebfac9 --- /dev/null +++ b/models/gameModel.js @@ -0,0 +1,11 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +var gameSchema = new Schema({ + 'title': String, + 'released': String, + 'webImg': String, + 'code': String +}); + +module.exports = mongoose.model('game', gameSchema); \ No newline at end of file diff --git a/models/userModel.js b/models/userModel.js index af1c088..f693e35 100644 --- a/models/userModel.js +++ b/models/userModel.js @@ -4,6 +4,8 @@ var Schema = mongoose.Schema; var userSchema = new Schema({ 'pass': String, 'key': String, + 'client_id': String, + 'client_secret': String, }); module.exports = mongoose.model('user', userSchema); \ No newline at end of file diff --git a/routes/api/apiRouter.js b/routes/api/apiRouter.js new file mode 100644 index 0000000..406fca3 --- /dev/null +++ b/routes/api/apiRouter.js @@ -0,0 +1,17 @@ + + +var express = require('express'); +var router = express.Router(); + + +var photosRouter = require('./photoRouter'); +var movieRouter = require('./movieRouter'); +var gameRouter = require('./gameRouter'); + +router.use('/photos', photosRouter); +router.use('/movies', movieRouter); +router.use('/games', gameRouter); + + + +module.exports = router; \ No newline at end of file diff --git a/routes/api/gameRouter.js b/routes/api/gameRouter.js new file mode 100644 index 0000000..39b06e4 --- /dev/null +++ b/routes/api/gameRouter.js @@ -0,0 +1,11 @@ +var express = require('express'); +var router = express.Router(); +var gameController = require('../../controllers/gameController.js'); + +router.get('/', gameController.list); + +router.post('/', gameController.create); + +router.delete('/', gameController.remove); + +module.exports = router; \ No newline at end of file diff --git a/views/list.hbs b/views/list.hbs index d9266f7..a6e02b5 100644 --- a/views/list.hbs +++ b/views/list.hbs @@ -4,19 +4,35 @@ {{/each}} - - -
-
- - -
-
\ No newline at end of file + \ No newline at end of file