diff --git a/lib/logic/api_maps/graphql_maps/api_map.dart b/lib/logic/api_maps/graphql_maps/api_map.dart index 185a5e54..0f786417 100644 --- a/lib/logic/api_maps/graphql_maps/api_map.dart +++ b/lib/logic/api_maps/graphql_maps/api_map.dart @@ -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(final T objectToLog) { + getIt.get().addMessage( + Message( + text: objectToLog.toString(), + ), + ); +} + +class LoggingLink extends Link { + @override + Stream request( + final Request request, [ + final NextLink? forward, + ]) async* { + _logToAppConsole(request); + yield* forward!(request); + } +} + +class LoggingResponseParser extends ResponseParser { + @override + Response parseResponse(final Map body) { + final response = super.parseResponse(body); + _logToAppConsole(response); + return response; + } + + @override + GraphQLError parseError(final Map error) { + final graphQlError = super.parseError(error); + _logToAppConsole(graphQlError); + return graphQlError; + } +} abstract class ApiMap { Future 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(),