Skip to content

Commit

Permalink
Integration federation lookup module
Browse files Browse the repository at this point in the history
  • Loading branch information
nqhhdev committed Feb 4, 2025
1 parent 716097c commit 1c9203b
Show file tree
Hide file tree
Showing 16 changed files with 687 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_hash_details_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_request.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_register_response.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';

abstract class FederationIdentityLookupDatasource {
Future<FederationRegisterResponse> register({
required FederationTokenInformation tokenInformation,
});

Future<FederationHashDetailsResponse> getHashDetails({
required String token,
});

Future<FederationLookupMxidResponse> lookupMxid({
required FederationLookupMxidRequest request,
required String token,
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import 'package:fluffychat/modules/federation_identity_lookup/data/datasource/federation_identity_lookup_datasource.dart';
import 'package:fluffychat/modules/federation_identity_lookup/data/network/federation_identity_lookup_api.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_hash_details_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_request.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_register_response.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';

class FederationIdentityLookupDatasourceImpl
implements FederationIdentityLookupDatasource {
final FederationIdentityLookupApi federationIdentityLookupApi;

FederationIdentityLookupDatasourceImpl({
required this.federationIdentityLookupApi,
});

@override
Future<FederationHashDetailsResponse> getHashDetails({
required String token,
}) {
return federationIdentityLookupApi.getHashDetails(
token,
);
}

@override
Future<FederationLookupMxidResponse> lookupMxid({
required FederationLookupMxidRequest request,
required String token,
}) {
return federationIdentityLookupApi.lookupMxid(
request: request,
token: token,
);
}

@override
Future<FederationRegisterResponse> register({
required FederationTokenInformation tokenInformation,
}) {
return federationIdentityLookupApi.register(
tokenInformation: tokenInformation,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:fluffychat/data/network/service_path.dart';

class FederationIdentityEndpoint {
static const String federationIdentityRootPath = '/_matrix/identity';
static const String federationIdentityAPIVersion = 'v2';

static const federationIdentityDioClientName =
'federationIdentityDioClientName';

static const acceptHeaderDefault = 'application/json';

static const contentTypeHeaderDefault = 'application/json';

static final ServicePath lookupServicePath = ServicePath(
'/lookup',
);

static final ServicePath hashDetailsServicePath = ServicePath(
'/hash_details',
);

static final ServicePath registerServicePath = ServicePath(
'/register',
);
}

extension FederationServicePathExtensions on ServicePath {
String generateFederationIdentityEndpoint({
String rootPath = FederationIdentityEndpoint.federationIdentityRootPath,
String apiVersion = FederationIdentityEndpoint.federationIdentityAPIVersion,
}) {
return '$rootPath/$apiVersion$path';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:fluffychat/modules/federation_identity_lookup/data/network/federation_identity_endpoint.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_hash_details_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_request.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_register_response.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';
import 'package:fluffychat/data/network/dio_client.dart';

class FederationIdentityLookupApi {
final DioClient client;

FederationIdentityLookupApi(this.client);

Future<FederationRegisterResponse> register({
required FederationTokenInformation tokenInformation,
}) async {
final path = FederationIdentityEndpoint.registerServicePath
.generateFederationIdentityEndpoint();

final response = await client.postToGetBody(
path,
data: tokenInformation.toJson(),
);

return FederationRegisterResponse.fromJson(response);
}

Future<FederationHashDetailsResponse> getHashDetails(String token) async {
final path = FederationIdentityEndpoint.hashDetailsServicePath
.generateFederationIdentityEndpoint();

final dioHeaders = client.getHeaders();

dioHeaders[HttpHeaders.authorizationHeader] = 'Bearer $token';

final response = await client.get(
path,
options: Options(headers: dioHeaders),
);

return FederationHashDetailsResponse.fromJson(response);
}

Future<FederationLookupMxidResponse> lookupMxid({
required FederationLookupMxidRequest request,
required String token,
}) async {
final path = FederationIdentityEndpoint.lookupServicePath
.generateFederationIdentityEndpoint();

final dioHeaders = client.getHeaders();

dioHeaders[HttpHeaders.authorizationHeader] = 'Bearer $token';

final response = await client.postToGetBody(
path,
data: request.toJson(),
options: Options(headers: dioHeaders),
);

return FederationLookupMxidResponse.fromJson(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:fluffychat/modules/federation_identity_lookup/data/datasource/federation_identity_lookup_datasource.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_hash_details_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_request.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_register_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/repository/federation_identity_lookup_repository.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';

class FederationIdentityLookupRepositoryImpl
implements FederationIdentityLookupRepository {
final FederationIdentityLookupDatasource datasource;

FederationIdentityLookupRepositoryImpl({required this.datasource});

@override
Future<FederationHashDetailsResponse> getHashDetails({
required String token,
}) {
return datasource.getHashDetails(
token: token,
);
}

@override
Future<FederationLookupMxidResponse> lookupMxid({
required FederationLookupMxidRequest request,
required String token,
}) {
return datasource.lookupMxid(
request: request,
token: token,
);
}

@override
Future<FederationRegisterResponse> register({
required FederationTokenInformation tokenInformation,
}) {
return datasource.register(
tokenInformation: tokenInformation,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:equatable/equatable.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';

class FederationArguments with EquatableMixin {
final String federationUrl;

final FederationTokenInformation tokenInformation;

final Set<String>? phoneNumbers;

final Set<String>? emailAddresses;

FederationArguments({
required this.federationUrl,
required this.tokenInformation,
this.phoneNumbers,
this.emailAddresses,
});

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

part 'federation_hash_details_response.g.dart';

@JsonSerializable()
class FederationHashDetailsResponse extends Equatable {
@JsonKey(name: 'algorithms')
final Set<String>? algorithms;

@JsonKey(name: 'lookup_pepper')
final String? lookupPepper;

const FederationHashDetailsResponse({
this.algorithms,
this.lookupPepper,
});

@override
List<Object?> get props => [algorithms, lookupPepper];

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

Map<String, dynamic> toJson() => _$FederationHashDetailsResponseToJson(this);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';

part 'federation_lookup_mxid_request.g.dart';

@JsonSerializable()
class FederationLookupMxidRequest extends Equatable {
@JsonKey(name: 'addresses')
final Set<String>? addresses;
@JsonKey(name: 'algorithm')
final String? algorithm;
@JsonKey(name: 'pepper')
final String? pepper;

const FederationLookupMxidRequest({
this.addresses,
this.algorithm,
this.pepper,
});

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

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

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

part 'federation_lookup_mxid_response.g.dart';

@JsonSerializable()
class FederationLookupMxidResponse extends Equatable {
@JsonKey(name: 'mappings')
final Map<String, String>? mappings;

@JsonKey(name: 'inactive_mappings')
final Map<String, String>? inactiveMappings;

const FederationLookupMxidResponse({
this.mappings,
this.inactiveMappings,
});

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

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

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

part 'federation_register_response.g.dart';

@JsonSerializable()
class FederationRegisterResponse extends Equatable {
@JsonKey(name: "token")
final String? token;

const FederationRegisterResponse({
this.token,
});

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

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

@override
List<Object?> get props => [token];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_hash_details_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_request.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_lookup_mxid_response.dart';
import 'package:fluffychat/modules/federation_identity_lookup/domain/models/federation_register_response.dart';
import 'package:fluffychat/modules/federation_indetity_request_token/domain/models/federation_token_information.dart';

abstract class FederationIdentityLookupRepository {
Future<FederationRegisterResponse> register({
required FederationTokenInformation tokenInformation,
});

Future<FederationHashDetailsResponse> getHashDetails({
required String token,
});

Future<FederationLookupMxidResponse> lookupMxid({
required FederationLookupMxidRequest request,
required String token,
});
}
Loading

0 comments on commit 1c9203b

Please sign in to comment.