88 lines
3.1 KiB
JavaScript
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]);
|
|
}
|