Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TW-2220: Extract fed server in well know #2221

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,
];
}
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class FederationConfigurationNotFound implements Exception {
FederationConfigurationNotFound() : super();
}
Loading