@@ -1,15 +1,18 @@
const express = require("express");
const router = express.Router();
const db = require("../db/db");
const db = require("../db/db");
const msg = require("../db/http");
const mysql = require("mysql");
const bcrypt = require("bcrypt");
const tokenController = require('../controllers/token');
const jwtDecode = require('jwt-decode');

const seq = require('../models');
const User = seq.users;


exports.getUserByProperty = (column, value, callback) => {

exports.getUserByProperty = (column, value, callback) => {
const sql = `SELECT * FROM Users WHERE ${column}=${mysql.escape(value)}`;
db.executeSql(sql, function(data, err) {
if (err) {
@@ -77,6 +80,14 @@ exports.update = (req, res, next) => {

return msg.show200(req, res, "Success");
})
}

exports.get_by_id = (id) => {
return User.findById(id, {logging:false}).then(user => {
console.log('FINDBYID')
console.log(user.dataValues);
return user.dataValues
});
}

exports.user_signup = (req, res, next) => {
@@ -85,6 +96,8 @@ exports.user_signup = (req, res, next) => {
const email = req.body.email;
const password = req.body.password;



//check if valid email
req.check("email", "Email is not a valid email").isEmail();
req.check("password", "Password has to be 8 characters").isLength({ min: 8 });
@@ -100,30 +113,32 @@ exports.user_signup = (req, res, next) => {
msg.show500(req, res, err);
}

const sql = `INSERT INTO Users (Name,Tag,Email,Password)
VALUES (${mysql.escape(name)}, ${mysql.escape(tag)}, ${mysql.escape(
email
)}, ${mysql.escape(hash)})`;

db.executeSql(sql, function(data, err) {
if (err) {
if(err.sqlMessage.includes('email_unique') || err.sqlMessage.includes('tag_unique')) {
let errors = 'Error';
if(err.sqlMessage.includes('email_unique')) errors ='Email is already taken';
if(err.sqlMessage.includes('tag_unique')) errors ='Tag is already taken';
return msg.show409(req, res, "Duplicate entries", errors);
}

return msg.show500(req, res, err);
}
const newUser = {
Name: name,
Tag: tag,
Email: email,
Password: password,
IsAdmin: false
}

return msg.show200(req, res, "Success");
});

User
.create(newUser, {logging: false})
.then(user => {
console.log('Signed up user...')
console.log(user.dataValues);
return msg.show200(req, res, "Success", user.dataValues);
})
.catch(seq.Sequelize.ValidationError, function (err) {
//console.log( err.errors[0].message)
return msg.show400(req, res, err.errors[0].message);
}).catch(function (err) {
console.log(err);
return msg.show500(req, res, err);
})
});

//check if email is unique
/* module.exports.getUserByProperty('Email', email, function(emailuser) {
module.exports.getUserByProperty('Email', email, function(emailuser) {
if (emailuser) {
return msg.show409(req, res, "Email exists");
}
@@ -152,10 +167,10 @@ exports.user_signup = (req, res, next) => {

});
})
}); */
});
};

exports.user_login = (req, res, next) => {
exports.user_login = (req, res, next) => {
const email = req.body.email;

module.exports.getUserByProperty('Email', email, function(data, err) {
@@ -190,7 +205,7 @@ exports.user_login = (req, res, next) => {
}
})
})
}
}

exports.user_all = (req, res, next) => {

@@ -214,9 +229,9 @@ exports.user_all = (req, res, next) => {
});
}


/* HELPER */
function getUserId(req) {
function getUserId(req) {
//decode the token and fetch id
const token = req.headers.authorization.split(' ');

@@ -226,4 +241,4 @@ function getUserId(req) {
} catch (err) {
return -1;
}
}
}
@@ -7,8 +7,8 @@ module.exports = function(sequelize, DataTypes) {
})

Tournament.associate = (models) => {
Tournament.belongsToMany(models.users, {through: models.users_tournaments});
Tournament.belongsToMany(models.users, {through: models.requests});
Tournament.belongsToMany(models.users, {through: models.users_tournaments}, { onDelete: 'cascade' });
Tournament.belongsToMany(models.users, {through: models.requests}, { onDelete: 'cascade' });
}

return Tournament;
@@ -2,16 +2,16 @@ module.exports = function(sequelize, DataTypes) {
const User = sequelize.define("users", {
UserId: {type: DataTypes.INTEGER, primaryKey: true, allowNull: false, autoIncrement: true},
Name: {type: DataTypes.TEXT, allowNull: false},
Tag: {type: DataTypes.STRING(5), validate: {unique: true, allowNull: false}},
Email: {type: DataTypes.STRING(45), validate: {isEmail: true}, allowNull: false},
Tag: {type: DataTypes.STRING(5), unique: true, allowNull: false},
Email: {type: DataTypes.STRING(45), validate: {isEmail: true}, allowNull: false, unique: true},
Password: {type: DataTypes.TEXT, allowNull: false},
IsAdmin: {type: DataTypes.TINYINT, allowNull: false},
RefreshToken: {type: DataTypes.TEXT, allowNull: true}
});

User.associate = (models) => {
User.belongsToMany(models.tournaments, {through: models.users_tournaments});
User.belongsToMany(models.tournaments, {through: models.requests});
User.belongsToMany(models.tournaments, {through: models.users_tournaments}, { onDelete: 'cascade' });
User.belongsToMany(models.tournaments, {through: models.requests}, { onDelete: 'cascade' });
}

return User;
@@ -11,15 +11,18 @@
"license": "ISC",
"dependencies": {
"bcrypt": "^1.0.3",
"chai-factories": "^0.1.0",
"config": "^1.30.0",
"express": "^4.16.3",
"express-validator": "^5.0.3",
"jsonwebtoken": "^8.2.0",
"jwt-decode": "^2.2.0",
"lodash": "^4.17.10",
"moment": "^2.22.1",
"morgan": "^1.9.0",
"mysql": "^2.15.0",
"nodemon": "^1.17.3",
"mysql2": "^1.5.3",
"nodemon": "^1.17.3",
"sequelize": "^4.37.6",
"sequelize-cli": "^3.1.0"
},
@@ -1,56 +1,52 @@
process.env.NODE_ENV = "test";
process.env.NODE_ENV = "test";

const config = require("config");
const chai = require("chai");
const chaiHttp = require("chai-http");
const server = require("../server");
const should = chai.should();
/* const db = require("../db/db"); */
const db = require('../models');
const Tournament = db.tournaments;
const tokenController = require('../controllers/token')

const token = require("../controllers/token");
const truncate = require('../test/truncate');

chai.use(chaiHttp);
chai.use(chaiHttp);

//Our tournament block
describe("Tournaments", () => {
const tokens = tokenController.generateTokens({
Email: "Bryan@email.dk",
UserId: 1,
IsAdmin: false
});
beforeEach(done => {
db
.sequelize
.query('SET FOREIGN_KEY_CHECKS = 0', null, {raw: true})
.then(function(results) {
db.sequelize.sync({force: true})
.then(() => {
done()
});

const tokens = tokenController.generateTokens({
Email: "Bryan@email.dk",
UserId: 1,
IsAdmin: false
});

const user = {
name: "Kobe Bryan",
tag: "KB",
email: "Bryan@email.dk",
password: "123456789",
};

const tourney = {
name: "Season1",
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2021-03-25T12:00:00Z")
};



describe("/POST tournament", () => {
beforeEach(done => {
truncate.clear(function(result) {
done();
})
});
});
after(function(done) {
db
.sequelize
.query('SET FOREIGN_KEY_CHECKS = 0', null, {raw: true})
.then(function(results) {
db.sequelize.sync({force: true})
.then(() => {
done()
});
after(function(done) {
truncate.clear(function(result) {
done();
})
});
});
//Test post tournament
describe("/POST tournament", () => {
it("it should create a tournament", done => {
let tourney = {
name: "Season1",
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2021-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
@@ -61,16 +57,16 @@ describe("Tournaments", () => {
done();
});
});
/* it("it should not create with a start date earlier than today", done => {
let tourney = {
it("it should not create with a start date earlier than today", done => {
const invTour = {
name: "Season1",
start: new Date("2015-03-25T12:00:00Z"),
end: new Date("2015-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
.send(tourney)
.send(invTour)
.end((err, res) => {
res.should.have.status(400);
should.exist(res.body.err);
@@ -79,15 +75,15 @@ describe("Tournaments", () => {
});
});
it("it should not create with an end date earlier than start", done => {
let tourney = {
const invTour = {
name: "Season1",
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2020-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
.send(tourney)
.send(invTour)
.end((err, res) => {
res.should.have.status(400);
should.exist(res.body.err);
@@ -96,11 +92,6 @@ describe("Tournaments", () => {
});
});
it("it should only create on unique name", done => {
let tourney = {
name: "Season1",
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2021-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
@@ -111,60 +102,107 @@ describe("Tournaments", () => {
.post("/tournament")
.send(tourney)
.end((err, res) => {
res.should.have.status(409);
res.body.msg.should.be.eql("Tournament name exists");
res.should.have.status(400);
res.body.err.should.be.eql("Name must be unique");
done();
});
});
});
it("it not create with missing arguments", done => {
let tourney = {
const invTour = {
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2021-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
.send(tourney)
.send(invTour)
.end((err, res) => {
res.should.have.status(400);
should.exist(res.body.err);
res.body.err.should.be.a("array");
done();
});
}); */
});
/* describe("/GET tournament", () => {
});
});

describe("/GET tournaments", () => {
beforeEach(done => {
//Seed database
let tourney = {
name: "Season1",
start: new Date("2021-03-25T12:00:00Z"),
end: new Date("2021-03-25T12:00:00Z")
};
chai
.request(server)
.post("/tournament")
.send(tourney)
.end((err, res) => {
done();
});
truncate.clear(function(result) {
chai
.request(server)
.post("/tournament")
.send(tourney)
.end((err, res) => {
chai
.request(server)
.post("/user/signup")
.send(user)
.end((err, res) => {
done();
});
});
})
});
after(function(done) {
truncate.clear(function(result) {
done();
})
});

it("it should fetch all tournaments", done => {
it("it should get all tournaments", done => {
chai
.request(server)
.get("/tournament")
.end((err, res) => {
console.log('4444')
res.should.have.status(200);
res.body.data.should.be.a("array");
res.body.data.should.have.length(1);
res.body.data[0].should.be.a("object");
done();
});
});
/* it("it should get the enrolled tournament", done => {
chai
.request(server)
.post(`/tournament/1/requests`)
.set("authorization", "Bearer " + tokens.access_token)
.end((err, res) => {
res.should.have.status(200);
chai
.request(server)
.post(`/tournament/1/requests/1`)
.send({status: 'accepted'})
.end((err, res) => {
res.should.have.status(200);
chai
.request(server)
.get("/tournament/enrolled")
.set("authorization", "Bearer " + tokens.access_token)
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
}); */
/* it("it should NOT get the enrolled tournament with no token", done => {
chai
.request(server)
.get("/tournament/enrolled")
.set("authorization", "Bearer ")
.end((err, res) => {
res.should.have.status(500);
done();
});
}); */
})


//ENROLLED TOURNAMENTS FOR USER
describe("/Should get enrolled tournaments", () => {
/* describe("/Should get enrolled tournaments", () => {
const user = {
name: "Kobe Bryan",
tag: "KB",
@@ -179,7 +217,7 @@ describe("Tournaments", () => {
.end((err, res) => {
done();
});
});
});
it("it should get the enrolled tournament", done => {
chai
.request(server)
@@ -205,8 +243,8 @@ describe("Tournaments", () => {
});
});
});
});
it("it should NOT get the enrolled tournament with no token", done => {
}); */
/* it("it should NOT get the enrolled tournament with no token", done => {
chai
.request(server)
.get("/tournament/enrolled")
@@ -215,11 +253,16 @@ describe("Tournaments", () => {
res.should.have.status(500);
done();
});
});
});
}); */
})
}); */


//Test post tournament




/*
describe("Requests", () => {
const tokens = tokenController.generateTokens({
Email: "Bryan@email.dk",
@@ -424,12 +467,7 @@ describe("Requests", () => {
});
});
});
})
}) */

*/

/*
})
*/

@@ -0,0 +1,68 @@
const db = require('../models');



exports.clear = (done) => {
const user = db.users;
const tournament = db.tournaments
const usertournament = db.users_tournaments
const request = db.requests


/* db.sequelize.query("set FOREIGN_KEY_CHECKS=0").then(
db.users_tournaments.sync({force:true, logging: false}).then(
db.requests.sync({force:true, logging: false}).then(
db.users.sync({force:true, logging: false}).then(
db.tournaments.sync({force:true, logging: false}).then(
done()
)
)
)
)
); */



db.sequelize
.query("set FOREIGN_KEY_CHECKS=0", {logging: false})
.then(
usertournament
.destroy({ truncate: true, force: true, logging: false })
.then(
db.sequelize
.query("set FOREIGN_KEY_CHECKS=0", {logging: false})
.then(
request
.destroy(
{ truncate: true, force: true, logging: false }

)
.then(
db.sequelize
.query("set FOREIGN_KEY_CHECKS=0", {logging: false})
.then(
user
.destroy(
{ truncate: true, force: true, logging: false }

)
.then(
db.sequelize
.query("set FOREIGN_KEY_CHECKS=0", {logging: false})
.then(
tournament
.destroy(
{ truncate: true, force: true, logging: false }

)
.then(done())
)
)
)
)
)
)
);

}
@@ -1,25 +1,33 @@
/* process.env.NODE_ENV = "test";
process.env.NODE_ENV = "test";

const config = require("config");
const chai = require("chai");
const chaiHttp = require("chai-http");
const server = require("../server");
const should = chai.should();
const tokenController = require("../controllers/token");
const db = require("../db/db");
//const db = require("../db/db");
const truncate = require('../test/truncate');

const user = require("../controllers/user");
const userController = require("../controllers/user");

chai.use(chaiHttp);

describe("Users", () => {
beforeEach(done => {
db.cleanDatabase(function(data) {
truncate.clear(function(result) {
done();
});
})
});
after(function(done) {
truncate.clear(function(result) {
done();

})
});

describe("/GET User", () => {

beforeEach(done => {
let person = {
name: "Kobe Bryan",
@@ -36,15 +44,16 @@ describe("Users", () => {
});
});
it("it should GET a user by id 1", done => {
//2 since admin has been seeded
user.getUserByProperty("UserId", 1, function(data, err) {
should.equal(err, undefined);
should.equal(data.UserId, 1);
should.equal(data.Name, "Kobe Bryan");
userController.get_by_id(1).then(match => {
should.equal(match.UserId, 1);
should.equal(match.Name, 'Kobe Bryan');
console.log('Done..')
done();
});
})

});
it("it should not GET anything with a crazy id", done => {
});
/* it("it should not GET anything with a crazy id", done => {
user.getUserByProperty("UserId", 13249, function(data, err) {
should.equal(data, undefined);
done();
@@ -78,8 +87,7 @@ describe("Users", () => {
should.equal(data, undefined);
done();
});
});
}); */
}); */

/****************************** TESTING SIGNUP *****************************/
/* describe("/POST User/signup", () => {
@@ -207,7 +215,7 @@ describe("Users", () => {
});
*/
/****************************** TESTING LOGIN *****************************/
/* describe("/POST User/login", () => {
/* describe("/POST User/login", () => {
beforeEach(done => {
let person = {
name: "Kobe Bryan",
@@ -391,12 +399,8 @@ describe("Users", () => {
});
});
});
});
}); */


after(function(done) {
db.cleanDatabase(function(data) {
done();
});
});
});
*/