Add Teams endpoint and endpoints with service
This commit is contained in:
149
backend_splatournament_manager/src/services/team-service.ts
Normal file
149
backend_splatournament_manager/src/services/team-service.ts
Normal 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();
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user