diff --git a/Sources/bowlin_project/android/app/src/main/AndroidManifest.xml b/Sources/bowlin_project/android/app/src/main/AndroidManifest.xml index 527f7fe..afa799d 100644 --- a/Sources/bowlin_project/android/app/src/main/AndroidManifest.xml +++ b/Sources/bowlin_project/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ + + > readGame(int id) async { final db = await instance.database; final result = await db diff --git a/Sources/bowlin_project/lib/model/ApiManager/ApiManager.dart b/Sources/bowlin_project/lib/model/ApiManager/ApiManager.dart new file mode 100644 index 0000000..035dfd2 --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/ApiManager.dart @@ -0,0 +1,31 @@ + +import 'package:bowl_in/model/ApiManager/GameService.dart'; +import 'package:bowl_in/model/ApiManager/UserService.dart'; +import 'package:http/http.dart' as http; + +import '../GameDetail.dart'; +import '../IGameManager.dart'; +import '../IManager.dart'; +import '../IUserManager.dart'; + +class ApiManager extends IManager { + final httpClient = http.Client(); + final int userId = 1; + + late IUserManager _userMgr; + late IGameManager _gameMgr; + + ApiManager() { + _userMgr = UserService(this); + _gameMgr = GameService(this); + } + + List _gameDetails = []; + + List get gameDetails => _gameDetails; + + set gameDetails(List gameDetails) { + _gameDetails = gameDetails; + } + +} diff --git a/Sources/bowlin_project/lib/model/ApiManager/AuthService.dart b/Sources/bowlin_project/lib/model/ApiManager/AuthService.dart new file mode 100644 index 0000000..f4038a3 --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/AuthService.dart @@ -0,0 +1,29 @@ + +import 'package:bowl_in/model/ApiManager/ApiManager.dart'; + +import '../IAuthManager.dart'; + +class AuthService extends IAuthManager { + final ApiManager parent; + + AuthService(this.parent); + @override + bool verifiedUser(String mail, String password) { + // TODO: implement verifiedUser + throw UnimplementedError(); + } + + + // Constructor + /* AuthManager(this.parent); + // Methods + bool verifiedUser(String mail, String password) { + for (var user in parent.players) { + if (user is User && user.mail == mail) { + parent.userCurrent = user as User; + return true; + } + } + return false; + }*/ +} diff --git a/Sources/bowlin_project/lib/model/ApiManager/GameService.dart b/Sources/bowlin_project/lib/model/ApiManager/GameService.dart new file mode 100644 index 0000000..891f73b --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/GameService.dart @@ -0,0 +1,192 @@ +import 'dart:convert'; + +import 'package:bowl_in/model/ApiManager/responceFactory/GameFactory.dart'; +import 'package:bowl_in/model/ApiManager/responceFactory/UserFactory.dart'; + +import '../GameDetail.dart'; +import '../IGameManager.dart'; +import '../Player.dart'; +import '../User.dart'; +import 'ApiManager.dart'; + +class GameService extends IGameManager { + + var url = Uri.parse('http:localhost:8080/games'); + + final ApiManager parent; + + // Constructor + GameService(this.parent){ + _initGame(); + } + + _initGame() async { + parent.gameDetails = await parent.database.readGameDetail(); + } + + // Methods + @override + Future getGameById(int id) async { + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/$id')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return GameFactory.toModel(decodedResponse); + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } + + + @override + Future> getGamesByPlayerId(int id) async { + return _getGames(id); + } + + Future> _getGames(dynamic player) async { + // Récupérer l'ID du joueur si un joueur a été passé en paramètre + int playerId = player is User ? player.id : player; + + // Effectuer l'appel API pour récupérer les détails des jeux pour ce joueur + var response = await parent.httpClient.get(Uri.parse('${url}/$playerId/players')); + + if (response.statusCode == 200) { + // Décoder la réponse JSON en une liste de détails de jeu + var decodedResponse = jsonDecode(response.body) as List; + return decodedResponse.map((game) => GameDetail.fromJson(game)).toList(); + } else { + throw Exception('Failed to retrieve game details'); + } + var response = await parent.httpClient.get(Uri.parse('${url}/$id/players')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return decodedResponse; + } + } + + @override + Future> getGamesByPlayer(Player user) async { + return _getGames(user); + } + + @override + Future> getGamesByPlayers(List users) async { + List games = []; + List playerIds = users.map((player) => player.name).toList(); + + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/$id/players')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return decodedResponse; + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } + + + @override + Future> getPlayersByIdGame(int id) async { + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/$id/players')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body) as List; + List players = decodedResponse + .map((userJson) => UserFactory.toModel(userJson)) + .toList(); + return players; + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } + + @override + Future> getRankByIdGame(int id) async { + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/$id/rank')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return decodedResponse; + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } + + @override + addGame(GameDetail gd) async { + try{ + var response = await parent.httpClient.post(url, body : GameFactory.toJson(gd)); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return ; + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } + +/* + Future 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 createGameDetail(GameDetail gameDetail) async { + final db = await instance.database; + + await db.transaction((txn) async { + await txn.insert(tableGameDetail, GameDetailMapper.toJson(gameDetail)); + }); + }*/ + + @override + getNextId() async { + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/count')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + return decodedResponse; + } + else{ + print('Error occurred while fetching count isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching count for game: $error'); + throw Exception('Http failded but not implented');; + } + } +} diff --git a/Sources/bowlin_project/lib/model/ApiManager/UserService.dart b/Sources/bowlin_project/lib/model/ApiManager/UserService.dart new file mode 100644 index 0000000..43cfcaf --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/UserService.dart @@ -0,0 +1,74 @@ +import 'package:bowl_in/model/ApiManager/ApiManager.dart'; +import 'package:bowl_in/model/ApiManager/AuthService.dart'; +import 'package:bowl_in/model/ApiManager/responceFactory/UserFactory.dart'; +import 'package:bowl_in/model/Player.dart'; + +import 'package:bowl_in/model/User.dart'; + +import '../IAuthManager.dart'; +import '../IUserManager.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; + +class UserService extends IUserManager { + var url = Uri.parse('https://localhost:8443/users'); + + late IAuthManager _authMgr; + final ApiManager parent; + + UserService(this.parent) : super(AuthService(parent)){ + _initUser(); + } + + _initUser() async { + try { + var user = await getUserById(parent.userId); + parent.userCurrent = user; + }catch(error){ + User user2 = User(0, "Unknown", "./assets/images/image_user_pink.png", "", [], []); + parent.userCurrent = user2; + } + + } + + @override + List getRankingWithFriends() { + // TODO: implement getRankingWithFriends + List sortedPlayers = List.from(parent.userCurrent.friends); + sortedPlayers.sort((a, b) => b.stat.highscore.compareTo(a.stat.highscore)); + return sortedPlayers; + } + + @override + Future getUserById(int id) async { + try{ + var response = await parent.httpClient.get(Uri.parse('${url}/$id')); + if (response.statusCode == 200){ + var decodedResponse = jsonDecode(response.body); + print(decodedResponse); + return UserFactory.toModel(decodedResponse); + } + else{ + print('Error occurred while fetching user by ID isint 200 '); + throw Exception('Http failded but not implented'); + } + }catch(error){ + print('Error occurred while fetching user by ID: $error'); + throw Exception('Http failded but not implented');; + } + + } + + @override + Future> getUsersByName(String name) async { + // TODO: implement getUsersByName + throw UnimplementedError(); + + } + + @override + saveUser(User user) async { + var response = await parent.httpClient.post(url, body : UserFactory.toJson(user)); + + } +} diff --git a/Sources/bowlin_project/lib/model/ApiManager/fields/StatsField.dart b/Sources/bowlin_project/lib/model/ApiManager/fields/StatsField.dart new file mode 100644 index 0000000..bba720c --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/fields/StatsField.dart @@ -0,0 +1,18 @@ +class StatsFields { + static final List values = [ + id, user, nbVictories, nbGames + ]; + + static final String id = 'id'; + static final String user = 'user'; + static final String nbVictories = 'nbVictories'; + static final String nbGames = 'nbGames'; + static final String highscore = 'highscore'; + static final String nbStrikes = 'nbStrikes'; + static final String nbSpares = 'nbSpares'; + static final String avgScore = 'avgScore'; + static final String avgPinsPerRound = 'avgPinsPerRound'; + + +} + diff --git a/Sources/bowlin_project/lib/model/ApiManager/fields/UserField.dart b/Sources/bowlin_project/lib/model/ApiManager/fields/UserField.dart new file mode 100644 index 0000000..2a758f9 --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/fields/UserField.dart @@ -0,0 +1,13 @@ +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'; + static final String password = 'password'; + +} + diff --git a/Sources/bowlin_project/lib/model/ApiManager/responceFactory/GameFactory.dart b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/GameFactory.dart new file mode 100644 index 0000000..2613419 --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/GameFactory.dart @@ -0,0 +1,34 @@ +import 'package:bowl_in/model/GameDetail.dart'; + +import '../../Game.dart'; +import '../../Player.dart'; +import '../../User.dart'; + +class GameFactory { + static Map toJson(Game game, User user,) { + return { + GameFields.id: game.id, + GameFields.date: game.date.toIso8601String(), + GameFields.pointsCurrentUser: game.pointsCurrentUser, + GameFields.userId: user.id, + }; + } + + static Map toJsonDetails(GameDetail game) { + return { + GameFields.id: game.id, + GameFields.date: game.date.toIso8601String(), + GameFields.pointsCurrentUser: game.pointsCurrentUser, + GameFields.userId: user.id, + }; + } + + static Game toModel(Map json, List players) { + return Game( + json[GameFields.id], + DateTime.parse(json[GameFields.date]), + json[GameFields.pointsCurrentUser], + players + ); + } +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/model/ApiManager/responceFactory/StatsFactory.dart b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/StatsFactory.dart new file mode 100644 index 0000000..c7d0baf --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/StatsFactory.dart @@ -0,0 +1,31 @@ +import '../../Stat.dart'; +import '../../User.dart'; +import '../fields/StatsField.dart'; + +class StatsFactory { + static Stat fromJson(Map json) { + return Stat( + json[StatsFields.nbVictories], + json[StatsFields.nbGames], + json[StatsFields.highscore], + json[StatsFields.nbStrikes], + json[StatsFields.nbSpares], + 0, + json[StatsFields.avgScore], + json[StatsFields.avgPinsPerRound] + ); + + } + static Map toJson(Stat stat, User user) { + return { + StatsFields.user: user.id, + StatsFields.nbVictories:stat.nbVictory, + StatsFields.nbGames: stat.nbGames, + StatsFields.highscore: stat.highscore, + StatsFields.nbStrikes: stat.nbStrikes, + StatsFields.nbSpares: stat.nbSpares, + StatsFields.avgScore:stat.avgScore, + StatsFields.avgPinsPerRound: stat.avgPinsPerRound + }; + } +} \ No newline at end of file diff --git a/Sources/bowlin_project/lib/model/ApiManager/responceFactory/UserFactory.dart b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/UserFactory.dart new file mode 100644 index 0000000..b7db133 --- /dev/null +++ b/Sources/bowlin_project/lib/model/ApiManager/responceFactory/UserFactory.dart @@ -0,0 +1,34 @@ +import 'package:bowl_in/model/User.dart'; + +import '../fields/UserField.dart'; +import 'StatsFactory.dart'; + +class UserFactory { + static User toModel(Map json) { + return User.withStat( + json['id'], + json['name'], + json['photoProfile'], + json['email'], + [], + [], + StatsFactory.fromJson(json['stats']) + ); + } + + static Map toJson(User user) { + return { + UserFields.id: user.id, + UserFields.name: user.name, + UserFields.password:'000', + UserFields.image: user.image, + UserFields.mail: user.mail, + 'stats': StatsFactory.toJson(user.stat, user), + }; + } +} + + + + + diff --git a/Sources/bowlin_project/lib/model/IUserManager.dart b/Sources/bowlin_project/lib/model/IUserManager.dart index e5a7e89..19ed189 100644 --- a/Sources/bowlin_project/lib/model/IUserManager.dart +++ b/Sources/bowlin_project/lib/model/IUserManager.dart @@ -10,8 +10,8 @@ abstract class IUserManager { // Methods IAuthManager get authMgr => _authMgr; - List getUsersByName(String name); - Player getUserById(int id); + Future> getUsersByName(String name); + Future getUserById(int id); saveUser(User user); List getRankingWithFriends(); } diff --git a/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart b/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart index fdefc7b..2c8fe33 100644 --- a/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart +++ b/Sources/bowlin_project/lib/model/LocalManager/UserManager.dart @@ -45,12 +45,12 @@ class UserManager extends IUserManager { } @override - Player getUserById(int id) { + Future getUserById(int id) { throw UnimplementedError(); } @override - List getUsersByName(String name) { + Future> getUsersByName(String name) { throw UnimplementedError(); } } diff --git a/Sources/bowlin_project/lib/model/StubManager/UserManager.dart b/Sources/bowlin_project/lib/model/StubManager/UserManager.dart index ad9c5f6..c0e79e2 100644 --- a/Sources/bowlin_project/lib/model/StubManager/UserManager.dart +++ b/Sources/bowlin_project/lib/model/StubManager/UserManager.dart @@ -14,21 +14,21 @@ class UserManager extends IUserManager { // Methods @override - List getUsersByName(String name) { + Future> getUsersByName(String name) { List players = []; for (var player in parent.players) { if (player.name == name) { players.add(player); } } - return players; + return Future.value(players); } @override - Player getUserById(int id) { + Future getUserById(int id) { for (var player in parent.players) { if (player is User && player.id == id) { - return player; + return Future.value(player); } } throw new Exception("Player not found"); diff --git a/Sources/bowlin_project/pubspec.lock b/Sources/bowlin_project/pubspec.lock index e04bffe..84d8830 100644 --- a/Sources/bowlin_project/pubspec.lock +++ b/Sources/bowlin_project/pubspec.lock @@ -169,7 +169,7 @@ packages: source: hosted version: "3.0.1" http: - dependency: transitive + dependency: "direct main" description: name: http sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" @@ -494,5 +494,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.18.2 <3.0.0" + dart: ">=2.18.2 <4.0.0" flutter: ">=3.3.0" diff --git a/Sources/bowlin_project/pubspec.yaml b/Sources/bowlin_project/pubspec.yaml index a2e33e3..972c2da 100644 --- a/Sources/bowlin_project/pubspec.yaml +++ b/Sources/bowlin_project/pubspec.yaml @@ -42,7 +42,7 @@ dependencies: uuid: ^3.0.7 intl: ^0.18.0 sqflite: ^2.0.0+3 - + http: ^0.13.5 dev_dependencies: flutter_test: