Pointssystem, create Final and add results

This commit is contained in:
Mario Peters
2025-10-03 16:40:31 +02:00
parent 961ea5e1a1
commit b8b8ffc7b2
3 changed files with 170 additions and 58 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "kt-backend",
"version": "1.4.0",
"version": "2.0.0",
"description": "Karateturniere.de Backend",
"main": "server.js",
"scripts": {

View File

@@ -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

View File

@@ -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)
})
})