togethere.cloud/private_html/disciplines/ping-pong/1v1/node-server/src/mysqlWriter.js

88 lines
3.1 KiB
JavaScript

import { hasTable } from './db.js';
async function hasColumn(pool, tableName, columnName) {
const [rows] = await pool.query(
'SELECT COUNT(*) AS c FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?',
[tableName, columnName]
);
return (rows?.[0]?.c ?? 0) > 0;
}
export async function initMySqlSupport(pool) {
return {
hasMatchTicks: await hasTable(pool, 'match_ticks'),
matchesHasDiscipline: await hasColumn(pool, 'matches', 'Discipline'),
matchesHasParticipants: await hasColumn(pool, 'matches', 'Participants'),
matchesHasRate: await hasColumn(pool, 'matches', 'Rate'),
matchesHasScore: await hasColumn(pool, 'matches', 'Score'),
};
}
export async function createMatchRow(pool, support, { team1Id, team2Id, startTimeUtc, platform, matchType, participantsJson, discipline }) {
const columns = ['Team1_ID', 'Team2_ID', 'StartTime', 'Status', 'Platform', 'MatchType'];
const values = [team1Id, team2Id, startTimeUtc, 'live', platform, matchType];
if (support.matchesHasScore) {
columns.push('Score');
values.push('0:0');
}
if (support.matchesHasRate) {
columns.push('Rate');
values.push('free');
}
if (support.matchesHasParticipants) {
columns.push('Participants');
values.push(participantsJson);
}
if (discipline && support.matchesHasDiscipline) {
columns.push('Discipline');
values.push(discipline);
}
const placeholders = columns.map(() => '?').join(', ');
const sql = `INSERT INTO matches (${columns.join(', ')}) VALUES (${placeholders})`;
try {
const [result] = await pool.execute(sql, values);
return Number(result.insertId);
} catch {
const fallbackColumns = ['Team1_ID', 'Team2_ID', 'StartTime', 'Status', 'Platform', 'MatchType'];
const fallbackValues = [team1Id, team2Id, startTimeUtc, 'live', platform, matchType];
if (support.matchesHasScore) {
fallbackColumns.push('Score');
fallbackValues.push('0:0');
}
const fallbackSql = `INSERT INTO matches (${fallbackColumns.join(', ')}) VALUES (${fallbackColumns.map(() => '?').join(', ')})`;
const [result] = await pool.execute(fallbackSql, fallbackValues);
return Number(result.insertId);
}
}
export async function updateMatchPerSecond(pool, support, matchId, { status, score, participantsJson }) {
const set = ['Status = ?', 'Score = ?'];
const params = [status, score];
if (support.matchesHasParticipants) {
set.push('Participants = ?');
params.push(participantsJson);
}
const sql = `UPDATE matches SET ${set.join(', ')} WHERE ID = ?`;
params.push(matchId);
await pool.execute(sql, params);
}
export async function endMatch(pool, matchId, { score, endTimeUtc }) {
const sql = `UPDATE matches SET Status = 'end', Score = ?, EndTime = ? WHERE ID = ?`;
await pool.execute(sql, [score, endTimeUtc, matchId]);
}
export async function insertMatchTick(pool, matchId, tickTsUtc, stateJson) {
const sql = `INSERT INTO match_ticks (match_id, tick_time, state_json) VALUES (?, ?, ?)`;
await pool.execute(sql, [matchId, tickTsUtc, stateJson]);
}