diff --git a/lib/data/services/api_client.dart b/lib/data/services/api_client.dart index 631c406..0310bea 100644 --- a/lib/data/services/api_client.dart +++ b/lib/data/services/api_client.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart'; import 'package:logger/logger.dart'; @@ -38,7 +37,7 @@ class ApiClient { ); Future _initStore() async { - _secureStorage ??= const FlutterSecureStorage(aOptions: AndroidOptions()); + _secureStorage ??= const FlutterSecureStorage(); } Future> _getHeaders([ diff --git a/lib/data/services/auth_client.dart b/lib/data/services/auth_client.dart index 4d77b4f..8b5653b 100644 --- a/lib/data/services/auth_client.dart +++ b/lib/data/services/auth_client.dart @@ -1,29 +1,39 @@ 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" as http; +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( - aOptions: AndroidOptions(encryptedSharedPreferences: true), - ); + _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 url = Uri.parse("https://$apiBasePath/token-check"); - var response = await http.post( - url, + var response = await client.post( + Uri.parse(url), headers: {"Content-Type": "application/json"}, body: jsonEncode({"token": token}), ); @@ -34,33 +44,41 @@ class AuthClient { } 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 { - var client = http.Client(); + final url = "https://$apiBasePath/auth"; + log.i("Logging in: $url"); + var client = Client(); try { await _initStore(); - var url = Uri.parse("https://$apiBasePath/auth"); var response = await client.post( - url, - headers: { - "Content-Type": "application/json", - "Accept": "application/json", - }, + Uri.parse(url), + headers: {"Content-Type": "application/json"}, body: jsonEncode({"password": password, "username": username}), ); - if (response.statusCode == 200) { - var json = jsonDecode(response.body); - await _secureStorage!.write(key: "token", value: json["access_token"]); - return Result.ok(json["access_token"]); - } else if (response.statusCode == 401) { - return Result.error(Exception("Wrong credentials")); - } else { - return Result.error(Exception("Token creation error")); + 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(); @@ -68,18 +86,20 @@ class AuthClient { } Future> getRemoteApiVersion() async { - final client = http.Client(); + final url = "https://$apiBasePath/version"; + log.i("Fetching: getRemoteApiVersion ($url)"); + final client = Client(); try { - final response = await client.get( - Uri.parse("https://$apiBasePath/version"), - ); - if (response.statusCode == 200) { - final json = jsonDecode(response.body) as int; - return Result.ok(json); - } else { - throw "Something wrong happened"; + 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(); diff --git a/lib/data/services/websocket_client.dart b/lib/data/services/websocket_client.dart index f8df18a..89cf8b9 100644 --- a/lib/data/services/websocket_client.dart +++ b/lib/data/services/websocket_client.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:logger/logger.dart'; import 'package:rxdart/rxdart.dart'; import 'package:seshat/config/constants.dart'; import 'package:seshat/domain/models/owner.dart'; @@ -15,20 +16,28 @@ class WebsocketClient { sync: true, ); late final StreamSubscription sub; + Logger log = Logger( + printer: PrettyPrinter( + colors: true, + lineLength: 100, + methodCount: 0, + dateTimeFormat: DateTimeFormat.dateAndTime, + ), + ); Stream get owners => _ownersController.stream; Future _initStore() async { - _secureStorage ??= const FlutterSecureStorage( - aOptions: AndroidOptions(encryptedSharedPreferences: true), - ); + _secureStorage ??= const FlutterSecureStorage(); } Future connect() async { + final url = "wss://$apiBasePath/ws"; + log.i("Webocket: $url"); await _initStore(); if (_channel != null) return; - _channel = WebSocketChannel.connect(Uri.parse("wss://$apiBasePath/ws")); + _channel = WebSocketChannel.connect(Uri.parse(url)); await _channel!.ready; var token = await _secureStorage!.read(key: "token");