Add instance info processing endpoints

This commit is contained in:
Hank Grabowski 2023-03-17 16:08:25 -04:00
parent 8fc69142c6
commit 0c42e1cf0e
4 changed files with 114 additions and 0 deletions

View file

@ -7,8 +7,10 @@ import 'data/memory/memory_groups_repo.dart';
import 'data/objectbox/objectbox_cache.dart';
import 'data/objectbox/objectbox_connections_repo.dart';
import 'data/objectbox/objectbox_hashtag_repo.dart';
import 'friendica_client/friendica_client.dart';
import 'globals.dart';
import 'models/auth/profile.dart';
import 'models/instance_info.dart';
import 'services/auth_service.dart';
import 'services/connections_manager.dart';
import 'services/direct_message_service.dart';
@ -40,6 +42,9 @@ Future<void> dependencyInjectionInitialization() async {
getIt.registerSingleton<ActiveProfileSelector<IConnectionsRepo>>(
ActiveProfileSelector(null));
getIt.registerSingleton<ActiveProfileSelector<InstanceInfo>>(
ActiveProfileSelector(null));
final secretsService = SecretsService();
final serviceInit = await secretsService.initialize();
@ -93,4 +98,13 @@ Future<void> updateProfileDependencyInjectors(Profile profile) async {
getIt<ActiveProfileSelector<IConnectionsRepo>>();
connectionReposSelector.injectEntry(
profile, ObjectBoxConnectionsRepo(objectBox));
final instanceSelector = getIt<ActiveProfileSelector<InstanceInfo>>();
final instanceInfo = await InstanceDataClient(profile).getInstanceData();
instanceInfo.andThenSuccess(
(instanceInfo) => instanceSelector.injectEntry(
profile,
instanceInfo,
),
);
}

View file

@ -16,6 +16,7 @@ import '../models/exec_error.dart';
import '../models/gallery_data.dart';
import '../models/group_data.dart';
import '../models/image_entry.dart';
import '../models/instance_info.dart';
import '../models/media_attachment_uploads/image_types_enum.dart';
import '../models/timeline_entry.dart';
import '../models/user_notification.dart';
@ -24,6 +25,7 @@ import '../serializers/friendica/gallery_data_friendica_extensions.dart';
import '../serializers/friendica/image_entry_friendica_extensions.dart';
import '../serializers/mastodon/connection_mastodon_extensions.dart';
import '../serializers/mastodon/group_data_mastodon_extensions.dart';
import '../serializers/mastodon/instance_info_mastodon_extensions.dart';
import '../serializers/mastodon/notification_mastodon_extension.dart';
import '../serializers/mastodon/timeline_entry_mastodon_extensions.dart';
import '../services/network_status_service.dart';
@ -260,6 +262,41 @@ class InteractionsClient extends FriendicaClient {
}
}
class InstanceDataClient extends FriendicaClient {
static final _logger = Logger('$InteractionsClient');
InstanceDataClient(super.credentials);
FutureResult<InstanceInfo, ExecError> getInstanceData() async {
_logger.finest(() => 'Getting $serverName instance info');
final v2Result = await getInstanceDataV2();
if (v2Result.isSuccess) {
return v2Result;
}
return getInstanceDataV1();
}
FutureResult<InstanceInfo, ExecError> getInstanceDataV1() async {
_logger.finest(() => 'Getting $serverName instance info via V1 endpoint');
final url = Uri.parse('https://$serverName/api/v1/instance');
final result = await _getApiRequest(url);
return result.andThen((json) {
return fromInstanceV1Json(json);
}).execErrorCast();
}
FutureResult<InstanceInfo, ExecError> getInstanceDataV2() async {
_logger.finest(() => 'Getting $serverName instance info via V2 endpoint');
final url = Uri.parse('https://$serverName/api/v2/instance');
final result = await _getApiRequest(url);
return result.andThen((response) {
final instanceInfoResult = fromInstanceV2Json(response);
return instanceInfoResult;
}).execErrorCast();
}
}
class NotificationsClient extends FriendicaClient {
static final _logger = Logger('$NotificationsClient');

View file

@ -0,0 +1,20 @@
import 'friendica_version.dart';
class InstanceInfo {
final int maxStatusCharacters;
final FriendicaVersion friendicaVersion;
final String versionString;
final int maxImageBytes;
InstanceInfo({
required this.maxStatusCharacters,
required this.friendicaVersion,
required this.versionString,
required this.maxImageBytes,
});
@override
String toString() {
return 'InstanceInfo{maxStatusCharacters: $maxStatusCharacters, version: $versionString, maxImageBytes: $maxImageBytes}';
}
}

View file

@ -0,0 +1,43 @@
import 'package:result_monad/result_monad.dart';
import '../../models/exec_error.dart';
import '../../models/friendica_version.dart';
import '../../models/instance_info.dart';
const _defaultMaxImageBytes = 819200;
const _defaultMaxCharacters = 4000;
Result<InstanceInfo, ExecError> fromInstanceV1Json(Map<String, dynamic> json) {
return runCatching(() {
final maxStatusCharacters = json['max_toot_chars'] ?? _defaultMaxCharacters;
final versionString = json['version'];
return Result.ok(InstanceInfo(
friendicaVersion: FriendicaVersion.fromMastodonVersionString(
versionString,
),
maxStatusCharacters: maxStatusCharacters,
versionString: versionString,
maxImageBytes: _defaultMaxImageBytes,
));
}).execErrorCast();
}
Result<InstanceInfo, ExecError> fromInstanceV2Json(Map<String, dynamic> json) {
return runCatching(() {
final maxStatusCharacters = json['configuration']?['statuses']
?['max_characters'] ??
_defaultMaxCharacters;
final maxImageBytes = json['configuration']?['media_attachments']
?['image_size_limit'] ??
_defaultMaxImageBytes;
final versionString =
json['friendica']?['version'] ?? 'Not a friendica server';
final version = FriendicaVersion.fromVersionString(versionString);
return Result.ok(InstanceInfo(
friendicaVersion: version,
maxStatusCharacters: maxStatusCharacters,
versionString: versionString,
maxImageBytes: maxImageBytes,
));
}).execErrorCast();
}