@@ -4,27 +4,14 @@ import { Lobby } from "../interfaces/Lobbies";
44import { User } from "interfaces/User" ;
55import { IUserService } from "./UserService" ;
66
7- interface LobbyUser {
8- username : string ;
9- user_id : string ;
10- verified : boolean ;
11- steam_username ?: string ;
12- steam_avatar_url ?: string ;
13- steam_id ?: string ;
14- }
15-
167export interface ILobbyService {
178 getLobby ( lobbyId : string ) : Promise < Lobby | null > ;
18- getFormattedLobby ( lobbyId : string ) : Promise < { lobbyId : string ; users : LobbyUser [ ] } | null > ;
199 joinLobby ( lobbyId : string , userId : string ) : Promise < void > ;
2010 leaveLobby ( lobbyId : string , userId : string ) : Promise < void > ;
21- getUserLobby (
22- userId : string
23- ) : Promise < Lobby | null > ;
24- getFormattedLobbyUsers ( userIds : string [ ] ) : Promise < LobbyUser [ ] > ;
11+ getUserLobby ( userId : string ) : Promise < Lobby | null > ;
2512 createLobby ( lobbyId : string , users ?: string [ ] ) : Promise < void > ;
2613 deleteLobby ( lobbyId : string ) : Promise < void > ;
27- getUserLobbies ( userId : string ) : Promise < { lobbyId : string ; users : string } [ ] > ;
14+ getUserLobbies ( userId : string ) : Promise < Lobby [ ] > ;
2815 leaveAllLobbies ( userId : string ) : Promise < void > ;
2916}
3017
@@ -36,21 +23,23 @@ export class LobbyService implements ILobbyService {
3623 ) { }
3724
3825 async getLobby ( lobbyId : string ) : Promise < Lobby | null > {
39- const rows = await this . databaseService . read < Lobby > (
40- "SELECT users FROM lobbies WHERE lobbyId = ?" ,
26+ const lobby = await this . databaseService . read < {
27+ lobbyId : string ;
28+ users : string [ ] ;
29+ } > (
30+ "SELECT lobbyId, users FROM lobbies WHERE lobbyId = ?" ,
4131 [ lobbyId ]
4232 ) ;
43- return rows [ 0 ] || null ;
44- }
4533
46- async getFormattedLobby ( lobbyId : string ) : Promise < { lobbyId : string ; users : LobbyUser [ ] } | null > {
47- const lobby = await this . getLobby ( lobbyId ) ;
48- if ( ! lobby ) return null ;
34+ if ( lobby . length === 0 ) return null ;
35+
36+ const userIds = lobby [ 0 ] . users ;
37+ const users = await this . getUsersByIds ( userIds ) ;
4938
50- const users = lobby . users ;
51- return { lobbyId, users } ;
39+ return { lobbyId : lobby [ 0 ] . lobbyId , users } ;
5240 }
5341
42+
5443 async joinLobby ( lobbyId : string , userId : string ) : Promise < void > {
5544 const lobby = await this . getLobby ( lobbyId ) ;
5645 if ( ! lobby ) throw new Error ( "Lobby not found" ) ;
@@ -75,31 +64,21 @@ export class LobbyService implements ILobbyService {
7564 }
7665 }
7766
78- async getUserLobby (
79- userId : string
80- ) : Promise < Lobby | null > {
81- const rows = await this . databaseService . read < Lobby > ( "SELECT lobbyId, users FROM lobbies WHERE JSON_EXTRACT(users, '$') LIKE ?" ,
82- [ `%"${ userId } "%` ] ) ;
83-
84- if ( rows . length === 0 ) return null ;
85-
86- const row = rows [ 0 ] ;
87- const users = row . users
88- return { lobbyId : row . lobbyId , users } ;
89- }
90-
91- async getFormattedLobbyUsers ( userIds : string [ ] ) : Promise < LobbyUser [ ] > {
92- if ( userIds . length === 0 ) return [ ] ;
93-
94- const placeholders = userIds . map ( ( ) => '?' ) . join ( ',' ) ;
95- const users = await this . databaseService . read < User > (
96- `SELECT user_id, username, verified, steam_username, steam_avatar_url, steam_id
97- FROM users
98- WHERE user_id IN (${ placeholders } )` ,
99- userIds
67+ async getUserLobby ( userId : string ) : Promise < Lobby | null > {
68+ const lobbies = await this . databaseService . read < {
69+ lobbyId : string ;
70+ users : string [ ] ;
71+ } > (
72+ "SELECT lobbyId, users FROM lobbies WHERE JSON_EXTRACT(users, '$') LIKE ?" ,
73+ [ `%"${ userId } "%` ]
10074 ) ;
101-
102- return users . map ( mapLobbyUser ) ;
75+
76+ if ( lobbies . length === 0 ) return null ;
77+
78+ const lobby = lobbies [ 0 ] ;
79+ const userIds = lobby . users ;
80+ const users = await this . getUsersByIds ( userIds ) ;
81+ return { lobbyId : lobby . lobbyId , users } ;
10382 }
10483
10584 async createLobby ( lobbyId : string , users : string [ ] = [ ] ) : Promise < void > {
@@ -115,11 +94,22 @@ export class LobbyService implements ILobbyService {
11594 ] ) ;
11695 }
11796
118- async getUserLobbies ( userId : string ) : Promise < { lobbyId : string ; users : string } [ ] > {
119- return await this . databaseService . read < { lobbyId : string ; users : string } > (
97+ async getUserLobbies ( userId : string ) : Promise < Lobby [ ] > {
98+ const lobbies = await this . databaseService . read < {
99+ lobbyId : string ;
100+ users : string [ ] ;
101+ } > (
120102 "SELECT lobbyId, users FROM lobbies WHERE JSON_EXTRACT(users, '$') LIKE ?" ,
121103 [ `%"${ userId } "%` ]
122104 ) ;
105+
106+ return Promise . all (
107+ lobbies . map ( async ( lobby ) => {
108+ const userIds = lobby . users ;
109+ const users = await this . getUsersByIds ( userIds ) ;
110+ return { lobbyId : lobby . lobbyId , users } ;
111+ } )
112+ ) ;
123113 }
124114
125115 async leaveAllLobbies ( userId : string ) : Promise < void > {
@@ -128,15 +118,15 @@ export class LobbyService implements ILobbyService {
128118 await this . leaveLobby ( lobby . lobbyId , userId ) ;
129119 }
130120 }
131- }
132121
133- function mapLobbyUser ( user : User ) : LobbyUser {
134- return {
135- username : user . username ,
136- user_id : user . user_id ,
137- verified : user . verified ,
138- steam_username : user . steam_username ,
139- steam_avatar_url : user . steam_avatar_url ,
140- steam_id : user . steam_id ,
141- } ;
142- }
122+ private async getUsersByIds ( userIds : string [ ] ) : Promise < User [ ] > {
123+ if ( userIds . length === 0 ) return [ ] ;
124+
125+ return await this . databaseService . read < User > (
126+ `SELECT user_id, username, verified, admin FROM users WHERE user_id IN (${ userIds
127+ . map ( ( ) => "?" )
128+ . join ( "," ) } )`,
129+ userIds
130+ ) ;
131+ }
132+ }
0 commit comments