import 'package:cabo_counter/data/db/database.dart'; import 'package:cabo_counter/data/db/tables/game_session_table.dart'; import 'package:cabo_counter/data/dto/game_session.dart'; import 'package:cabo_counter/data/dto/player.dart'; import 'package:cabo_counter/data/dto/round.dart'; import 'package:drift/drift.dart'; part 'game_session_dao.g.dart'; @DriftAccessor(tables: [GameSessionTable]) class GameSessionDao extends DatabaseAccessor with _$GameSessionDaoMixin { GameSessionDao(super.db); /// Retrieves a game session by its ID. Future getGameSession(String id) async { final query = select(gameSessionTable)..where((tbl) => tbl.id.equals(id)); final gameSessionResult = await query.getSingle(); List playerList = await db.playerDao.getPlayersByGameId(id); List roundList = await db.roundsDao.getRoundsByGameId(id); GameSession gameSession = GameSession( id: gameSessionResult.id, createdAt: gameSessionResult.createdAt, gameTitle: gameSessionResult.gameTitle, players: playerList, pointLimit: gameSessionResult.pointLimit, caboPenalty: gameSessionResult.caboPenalty, isPointsLimitEnabled: gameSessionResult.isPointsLimitEnabled, isGameFinished: gameSessionResult.isGameFinished, winner: gameSessionResult.winner ?? '', roundNumber: gameSessionResult.roundNumber, roundList: roundList); return gameSession; } /// Retrieves all game sessions from the database. Future> getAllGameSessions() async { final query = select(gameSessionTable); final gameSessionResults = await query.get(); List gameSessions = await Future.wait( gameSessionResults.map((row) async { List playerList = await db.playerDao.getPlayersByGameId(row.id); List roundList = await db.roundsDao.getRoundsByGameId(row.id); return GameSession( id: row.id, createdAt: row.createdAt, gameTitle: row.gameTitle, players: playerList, pointLimit: row.pointLimit, caboPenalty: row.caboPenalty, isPointsLimitEnabled: row.isPointsLimitEnabled, isGameFinished: row.isGameFinished, winner: row.winner ?? '', roundNumber: row.roundNumber, roundList: roundList, ); }), ); return gameSessions; } Future insertGameSession(GameSession gameSession) async { await into(gameSessionTable).insert( GameSessionTableCompanion.insert( id: gameSession.id, createdAt: gameSession.createdAt, gameTitle: gameSession.gameTitle, pointLimit: gameSession.pointLimit, caboPenalty: gameSession.caboPenalty, isPointsLimitEnabled: gameSession.isPointsLimitEnabled, isGameFinished: gameSession.isGameFinished, winner: Value(gameSession.winner), roundNumber: gameSession.roundNumber, ), ); db.playerDao.insertPlayers(gameSession.id, gameSession.players); db.roundsDao.insertMultipleRounds( gameSession.id, gameSession.roundList, gameSession.players); } }