fediverse-archiving-tools/bin/friendica_client.dart
2022-01-14 10:31:22 -05:00

44 lines
1.5 KiB
Dart

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<List<FriendicaEntry>, 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<List<dynamic>, 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<dynamic>;
return Result.ok(bodyJson);
}
}