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 '../../model/User.dart';
import '../../model/Player.dart';
import '../fields/GameDetailFields.dart';
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(
json[GameDetailFields.id],
json[GameDetailFields.date],
json[winner],
json[GameDetailFields.host],
[],
);
json[GameDetailFields.id],
DateTime.parse(dateString),
winner,
json[GameDetailFields.host],
players);
}
}

@ -1,4 +1,5 @@
import 'package:bowl_in/model/Game.dart';
import '../../model/Player.dart';
import '../../model/User.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(
json[GameFields.id],
DateTime.parse(json[GameFields.date]),
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/PlayerMapper.dart';
import 'package:bowl_in/database/mappers/StatMapper.dart';
import 'package:bowl_in/model/Game.dart';
import 'package:bowl_in/model/GameDetail.dart';
import 'package:bowl_in/model/User.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import '../../model/Player.dart';
import '../../model/Stat.dart';
import '../fields/GameDetailFields.dart';
import '../fields/GameFields.dart';
import '../fields/StatFields.dart';
import '../fields/UserFields.dart';
import '../mappers/GameDetailMapper.dart';
import '../mappers/UserMapper.dart';
class BowlInDatabase {
@ -25,6 +30,7 @@ class BowlInDatabase {
static const String tableGame = 'games';
static const String tableGameDetail = 'gameDetails';
static const String tableStat = 'stats';
static const String tablePlayer = 'players';
Future<Database> get database async {
if (_database != null) return _database!;
@ -38,7 +44,7 @@ class BowlInDatabase {
final path = join(dbPath, filePath);
return await openDatabase(path,
version: 1, onCreate: _createDB, onUpgrade: _upgradeDB);
version: 6, onCreate: _createDB, onUpgrade: _upgradeDB);
}
Future _createDB(Database db, int version) async {
@ -72,7 +78,7 @@ CREATE TABLE $tableGameDetail (
${GameDetailFields.id} $idType,
${GameDetailFields.date} $textType,
${GameDetailFields.nameWinner} $textType,
${GameDetailFields.host} $textType
${GameDetailFields.host} $integerType
)
''');
@ -89,15 +95,26 @@ CREATE TABLE $tableStat (
${StatFields.avgPinsPerRound} $realType,
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 {
if (oldVersion == 5) {
if (oldVersion < 6 ) {
await db.execute('DROP TABLE IF EXISTS $tableUser');
await db.execute('DROP TABLE IF EXISTS $tableGame');
await db.execute('DROP TABLE IF EXISTS $tableGameDetail');
await db.execute('DROP TABLE IF EXISTS $tableStat');
await db.execute('DROP TABLE IF EXISTS $tablePlayer');
await _createDB(db, newVersion);
}
}
@ -121,14 +138,13 @@ CREATE TABLE $tableStat (
User user;
if (stat != null) {
user = UserMapper.toModel(result.first, stat);
}
else {
} else {
user = UserMapper.toModel(result.first, Stat.empty());
}
//final games = await readGame(id);
//for (var game in games!) {
//user.games.add(game);
//}
final games = await readGame(id);
for (var game in games) {
user.games.add(game);
}
return user;
} else {
return null;
@ -146,7 +162,21 @@ CREATE TABLE $tableStat (
where: '${StatFields.idUser} = ?', whereArgs: [user.id]);
// 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
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
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 result = await db.query(tableGame,
where: '${GameFields.userId} = ?', whereArgs: [id]);
final result = await db
.query(tableGame, where: '${GameFields.userId} = ?', whereArgs: [id]);
if (result.isNotEmpty) {
List<Game> games = [];
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;
} else {
return null;
return [];
}
}
Future<int> deleteGame(int id) async {
final db = await instance.database;
return await db.delete(
tableGame,
where: '${GameFields.userId} = ?',
whereArgs: [id],
);
return await db.transaction((txn) async {
await txn.delete(
tablePlayer,
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
@ -213,8 +300,8 @@ CREATE TABLE $tableStat (
Future<Stat?> readStat(int id) async {
final db = await instance.database;
final result = await db.query(tableStat,
where: '${StatFields.idUser} = ?', whereArgs: [id]);
final result = await db
.query(tableStat, where: '${StatFields.idUser} = ?', whereArgs: [id]);
if (result.isNotEmpty) {
Stat stat = StatMapper.toModel(result.first);
@ -240,7 +327,6 @@ CREATE TABLE $tableStat (
where: '${StatFields.idUser} = ?',
whereArgs: [id],
);
}
Future close() async {

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

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

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

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

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

@ -9,18 +9,18 @@ class UserManager extends IUserManager {
// Constructor
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() 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);
if (user == null) {
User user2 =
User(1, "Unknown", "./assets/images/image_user_cyan.png", "", [], []);
User(0, "Unknown", "./assets/images/image_user_pink.png", "", [], []);
parent.userCurrent = user2;
} else {
parent.userCurrent = user;

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

Loading…
Cancel
Save