Skip to content

Commit e0bcc4b

Browse files
authored
Merge pull request SaboStudios#218 from ogazboiz/feature/161-leave-game-endpoint
[BE] Implement leave game endpoint
2 parents a6beb8a + f16ec28 commit e0bcc4b

3 files changed

Lines changed: 44 additions & 313 deletions

File tree

backend/package-lock.json

Lines changed: 0 additions & 313 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/src/modules/games/game-players.service.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,39 @@ export class GamePlayersService {
9696
return player;
9797
}
9898

99+
async leaveGameForUser(gameId: number, userId: number): Promise<void> {
100+
const game = await this.gameRepository.findOne({ where: { id: gameId } });
101+
if (!game) {
102+
throw new NotFoundException(`Game ${gameId} not found`);
103+
}
104+
if (game.status !== GameStatus.PENDING) {
105+
throw new BadRequestException('Cannot leave game after it has started');
106+
}
107+
108+
const player = await this.gamePlayerRepository.findOne({
109+
where: { game_id: gameId, user_id: userId },
110+
});
111+
if (!player) {
112+
throw new NotFoundException(
113+
`User ${userId} is not a player in game ${gameId}`,
114+
);
115+
}
116+
117+
if (player.turn_order !== null) {
118+
await this.gamePlayerRepository
119+
.createQueryBuilder()
120+
.update(GamePlayer)
121+
.set({ turn_order: () => 'turn_order - 1' })
122+
.where('game_id = :gameId', { gameId })
123+
.andWhere('turn_order > :turnOrder', {
124+
turnOrder: player.turn_order,
125+
})
126+
.execute();
127+
}
128+
129+
await this.gamePlayerRepository.delete(player.id);
130+
}
131+
99132
private async isGameStarted(gameId: number): Promise<boolean> {
100133
const game = await this.gameRepository.findOne({ where: { id: gameId } });
101134
if (!game) return false;

0 commit comments

Comments
 (0)