diff --git a/Sources/bowlin_project/lib/database/fields/StatFields.dart b/Sources/bowlin_project/lib/database/fields/StatFields.dart new file mode 100644 index 0000000..554ba52 --- /dev/null +++ b/Sources/bowlin_project/lib/database/fields/StatFields.dart @@ -0,0 +1,4 @@ +class StatFields { + + +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/database/fields/UserFields.dart b/Sources/bowlin_project/lib/database/fields/UserFields.dart new file mode 100644 index 0000000..5999827 --- /dev/null +++ b/Sources/bowlin_project/lib/database/fields/UserFields.dart @@ -0,0 +1,12 @@ +class UserFields { + static final List 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'; + +} + diff --git a/Sources/bowlin_project/lib/database/mappers/UserMapper.dart b/Sources/bowlin_project/lib/database/mappers/UserMapper.dart new file mode 100644 index 0000000..97e313c --- /dev/null +++ b/Sources/bowlin_project/lib/database/mappers/UserMapper.dart @@ -0,0 +1,26 @@ +import '../../model/Stat.dart'; +import '../../model/User.dart'; +import '../fields/StatFields.dart'; + +class UserMapper { + static Map toJson(User user) { + return { + UserFields.id: user.id, + UserFields.name: user.name, + UserFields.image: user.image, + UserFields.mail: user.mail, + }; + } + + static User toModel(Map json) { + return User( + json[UserFields.id], + json[UserFields.name], + json[UserFields.image], + json[UserFields.mail], + [], + [], + Stat(0,0,0,0,0,0,0,0) + ); + } +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/database/sqlflite/UserDataBase.dart b/Sources/bowlin_project/lib/database/sqlflite/UserDataBase.dart new file mode 100644 index 0000000..b58fc78 --- /dev/null +++ b/Sources/bowlin_project/lib/database/sqlflite/UserDataBase.dart @@ -0,0 +1,75 @@ +import 'package:bowl_in/model/User.dart'; +import 'package:path/path.dart'; +import 'package:sqflite/sqflite.dart'; + +import '../fields/UserFields.dart'; +import '../mappers/UserMapper.dart'; + +class UserDatabase { + static final UserDatabase instance = UserDatabase._init(); + + static Database? _database; + + UserDatabase._init(); + + Future get database async { + if (_database != null) return _database!; + + _database = await _initDB('user.db'); + return _database!; + } + + Future _initDB(String filePath) async { + final dbPath = await getDatabasesPath(); + final path = join(dbPath, filePath); + + return await openDatabase(path, version: 1, onCreate: _createDB); + } + + Future _createDB(Database db, int version) async { + final idType = 'INTEGER PRIMARY KEY AUTOINCREMENT'; + final textType = 'TEXT NOT NULL'; + final boolType = 'BOOLEAN NOT NULL'; + final integerType = 'INTEGER NOT NULL'; + + await db.execute(''' +CREATE TABLE $tableUser ( + ${UserFields.id} $idType, + ${UserFields.name} $boolType, + ${UserFields.image} $integerType, + ${UserFields.mail} $textType, + ) +'''); + } + + Future createUser(User user) async { + final db = await instance.database; + await db.insert(tableUser, UserMapper.toJson(user)); + } + + Future readUser(int id) async { + final db = await instance.database; + final result = await db.query( + tableUser, + where: '${UserFields.id} = ?', + whereArgs: [id]); + return result.isNotEmpty ? UserMapper.toModel(result.first) : null; + + } + + Future deleteUser(int id) async { + final db = await instance.database; + + return await db.delete( + tableUser, + where: '${UserFields.id} = ?', + whereArgs: [id], + ); + } + + Future close() async { + final db = await instance.database; + + db.close(); + } +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/main.dart b/Sources/bowlin_project/lib/main.dart index 1046f67..34c31fe 100644 --- a/Sources/bowlin_project/lib/main.dart +++ b/Sources/bowlin_project/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:bowl_in/model/LocalManager/LocalData.dart'; import 'package:bowl_in/views/game_screen.dart'; import 'package:bowl_in/views/ingame_screen.dart'; import 'package:bowl_in/views/main_screen.dart'; @@ -16,7 +17,7 @@ void main() { } class MyApp extends StatelessWidget { - static IManager controller = StubData(); + static IManager controller = LocalData(); const MyApp({super.key}); @override Widget build(BuildContext context) { diff --git a/Sources/bowlin_project/lib/model/LocalManager/LocalData.dart b/Sources/bowlin_project/lib/model/LocalManager/LocalData.dart index ebef5aa..ad3ef50 100644 --- a/Sources/bowlin_project/lib/model/LocalManager/LocalData.dart +++ b/Sources/bowlin_project/lib/model/LocalManager/LocalData.dart @@ -16,4 +16,9 @@ class LocalData extends IManager{ _userMgr = UserManager(this); _gameMgr = GameManager(this); } + + IUserManager get userMgr => _userMgr; + + IGameManager get gameMgr => _gameMgr; + } \ No newline at end of file diff --git a/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart b/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart index b025fc7..962ea22 100644 --- a/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart +++ b/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart @@ -16,10 +16,21 @@ class UserManager extends IUserManager { _initUser(); } - _initUser() { - String userJson = parent.storage.getItem('user'); + _initUser() async { + var userJson = await parent.storage.getItem('user'); + if (userJson == null || userJson =='') { + User user2 = User( + 1, + "Unknown", + "./assets/images/image_user_cyan.png", + "", + [], + [], + Stat(0, 0, 0, 0, 0, 0, 0, 0)); + parent.userCurrent = user2; - if (userJson != null) { + + } else { Map userMap = json.decode(userJson); User user = User( userMap['_id'], @@ -28,18 +39,9 @@ class UserManager extends IUserManager { userMap['_mail'], [], [], - new Stat(0, 0, 0, 0, 0, 0, 2.0, 3.0), + Stat(0, 0, 0, 0, 0, 0, 2.0, 3.0), ); parent.userCurrent = user; - } else { - parent.userCurrent = new User( - 1, - "Unknown", - "./assets/images/image_user_cyan.png", - "david.d_almeida@etu.uca.fr", - [], - [], - Stat(0, 0, 0, 0, 0, 0, 0, 0)); } } diff --git a/Sources/bowlin_project/lib/model/Stat.dart b/Sources/bowlin_project/lib/model/Stat.dart index d68fa57..6cf57b4 100644 --- a/Sources/bowlin_project/lib/model/Stat.dart +++ b/Sources/bowlin_project/lib/model/Stat.dart @@ -96,4 +96,17 @@ class Stat { avgPinsPerRound = ((avgPinsPerRound * (nbGames-1)) + (totalpins/10))/nbGames; } + + + // Serialize to JSON + Map toJson() => { + 'nbVictory': nbVictory, + 'nbGames': nbGames, + 'highscore': highscore, + 'nbStrikes': nbStrikes, + 'nbSpares': nbSpares, + 'nbScore': nbScore, + 'avgScore': avgScore, + 'avgPinsPerRound': avgPinsPerRound, + }; } diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index 81afb95..ae95609 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -25,7 +25,6 @@ class StubData extends IManager { _initGameDetails(); _initGame(); userCurrent = players[8] as User; - userCurrent.games = []; } IUserManager get userMgr => _userMgr; diff --git a/Sources/bowlin_project/lib/model/User.dart b/Sources/bowlin_project/lib/model/User.dart index b1740aa..0b0a8b9 100644 --- a/Sources/bowlin_project/lib/model/User.dart +++ b/Sources/bowlin_project/lib/model/User.dart @@ -1,3 +1,5 @@ +import 'package:bowl_in/database/fields/UserFields.dart'; + import 'Achievement.dart'; import 'Game.dart'; import 'Player.dart'; @@ -42,4 +44,5 @@ class User extends Player { set stat(Stat value) { _stat = value; } + } diff --git a/Sources/bowlin_project/pubspec.lock b/Sources/bowlin_project/pubspec.lock index 27cb5bf..248abaf 100644 --- a/Sources/bowlin_project/pubspec.lock +++ b/Sources/bowlin_project/pubspec.lock @@ -156,10 +156,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: b4bb06205ec607278b6fc23db238278417bca84a3905779cc68d1eb7afae37e2 + sha256: e2a90e1d4eed378ea12e0771be9e32766a2f8d2de3064e42f3a55f1b04fb8af8 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.4.1" google_fonts: dependency: "direct main" description: @@ -276,34 +276,34 @@ packages: dependency: transitive description: name: path_provider - sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" + sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e" + sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.24" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972 + sha256: "12eee51abdf4d34c590f043f45073adbb45514a108bd9db4491547a2fd891059" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.2.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a" + sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" url: "https://pub.dev" source: hosted - version: "2.1.9" + version: "2.1.10" path_provider_platform_interface: dependency: transitive description: @@ -316,10 +316,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" + sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" petitparser: dependency: transitive description: @@ -348,10 +348,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + sha256: ae73e842cdd27a3467a71d70cefd9b198538aab4fc7dde1d0e8c78c96225abf0 url: "https://pub.dev" source: hosted - version: "3.6.2" + version: "3.7.1" process: dependency: transitive description: @@ -381,6 +381,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "500d6fec583d2c021f2d25a056d96654f910662c64f836cd2063167b8f1fa758" + url: "https://pub.dev" + source: hosted + version: "2.2.6" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "963dad8c4aa2f814ce7d2d5b1da2f36f31bd1a439d8f27e3dc189bb9d26bc684" + url: "https://pub.dev" + source: hosted + version: "2.4.3" stack_trace: dependency: transitive description: @@ -405,6 +421,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + url: "https://pub.dev" + source: hosted + version: "3.0.1" term_glyph: dependency: transitive description: @@ -465,10 +489,10 @@ packages: dependency: transitive description: name: xml - sha256: ac0e3f4bf00ba2708c33fbabbbe766300e509f8c82dbd4ab6525039813f7e2fb + sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.2" yaml: dependency: transitive description: diff --git a/Sources/bowlin_project/pubspec.yaml b/Sources/bowlin_project/pubspec.yaml index 45ba99c..04e4716 100644 --- a/Sources/bowlin_project/pubspec.yaml +++ b/Sources/bowlin_project/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: uuid: ^3.0.7 localstorage: ^4.0.0+1 intl: ^0.18.0 + sqflite: ^2.0.0+3 dev_dependencies: