Implemented getMatch methods
This commit is contained in:
parent
19a7cb538d
commit
906a7ada40
|
@ -12,6 +12,8 @@ const port = 3000;
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
console.log(`Listening on port ${port}`)
|
console.log(`Listening on port ${port}`)
|
||||||
})
|
})
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(express.urlencoded({ extended: true }));
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
// #region frontend
|
// #region frontend
|
||||||
|
@ -39,4 +41,36 @@ app.get("/tournament/:tournamentId/getMatches", (req, res) => {
|
||||||
.then(matches => res.send({"status": "OK", "data": matches}))
|
.then(matches => res.send({"status": "OK", "data": matches}))
|
||||||
.catch(err => res.send({"status": "error", "data": err}));
|
.catch(err => res.send({"status": "error", "data": err}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get("/match/:matchId/getMatch", (req, res) => {
|
||||||
|
let matchId = req.params.matchId;
|
||||||
|
if (isNaN(matchId)) {
|
||||||
|
res.json({"status": "error", "data": "matchId must be a number"});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
matchId = parseInt(matchId);
|
||||||
|
tmdb.getMatch(matchId)
|
||||||
|
.then(match => res.send({"status": "OK", "data": match}))
|
||||||
|
.catch(err => res.send({"status": "error", "data": err}));
|
||||||
|
});
|
||||||
|
|
||||||
|
// JSON body: {"winner": "teamId"}
|
||||||
|
app.post("/match/:matchId/setWinner", (req, res) => {
|
||||||
|
let matchId = req.params.matchId;
|
||||||
|
let winnerId = req.body.winnerId;
|
||||||
|
if (isNaN(matchId)) {
|
||||||
|
res.json({"status": "error", "data": "matchId must be a number"});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (winnerId == undefined || isNaN(winnerId)) {
|
||||||
|
res.json({"status": "error", "data": "winnerId must be a number"});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
matchId = parseInt(matchId);
|
||||||
|
winnerId = parseInt(winnerId);
|
||||||
|
tmdb.setMatchWinner(matchId, winnerId)
|
||||||
|
.then(match => res.send({"status": "OK", "data": match}))
|
||||||
|
.catch(err => res.send({"status": "error", "data": err}));
|
||||||
|
});
|
||||||
// #endregion
|
// #endregion
|
|
@ -9,6 +9,7 @@ DROP TABLE IF EXISTS tournaments;
|
||||||
CREATE TABLE tournaments (
|
CREATE TABLE tournaments (
|
||||||
id INTEGER PRIMARY KEY AUTO_INCREMENT,
|
id INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
startTime DATETIME NOT NULL,
|
startTime DATETIME NOT NULL,
|
||||||
endTime DATETIME NOT NULL
|
endTime DATETIME NOT NULL
|
||||||
);
|
);
|
||||||
|
@ -43,8 +44,8 @@ CREATE TABLE players (
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Example data (Two tournaments, 4 teams, single elimination)
|
-- Example data (Two tournaments, 4 teams, single elimination)
|
||||||
INSERT INTO tournaments (name, startTime, endTime) VALUES ('Tournament 1', '2022-04-01 16:00:00', '2022-04-01 20:00:00');
|
INSERT INTO tournaments (name, description, startTime, endTime) VALUES ('Tournament 1', 'First tournament, single elimination', '2022-04-01 16:00:00', '2022-04-01 20:00:00');
|
||||||
INSERT INTO tournaments (name, startTime, endTime) VALUES ('Tournament 2', '2022-04-03 17:30:00', '2022-04-02 21:30:00');
|
INSERT INTO tournaments (name, description, startTime, endTime) VALUES ('Tournament 2', 'Second tournament, four teams', '2022-04-03 17:30:00', '2022-04-02 21:30:00');
|
||||||
|
|
||||||
INSERT INTO teams (tournamentId, name) VALUES (1, 'Fnatic'); -- 1
|
INSERT INTO teams (tournamentId, name) VALUES (1, 'Fnatic'); -- 1
|
||||||
INSERT INTO teams (tournamentId, name) VALUES (1, 'Cloud 9'); -- 2
|
INSERT INTO teams (tournamentId, name) VALUES (1, 'Cloud 9'); -- 2
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getMatchesByTournamentId: getMatchesByTournamentId,
|
getMatchesByTournamentId: getMatchesByTournamentId,
|
||||||
getTournaments: getTournaments,
|
getTournaments: getTournaments,
|
||||||
executeStatement: executeStatement
|
getMatch: getMatch,
|
||||||
|
setMatchWinner: setMatchWinner,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { query } = require("express");
|
||||||
const mysql = require("mysql");
|
const mysql = require("mysql");
|
||||||
|
|
||||||
let connection = mysql.createConnection({
|
let connection = mysql.createConnection({
|
||||||
|
@ -18,7 +20,7 @@ let connection = mysql.createConnection({
|
||||||
|
|
||||||
function getMatchesByTournamentId(tournamentId) {
|
function getMatchesByTournamentId(tournamentId) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
connection.query("SELECT * FROM matches WHERE tournament_id = ?", [mysql.escape(tournamentId)], (err, matches) => {
|
connection.query("SELECT * FROM matches WHERE tournamentId = ?", [mysql.escape(tournamentId)], (err, matches) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
reject(err);
|
reject(err);
|
||||||
|
@ -42,6 +44,89 @@ function getTournaments() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the match of the exact given id.
|
||||||
|
function getMatch(matchId) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
connection.query("SELECT * FROM matches WHERE id = ?", [mysql.escape(matchId)], (err, matches) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
if (matches.length == 0) {
|
||||||
|
reject("No such match exists");
|
||||||
|
}
|
||||||
|
resolve(matches[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes a given team from a given match. This is done by setting the teamId-property containing the given team to null.
|
||||||
|
function unsetContestant(matchId, teamId) {
|
||||||
|
let match = getMatch(matchId);
|
||||||
|
if (match.team1Id == teamId) {
|
||||||
|
connection.query("UPDATE matches SET team1Id = NULL WHERE id = ?", [mysql.escape(matchId)], (err, result) => {
|
||||||
|
if (err) { console.log(err); }
|
||||||
|
});
|
||||||
|
} else if (match.team2Id == teamId) {
|
||||||
|
connection.query("UPDATE matches SET team2Id = NULL WHERE id = ?", [mysql.escape(matchId)], (err, result) => {
|
||||||
|
if (err) { console.log(err); }
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log("Error: Team not found in match");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets the winnerId-property of a given match.
|
||||||
|
// Also appoints the winner as a contestant to the next(parent) match.
|
||||||
|
function setMatchWinner(matchId, winnerId) {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
getMatch(matchId)
|
||||||
|
.catch(err => reject(err))
|
||||||
|
.then(match => {
|
||||||
|
if (winnerId != match.team1Id && winnerId != match.team2Id) {
|
||||||
|
reject("Winner must be one of the teams in the match");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final match doesn't have a parent
|
||||||
|
if (match.parentMatchId != null) {
|
||||||
|
// Enter the winner of the match into the parent match
|
||||||
|
getMatch(match.parentMatchId)
|
||||||
|
.catch(err =>reject(err))
|
||||||
|
.then(parentMatch => {
|
||||||
|
if (parentMatch.team1Id == null) {
|
||||||
|
connection.query("UPDATE matches SET team1Id = ? WHERE id = ?",
|
||||||
|
[mysql.escape(winnerId), mysql.escape(parentMatch.id)], (err, sets) => {
|
||||||
|
if (err) { reject(err); }
|
||||||
|
});
|
||||||
|
} else if (parentMatch.team2Id == null) {
|
||||||
|
connection.query("UPDATE matches SET team2Id = ? WHERE id = ?",
|
||||||
|
[mysql.escape(winnerId), mysql.escape(parentMatch.id)], (err, sets) => {
|
||||||
|
if (err) { reject(err); }
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
reject("Parent match already has two teams");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lastly, if all checks passed, actually set the winnerId property
|
||||||
|
connection.query("UPDATE matches SET winnerId = ? WHERE id = ?",
|
||||||
|
[mysql.escape(winnerId), mysql.escape(matchId)], (err, sets) => {
|
||||||
|
if (err) {
|
||||||
|
// If this update fails, we need to undo the parent match update
|
||||||
|
unsetContestant(parentMatchId, winnerId);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
getMatch(matchId)
|
||||||
|
.catch(err => reject(err))
|
||||||
|
.then(match => resolve(match));
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Dangerous function, use with caution.
|
// Dangerous function, use with caution.
|
||||||
// Used to initialize and manage the database by management tools, not by the main application.
|
// Used to initialize and manage the database by management tools, not by the main application.
|
||||||
function executeStatement(statement) {
|
function executeStatement(statement) {
|
||||||
|
|
Loading…
Reference in New Issue