import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:http/http.dart' as http; import 'package:tuple/tuple.dart'; class RequestApi implements IDataStrategy { // Faire attention au URL String urlApi = "https://codefirst.iut.uca.fr/containers/SmartFit-smartfit_api"; @override Future getFile(String token, String fileUuid) async { final url = Uri.parse('$urlApi/user/files/$fileUuid'); var request = http.Request('GET', url); request.headers.addAll({'Authorization': token}); var streamedResponse = await request.send(); final response = await http.Response.fromStream(streamedResponse); // !! Crée un fichier comme ca avec les bytes !! //File("//").writeAsBytes(response.bodyBytes); if (response.statusCode == 200) { return Tuple2(true, response.bodyBytes); } if ((response.statusCode == 401)) { return const Tuple2(false, "401 - UNAUTHORIZED"); } if ((response.statusCode == 404)) { return const Tuple2(false, "404 - NOT FOUND"); } return const Tuple2(false, "Fail"); } @override Future> deleteFile(String token, String fileUuid) async { final response = await http.delete( Uri.parse('$urlApi/user/files/$fileUuid'), headers: {'Authorization': token}); if (response.statusCode == 200) { return const Tuple2(true, "Successful"); } if (response.statusCode == 401) { return const Tuple2(false, "401 - UNAUTHORIZED"); } if (response.statusCode == 404) { return const Tuple2(false, "404 - NOT FOUND"); } return const Tuple2(false, "Fail"); } @override Future> deleteUser(String token) async { final response = await http.delete(Uri.parse('$urlApi/user'), headers: {'Authorization': token}); if (response.statusCode == 200) { return const Tuple2(true, "Successful"); } else if (response.statusCode == 401) { return const Tuple2( false, "401 UNAUTHORIZED - Mauvais ou pas de token"); } else if (response.statusCode == 404) { return const Tuple2( false, "404 NOT FOUND - Pas de compte lié"); } return const Tuple2(false, "Fail"); } @override Future getFiles(String token) async { final response = await http.get(Uri.parse('$urlApi/user/files'), headers: {'Authorization': token}); if (response.statusCode == 200) { return Tuple2(true, (json.decode(response.body) as List).cast>()); } if (response.statusCode == 401) { return const Tuple2(false, "401 - UNAUTHORIZED"); } return const Tuple2(false, "Fail"); } @override Future> connexion(String email, String hash) async { final response = await http.get(Uri.parse('$urlApi/user/login/$email/$hash')); if (response.statusCode == 200) { Map json = jsonDecode(response.body); return Tuple2(true, json['token'].toString()); } if (response.statusCode == 401) { return const Tuple2(false, "UNAUTHORIZED"); } if (response.statusCode == 404) { return const Tuple2(false, "Not found the email"); } return const Tuple2(false, "Fail"); } @override Future> postUser( String email, String hash, String username) async { var body = {"email": email, "hash": hash, "username": username}; var header = {"Content-Type": "application/json"}; final response = await http.post(Uri.parse('$urlApi/user'), headers: header, body: jsonEncode(body)); if (response.statusCode == 200) { Map json = jsonDecode(response.body); return Tuple2(true, json['token'].toString()); } if (response.statusCode == 400) { return const Tuple2(false, "400 BAD REQUEST - Json mal formaté"); } if (response.statusCode == 409) { return const Tuple2( false, "409 CONFLICT - Déja un compte avec cet email"); } return const Tuple2(false, "Fail"); } @override Future> modifAttribut( String token, String nameAttribut, String newValue) async { final response = await http.put(Uri.parse('$urlApi/user/$nameAttribut'), headers: { 'Authorization': token, "Content-Type": "application/json" }, body: jsonEncode({nameAttribut: newValue})); if (response.statusCode == 200) { //Map json = jsonDecode(response.body); return const Tuple2(true, "200 - OK"); } if (response.statusCode == 400) { return const Tuple2(false, "400 - BAD REQUEST"); } if (response.statusCode == 401) { return const Tuple2(false, "400 - UNAUTHORIZED"); } else { return const Tuple2(false, "Fail"); } } // -- Priviligié uploadFileByte -- // @override Future> uploadFile(String token, File file) async { String filename = file.path.split('/').last; String categoryActivity = filename.split("_").first.toLowerCase(); String dateActivity = filename.split("_")[1].split("T").first; final uri = Uri.parse('$urlApi/user/files'); Map headers = {'Authorization': token}; var request = http.MultipartRequest('POST', uri); final httpImage = http.MultipartFile.fromBytes( 'file', await file.readAsBytes(), filename: filename, ); request.files.add(httpImage); request.headers.addAll(headers); request.fields["SmartFit_Category"] = categoryActivity; request.fields["SmartFit_Date"] = dateActivity; final response = await request.send(); if (response.statusCode == 200) { return const Tuple2(true, "Successful"); } if (response.statusCode == 400) { return const Tuple2(false, "400 - BAD REQUEST"); } if (response.statusCode == 401) { return const Tuple2(false, "401 - UNAUTHORIZED"); } if (response.statusCode == 409) { return const Tuple2(false, "409 - CONFLICT"); } return const Tuple2(false, "Fail "); } @override Future> uploadFileByte( String token, Uint8List contentFile, String nameFile, String category, DateTime date, ActivityInfo activityInfo) async { final uri = Uri.parse('$urlApi/user/files'); Map headers = {'Authorization': token}; var request = http.MultipartRequest('POST', uri); final httpImage = http.MultipartFile.fromBytes( 'file', contentFile, filename: nameFile, ); request.files.add(httpImage); request.headers.addAll(headers); request.fields["SmartFit_Category"] = category; request.fields["SmartFit_Date"] = date.toString(); request.fields["info"] = activityInfo.toJson(); final response = await request.send(); if (response.statusCode == 200) { return const Tuple2(true, "Successful"); } if (response.statusCode == 400) { return const Tuple2(false, "400 - BAD REQUEST"); } if (response.statusCode == 401) { return const Tuple2(false, "401 - UNAUTHORIZED"); } if (response.statusCode == 409) { return const Tuple2(false, "409 - CONFLICT"); } return const Tuple2(false, "Fail "); } @override Future getInfoUser(String token) async { final response = await http.get(Uri.parse('$urlApi/user/info'), headers: {'Authorization': token}); if (response.statusCode == 200) { Map json = jsonDecode(response.body); return Tuple2(true, json); } if (response.statusCode == 400) { return const Tuple2(false, "400 - BAD REQUEST"); } if (response.statusCode == 401) { return const Tuple2(false, "401 - UNAUTHORIZED"); } return const Tuple2(false, "Fail "); } }