2022-01-14 14:24:49 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
import 'package:result_monad/result_monad.dart';
|
|
|
|
|
2022-01-14 15:31:22 +00:00
|
|
|
import 'models.dart';
|
|
|
|
|
2022-01-14 14:24:49 +00:00
|
|
|
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";
|
|
|
|
}
|
|
|
|
|
2022-01-14 15:31:22 +00:00
|
|
|
FutureResult<List<FriendicaEntry>, String> getTimeline(
|
2022-01-14 14:24:49 +00:00
|
|
|
String userId, int page, int count) async {
|
|
|
|
final request = Uri.parse(
|
|
|
|
'https://$serverName/api/statuses/user_timelineuser_id=$userId&count=$count&page=$page');
|
2022-01-14 15:31:22 +00:00
|
|
|
return (await _getApiRequest(request)).mapValue((postsJson) =>
|
|
|
|
postsJson.map((postJson) => FriendicaEntry.fromJson(postJson)).toList());
|
2022-01-14 14:24:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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('');
|
2022-01-14 15:31:22 +00:00
|
|
|
File('/tmp/response.json').writeAsStringSync(body);
|
2022-01-14 14:24:49 +00:00
|
|
|
final bodyJson = jsonDecode(body) as List<dynamic>;
|
|
|
|
return Result.ok(bodyJson);
|
|
|
|
}
|
|
|
|
}
|