blob: 9fa65063eb5ecb6d2badd48eac76a49a0421969e [file] [log] [blame]
// Copyright 2020 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:gql/language.dart' as lang;
import 'package:graphql/client.dart';
import 'package:meta/meta.dart';
import '../request_handling/api_request_handler.dart';
import '../request_handling/body.dart';
import '../request_handling/exceptions.dart';
import '../service/logging.dart';
/// Runs an authenticated Github GraphQl query returning the query result as json.
@immutable
class QueryGithubGraphql extends ApiRequestHandler<Body> {
const QueryGithubGraphql({
required super.config,
required super.authenticationProvider,
@visibleForTesting super.requestBodyValue,
});
@override
Future<Body> post() async {
final String requestDataString = String.fromCharCodes(requestBody!);
if (requestDataString.isEmpty) {
throw const BadRequestException('Empty request');
}
log.info('Received query: $requestDataString');
final GraphQLClient client = await config.createGitHubGraphQLClient();
final Map<String, dynamic>? data = await _queryGraphQL(client, requestDataString);
return Body.forJson(data);
}
Future<Map<String, dynamic>?> _queryGraphQL(
GraphQLClient client,
String query,
) async {
final QueryResult result = await client.query(
QueryOptions(
document: lang.parseString(query),
fetchPolicy: FetchPolicy.noCache,
),
);
if (result.hasException) {
log.severe(result.exception.toString());
throw const BadRequestException('GraphQL query failed');
}
return result.data;
}
}