Skip to content

Commit

Permalink
TW-2220: Extract fed server in well-know API
Browse files Browse the repository at this point in the history
  • Loading branch information
nqhhdev committed Feb 12, 2025
1 parent ca18fd7 commit d91ce44
Show file tree
Hide file tree
Showing 17 changed files with 442 additions and 9 deletions.
12 changes: 12 additions & 0 deletions lib/data/datasource/federation_configurations_datasource.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:fluffychat/data/model/federation_server/federation_configuration.dart';

abstract class FederationConfigurationsDatasource {
Future<FederationConfigurations> getFederationConfigurations(String userId);

Future<void> saveFederationConfigurations(
String userId,
FederationConfigurations federationConfiguration,
);

Future<void> deleteFederationConfigurations(String userId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart';
import 'package:fluffychat/data/hive/dto/federation_configurations_hive_obj.dart';
import 'package:fluffychat/data/hive/hive_collection_tom_database.dart';
import 'package:fluffychat/data/model/federation_server/federation_configuration.dart';
import 'package:fluffychat/di/global/get_it_initializer.dart';
import 'package:fluffychat/domain/exception/federation_configuration_not_found.dart';
import 'package:matrix/matrix.dart';

class HiveFederationConfigurationsDatasourceImpl
implements FederationConfigurationsDatasource {
@override
Future<FederationConfigurations> getFederationConfigurations(
String userId,
) async {
final hiveCollectionFederationDatabase =
await getIt.getAsync<HiveCollectionToMDatabase>();
final cachedFederationConfigurations =
await hiveCollectionFederationDatabase.federationConfigurationsBox
.get(userId);
if (cachedFederationConfigurations != null) {
final federationConfigurationsHiveObj =
FederationConfigurationsHiveObj.fromJson(
copyMap(
cachedFederationConfigurations,
),
);

return FederationConfigurations(
fedServerInformation: federationConfigurationsHiveObj
.federationServerInformation
.toFederationServerInformation(),
identityServerInformation:
federationConfigurationsHiveObj.identityServerUrl != null
? IdentityServerInformation(
baseUrl: Uri.parse(
federationConfigurationsHiveObj.identityServerUrl!,
),
)
: null,
);
}
throw FederationConfigurationNotFound();
}

@override
Future<void> saveFederationConfigurations(
String userId,
FederationConfigurations federationConfiguration,
) async {
final hiveCollectionFederationDatabase =
await getIt.getAsync<HiveCollectionToMDatabase>();
return hiveCollectionFederationDatabase.federationConfigurationsBox.put(
userId,
FederationConfigurationsHiveObj.fromFederationConfigurations(
federationConfiguration,
).toJson(),
);
}

@override
Future<void> deleteFederationConfigurations(String userId) async {
final hiveCollectionFederationDatabase =
getIt.get<HiveCollectionToMDatabase>();
return hiveCollectionFederationDatabase.federationConfigurationsBox.delete(
userId,
);
}
}
44 changes: 44 additions & 0 deletions lib/data/hive/dto/federation_configurations_hive_obj.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import 'package:equatable/equatable.dart';
import 'package:fluffychat/data/hive/dto/federation_server_information_hive_obj.dart';
import 'package:fluffychat/data/model/federation_server/federation_configuration.dart';
import 'package:json_annotation/json_annotation.dart';

part 'federation_configurations_hive_obj.g.dart';

@JsonSerializable(explicitToJson: true)
class FederationConfigurationsHiveObj with EquatableMixin {
final FederationServerInformationHiveObj federationServerInformation;

final String? identityServerUrl;

FederationConfigurationsHiveObj({
required this.federationServerInformation,
required this.identityServerUrl,
});

factory FederationConfigurationsHiveObj.fromFederationConfigurations(
FederationConfigurations federationConfigurations,
) {
return FederationConfigurationsHiveObj(
federationServerInformation:
FederationServerInformationHiveObj.fromFederationServerInformation(
federationConfigurations.fedServerInformation,
),
identityServerUrl: federationConfigurations
.identityServerInformation?.baseUrl
.toString(),
);
}

factory FederationConfigurationsHiveObj.fromJson(Map<String, dynamic> json) =>
_$FederationConfigurationsHiveObjFromJson(json);

Map<String, dynamic> toJson() =>
_$FederationConfigurationsHiveObjToJson(this);

@override
List<Object?> get props => [
federationServerInformation,
identityServerUrl,
];
}
40 changes: 40 additions & 0 deletions lib/data/hive/dto/federation_server_information_hive_obj.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'package:equatable/equatable.dart';
import 'package:fluffychat/data/model/federation_server/federation_server_information.dart';
import 'package:json_annotation/json_annotation.dart';

part 'federation_server_information_hive_obj.g.dart';

@JsonSerializable(explicitToJson: true)
class FederationServerInformationHiveObj with EquatableMixin {
final List<String>? baseUrls;

FederationServerInformationHiveObj({
required this.baseUrls,
});

factory FederationServerInformationHiveObj.fromJson(
Map<String, dynamic> json,
) =>
_$FederationServerInformationHiveObjFromJson(json);

Map<String, dynamic> toJson() =>
_$FederationServerInformationHiveObjToJson(this);

FederationServerInformation toFederationServerInformation() {
return FederationServerInformation(
baseUrls: baseUrls?.map((e) => Uri.parse(e)).toList(),
);
}

factory FederationServerInformationHiveObj.fromFederationServerInformation(
FederationServerInformation fedServerInformation,
) {
return FederationServerInformationHiveObj(
baseUrls:
fedServerInformation.baseUrls?.map((e) => e.toString()).toList(),
);
}

@override
List<Object?> get props => [baseUrls];
}
14 changes: 13 additions & 1 deletion lib/data/hive/hive_collection_tom_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ class HiveCollectionToMDatabase {
late BoxCollection _collection;

String get _tomConfigurationsBoxName => 'tom_configurations_box';

String get _federationConfigurationsBoxName =>
'federation_configurations_box';
late CollectionBox<Map> tomConfigurationsBox;

late CollectionBox<Map> federationConfigurationsBox;

HiveCollectionToMDatabase(this.name, this.path, {this.key});

static Future<HiveCollectionToMDatabase> databaseBuilder() async {
Expand Down Expand Up @@ -114,14 +119,21 @@ class HiveCollectionToMDatabase {
Future<void> open() async {
_collection = await BoxCollection.open(
name,
{_tomConfigurationsBoxName},
{
_tomConfigurationsBoxName,
_federationConfigurationsBoxName,
},
path: path,
key: key,
);
tomConfigurationsBox = await _collection.openBox(
_tomConfigurationsBoxName,
preload: true,
);
federationConfigurationsBox = await _collection.openBox(
_federationConfigurationsBoxName,
preload: true,
);
}

Future<void> clear() async {
Expand Down
19 changes: 19 additions & 0 deletions lib/data/model/federation_server/federation_configuration.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:equatable/equatable.dart';
import 'package:fluffychat/data/model/federation_server/federation_server_information.dart';
import 'package:matrix/matrix.dart';

class FederationConfigurations with EquatableMixin {
final FederationServerInformation fedServerInformation;
final IdentityServerInformation? identityServerInformation;

FederationConfigurations({
required this.fedServerInformation,
this.identityServerInformation,
});

@override
List<Object?> get props => [
fedServerInformation,
identityServerInformation,
];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'federation_server_information.g.dart';

@JsonSerializable()
class FederationServerInformation with EquatableMixin {
static const String fedServerKey = 'm.federated_identity_services';

@JsonKey(name: 'base_urls')
final List<Uri>? baseUrls;

FederationServerInformation({
this.baseUrls,
});

factory FederationServerInformation.fromJson(Map<String, dynamic> json) =>
_$FederationServerInformationFromJson(json);

Map<String, dynamic> toJson() => _$FederationServerInformationToJson(this);

@override
List<Object?> get props => [baseUrls];
}
36 changes: 36 additions & 0 deletions lib/data/model/user/fed_token_information.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'fed_token_information.g.dart';

@JsonSerializable()
class FedTokenInformation with EquatableMixin {
@JsonKey(name: 'access_token')
final String? fedAccessToken;
@JsonKey(name: 'token_type')
final String? fedTokenType;
@JsonKey(name: 'matrix_server_name')
final String? matrixServerName;
@JsonKey(name: 'expires_in')
final int? fedTokenExpiresIn;

FedTokenInformation({
this.fedAccessToken,
this.fedTokenType,
this.matrixServerName,
this.fedTokenExpiresIn,
});

factory FedTokenInformation.fromJson(Map<String, dynamic> json) =>
_$FedTokenInformationFromJson(json);

Map<String, dynamic> toJson() => _$FedTokenInformationToJson(this);

@override
List<Object?> get props => [
fedAccessToken,
fedTokenType,
matrixServerName,
fedTokenExpiresIn,
];
}
34 changes: 34 additions & 0 deletions lib/data/repository/federation_configurations_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart';
import 'package:fluffychat/data/model/federation_server/federation_configuration.dart';
import 'package:fluffychat/di/global/get_it_initializer.dart';
import 'package:fluffychat/domain/repository/federation_configurations_repository.dart';

class FederationConfigurationsRepositoryImpl
implements FederationConfigurationsRepository {
final FederationConfigurationsDatasource federationConfigurationsDatasource =
getIt.get<FederationConfigurationsDatasource>();

@override
Future<FederationConfigurations> getFederationConfigurations(String userId) {
return federationConfigurationsDatasource
.getFederationConfigurations(userId);
}

@override
Future<void> saveFederationConfigurations(
String userId,
FederationConfigurations federationConfigurations,
) {
return federationConfigurationsDatasource.saveFederationConfigurations(
userId,
federationConfigurations,
);
}

@override
Future<void> deleteFederationConfigurations(String userId) {
return federationConfigurationsDatasource.deleteFederationConfigurations(
userId,
);
}
}
10 changes: 10 additions & 0 deletions lib/di/global/get_it_initializer.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:collection';

import 'package:fluffychat/config/app_grid_config/app_config_loader.dart';
import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart';
import 'package:fluffychat/data/datasource/localizations/localizations_datasource.dart';
import 'package:fluffychat/data/datasource/lookup_datasource.dart';
import 'package:fluffychat/data/datasource/media/media_data_source.dart';
Expand All @@ -14,6 +15,7 @@ import 'package:fluffychat/data/datasource/tom_contacts_datasource.dart';
import 'package:fluffychat/data/datasource_impl/contact/lookup_datasource_impl.dart';
import 'package:fluffychat/data/datasource_impl/contact/phonebook_contact_datasource_impl.dart';
import 'package:fluffychat/data/datasource_impl/contact/tom_contacts_datasource_impl.dart';
import 'package:fluffychat/data/datasource_impl/federation_configurations_datasource_impl.dart';
import 'package:fluffychat/data/datasource_impl/localizations/localizations_datasource_impl.dart';
import 'package:fluffychat/data/datasource_impl/media/media_data_source_impl.dart';
import 'package:fluffychat/data/datasource_impl/multiple_account/multiple_account_datasource_impl.dart';
Expand All @@ -33,6 +35,7 @@ import 'package:fluffychat/data/network/server_config_api.dart';
import 'package:fluffychat/data/repository/contact/lookup_repository_impl.dart';
import 'package:fluffychat/data/repository/contact/phonebook_contact_repository_impl.dart';
import 'package:fluffychat/data/repository/contact/tom_contact_repository_impl.dart';
import 'package:fluffychat/data/repository/federation_configurations_repository_impl.dart';
import 'package:fluffychat/data/repository/localizations/localizations_repository_impl.dart';
import 'package:fluffychat/data/repository/media/media_repository_impl.dart';
import 'package:fluffychat/data/repository/multiple_account/multiple_account_repository_impl.dart';
Expand All @@ -45,6 +48,7 @@ import 'package:fluffychat/di/global/network_connectivity_di.dart';
import 'package:fluffychat/di/global/network_di.dart';
import 'package:fluffychat/domain/contact_manager/contacts_manager.dart';
import 'package:fluffychat/domain/repository/contact_repository.dart';
import 'package:fluffychat/domain/repository/federation_configurations_repository.dart';
import 'package:fluffychat/domain/repository/localizations/localizations_repository.dart';
import 'package:fluffychat/domain/repository/lookup_repository.dart';
import 'package:fluffychat/domain/repository/multiple_account/multiple_account_repository.dart';
Expand Down Expand Up @@ -174,6 +178,9 @@ class GetItInitializer {
getIt.registerFactory<ToMConfigurationsDatasource>(
() => HiveToMConfigurationDatasource(),
);
getIt.registerFactory<FederationConfigurationsDatasource>(
() => HiveFederationConfigurationsDatasourceImpl(),
);
getIt.registerFactory<MediaDataSource>(
() => MediaDataSourceImpl(getIt.get<MediaAPI>()),
);
Expand Down Expand Up @@ -226,6 +233,9 @@ class GetItInitializer {
getIt.registerFactory<ToMConfigurationsRepository>(
() => ToMConfigurationsRepositoryImpl(),
);
getIt.registerFactory<FederationConfigurationsRepository>(
() => FederationConfigurationsRepositoryImpl(),
);
getIt.registerLazySingleton<RecoveryWordsRepository>(
() => RecoveryWordsRepositoryImpl(),
);
Expand Down
3 changes: 3 additions & 0 deletions lib/domain/exception/federation_configuration_not_found.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class FederationConfigurationNotFound implements Exception {
FederationConfigurationNotFound() : super();
}
Loading

0 comments on commit d91ce44

Please sign in to comment.