mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-08 16:07:52 -06:00
Initial commit
This commit is contained in:
34
lib/core/interceptor/authentication.interceptor.dart
Normal file
34
lib/core/interceptor/authentication.interceptor.dart
Normal file
@@ -0,0 +1,34 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:flutter_paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@injectable
|
||||
class AuthenticationInterceptor implements InterceptorContract {
|
||||
AuthenticationCubit authenticationCubit;
|
||||
AuthenticationInterceptor(this.authenticationCubit);
|
||||
|
||||
@override
|
||||
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
|
||||
final authState = authenticationCubit.state;
|
||||
if (kDebugMode) {
|
||||
log("Intercepted request to ${request.url.toString()}");
|
||||
}
|
||||
if (authState.authentication == null) {
|
||||
throw const ErrorMessage(ErrorCode.notAuthenticated);
|
||||
}
|
||||
return request.copyWith(
|
||||
//Append server Url
|
||||
url: Uri.parse(authState.authentication!.serverUrl + request.url.toString()),
|
||||
headers: authState.authentication!.token.isEmpty
|
||||
? request.headers
|
||||
: {...request.headers, 'Authorization': 'Token ${authState.authentication!.token}'},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<BaseResponse> interceptResponse({required BaseResponse response}) async => response;
|
||||
}
|
||||
31
lib/core/interceptor/connection_state.interceptor.dart
Normal file
31
lib/core/interceptor/connection_state.interceptor.dart
Normal file
@@ -0,0 +1,31 @@
|
||||
import 'package:flutter_paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:flutter_paperless_mobile/core/service/connectivity_status.service.dart';
|
||||
import 'package:flutter_paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@injectable
|
||||
class ConnectionStateInterceptor implements InterceptorContract {
|
||||
final AuthenticationCubit authenticationCubit;
|
||||
final ConnectivityStatusService connectivityStatusService;
|
||||
ConnectionStateInterceptor(
|
||||
this.authenticationCubit, this.connectivityStatusService);
|
||||
|
||||
@override
|
||||
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
|
||||
if (!(await connectivityStatusService.isConnectedToInternet())) {
|
||||
throw const ErrorMessage(ErrorCode.deviceOffline);
|
||||
}
|
||||
final isServerReachable =
|
||||
await connectivityStatusService.isServerReachable(request.url.origin);
|
||||
if (!isServerReachable) {
|
||||
throw const ErrorMessage(ErrorCode.serverUnreachable);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<BaseResponse> interceptResponse(
|
||||
{required BaseResponse response}) async =>
|
||||
response;
|
||||
}
|
||||
25
lib/core/interceptor/language_header.interceptor.dart
Normal file
25
lib/core/interceptor/language_header.interceptor.dart
Normal file
@@ -0,0 +1,25 @@
|
||||
import 'package:flutter_paperless_mobile/features/settings/bloc/application_settings_cubit.dart';
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@injectable
|
||||
class LanguageHeaderInterceptor implements InterceptorContract {
|
||||
final ApplicationSettingsCubit appSettingsCubit;
|
||||
|
||||
LanguageHeaderInterceptor(this.appSettingsCubit);
|
||||
|
||||
@override
|
||||
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
|
||||
late String languages;
|
||||
if (appSettingsCubit.state.preferredLocaleSubtag == "en") {
|
||||
languages = "en";
|
||||
} else {
|
||||
languages = appSettingsCubit.state.preferredLocaleSubtag + ",en;q=0.7,en-US;q=0.6";
|
||||
}
|
||||
request.headers.addAll({"Accept-Language": languages});
|
||||
return request;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<BaseResponse> interceptResponse({required BaseResponse response}) async => response;
|
||||
}
|
||||
32
lib/core/interceptor/response_conversion.interceptor.dart
Normal file
32
lib/core/interceptor/response_conversion.interceptor.dart
Normal file
@@ -0,0 +1,32 @@
|
||||
import 'package:http/http.dart';
|
||||
import 'package:http_interceptor/http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
const interceptedRoutes = ['thumb/'];
|
||||
|
||||
@injectable
|
||||
class ResponseConversionInterceptor implements InterceptorContract {
|
||||
@override
|
||||
Future<BaseRequest> interceptRequest({required BaseRequest request}) async => request;
|
||||
|
||||
@override
|
||||
Future<BaseResponse> interceptResponse({required BaseResponse response}) async {
|
||||
final String requestUrl = response.request?.url.toString().split("?").first ?? '';
|
||||
if (response.request?.method == "GET" &&
|
||||
interceptedRoutes.any((element) => requestUrl.endsWith(element))) {
|
||||
final resp = response as Response;
|
||||
|
||||
return StreamedResponse(
|
||||
Stream.value(resp.bodyBytes.toList()).asBroadcastStream(),
|
||||
resp.statusCode,
|
||||
contentLength: resp.contentLength,
|
||||
headers: resp.headers,
|
||||
isRedirect: resp.isRedirect,
|
||||
persistentConnection: false,
|
||||
reasonPhrase: resp.reasonPhrase,
|
||||
request: resp.request,
|
||||
);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user