Merge pull request 'ContinueLocalManager' (#28) from ContinueLocalManager into master
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
Reviewed-on: #28deployed
commit
891c661dbb
@ -0,0 +1,10 @@
|
|||||||
|
class GameFields {
|
||||||
|
static final List<String> values = [
|
||||||
|
id, date, pointsCurrentUser, userId
|
||||||
|
];
|
||||||
|
|
||||||
|
static final String id = '_id';
|
||||||
|
static final String date = '_date';
|
||||||
|
static final String pointsCurrentUser = '_points_current_user';
|
||||||
|
static final String userId = '_user_id';
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
class GameDetailFields {
|
||||||
|
static final List<String> values = [
|
||||||
|
id, date, nameWinner, host
|
||||||
|
];
|
||||||
|
|
||||||
|
static final String id = '_id';
|
||||||
|
static final String date = '_date';
|
||||||
|
static final String nameWinner = '_winner_id';
|
||||||
|
static final String host = '_host';
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
class GameFields {
|
||||||
|
static final List<String> values = [
|
||||||
|
id, date, pointsCurrentUser, userId
|
||||||
|
];
|
||||||
|
|
||||||
|
static final String id = '_id';
|
||||||
|
static final String date = '_date';
|
||||||
|
static final String pointsCurrentUser = '_points_current_user';
|
||||||
|
static final String userId = '_user_id';
|
||||||
|
}
|
@ -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';
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
|||||||
|
class StatFields {
|
||||||
|
static final List<String> values = [
|
||||||
|
idUser, nbVictory, nbGames, highscore, nbStrikes, nbSpares, nbScore, avgScore, avgPinsPerRound
|
||||||
|
];
|
||||||
|
|
||||||
|
static final String nbVictory = '_nbVictory';
|
||||||
|
static final String nbGames = '_nbGames';
|
||||||
|
static final String highscore = '_highscore';
|
||||||
|
static final String nbStrikes = '_nbStrikes';
|
||||||
|
static final String nbSpares = '_nbSpares';
|
||||||
|
static final String nbScore = '_nbScore';
|
||||||
|
static final String avgScore = '_avgScore';
|
||||||
|
static final String avgPinsPerRound = '_avgPinsPerRound';
|
||||||
|
static final String idUser = '_idUser';
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
class UserFields {
|
||||||
|
static final List<String> values = [
|
||||||
|
id, name, image, mail
|
||||||
|
];
|
||||||
|
|
||||||
|
static final String id = '_id';
|
||||||
|
static final String name = '_name';
|
||||||
|
static final String image = '_image';
|
||||||
|
static final String mail = '_mail';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
import 'package:bowl_in/model/GameDetail.dart';
|
||||||
|
|
||||||
|
import '../../model/Player.dart';
|
||||||
|
import '../fields/GameDetailFields.dart';
|
||||||
|
|
||||||
|
class GameDetailMapper {
|
||||||
|
static Map<String, dynamic> toJson(GameDetail gameDetail) {
|
||||||
|
return {
|
||||||
|
GameDetailFields.id: gameDetail.id,
|
||||||
|
GameDetailFields.date: gameDetail.time.toIso8601String(),
|
||||||
|
GameDetailFields.nameWinner: gameDetail.winner?.name,
|
||||||
|
GameDetailFields.host: gameDetail.host
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static GameDetail toModel(
|
||||||
|
Map<String, dynamic> json, Player? winner, List<Player> players) {
|
||||||
|
String dateString = json[GameDetailFields.date];
|
||||||
|
return GameDetail(
|
||||||
|
json[GameDetailFields.id],
|
||||||
|
DateTime.parse(dateString),
|
||||||
|
winner,
|
||||||
|
json[GameDetailFields.host],
|
||||||
|
players);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
import 'package:bowl_in/model/Game.dart';
|
||||||
|
import '../../model/Player.dart';
|
||||||
|
import '../../model/User.dart';
|
||||||
|
import '../fields/GameFields.dart';
|
||||||
|
|
||||||
|
class GameMapper {
|
||||||
|
static Map<String, dynamic> toJson(Game game, User user) {
|
||||||
|
return {
|
||||||
|
GameFields.id: game.id,
|
||||||
|
GameFields.date: game.date.toIso8601String(),
|
||||||
|
GameFields.pointsCurrentUser: game.pointsCurrentUser,
|
||||||
|
GameFields.userId: user.id,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
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]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
import 'package:bowl_in/database/fields/StatFields.dart';
|
||||||
|
import '../../model/Stat.dart';
|
||||||
|
import '../../model/User.dart';
|
||||||
|
|
||||||
|
class StatMapper {
|
||||||
|
static Map<String, dynamic> toJson(Stat stat, User user) {
|
||||||
|
return {
|
||||||
|
StatFields.idUser: user.id,
|
||||||
|
StatFields.nbVictory: stat.nbVictory,
|
||||||
|
StatFields.nbGames: stat.nbGames,
|
||||||
|
StatFields.highscore: stat.highscore,
|
||||||
|
StatFields.nbStrikes: stat.nbStrikes,
|
||||||
|
StatFields.nbSpares: stat.nbSpares,
|
||||||
|
StatFields.nbScore: stat.nbScore,
|
||||||
|
StatFields.avgScore: stat.avgScore,
|
||||||
|
StatFields.avgPinsPerRound: stat.avgPinsPerRound
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static Stat toModel(Map<String, dynamic> json) {
|
||||||
|
return Stat(
|
||||||
|
json[StatFields.nbVictory],
|
||||||
|
json[StatFields.nbGames],
|
||||||
|
json[StatFields.highscore],
|
||||||
|
json[StatFields.nbStrikes],
|
||||||
|
json[StatFields.nbSpares],
|
||||||
|
json[StatFields.nbScore],
|
||||||
|
json[StatFields.avgScore],
|
||||||
|
json[StatFields.avgPinsPerRound]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
import '../../model/Stat.dart';
|
||||||
|
import '../../model/User.dart';
|
||||||
|
import '../fields/UserFields.dart';
|
||||||
|
|
||||||
|
class UserMapper {
|
||||||
|
static Map<String, dynamic> toJson(User user) {
|
||||||
|
return {
|
||||||
|
UserFields.id: user.id,
|
||||||
|
UserFields.name: user.name,
|
||||||
|
UserFields.image: user.image,
|
||||||
|
UserFields.mail: user.mail,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static User toModel(Map<String, dynamic> json, Stat stat) {
|
||||||
|
return User.withStat(
|
||||||
|
json[UserFields.id],
|
||||||
|
json[UserFields.name],
|
||||||
|
json[UserFields.image],
|
||||||
|
json[UserFields.mail],
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
stat
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,336 @@
|
|||||||
|
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 {
|
||||||
|
BowlInDatabase();
|
||||||
|
|
||||||
|
static final BowlInDatabase instance = BowlInDatabase._init();
|
||||||
|
|
||||||
|
static Database? _database;
|
||||||
|
|
||||||
|
BowlInDatabase._init();
|
||||||
|
|
||||||
|
static const String tableUser = 'users';
|
||||||
|
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!;
|
||||||
|
|
||||||
|
_database = await _initDB('user.db');
|
||||||
|
return _database!;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Database> _initDB(String filePath) async {
|
||||||
|
final dbPath = await getDatabasesPath();
|
||||||
|
final path = join(dbPath, filePath);
|
||||||
|
|
||||||
|
return await openDatabase(path,
|
||||||
|
version: 6, onCreate: _createDB, onUpgrade: _upgradeDB);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future _createDB(Database db, int version) async {
|
||||||
|
const idType = 'INTEGER PRIMARY KEY AUTOINCREMENT';
|
||||||
|
const textType = 'TEXT NOT NULL';
|
||||||
|
const boolType = 'BOOLEAN NOT NULL';
|
||||||
|
const integerType = 'INTEGER NOT NULL';
|
||||||
|
const realType = 'REAL NOT NULL';
|
||||||
|
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE $tableUser (
|
||||||
|
${UserFields.id} $idType,
|
||||||
|
${UserFields.name} $boolType,
|
||||||
|
${UserFields.image} $textType,
|
||||||
|
${UserFields.mail} $textType
|
||||||
|
)
|
||||||
|
''');
|
||||||
|
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE $tableGame (
|
||||||
|
${GameFields.id} $idType,
|
||||||
|
${GameFields.date} $textType,
|
||||||
|
${GameFields.pointsCurrentUser} $integerType,
|
||||||
|
${GameFields.userId} $integerType,
|
||||||
|
FOREIGN KEY(${GameFields.userId}) REFERENCES $tableUser(${UserFields.id})
|
||||||
|
)
|
||||||
|
''');
|
||||||
|
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE $tableGameDetail (
|
||||||
|
${GameDetailFields.id} $idType,
|
||||||
|
${GameDetailFields.date} $textType,
|
||||||
|
${GameDetailFields.nameWinner} $textType,
|
||||||
|
${GameDetailFields.host} $integerType
|
||||||
|
)
|
||||||
|
''');
|
||||||
|
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE $tableStat (
|
||||||
|
${StatFields.idUser} $integerType,
|
||||||
|
${StatFields.nbVictory} $integerType,
|
||||||
|
${StatFields.nbGames} $integerType,
|
||||||
|
${StatFields.highscore} $integerType,
|
||||||
|
${StatFields.nbStrikes} $integerType,
|
||||||
|
${StatFields.nbSpares} $integerType,
|
||||||
|
${StatFields.nbScore} $integerType,
|
||||||
|
${StatFields.avgScore} $realType,
|
||||||
|
${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 < 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// User
|
||||||
|
|
||||||
|
Future<void> createUser(User user) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
await db.insert(tableUser, UserMapper.toJson(user));
|
||||||
|
await createStat(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<User?> readUser(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
final result = await db
|
||||||
|
.query(tableUser, where: '${UserFields.id} = ?', whereArgs: [id]);
|
||||||
|
|
||||||
|
if (result.isNotEmpty) {
|
||||||
|
final stat = await readStat(id);
|
||||||
|
|
||||||
|
User user;
|
||||||
|
if (stat != null) {
|
||||||
|
user = UserMapper.toModel(result.first, stat);
|
||||||
|
} else {
|
||||||
|
user = UserMapper.toModel(result.first, Stat.empty());
|
||||||
|
}
|
||||||
|
final games = await readGame(id);
|
||||||
|
for (var game in games) {
|
||||||
|
user.games.add(game);
|
||||||
|
}
|
||||||
|
return user;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateUser(User user) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
await db.transaction((txn) async {
|
||||||
|
await txn.update(tableUser, UserMapper.toJson(user),
|
||||||
|
where: '${UserFields.id} = ?', whereArgs: [user.id]);
|
||||||
|
|
||||||
|
await txn.update(tableStat, StatMapper.toJson(user.stat, user),
|
||||||
|
where: '${StatFields.idUser} = ?', whereArgs: [user.id]);
|
||||||
|
|
||||||
|
// Insert new games for the 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<int> deleteUser(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
await deleteGame(id);
|
||||||
|
|
||||||
|
await deleteStat(id);
|
||||||
|
|
||||||
|
return await db.delete(
|
||||||
|
tableUser,
|
||||||
|
where: '${UserFields.id} = ?',
|
||||||
|
whereArgs: [id],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 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 {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
await db.transaction((txn) async {
|
||||||
|
for (var game in user.games) {
|
||||||
|
await txn.insert(tableGame, GameMapper.toJson(game, user));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<Game>> readGame(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
final result = await db
|
||||||
|
.query(tableGame, where: '${GameFields.userId} = ?', whereArgs: [id]);
|
||||||
|
|
||||||
|
if (result.isNotEmpty) {
|
||||||
|
List<Game> games = [];
|
||||||
|
for (var game in result) {
|
||||||
|
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 [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<int> deleteGame(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Future<void> createStat(User user) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
await db.insert(tableStat, StatMapper.toJson(Stat.empty(), user));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Stat?> readStat(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
final result = await db
|
||||||
|
.query(tableStat, where: '${StatFields.idUser} = ?', whereArgs: [id]);
|
||||||
|
|
||||||
|
if (result.isNotEmpty) {
|
||||||
|
Stat stat = StatMapper.toModel(result.first);
|
||||||
|
return stat;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateStat(User user) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
await db.transaction((txn) async {
|
||||||
|
await txn.update(tableStat, StatMapper.toJson(user.stat, user),
|
||||||
|
where: '${StatFields.idUser} = ?', whereArgs: [user.id]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<int> deleteStat(int id) async {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
return await db.delete(
|
||||||
|
tableStat,
|
||||||
|
where: '${StatFields.idUser} = ?',
|
||||||
|
whereArgs: [id],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future close() async {
|
||||||
|
final db = await instance.database;
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
import 'package:bowl_in/model/IAuthManager.dart';
|
||||||
|
import 'package:bowl_in/model/LocalManager/LocalData.dart';
|
||||||
|
|
||||||
|
class AuthManager extends IAuthManager {
|
||||||
|
final LocalData parent;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
AuthManager(this.parent);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool verifiedUser(String mail, String password) {
|
||||||
|
// TODO: implement verifiedUser
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,101 @@
|
|||||||
|
import 'package:bowl_in/model/GameDetail.dart';
|
||||||
|
import 'package:bowl_in/model/IGameManager.dart';
|
||||||
|
import 'package:bowl_in/model/LocalManager/LocalData.dart';
|
||||||
|
import 'package:bowl_in/model/Player.dart';
|
||||||
|
|
||||||
|
import '../User.dart';
|
||||||
|
|
||||||
|
class GameManager extends IGameManager {
|
||||||
|
final LocalData parent;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
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) {
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
for (Player player in element.players) {
|
||||||
|
if (player is User && player.id == id) {
|
||||||
|
games.add(element);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<GameDetail> getGamesByPlayer(Player user) {
|
||||||
|
List<GameDetail> games = [];
|
||||||
|
for (var element in parent.gameDetails) {
|
||||||
|
for (Player player in element.players) {
|
||||||
|
if (player is User && user is User && player.id == user.id) {
|
||||||
|
games.add(element);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<GameDetail> getGamesByPlayers(List<Player> users) {
|
||||||
|
List<GameDetail> games = [];
|
||||||
|
for (var element in parent.gameDetails) {
|
||||||
|
if (element.players.toSet().containsAll(users.toSet())) {
|
||||||
|
games.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Player> getPlayersByIdGame(int id) {
|
||||||
|
List<Player> players = [];
|
||||||
|
for (var element in parent.gameDetails) {
|
||||||
|
if (element.id == id) {
|
||||||
|
for (var player in element.players) {
|
||||||
|
players.add(player);
|
||||||
|
}
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw Exception("Game not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Player, int> getRankByIdGame(int id) {
|
||||||
|
for (var game in parent.gameDetails) {
|
||||||
|
if (game.id == id) {
|
||||||
|
return game.getRank();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw Exception("Game not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
addGame(GameDetail gd) {
|
||||||
|
parent.gameDetails.add(gd);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int getNextId() {
|
||||||
|
return parent.gameDetails.length;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
import 'package:bowl_in/database/sqlflite/BowlInDatabase.dart';
|
||||||
|
import 'package:bowl_in/model/IManager.dart';
|
||||||
|
import '../GameDetail.dart';
|
||||||
|
import 'GameManager.dart';
|
||||||
|
import 'UserManager.dart';
|
||||||
|
|
||||||
|
class LocalData extends IManager {
|
||||||
|
final BowlInDatabase database = BowlInDatabase();
|
||||||
|
|
||||||
|
LocalData() {
|
||||||
|
userMgr = UserManager(this);
|
||||||
|
gameMgr = GameManager(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<GameDetail> _gameDetails = [];
|
||||||
|
|
||||||
|
List<GameDetail> get gameDetails => _gameDetails;
|
||||||
|
|
||||||
|
set gameDetails(List<GameDetail> gameDetails) {
|
||||||
|
_gameDetails = gameDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
import 'package:bowl_in/model/IUserManager.dart';
|
||||||
|
import 'package:bowl_in/model/LocalManager/LocalData.dart';
|
||||||
|
import 'package:bowl_in/model/Player.dart';
|
||||||
|
import 'package:bowl_in/model/User.dart';
|
||||||
|
import 'AuthManager.dart';
|
||||||
|
|
||||||
|
class UserManager extends IUserManager {
|
||||||
|
final LocalData parent;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
UserManager(this.parent) : super(AuthManager(parent)) {
|
||||||
|
_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(0, "Unknown", "./assets/images/image_user_pink.png", "", [], []);
|
||||||
|
parent.userCurrent = user2;
|
||||||
|
} else {
|
||||||
|
parent.userCurrent = user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveUser(User user) async {
|
||||||
|
var result = await parent.database.readUser(0);
|
||||||
|
if (result == null) {
|
||||||
|
await parent.database.createUser(user);
|
||||||
|
} else {
|
||||||
|
await parent.database.updateUser(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> userToMap(User user) {
|
||||||
|
return {
|
||||||
|
'_id': user.id,
|
||||||
|
'name': user.name,
|
||||||
|
'image': user.image,
|
||||||
|
'_mail': user.mail,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<User> getRankingWithFriends() {
|
||||||
|
List<User> sortedPlayers = List.from(parent.userCurrent.friends);
|
||||||
|
sortedPlayers.sort((a, b) => b.stat.highscore.compareTo(a.stat.highscore));
|
||||||
|
return sortedPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Player getUserById(int id) {
|
||||||
|
// TODO: implement getUserById
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Player> getUsersByName(String name) {
|
||||||
|
// TODO: implement getUsersByName
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue