feat: Implement logging for GraphQL API map

Log to application console all requests and all responses
pull/153/head
NaiJi ✨ 2022-12-19 22:47:35 +04:00
parent 1e8f17f16e
commit 813d275d12
1 changed files with 52 additions and 6 deletions

View File

@ -1,9 +1,48 @@
// ignore_for_file: prefer_foreach
import 'dart:async';
import 'dart:io';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:http/io_client.dart';
import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/api_maps/staging_options.dart';
import 'package:selfprivacy/logic/models/message.dart';
void _logToAppConsole<T>(final T objectToLog) {
getIt.get<ConsoleModel>().addMessage(
Message(
text: objectToLog.toString(),
),
);
}
class LoggingLink extends Link {
@override
Stream<Response> request(
final Request request, [
final NextLink? forward,
]) async* {
_logToAppConsole(request);
yield* forward!(request);
}
}
class LoggingResponseParser extends ResponseParser {
@override
Response parseResponse(final Map<String, dynamic> body) {
final response = super.parseResponse(body);
_logToAppConsole(response);
return response;
}
@override
GraphQLError parseError(final Map<String, dynamic> error) {
final graphQlError = super.parseError(error);
_logToAppConsole(graphQlError);
return graphQlError;
}
}
abstract class ApiMap {
Future<GraphQLClient> getClient() async {
@ -22,16 +61,23 @@ abstract class ApiMap {
final httpLink = HttpLink(
'https://api.$rootAddress/graphql',
httpClient: ioClient,
parser: LoggingResponseParser(),
);
final String token = _getApiToken();
final Link graphQLLink = isWithToken
? AuthLink(
getToken: () async =>
customToken == '' ? 'Bearer $token' : customToken,
).concat(httpLink)
: httpLink;
final Link graphQLLink = LoggingLink().concat(
isWithToken
? AuthLink(
getToken: () async =>
customToken == '' ? 'Bearer $token' : customToken,
).concat(httpLink)
: httpLink,
);
// Every request goes through either chain:
// 1. AuthLink -> HttpLink -> LoggingLink
// 2. HttpLink -> LoggingLink
return GraphQLClient(
cache: GraphQLCache(),