import 'dart:convert'; import 'dart:io'; import 'package:result_monad/result_monad.dart'; import 'models.dart'; class FriendicaClient { final String username; final String password; final String serverName; final _client = HttpClient(); late final String _authHeader; FriendicaClient( {required this.username, required this.password, required this.serverName}) { final authenticationString = "$username:$password"; final encodedAuthString = base64Encode(utf8.encode(authenticationString)); _authHeader = "Basic $encodedAuthString"; } FutureResult, String> getTimeline( String userId, int page, int count) async { final request = Uri.parse( 'https://$serverName/api/statuses/user_timelineuser_id=$userId&count=$count&page=$page'); return (await _getApiRequest(request)).mapValue((postsJson) => postsJson.map((postJson) => FriendicaEntry.fromJson(postJson)).toList()); } FutureResult, String> _getApiRequest(Uri url) async { // TODO Error mode against: bad server URL, bad auth, bad path, empty response final request = await _client.getUrl(url); request.headers.add('authorization', _authHeader); request.headers.contentType = ContentType('application', 'json', charset: 'utf-8'); final response = await request.close(); final body = await response.transform(utf8.decoder).join(''); File('/tmp/response.json').writeAsStringSync(body); final bodyJson = jsonDecode(body) as List; return Result.ok(bodyJson); } }