diff --git a/Sources/App/Model/Database.swift b/Sources/App/Model/Database.swift index 4b39fd9..61e708c 100644 --- a/Sources/App/Model/Database.swift +++ b/Sources/App/Model/Database.swift @@ -90,7 +90,18 @@ final class Database { tables.getPublicTableInfos() } - func join(tableId: TableId, player: PlayerName) -> TableManagement.JoinTableResult { - tables.join(tableId: tableId, player: player) + func join(tableId: TableId, playerToken: SessionToken) -> JoinTableResult { + guard let player = players.registeredPlayerExists(withSessionToken: playerToken) else { + return .invalidToken + } + return tables.join(tableId: tableId, player: player) + } + + func leaveTable(playerToken: SessionToken) -> Bool { + guard let player = players.registeredPlayerExists(withSessionToken: playerToken) else { + return false + } + tables.remove(player: player) + return true } } diff --git a/Sources/App/Model/TableManagement.swift b/Sources/App/Model/TableManagement.swift index 4f2a809..3953dc2 100644 --- a/Sources/App/Model/TableManagement.swift +++ b/Sources/App/Model/TableManagement.swift @@ -79,8 +79,6 @@ final class TableManagement { players.append(player) if let oldTable = playerTables[tableId] { remove(player: player, fromTable: oldTable) - // TODO: End game if needed - // } tablePlayers[tableId] = players playerTables[tableId] = tableId @@ -89,10 +87,15 @@ final class TableManagement { func remove(player: PlayerName, fromTable tableId: TableId) { tablePlayers[tableId] = tablePlayers[tableId]?.filter { $0 != player } + // TODO: End connection for removed user + // TODO: End game if needed, send info to remaining players } func remove(player: PlayerName) { - fatalError() + guard let tableId = playerTables[player] else { + return + } + remove(player: player, fromTable: tableId) } func connect(player: PlayerName, using socket: WebSocket) -> Bool { diff --git a/Sources/App/routes.swift b/Sources/App/routes.swift index ea41da0..72f2aad 100644 --- a/Sources/App/routes.swift +++ b/Sources/App/routes.swift @@ -235,10 +235,9 @@ func routes(_ app: Application) throws { let token = req.body.string else { throw Abort(.badRequest) } - guard let player = database.registeredPlayerExists(withSessionToken: token) else { + switch database.join(tableId: table, playerToken: token) { + case .invalidToken: throw Abort(.unauthorized) // 401 - } - switch database.join(tableId: table, player: player) { case .tableNotFound: throw Abort(.gone) // 410 case .tableIsFull: @@ -247,4 +246,22 @@ func routes(_ app: Application) throws { return "" } } + + /** + Leave the current table. + - Parameter token: The session token of the player, as a string in the request body + - Throws: + - 400: Missing token + - 401: The session token is invalid + - Returns: Nothing + */ + app.post("table", "leave") { req -> String in + guard let token = req.body.string else { + throw Abort(.badRequest) + } + guard database.leaveTable(playerToken: token) else { + throw Abort(.unauthorized) // 401 + } + return "" + } }