Storage of gameDetails and players in it done
continuous-integration/drone/push Build is passing Details

ContinueLocalManager
Emre KARTAL 2 years ago
parent af233c821b
commit 8dc7454e26

@ -0,0 +1,10 @@
class PlayerFields {
static final List<String> values = [
idGame, name, image
];
static final String idGame = '_idGame';
static final String name = '_name';
static final String image = '_image';
}

@ -1,6 +1,6 @@
import 'package:bowl_in/model/GameDetail.dart'; import 'package:bowl_in/model/GameDetail.dart';
import '../../model/User.dart'; import '../../model/Player.dart';
import '../fields/GameDetailFields.dart'; import '../fields/GameDetailFields.dart';
class GameDetailMapper { class GameDetailMapper {
@ -13,13 +13,14 @@ class GameDetailMapper {
}; };
} }
static GameDetail toModel(Map<String, dynamic> json, User winner) { static GameDetail toModel(
Map<String, dynamic> json, Player? winner, List<Player> players) {
String dateString = json[GameDetailFields.date];
return GameDetail( return GameDetail(
json[GameDetailFields.id], json[GameDetailFields.id],
json[GameDetailFields.date], DateTime.parse(dateString),
json[winner], winner,
json[GameDetailFields.host], json[GameDetailFields.host],
[], players);
);
} }
} }

@ -1,4 +1,5 @@
import 'package:bowl_in/model/Game.dart'; import 'package:bowl_in/model/Game.dart';
import '../../model/Player.dart';
import '../../model/User.dart'; import '../../model/User.dart';
import '../fields/GameFields.dart'; import '../fields/GameFields.dart';
@ -12,12 +13,12 @@ class GameMapper {
}; };
} }
static Game toModel(Map<String, dynamic> json) { static Game toModel(Map<String, dynamic> json, List<Player> players) {
return Game( return Game(
json[GameFields.id], json[GameFields.id],
DateTime.parse(json[GameFields.date]), DateTime.parse(json[GameFields.date]),
json[GameFields.pointsCurrentUser], json[GameFields.pointsCurrentUser],
[], players
); );
} }
} }

@ -0,0 +1,21 @@
import 'package:bowl_in/database/fields/PlayerFields.dart';
import '../../model/Game.dart';
import '../../model/Player.dart';
class PlayerMapper {
static Map<String, dynamic> toJson(Player player, Game game) {
return {
PlayerFields.idGame: game.id,
PlayerFields.name: player.name,
PlayerFields.image: player.image,
};
}
static Player toModel(Map<String, dynamic> json) {
return Player(
json[PlayerFields.name],
json[PlayerFields.image]
);
}
}

@ -1,15 +1,20 @@
import 'package:bowl_in/database/fields/PlayerFields.dart';
import 'package:bowl_in/database/mappers/GameMapper.dart'; import 'package:bowl_in/database/mappers/GameMapper.dart';
import 'package:bowl_in/database/mappers/PlayerMapper.dart';
import 'package:bowl_in/database/mappers/StatMapper.dart'; import 'package:bowl_in/database/mappers/StatMapper.dart';
import 'package:bowl_in/model/Game.dart'; import 'package:bowl_in/model/Game.dart';
import 'package:bowl_in/model/GameDetail.dart';
import 'package:bowl_in/model/User.dart'; import 'package:bowl_in/model/User.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
import '../../model/Player.dart';
import '../../model/Stat.dart'; import '../../model/Stat.dart';
import '../fields/GameDetailFields.dart'; import '../fields/GameDetailFields.dart';
import '../fields/GameFields.dart'; import '../fields/GameFields.dart';
import '../fields/StatFields.dart'; import '../fields/StatFields.dart';
import '../fields/UserFields.dart'; import '../fields/UserFields.dart';
import '../mappers/GameDetailMapper.dart';
import '../mappers/UserMapper.dart'; import '../mappers/UserMapper.dart';
class BowlInDatabase { class BowlInDatabase {
@ -25,6 +30,7 @@ class BowlInDatabase {
static const String tableGame = 'games'; static const String tableGame = 'games';
static const String tableGameDetail = 'gameDetails'; static const String tableGameDetail = 'gameDetails';
static const String tableStat = 'stats'; static const String tableStat = 'stats';
static const String tablePlayer = 'players';
Future<Database> get database async { Future<Database> get database async {
if (_database != null) return _database!; if (_database != null) return _database!;
@ -38,7 +44,7 @@ class BowlInDatabase {
final path = join(dbPath, filePath); final path = join(dbPath, filePath);
return await openDatabase(path, return await openDatabase(path,
version: 1, onCreate: _createDB, onUpgrade: _upgradeDB); version: 6, onCreate: _createDB, onUpgrade: _upgradeDB);
} }
Future _createDB(Database db, int version) async { Future _createDB(Database db, int version) async {
@ -72,7 +78,7 @@ CREATE TABLE $tableGameDetail (
${GameDetailFields.id} $idType, ${GameDetailFields.id} $idType,
${GameDetailFields.date} $textType, ${GameDetailFields.date} $textType,
${GameDetailFields.nameWinner} $textType, ${GameDetailFields.nameWinner} $textType,
${GameDetailFields.host} $textType ${GameDetailFields.host} $integerType
) )
'''); ''');
@ -89,15 +95,26 @@ CREATE TABLE $tableStat (
${StatFields.avgPinsPerRound} $realType, ${StatFields.avgPinsPerRound} $realType,
FOREIGN KEY(${StatFields.idUser}) REFERENCES $tableUser(${UserFields.id}) FOREIGN KEY(${StatFields.idUser}) REFERENCES $tableUser(${UserFields.id})
) )
''');
await db.execute('''
CREATE TABLE $tablePlayer (
id $idType,
${PlayerFields.name} $textType,
${PlayerFields.image} $textType,
${PlayerFields.idGame} $integerType,
FOREIGN KEY(${PlayerFields.idGame}) REFERENCES $tableGame(${GameFields.id})
)
'''); ''');
} }
Future<void> _upgradeDB(Database db, int oldVersion, int newVersion) async { Future<void> _upgradeDB(Database db, int oldVersion, int newVersion) async {
if (oldVersion == 5) { if (oldVersion < 6 ) {
await db.execute('DROP TABLE IF EXISTS $tableUser'); await db.execute('DROP TABLE IF EXISTS $tableUser');
await db.execute('DROP TABLE IF EXISTS $tableGame'); await db.execute('DROP TABLE IF EXISTS $tableGame');
await db.execute('DROP TABLE IF EXISTS $tableGameDetail'); await db.execute('DROP TABLE IF EXISTS $tableGameDetail');
await db.execute('DROP TABLE IF EXISTS $tableStat'); await db.execute('DROP TABLE IF EXISTS $tableStat');
await db.execute('DROP TABLE IF EXISTS $tablePlayer');
await _createDB(db, newVersion); await _createDB(db, newVersion);
} }
} }
@ -121,14 +138,13 @@ CREATE TABLE $tableStat (
User user; User user;
if (stat != null) { if (stat != null) {
user = UserMapper.toModel(result.first, stat); user = UserMapper.toModel(result.first, stat);
} } else {
else {
user = UserMapper.toModel(result.first, Stat.empty()); user = UserMapper.toModel(result.first, Stat.empty());
} }
//final games = await readGame(id); final games = await readGame(id);
//for (var game in games!) { for (var game in games) {
//user.games.add(game); user.games.add(game);
//} }
return user; return user;
} else { } else {
return null; return null;
@ -146,7 +162,21 @@ CREATE TABLE $tableStat (
where: '${StatFields.idUser} = ?', whereArgs: [user.id]); where: '${StatFields.idUser} = ?', whereArgs: [user.id]);
// Insert new games for the user // Insert new games for the user
//await createGame(user); for (var game in user.games) {
var result = await txn.query(tableGame,
where: '${GameFields.id} = ? AND ${GameFields.userId} = ?',
whereArgs: [game.id, user.id]);
if (result.isNotEmpty) {
await txn.update(tableGame, GameMapper.toJson(game, user),
where: '${GameFields.id} = ? AND ${GameFields.userId} = ?',
whereArgs: [game.id, user.id]);
} else {
await txn.insert(tableGame, GameMapper.toJson(game, user));
for (var player in game.players) {
await txn.insert(tablePlayer, PlayerMapper.toJson(player, game));
}
}
}
}); });
} }
@ -166,6 +196,48 @@ CREATE TABLE $tableStat (
// GameDetail // GameDetail
Future<void> createGameDetail(GameDetail gameDetail) async {
final db = await instance.database;
await db.transaction((txn) async {
await txn.insert(tableGameDetail, GameDetailMapper.toJson(gameDetail));
});
}
Future<List<GameDetail>> readGameDetail() async {
final db = await instance.database;
final result = await db.query(tableGameDetail);
if (result.isNotEmpty) {
List<GameDetail> gameDetails = [];
for (var gameDetail in result) {
List<Player> players = [];
Player? winner = null;
final resultPlayer = await db.query(tablePlayer,
where: '${PlayerFields.idGame} = ?',
whereArgs: [gameDetail[GameDetailFields.id]]);
for (var player in resultPlayer) {
var winner;
var rPlayer = PlayerMapper.toModel(player);
players.add(rPlayer);
if (rPlayer.name == gameDetail[GameDetailFields.nameWinner]) {
winner = rPlayer;
}
}
gameDetails.add(GameDetailMapper.toModel(gameDetail, winner, players));
}
return gameDetails;
} else {
return [];
}
}
Future<int> deleteGameDetail() async {
final db = await instance.database;
return await db.delete(tableGameDetail);
}
// Game // Game
Future<void> createGame(User user) async { Future<void> createGame(User user) async {
@ -178,30 +250,45 @@ CREATE TABLE $tableStat (
}); });
} }
Future<List<Game>?> readGame(int id) async { Future<List<Game>> readGame(int id) async {
final db = await instance.database; final db = await instance.database;
final result = await db.query(tableGame, final result = await db
where: '${GameFields.userId} = ?', whereArgs: [id]); .query(tableGame, where: '${GameFields.userId} = ?', whereArgs: [id]);
if (result.isNotEmpty) { if (result.isNotEmpty) {
List<Game> games = []; List<Game> games = [];
for (var game in result) { for (var game in result) {
games.add(GameMapper.toModel(game)); List<Player> players = [];
final resultPlayer = await db.query(tablePlayer,
where: '${PlayerFields.idGame} = ?', whereArgs: [game[GameFields.id]]);
for (var player in resultPlayer) {
players.add(PlayerMapper.toModel(player));
}
games.add(GameMapper.toModel(game, players));
players = [];
} }
return games; return games;
} else { } else {
return null; return [];
} }
} }
Future<int> deleteGame(int id) async { Future<int> deleteGame(int id) async {
final db = await instance.database; final db = await instance.database;
return await db.delete( return await db.transaction((txn) async {
tableGame, await txn.delete(
where: '${GameFields.userId} = ?', tablePlayer,
whereArgs: [id], where: '${PlayerFields.idGame} IN (SELECT ${GameFields.id} FROM $tableGame WHERE ${GameFields.userId} = ?)',
); whereArgs: [id],
);
return await txn.delete(
tableGame,
where: '${GameFields.userId} = ?',
whereArgs: [id],
);
});
} }
// Stat // Stat
@ -213,8 +300,8 @@ CREATE TABLE $tableStat (
Future<Stat?> readStat(int id) async { Future<Stat?> readStat(int id) async {
final db = await instance.database; final db = await instance.database;
final result = await db.query(tableStat, final result = await db
where: '${StatFields.idUser} = ?', whereArgs: [id]); .query(tableStat, where: '${StatFields.idUser} = ?', whereArgs: [id]);
if (result.isNotEmpty) { if (result.isNotEmpty) {
Stat stat = StatMapper.toModel(result.first); Stat stat = StatMapper.toModel(result.first);
@ -240,7 +327,6 @@ CREATE TABLE $tableStat (
where: '${StatFields.idUser} = ?', where: '${StatFields.idUser} = ?',
whereArgs: [id], whereArgs: [id],
); );
} }
Future close() async { Future close() async {

@ -1,4 +1,5 @@
import 'package:bowl_in/model/LocalManager/LocalData.dart'; import 'package:bowl_in/model/LocalManager/LocalData.dart';
import 'package:bowl_in/model/StubManager/StubData.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:bowl_in/config/app_router.dart'; import 'package:bowl_in/config/app_router.dart';

@ -41,6 +41,7 @@ class GamePlayer {
game.computeScores(); game.computeScores();
_parent.userMgr.saveUser(_parent.userCurrent); _parent.userMgr.saveUser(_parent.userCurrent);
_parent.gameMgr.saveGame(_game);
context?.go("/scoreboard", extra: game); context?.go("/scoreboard", extra: game);
} else { } else {
print("IN GAME : " + currentRoundIndex.toString()); print("IN GAME : " + currentRoundIndex.toString());

@ -3,6 +3,7 @@ import 'Player.dart';
abstract class IGameManager { abstract class IGameManager {
GameDetail getGameById(int id); GameDetail getGameById(int id);
saveGame(GameDetail gameDetail);
List<GameDetail> getGamesByPlayerId(int id); List<GameDetail> getGamesByPlayerId(int id);
List<GameDetail> getGamesByPlayer(Player user); List<GameDetail> getGamesByPlayer(Player user);
List<GameDetail> getGamesByPlayers(List<Player> users); List<GameDetail> getGamesByPlayers(List<Player> users);

@ -9,9 +9,15 @@ class GameManager extends IGameManager {
final LocalData parent; final LocalData parent;
// Constructor // Constructor
GameManager(this.parent); GameManager(this.parent){
_initGame();
}
// Methods // Methods
_initGame() async {
parent.gameDetails = await parent.database.readGameDetail();
}
GameDetail getGameById(int id) { GameDetail getGameById(int id) {
for (var element in parent.gameDetails) { for (var element in parent.gameDetails) {
if (element.id == id) { if (element.id == id) {
@ -21,6 +27,10 @@ class GameManager extends IGameManager {
throw Exception("Game not found."); throw Exception("Game not found.");
} }
saveGame(GameDetail gameDetail) async {
await parent.database.createGameDetail(gameDetail);
}
List<GameDetail> getGamesByPlayerId(int id) { List<GameDetail> getGamesByPlayerId(int id) {
List<GameDetail> games = []; List<GameDetail> games = [];
for (var element in parent.gameDetails) { for (var element in parent.gameDetails) {

@ -16,4 +16,8 @@ class LocalData extends IManager {
List<GameDetail> get gameDetails => _gameDetails; List<GameDetail> get gameDetails => _gameDetails;
set gameDetails(List<GameDetail> gameDetails) {
_gameDetails = gameDetails;
}
} }

@ -9,18 +9,18 @@ class UserManager extends IUserManager {
// Constructor // Constructor
UserManager(this.parent) : super(AuthManager(parent)) { UserManager(this.parent) : super(AuthManager(parent)) {
//User user = User(0, "Victor", "./assets/images/image_user_red.png", "", [], []);
//saveUser(user);
//parent.database.deleteUser(0);
//test();
_initUser(); _initUser();
} }
_initUser() async { _initUser() async {
//await parent.database.deleteGameDetail();
//await parent.database.deleteUser(0);
//User crUser = User(0, "Lucas", "./assets/images/image_user_red.png", "", [], []);
//await saveUser(crUser);
var user = await parent.database.readUser(0); var user = await parent.database.readUser(0);
if (user == null) { if (user == null) {
User user2 = User user2 =
User(1, "Unknown", "./assets/images/image_user_cyan.png", "", [], []); User(0, "Unknown", "./assets/images/image_user_pink.png", "", [], []);
parent.userCurrent = user2; parent.userCurrent = user2;
} else { } else {
parent.userCurrent = user; parent.userCurrent = user;

@ -22,6 +22,10 @@ class GameManager extends IGameManager {
throw Exception("Game not found."); throw Exception("Game not found.");
} }
saveGame(GameDetail gameDetail) {
return ;
}
List<GameDetail> getGamesByPlayerId(int id) { List<GameDetail> getGamesByPlayerId(int id) {
List<GameDetail> games = []; List<GameDetail> games = [];
for (var element in parent.gameDetails) { for (var element in parent.gameDetails) {

Loading…
Cancel
Save