import 'dart:convert'; import 'dart:ffi'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:logger/logger.dart'; import 'package:seshat/config/constants.dart'; import 'package:seshat/utils/result.dart'; import "package:http/http.dart"; class AuthClient { AuthClient(); FlutterSecureStorage? _secureStorage; Logger log = Logger( printer: PrettyPrinter( colors: true, lineLength: 100, methodCount: 0, dateTimeFormat: DateTimeFormat.dateAndTime, ), ); Future _initStore() async { _secureStorage ??= const FlutterSecureStorage(); } Future> hasValidToken() async { final url = "https://$apiBasePath/token-check"; log.i("Fetching: hasValidToken ($url)"); final client = Client(); try { await _initStore(); bool hasToken = await _secureStorage!.containsKey(key: "token"); if (hasToken) { var token = await _secureStorage!.read(key: "token"); var response = await client.post( Uri.parse(url), headers: {"Content-Type": "application/json"}, body: jsonEncode({"token": token}), ); if (response.body == "true") { return Result.ok(true); } } return Result.ok(false); } catch (e) { log.e(e.toString()); return Result.error(Exception(e)); } finally { client.close(); } } Future> login(String username, String password) async { final url = "https://$apiBasePath/auth"; log.i("Logging in: $url"); var client = Client(); try { await _initStore(); var response = await client.post( Uri.parse(url), headers: {"Content-Type": "application/json"}, body: jsonEncode({"password": password, "username": username}), ); switch (response.statusCode) { case 200: var json = jsonDecode(response.body); await _secureStorage!.write( key: "token", value: json["access_token"], ); return Result.ok(json["access_token"]); case 401: throw "Wrong credentials"; case 500: throw "Token creation error"; default: throw "Unknown error with code ${response.statusCode.toString()}"; } } catch (e) { log.e(e.toString()); return Result.error(Exception(e)); } finally { client.close(); } } Future> getRemoteApiVersion() async { final url = "https://$apiBasePath/version"; log.i("Fetching: getRemoteApiVersion ($url)"); final client = Client(); try { final response = await client.get(Uri.parse(url)); switch (response.statusCode) { case 200: final json = jsonDecode(response.body) as int; return Result.ok(json); default: throw "Unknown error with code ${response.statusCode.toString()}"; } } catch (e) { log.e(e.toString()); return Result.error(Exception(e)); } finally { client.close(); } } }