Pointssystem, create Final and add results
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "kt-backend",
|
||||
"version": "1.4.0",
|
||||
"version": "2.0.0",
|
||||
"description": "Karateturniere.de Backend",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
|
||||
90
routes.js
90
routes.js
@@ -19,36 +19,71 @@ exports.configureRoutes = (server) => {
|
||||
method: 'POST',
|
||||
path: '/winner',
|
||||
handler: function (request, h) {
|
||||
const p = new Promise((resolve, reject) => {
|
||||
const encounter = request.payload.encounter
|
||||
const gid = request.payload.gid
|
||||
const winner = request.payload.winner
|
||||
const wertungen = request.payload.wertungen
|
||||
console.log('encounter', encounter)
|
||||
console.log('gid', gid)
|
||||
console.log('winner', winner)
|
||||
console.log('wertungen', wertungen)
|
||||
return new Promise((resolve, reject) => {
|
||||
const { encounter, gid, winner, wertungen, pointssystem } = request.payload
|
||||
console.log('request.payload', request.payload)
|
||||
|
||||
// Calc encounter of next round
|
||||
const nextEcounter = Math.trunc(encounter / 2)
|
||||
const color = (encounter / 2) % 1 !== 0 ? 'aka' : 'shiro'
|
||||
const myquery = 'UPDATE encounters SET sieger = ' + winner + ', wertungen = ' + JSON.stringify(wertungen) + ' WHERE (gruppen_id = ' + gid + ') AND (begegnung = ' + encounter + ');'
|
||||
const myquery2 = 'UPDATE encounters SET ' + color + ' = ' + winner + ' WHERE (begegnung = ' + nextEcounter + ') AND (gruppen_ID = ' + gid + ');'
|
||||
// 1. aka/shiro aus DB laden
|
||||
const selectQuery = 'SELECT aka, shiro, wertungen FROM encounters WHERE (gruppen_id = ?) AND (begegnung = ?);'
|
||||
request.app.db.query(selectQuery, [gid, encounter], function (error, results) {
|
||||
if (error) return reject(error)
|
||||
if (!results || !results[0]) return reject(new Error('Begegnung nicht gefunden'))
|
||||
|
||||
// write score, winner
|
||||
request.app.db.query(myquery, function (error, results, fields) {
|
||||
if (error) throw error
|
||||
console.log(results)
|
||||
return resolve(results)
|
||||
})
|
||||
// write next round
|
||||
request.app.db.query(myquery2, function (error, results, fields) {
|
||||
if (error) throw error
|
||||
console.log(results)
|
||||
return resolve(results)
|
||||
const aka = results[0].aka
|
||||
const shiro = results[0].shiro
|
||||
|
||||
// 2. Wertungen-Objekt vorbereiten
|
||||
let wertungenObj = {}
|
||||
if (results[0].wertungen) {
|
||||
try {
|
||||
wertungenObj = JSON.parse(results[0].wertungen)
|
||||
} catch (e) {
|
||||
wertungenObj = {}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Farbe bestimmen
|
||||
let color = null
|
||||
if (winner === aka) color = 'aka'
|
||||
else if (winner === shiro) color = 'shiro'
|
||||
|
||||
// 4. Wertung für die Farbe setzen/überschreiben
|
||||
if (color) {
|
||||
wertungenObj[color] = wertungen
|
||||
}
|
||||
|
||||
const wertungenStr = JSON.stringify(wertungenObj)
|
||||
|
||||
// 5. Query bauen
|
||||
let myquery, params
|
||||
if (!pointssystem) {
|
||||
// Sieger und Wertungen setzen
|
||||
myquery = 'UPDATE encounters SET sieger = ?, wertungen = ? WHERE (gruppen_id = ?) AND (begegnung = ?);'
|
||||
params = [winner, wertungenStr, gid, encounter]
|
||||
} else {
|
||||
// Nur Wertungen setzen
|
||||
myquery = 'UPDATE encounters SET wertungen = ? WHERE (gruppen_id = ?) AND (begegnung = ?);'
|
||||
params = [wertungenStr, gid, encounter]
|
||||
}
|
||||
|
||||
request.app.db.query(myquery, params, function (error2, results2) {
|
||||
if (error2) return reject(error2)
|
||||
|
||||
// write next round for KO System
|
||||
if (!pointssystem) {
|
||||
const nextEcounter = Math.trunc(encounter / 2)
|
||||
const nextColor = (encounter / 2) % 1 !== 0 ? 'aka' : 'shiro'
|
||||
const myquery2 = 'UPDATE encounters SET ' + nextColor + ' = ? WHERE (begegnung = ?) AND (gruppen_ID = ?);'
|
||||
request.app.db.query(myquery2, [winner, nextEcounter, gid], function (error3, results3) {
|
||||
if (error3) return reject(error3)
|
||||
return resolve(results3)
|
||||
})
|
||||
} else {
|
||||
return resolve(results2)
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
return p
|
||||
},
|
||||
options: {
|
||||
validate: {
|
||||
@@ -56,7 +91,8 @@ exports.configureRoutes = (server) => {
|
||||
encounter: Joi.number().integer(),
|
||||
gid: Joi.number().integer(),
|
||||
winner: Joi.number().integer(),
|
||||
wertungen: [Joi.string(), Joi.number()],
|
||||
wertungen: [Joi.string(), Joi.number(), Joi.object(), Joi.array()],
|
||||
pointssystem: Joi.boolean(),
|
||||
}),
|
||||
},
|
||||
// TODO CORS ENTFERNE
|
||||
|
||||
136
routes/group.js
136
routes/group.js
@@ -60,7 +60,7 @@ exports.configureGroupRoutes = (server) => {
|
||||
},
|
||||
},
|
||||
{
|
||||
// Gruppen für das Finale erstellen
|
||||
// Teilnehmer in die Finalgruppe hinzufügen
|
||||
// TODO: edit admincheck
|
||||
method: 'PUT',
|
||||
path: '/final/triggerFinalists',
|
||||
@@ -70,6 +70,65 @@ exports.configureGroupRoutes = (server) => {
|
||||
const payload = request.payload
|
||||
const decoded = jwt.verify(token, process.env.JWT_KEY)
|
||||
const isTeam = payload.discipline.includes('Team')
|
||||
let sql = ''
|
||||
|
||||
if (payload.pointssystem) {
|
||||
// Pointssystem
|
||||
sql = `SELECT aka, shiro, wertungen FROM encounters WHERE gruppen_id = ${payload.groups[0]} AND (aka != 0 OR shiro != 0)`
|
||||
db().query(sql, function (error, results) {
|
||||
if (error) throw error
|
||||
|
||||
// Alle Teilnehmer mit Wertung sammeln
|
||||
let allParticipants = []
|
||||
|
||||
results.forEach((row) => {
|
||||
if (row.aka && row.wertungen) {
|
||||
try {
|
||||
const wertungen = JSON.parse(row.wertungen)
|
||||
if (wertungen.aka && wertungen.aka.total) {
|
||||
allParticipants.push({
|
||||
id: row.aka,
|
||||
total: parseFloat(wertungen.aka.total),
|
||||
points: wertungen.aka.points || [],
|
||||
})
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
if (row.shiro && row.wertungen) {
|
||||
try {
|
||||
const wertungen = JSON.parse(row.wertungen)
|
||||
if (wertungen.shiro && wertungen.shiro.total) {
|
||||
allParticipants.push({
|
||||
id: row.shiro,
|
||||
total: parseFloat(wertungen.shiro.total),
|
||||
points: wertungen.shiro.points || [],
|
||||
})
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
})
|
||||
|
||||
// Sortierfunktion: total DESC, dann kleinste Wertung DESC, dann größte Wertung DESC
|
||||
allParticipants.sort((a, b) => {
|
||||
if (b.total !== a.total) return b.total - a.total
|
||||
// Bei Gleichstand: kleinste Wertung vergleichen
|
||||
const aMin = Math.min(...a.points)
|
||||
const bMin = Math.min(...b.points)
|
||||
if (bMin !== aMin) return bMin - aMin
|
||||
// Dann größte Wertung vergleichen
|
||||
const aMax = Math.max(...a.points)
|
||||
const bMax = Math.max(...b.points)
|
||||
return bMax - aMax
|
||||
})
|
||||
|
||||
// Die besten 4 Teilnehmer
|
||||
const participants = allParticipants.slice(0, 4).map((p) => p.id)
|
||||
|
||||
console.log('participants', participants)
|
||||
saveParticipants(participants)
|
||||
return results
|
||||
})
|
||||
}
|
||||
|
||||
const saveParticipants = (participants) => {
|
||||
if (!isTeam) {
|
||||
@@ -91,8 +150,6 @@ exports.configureGroupRoutes = (server) => {
|
||||
})
|
||||
}
|
||||
|
||||
let sql = ``
|
||||
|
||||
// TODO: aid = turnier ersteller 1. über tid die accountid abfragen = acountid from turnier (|| acountid from turnier === decoded.id)
|
||||
if (decoded.admin < 1) {
|
||||
return reject(new Error(`/final/triggerFinalists: not allowed accountID: ${decoded.id}`))
|
||||
@@ -176,10 +233,6 @@ exports.configureGroupRoutes = (server) => {
|
||||
})
|
||||
break
|
||||
}
|
||||
|
||||
// TODO: Punktesystem
|
||||
// sql = `INSERT INTO karateturniere.encounters (gruppen_id, begegnung, aka, shiro, wertungen, teamstarter, sieger)
|
||||
// VALUES(${payload.id}, 3, 2529, 3124, '', 0, 0);`
|
||||
})
|
||||
|
||||
console.log('p', p)
|
||||
@@ -200,29 +253,44 @@ exports.configureGroupRoutes = (server) => {
|
||||
method: 'PUT',
|
||||
path: '/final/create',
|
||||
handler: async (request, h) => {
|
||||
// TODO: Verhindern, dass die funktion mehrfach wiederholt werden kann.
|
||||
const p = new Promise((resolve, reject) => {
|
||||
const token = request.query.token
|
||||
const tid = request.payload.tid
|
||||
const decoded = jwt.verify(token, process.env.JWT_KEY)
|
||||
|
||||
let sql = `INSERT INTO karateturniere.turniergruppen
|
||||
(gid, turnier_id, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, results, pointssystem)
|
||||
SELECT DISTINCT gid, turnier_id, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, 'Final', results, pointssystem
|
||||
FROM karateturniere.turniergruppen
|
||||
WHERE turnier_id = ${tid}
|
||||
AND pool != 'Final';`
|
||||
|
||||
// TODO: aid = turnier ersteller 1. über tid die accountid abfragen = acountid from turnier (|| acountid from turnier === decoded.id)
|
||||
// Admin-Check
|
||||
if (decoded.admin < 1) {
|
||||
return reject(new Error(`/final/create: not allowed accountID: ${decoded.id}`))
|
||||
}
|
||||
console.log('payload', JSON.stringify(request.payload, null, 4))
|
||||
|
||||
console.log('sql', sql)
|
||||
request.app.db.query(sql, (err) => {
|
||||
if (err) console.error(err)
|
||||
return resolve(true)
|
||||
// 1. Prüfen, ob es schon Finalgruppen gibt
|
||||
const checkSql = `SELECT COUNT(*) as count FROM karateturniere.turniergruppen WHERE turnier_id = ${tid} AND pool = 'Final';`
|
||||
request.app.db.query(checkSql, (err, results) => {
|
||||
if (err) {
|
||||
console.error(err)
|
||||
return reject(err)
|
||||
}
|
||||
if (results[0].count > 0) {
|
||||
// Es gibt schon Finalgruppen, also abbrechen
|
||||
return reject(new Error('Finalgruppen für dieses Turnier wurden bereits angelegt!'))
|
||||
}
|
||||
|
||||
// 2. Finalgruppen anlegen
|
||||
const sql = `INSERT INTO karateturniere.turniergruppen
|
||||
(gid, turnier_id, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, results, pointssystem)
|
||||
SELECT DISTINCT gid, turnier_id, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, 'Final', results, pointssystem
|
||||
FROM karateturniere.turniergruppen
|
||||
WHERE turnier_id = ${tid}
|
||||
AND pool != 'Final';`
|
||||
|
||||
console.log('sql', sql)
|
||||
request.app.db.query(sql, (err2) => {
|
||||
if (err2) {
|
||||
console.error(err2)
|
||||
return reject(err2)
|
||||
}
|
||||
return resolve(true)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -281,7 +349,7 @@ exports.configureGroupRoutes = (server) => {
|
||||
request.payload.forEach((group) => {
|
||||
const { gid, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, tid, pointssystem } = group
|
||||
sql += `INSERT INTO turniergruppen (turnier_id, gid, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, pointssystem)
|
||||
VALUES (${tid}, ${gid}, '${geschlecht}', '${gurtVon}', '${gurtBis}', '${disziplin}', ${altervon}, ${alterbis}, '${pool}', '${pointsystem}');`
|
||||
VALUES (${tid}, ${gid}, '${geschlecht}', '${gurtVon}', '${gurtBis}', '${disziplin}', ${altervon}, ${alterbis}, '${pool}', '${pointssystem}');`
|
||||
})
|
||||
|
||||
// console.log(JSON.stringify(group, null, 4));
|
||||
@@ -425,7 +493,7 @@ exports.configureGroupRoutes = (server) => {
|
||||
}
|
||||
console.log(JSON.stringify(request.payload, null, 4))
|
||||
|
||||
const sql = `INSERT INTO turniergruppen (turnier_id, gid, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, pointssystem) VALUES (${turnier_id}, ${gid}, '${geschlecht}', '${gurtVon}', '${gurtBis}', '${disziplin}', ${altervon}, ${alterbis}, '${pool}', '${pointsystem}');`
|
||||
const sql = `INSERT INTO turniergruppen (turnier_id, gid, geschlecht, gurtVon, gurtBis, disziplin, altervon, alterbis, pool, pointssystem) VALUES (${turnier_id}, ${gid}, '${geschlecht}', '${gurtVon}', '${gurtBis}', '${disziplin}', ${altervon}, ${alterbis}, '${pool}', '${pointssystem}');`
|
||||
console.log(sql)
|
||||
request.app.db.query(sql, (err, results) => {
|
||||
if (err) {
|
||||
@@ -722,20 +790,28 @@ exports.configureGroupRoutes = (server) => {
|
||||
|
||||
// Wenn keine GID gesetzt ist
|
||||
if (gid == '') {
|
||||
return reject(new Error('/addResults: not group set: '))
|
||||
return reject(new Error('/addResults: no group set: '))
|
||||
}
|
||||
|
||||
// TODO: aid = turnier ersteller 1. über tid die accountid abfragen = acountid from turnier (|| acountid from turnier === decoded.id)
|
||||
if (decoded.admin < 1) {
|
||||
return reject(new Error('/addGroup: not allowed accountID: ' + decoded.id))
|
||||
if (decoded.admin < 3) {
|
||||
return reject(new Error('/addResults: not allowed accountID: ' + decoded.id))
|
||||
}
|
||||
|
||||
const sql = `UPDATE turniergruppen SET results='{"p1":"${p1}", "p2":"${p2}", "p3":"${p3}", "p4":"${p4}"}' WHERE id=${gid} ;`
|
||||
// Dynamisch das results-Objekt bauen
|
||||
const resultsObj = {
|
||||
p1: p1,
|
||||
p2: p2,
|
||||
p3: p3,
|
||||
}
|
||||
if (typeof p4 !== 'undefined') {
|
||||
resultsObj.p4 = p4
|
||||
}
|
||||
|
||||
const sql = `UPDATE turniergruppen SET results='${JSON.stringify(resultsObj)}' WHERE id=${gid} ;`
|
||||
console.log(sql)
|
||||
request.app.db.query(sql, (err, results) => {
|
||||
if (err) console.error(err)
|
||||
console.log('result', results) // results contains rows returned by server
|
||||
// console.log('h.response(result)', h.response(results));
|
||||
console.log('result', results)
|
||||
return resolve(results)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user