diff --git a/app/.env b/app/.env new file mode 100644 index 0000000..7fdcc8e --- /dev/null +++ b/app/.env @@ -0,0 +1 @@ +mongoURL = mongodb://localhost:27017/examination \ No newline at end of file diff --git a/app/package.json b/app/package.json index 6b480b3..a3fb9e2 100755 --- a/app/package.json +++ b/app/package.json @@ -5,16 +5,19 @@ "description": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB.", "main": "server.js", "scripts": { - "start": "NODE_ENV=development node server.js", + "start": "NODE_ENV=development nodemon server.js", "start:prod": "NODE_ENV=production node server.js", - "test": "echo \"Error: no test specified\" && exit 1" + "test": "mocha test/player.js" }, "dependencies": { + "body-parser": "^1.19.0", + "dotenv": "^8.2.0", "express": "^4.17.1", "mongoose": "^5.9.2" }, "devDependencies": { - "chai": "^4.2.0" + "chai": "^4.2.0", + "mocha": "^7.1.1" }, "engines": { "node": ">=10.15.0" diff --git a/app/routes/player.js b/app/routes/player.js new file mode 100644 index 0000000..bd4c1a0 --- /dev/null +++ b/app/routes/player.js @@ -0,0 +1,74 @@ +const express = require('express'); +const route = express.Router(); +const Player = require('../schema/player') + +const array = [ "C", "PF", "SF", "PG", "SG" ]; + +route.get('/',getAllPlayers) +route.get('/:id', getOnePlayer) +route.put('/', updatePlayer) +route.post('/', createPlayer) +route.delete('/:id', deletePlayer) + +async function getAllPlayers(req,res){ + return res.send(await Player.find({})); +} + +async function createPlayer(req, res){ + const {name,id,position}=req.body; + if(name && (!isNaN(id)) && position && array.includes(position)){ + const result =await Player.create(req.body); + return res.send(result); + } + return res.send('Invalid input'); +} + + + +async function updatePlayer(req, res){ + const {name,id,position}=req.body; + if(!(name && position && (!isNaN(id)) && array.includes(position))){ + return res.send('Validation exception'); + } + + const player = await Player.findOne({id}); + if(!player){ + return res.send("Player not found"); + } + player.name=name; + player.position=position; + await player.save(); + + return res.send(player); +} + + +async function getOnePlayer (req, res) { + const id = req.params.id; + if(isNaN(id)){ + return res.send('invaliated Input'); + } + const player = await Player.findOne({id}); + if(!player){ + return res.send("Player not found"); + } + res.send(player); +} + + +async function deletePlayer(req, res) { + const id = req.params.id; + + if(isNaN(id)){ + return res.send("Invalid ID supplied"); + } + const player = await Player.findOne({id}); + if(!player){ + return res.send("Player not found"); + } + await Player.findOneAndDelete({id},req.body) + return res.send({status:0,message:"deleted"}); +} + + +module.exports = route \ No newline at end of file diff --git a/app/schema/player.js b/app/schema/player.js new file mode 100644 index 0000000..5495511 --- /dev/null +++ b/app/schema/player.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose'); +const playerSchema = mongoose.Schema({ + name:{type:String}, + id:{type:Number}, + position:{type:String} +}); + + + + +module.exports=mongoose.model('player',playerSchema); \ No newline at end of file diff --git a/app/server.js b/app/server.js index 72e5b39..c16eb65 100755 --- a/app/server.js +++ b/app/server.js @@ -1,11 +1,26 @@ const express = require('express'); - +const bodyParser = require('body-parser') const app = express(); +require('dotenv').config() +app.use(bodyParser.json()) app.get('/', (req, res) => { res.json({"message": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB."}); }); +const mongoose = require('mongoose'); +mongoose.connect('mongodb://localhost:27017/examination',{ useUnifiedTopology: true,useNewUrlParser: true }); +mongoose.connection.on("error",function(error){ + console.log("ERROR"+error); +}); +mongoose.connection.on("open",function(error){ + console.log("MONGO WORKING"); +}); + +app.use('/player', require('./routes/player')); + app.listen(3000, () => { console.log("Server is listening on port 3000"); -}); \ No newline at end of file +}); + +module.exports= app \ No newline at end of file diff --git a/app/test/player.js b/app/test/player.js new file mode 100644 index 0000000..8c9885c --- /dev/null +++ b/app/test/player.js @@ -0,0 +1,97 @@ +const Player = require('../schema/player'); +require('dotenv').config() +var chaiHttp = require('chai-http'); +const assert = require('assert'); +const chai = require('chai'); +const server = require('../server'); +var should = chai.should(); + + +chai.use(chaiHttp); + +describe('REST API',()=>{ + + + beforeEach(function(done){ + let newPlayer = new Player({ + name: "Leborn", + id: 0, + position: "C" + }); + newPlayer.save(function(err) { + done(); + }); + }); + afterEach(function(done){ + Player.collection.drop(); + done(); + }); + it('Create One player',(done)=>{ + chai.request(server) + .post('/player') + .send({'name': 'asdf', 'position': 'C', 'id':1}) + .end(function(err, res){ + res.should.have.status(200); + res.should.be.json; + res.body.should.be.a('object'); + res.body.should.have.property('name'); + res.body.should.have.property('position'); + res.body.should.have.property('id'); + res.body.name.should.equal('asdf'); + res.body.id.should.equal(1); + res.body.position.should.equal('C'); + done(); + }); + + }) + it('Update One player',(done)=>{ + chai.request(server) + .put('/player/') + .send({'name': 'asdf', 'position': 'C', 'id':0}) + .end(function(err, res){ + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('id'); + res.body.should.have.property('name'); + res.body.should.have.property('position'); + res.body.name.should.equal('asdf'); + res.body.position.should.equal('C'); + res.body.id.should.equal(0); + + done(); + }) + }) + //using :id + it('Get One player',(done)=>{ + chai.request(server) + .get('/player/0') + .end(function(err, res){ + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('_id'); + res.body.should.have.property('name'); + res.body.should.have.property('position'); + res.body.name.should.equal('Leborn'); + res.body.position.should.equal('C'); + done(); + }) + }) + it('Delete One player',(done)=>{ + chai.request(server) + .delete('/player/0') + .end(function(err, res){ + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('status'); + res.body.should.have.property('message'); + res.body.status.should.equal(0); + res.body.message.should.equal('deleted'); + + done(); + }) + }) + + + +}) +