TF-571 Check OIDC is available

This commit is contained in:
dab246
2022-05-20 12:38:31 +07:00
committed by Dat H. Pham
parent c5aa9f7d69
commit 239234f836
29 changed files with 625 additions and 55 deletions
@@ -0,0 +1,6 @@
import 'package:model/model.dart';
abstract class AuthenticationOIDCDataSource {
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest);
}
@@ -0,0 +1,20 @@
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
final OIDCHttpClient _oidcHttpClient;
AuthenticationOIDCDataSourceImpl(this._oidcHttpClient);
@override
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
return Future.sync(() async {
final oidcResponse = await _oidcHttpClient.checkOIDCIsAvailable(oidcRequest);
return oidcResponse != null;
}).catchError((error) {
throw error;
});
}
}
@@ -0,0 +1,29 @@
import 'package:core/core.dart';
import 'package:tmail_ui_user/features/login/data/network/endpoint.dart';
extension ServicePathExtension on ServicePath {
String generateEndpointPath() {
return path;
}
ServicePath generateOIDCPath(Uri baseUrl) {
return ServicePath(baseUrl.origin + Endpoint.oidc + path);
}
ServicePath withQueryParameters(List<QueryParameter> queryParameters) {
if (queryParameters.isEmpty) {
return this;
}
return ServicePath('$path?${queryParameters
.map((query) => '${query.queryName}=${query.queryValue}').join('&')}');
}
ServicePath withPathParameter([String? pathParameter]) {
if (pathParameter == null || pathParameter.isEmpty) {
return this;
}
return ServicePath('$path/$pathParameter');
}
}
@@ -0,0 +1,7 @@
import 'package:core/data/network/config/service_path.dart';
class Endpoint {
static const String oidc = '/oidc';
static final ServicePath webFinger = ServicePath('/.well-known/webfinger');
}
@@ -0,0 +1,32 @@
import 'dart:convert';
import 'package:core/core.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/login/data/network/endpoint.dart';
import 'package:tmail_ui_user/features/login/data/extensions/service_path_extension.dart';
class OIDCHttpClient {
final DioClient _dioClient;
OIDCHttpClient(this._dioClient);
Future<OIDCResponse?> checkOIDCIsAvailable(OIDCRequest oidcRequest) async {
final result = await _dioClient.get(
Endpoint.webFinger
.generateOIDCPath(Uri.parse(oidcRequest.baseUrl))
.withQueryParameters([
StringQueryParameter('resource', oidcRequest.resourceUrl),
StringQueryParameter('rel', oidcRequest.relUrl),
])
.generateEndpointPath()
);
log('OIDCHttpClient::checkOIDCIsAvailable(): RESULT: $result');
if (result is Map<String, dynamic>) {
return OIDCResponse.fromJson(result);
} else {
return OIDCResponse.fromJson(jsonDecode(result));
}
}
}
@@ -0,0 +1,14 @@
import 'package:model/oidc/request/oidc_request.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
final AuthenticationOIDCDataSource _oidcDataSource;
AuthenticationOIDCRepositoryImpl(this._oidcDataSource);
@override
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
return _oidcDataSource.checkOIDCIsAvailable(oidcRequest);
}
}