Addition of the Game table and modifications of the ReadUser and UpdateUser functions 🔨
continuous-integration/drone/push Build is passing Details

ContinueLocalManager
Emre KARTAL 2 years ago
parent 205708fce7
commit 73204ba03a

@ -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,24 @@
import 'package:bowl_in/database/mappers/UserMapper.dart';
import 'package:bowl_in/model/Game.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) {
return Game(
json[GameFields.id],
DateTime.parse(json[GameFields.date]),
json[GameFields.pointsCurrentUser],
[],
);
}
}

@ -1,12 +1,13 @@
import 'package:bowl_in/database/mappers/GameMapper.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 '../fields/GameFields.dart';
import '../fields/UserFields.dart'; import '../fields/UserFields.dart';
import '../mappers/UserMapper.dart'; import '../mappers/UserMapper.dart';
class UserDatabase { class UserDatabase {
UserDatabase(); UserDatabase();
static final UserDatabase instance = UserDatabase._init(); static final UserDatabase instance = UserDatabase._init();
@ -16,6 +17,7 @@ class UserDatabase {
UserDatabase._init(); UserDatabase._init();
static const String tableUser = 'users'; static const String tableUser = 'users';
static const String tableGame = 'games';
Future<Database> get database async { Future<Database> get database async {
if (_database != null) return _database!; if (_database != null) return _database!;
@ -28,14 +30,14 @@ class UserDatabase {
final dbPath = await getDatabasesPath(); final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath); final path = join(dbPath, filePath);
return await openDatabase(path, version: 1, onCreate: _createDB); return await openDatabase(path, version: 4, onCreate: _createDB, onUpgrade: _upgradeDB);
} }
Future _createDB(Database db, int version) async { Future _createDB(Database db, int version) async {
const idType = 'INTEGER PRIMARY KEY AUTOINCREMENT'; const idType = 'INTEGER PRIMARY KEY AUTOINCREMENT';
const textType = 'TEXT NOT NULL'; const textType = 'TEXT NOT NULL';
const boolType = 'BOOLEAN NOT NULL'; const boolType = 'BOOLEAN NOT NULL';
const integerType = 'INTEGER NOT NULL'; final integerType = 'INTEGER NOT NULL';
await db.execute(''' await db.execute('''
CREATE TABLE $tableUser ( CREATE TABLE $tableUser (
@ -45,6 +47,24 @@ CREATE TABLE $tableUser (
${UserFields.mail} $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})
)
''');
}
Future<void> _upgradeDB(Database db, int oldVersion, int newVersion) async {
if (oldVersion < 4) {
await db.execute('DROP TABLE IF EXISTS $tableUser');
await db.execute('DROP TABLE IF EXISTS $tableGame');
await _createDB(db, newVersion);
}
} }
Future<void> createUser(User user) async { Future<void> createUser(User user) async {
@ -54,12 +74,35 @@ CREATE TABLE $tableUser (
Future<User?> readUser(int id) async { Future<User?> readUser(int id) async {
final db = await instance.database; final db = await instance.database;
final result = await db.query( final result = await db
tableUser, .query(tableUser, where: '${UserFields.id} = ?', whereArgs: [id]);
where: '${UserFields.id} = ?',
whereArgs: [id]); if (result.isNotEmpty) {
return result.isNotEmpty ? UserMapper.toModel(result.first) : null; User user = UserMapper.toModel(result.first);
final games = await db
.query(tableGame, where: '${GameFields.userId} = ?', whereArgs: [user.id]);
for (var game in games) {
user.games.add(GameMapper.toModel(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]);
// Insert new games for the user
for (var game in user.games) {
await txn.insert(tableGame, GameMapper.toJson(game, user));
}
});
} }
Future<int> deleteUser(int id) async { Future<int> deleteUser(int id) async {

@ -2,6 +2,7 @@ import 'package:bowl_in/model/IUserManager.dart';
import 'package:bowl_in/model/LocalManager/LocalData.dart'; import 'package:bowl_in/model/LocalManager/LocalData.dart';
import 'package:bowl_in/model/Player.dart'; import 'package:bowl_in/model/Player.dart';
import 'package:bowl_in/model/User.dart'; import 'package:bowl_in/model/User.dart';
import '../Game.dart';
import 'AuthManager.dart'; import 'AuthManager.dart';
class UserManager extends IUserManager { class UserManager extends IUserManager {
@ -9,8 +10,9 @@ class UserManager extends IUserManager {
// Constructor // Constructor
UserManager(this.parent) : super(AuthManager(parent)) { UserManager(this.parent) : super(AuthManager(parent)) {
saveUser( User user = User(0, "Dave", "./assets/images/image_user_red.png", "", [], []);
User(0, "Lucas", "./assets/images/image_user_red.png", "", [], [])); user.games.add(Game(0,DateTime.now(), 30, []));
saveUser(user);
_initUser(); _initUser();
} }
@ -26,8 +28,7 @@ class UserManager extends IUserManager {
} }
saveUser(User user) { saveUser(User user) {
parent.userDatabase.deleteUser(0); parent.userDatabase.updateUser(user);
parent.userDatabase.createUser(user);
} }
Map<String, dynamic> userToMap(User user) { Map<String, dynamic> userToMap(User user) {

@ -1,5 +1,3 @@
import 'package:bowl_in/database/fields/UserFields.dart';
import 'Achievement.dart'; import 'Achievement.dart';
import 'Game.dart'; import 'Game.dart';
import 'Player.dart'; import 'Player.dart';

@ -156,10 +156,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: go_router name: go_router
sha256: b90b9aaa7723ca7159a81c0cd3be8108c74c986c3fbc41d413fd82ea164733ea sha256: e2a90e1d4eed378ea12e0771be9e32766a2f8d2de3064e42f3a55f1b04fb8af8
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.4.0" version: "6.4.1"
google_fonts: google_fonts:
dependency: "direct main" dependency: "direct main"
description: description:
@ -224,14 +224,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
localstorage:
dependency: "direct main"
description:
name: localstorage
sha256: "1b5304491c85250b90807e0e2b3a6217d2739caea4871b820d42782572f880f4"
url: "https://pub.dev"
source: hosted
version: "4.0.1+2"
logging: logging:
dependency: transitive dependency: transitive
description: description:

@ -40,7 +40,6 @@ dependencies:
google_fonts: ^3.0.1 google_fonts: ^3.0.1
go_router: ^6.0.1 go_router: ^6.0.1
uuid: ^3.0.7 uuid: ^3.0.7
localstorage: ^4.0.0+1
intl: ^0.18.0 intl: ^0.18.0
sqflite: ^2.0.0+3 sqflite: ^2.0.0+3

Loading…
Cancel
Save