gimm285-api-project/server/index.js

244 lines
9.2 KiB
JavaScript

//Libraries
const express = require('express');
const multer = require('multer');
const mysql = require('mysql2');
const games = require('./model/games');
const developers = require('./model/developers');
const publishers = require('./model/publishers');
const {request, response} = require("express");
const {check, checkSchema, validationResult} = require("express-validator");
//Setup defaults for script
const app = express();
const upload = multer({
dest: 'public/images/',
//Validation for file upload
fileFilter: (request, file, callback) => {
const allowedFileMimeTypes = ["image/png", "image/jpg", "image/jpeg"];
callback(null, allowedFileMimeTypes.includes(file.mimetype));
}
});
const port = 8787;
app.use(express.static('public'));
//The * in app.* needs to match the method type of the request
app.get('/games', upload.none(),
async (request, response) => {
let result = {};
try {
result = await games.getAllGames(request.query);
} catch (error) {
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
//Default response object
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result});
});
app.get('/games/:id', upload.none(),
async (request, response) => {
console.log("Getting data for game " + request.params.id);
let result = {};
try {
result = await games.getGame(request.params.id);
} catch (error) {
return response
.status(500)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server!'})
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result})
});
app.get('/developers', upload.none(),
async (request, response) => {
let result = {};
try {
result = await developers.getDeveloperNames();
} catch (error) {
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
//Default response object
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result});
});
app.get('/developers/:id', upload.none(),
async (request, response) => {
console.log("Getting data for developer " + request.params.id);
let result = {};
try {
result = await developers.getDeveloper(request.params.id);
} catch (error) {
return response
.status(500)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server!'})
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result})
});
app.get('/publishers', upload.none(),
async (request, response) => {
let result = {};
try {
result = await publishers.getPublisherNames();
} catch (error) {
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
//Default response object
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result});
});
app.get('/publishers/:id', upload.none(),
async (request, response) => {
console.log("Getting data for publisher " + request.params.id);
let result = {};
try {
result = await publishers.getPublisher(request.params.id);
} catch (error) {
return response
.status(500)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server!'})
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({'data': result})
});
app.post('/games', upload.single('coverArt'),
check('title', 'You must enter a title.').isLength({min: 3}),
check('releaseDate', 'You must select a release date.').isDate(["YYYY-MM-DD"]),
check('win', 'Invalid Windows option.').isIn([0, 1]),
check('mac', 'Invalid MacOS option.').isIn([0, 1]),
check('linux', 'Invalid Linux option.').isIn([0, 1]),
check('shortDescription', 'You must enter a description'),
checkSchema({
'coverArt': {
custom: {
options: (value, {req, path}) => !!req.files[path],
errorMessage: 'Please upload an image file.',
},
},
}),
async (request, response) => {
const errors = validationResult(request);
if(!errors.isEmpty()) {
return response
.status(400)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({
message: 'Request fields or files are invalid.',
errors: errors.array(),
});
} else {
console.log(request.query);
let result = {};
try {
result = await games.addNewGame(request.query, request.file.filename);
} catch (error) {
console.log(error);
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Game added successfully!'});
}
});
app.post('/developers', upload.none(),
check('name', 'You must enter a name.').isLength({min: 3}),
check('description', 'You must enter a description').isLength({min:5}),
check('homepage', 'You must enter a homepage URL.').isURL(),
async (request, response) => {
const errors = validationResult(request);
if(!errors.isEmpty()) {
return response
.status(400)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({
message: 'Request fields or files are invalid.',
errors: errors.array(),
});
} else {
console.log(request.query);
let result = {};
try {
result = await developers.addNewDeveloper(request.query);
} catch (error) {
console.log(error);
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Developer added successfully!'});
}
});
app.post('/publishers', upload.none(),
check('name', 'You must enter a name.').isLength({min: 3}),
check('description', 'You must enter a description').isLength({min:5}),
check('homepage', 'You must enter a homepage URL.').isURL(),
async (request, response) => {
const errors = validationResult(request);
if(!errors.isEmpty()) {
return response
.status(400)
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({
message: 'Request fields or files are invalid.',
errors: errors.array(),
});
} else {
console.log(request.query);
let result = {};
try {
result = await publishers.addNewPublisher(request.query);
} catch (error) {
console.log(error);
return response
.status(500) //Error code when something goes wrong with the server
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Something went wrong with the server.'});
}
response
.setHeader('Access-Control-Allow-Origin', '*') //Prevent CORS error
.json({message: 'Publisher added successfully!'});
}
});
app.listen(port, () => {
console.log(`Application listening at http://localhost:${port}`);
})