Add Teams endpoint and endpoints with service

This commit is contained in:
2026-03-09 15:48:47 +01:00
parent 67d4288c84
commit ea45d74c0f
7 changed files with 383 additions and 44 deletions

View File

@@ -0,0 +1,149 @@
import { Team, TournamentTeam } from '../models/team';
import { Database, RunResult } from 'sqlite3';
export class TeamService {
private db: Database;
constructor(db: Database) {
this.db = db;
this.db.serialize(() => {
this.db.run(`CREATE TABLE IF NOT EXISTS Teams
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
tag TEXT NOT NULL,
description TEXT,
createdAt TEXT NOT NULL DEFAULT (datetime('now'))
)`);
this.db.run(`CREATE TABLE IF NOT EXISTS TournamentTeams
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
tournamentId INTEGER NOT NULL,
teamId INTEGER NOT NULL,
registeredAt TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (tournamentId) REFERENCES Tournaments (id) ON DELETE CASCADE,
FOREIGN KEY (teamId) REFERENCES Teams (id) ON DELETE CASCADE,
UNIQUE (tournamentId, teamId)
)`);
});
}
getAllTeams(): Promise<Team[]> {
return new Promise<Team[]>((resolve, reject) => {
this.db.all(`SELECT * FROM Teams`, (err: Error | null, rows: Team[]) => {
if (err) return reject(err);
resolve(rows);
});
});
}
getTeamById(id: number): Promise<Team | undefined> {
return new Promise<Team | undefined>((resolve, reject) => {
this.db.get(
`SELECT * FROM Teams WHERE id = ?`,
[id],
(err: Error | null, row: Team | undefined) => {
if (err) return reject(err);
resolve(row);
}
);
});
}
addTeam(team: Omit<Team, 'id' | 'createdAt'>): Promise<Team> {
return new Promise<Team>((resolve, reject) => {
const stmt = this.db.prepare(
`INSERT INTO Teams (name, tag, description) VALUES (?, ?, ?)`
);
stmt.run(team.name, team.tag, team.description, function (this: RunResult, err: Error | null) {
if (err) return reject(err);
resolve({ id: (this as any).lastID, createdAt: new Date().toISOString(), ...team });
});
stmt.finalize();
});
}
updateTeam(id: number, team: Partial<Omit<Team, 'id' | 'createdAt'>>): Promise<void> {
return new Promise((resolve, reject) => {
this.db.run(
`UPDATE Teams SET name = COALESCE(?, name), tag = COALESCE(?, tag), description = COALESCE(?, description) WHERE id = ?`,
[team.name ?? null, team.tag ?? null, team.description ?? null, id],
(err: Error | null) => {
if (err) return reject(err);
resolve();
}
);
});
}
deleteTeam(id: number): Promise<void> {
return new Promise((resolve, reject) => {
this.db.run(`DELETE FROM Teams WHERE id = ?`, [id], (err: Error | null) => {
if (err) return reject(err);
resolve();
});
});
}
getTeamsByTournamentId(tournamentId: number): Promise<Team[]> {
return new Promise<Team[]>((resolve, reject) => {
this.db.all(
`SELECT t.*, tt.registeredAt
FROM Teams t
INNER JOIN TournamentTeams tt ON t.id = tt.teamId
WHERE tt.tournamentId = ?`,
[tournamentId],
(err: Error | null, rows: Team[]) => {
if (err) return reject(err);
resolve(rows);
}
);
});
}
getTournamentsByTeamId(teamId: number): Promise<TournamentTeam[]> {
return new Promise<TournamentTeam[]>((resolve, reject) => {
this.db.all(
`SELECT * FROM TournamentTeams WHERE teamId = ?`,
[teamId],
(err: Error | null, rows: TournamentTeam[]) => {
if (err) return reject(err);
resolve(rows);
}
);
});
}
registerTeamForTournament(tournamentId: number, teamId: number): Promise<TournamentTeam> {
return new Promise<TournamentTeam>((resolve, reject) => {
const stmt = this.db.prepare(
`INSERT INTO TournamentTeams (tournamentId, teamId) VALUES (?, ?)`
);
stmt.run(tournamentId, teamId, function (this: RunResult, err: Error | null) {
if (err) return reject(err);
resolve({
id: (this as any).lastID,
tournamentId,
teamId,
registeredAt: new Date().toISOString(),
});
});
stmt.finalize();
});
}
removeTeamFromTournament(tournamentId: number, teamId: number): Promise<void> {
return new Promise((resolve, reject) => {
this.db.run(
`DELETE FROM TournamentTeams WHERE tournamentId = ? AND teamId = ?`,
[tournamentId, teamId],
(err: Error | null) => {
if (err) return reject(err);
resolve();
}
);
});
}
}

View File

@@ -1,4 +1,5 @@
import {Tournament} from '../models/tournament';
import {Team} from '../models/team';
import fs from 'fs';
import path from 'path';
import {Database, RunResult} from "sqlite3";
@@ -26,27 +27,83 @@ export class TournamentService {
getAllTournaments(): Promise<Tournament[]> {
return new Promise<Tournament[]>((resolve, reject) => {
this.db.all(`SELECT *
FROM Tournaments`, (err: RunResult, rows: Tournament[]) => {
if (!err) {
resolve(rows);
this.db.all(
`SELECT t.*, tm.id as teamId, tm.name as teamName, tm.tag as teamTag,
tm.description as teamDescription, tm.createdAt as teamCreatedAt
FROM Tournaments t
LEFT JOIN TournamentTeams tt ON t.id = tt.tournamentId
LEFT JOIN Teams tm ON tt.teamId = tm.id`,
(err: Error | null, rows: any[]) => {
if (err) return reject(err);
const tournamentsMap = new Map<number, Tournament>();
for (const row of rows) {
if (!tournamentsMap.has(row.id)) {
tournamentsMap.set(row.id, {
id: row.id,
name: row.name,
description: row.description,
maxTeamAmount: row.maxTeamAmount,
currentTeamAmount: row.currentTeamAmount,
registrationStartDate: row.registrationStartDate,
registrationEndDate: row.registrationEndDate,
teams: [],
});
}
if (row.teamId) {
tournamentsMap.get(row.id)!.teams!.push({
id: row.teamId,
name: row.teamName,
tag: row.teamTag,
description: row.teamDescription,
createdAt: row.teamCreatedAt,
} as Team);
}
}
resolve(Array.from(tournamentsMap.values()));
}
reject(err);
});
);
});
}
getTournamentById(id: number): Promise<Tournament> {
return new Promise<Tournament>((resolve, reject) => {
this.db.get(`Select *
From Tournaments
WHERE id = ${id}`, (err: RunResult, tournament: Tournament) => {
if (!err) {
getTournamentById(id: number): Promise<Tournament | undefined> {
return new Promise<Tournament | undefined>((resolve, reject) => {
this.db.all(
`SELECT t.*, tm.id as teamId, tm.name as teamName, tm.tag as teamTag,
tm.description as teamDescription, tm.createdAt as teamCreatedAt
FROM Tournaments t
LEFT JOIN TournamentTeams tt ON t.id = tt.tournamentId
LEFT JOIN Teams tm ON tt.teamId = tm.id
WHERE t.id = ?`,
[id],
(err: Error | null, rows: any[]) => {
if (err) return reject(err);
if (!rows || rows.length === 0) return resolve(undefined);
const first = rows[0];
const tournament: Tournament = {
id: first.id,
name: first.name,
description: first.description,
maxTeamAmount: first.maxTeamAmount,
currentTeamAmount: first.currentTeamAmount,
registrationStartDate: first.registrationStartDate,
registrationEndDate: first.registrationEndDate,
teams: [],
};
for (const row of rows) {
if (row.teamId) {
tournament.teams!.push({
id: row.teamId,
name: row.teamName,
tag: row.teamTag,
description: row.teamDescription,
createdAt: row.teamCreatedAt,
} as Team);
}
}
resolve(tournament);
}
reject(err);
});
})
);
});
}
addTournament(tournament: Tournament): Promise<void> {