blob: 2c3e83eca0cc3204790d4ed8c6127a0044642eb2 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. 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:convert';
import 'package:http/http.dart' as http;
import 'constants.dart';
class FakeGAClient implements GAClient {
const FakeGAClient();
@override
String get apiSecret => throw UnimplementedError();
@override
String get measurementId => throw UnimplementedError();
@override
String get postUrl => throw UnimplementedError();
@override
http.Client get _client => throw UnimplementedError();
@override
void close() {}
@override
Future<http.Response> sendData(Map<String, Object?> body) =>
Future<http.Response>.value(http.Response('', 200));
}
class GAClient {
final String measurementId;
final String apiSecret;
final String postUrl;
final http.Client _client;
GAClient({
required this.measurementId,
required this.apiSecret,
}) : postUrl = '$kAnalyticsUrl?'
'measurement_id=$measurementId&api_secret=$apiSecret',
_client = http.Client();
/// Closes the http client's connection to prevent lingering requests.
void close() => _client.close();
/// Receive the payload in Map form and parse
/// into JSON to send to GA.
///
/// The [http.Response] returned from this method can be
/// checked to ensure that events have been sent. A response
/// status code of `2xx` indicates a successful send event.
/// A response status code of `500` indicates an error occured on the send
/// can the error message can be found in the [http.Response.body].
Future<http.Response> sendData(Map<String, Object?> body) async {
final uri = Uri.parse(postUrl);
// Using a try catch all since post method can result in several
// errors; clients using this method can check the awaited status
// code to get a specific error message if the status code returned
// is a 500 error status code
try {
return await _client.post(
uri,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(body),
);
// ignore: avoid_catches_without_on_clauses
} catch (error) {
return Future<http.Response>.value(
http.Response(
error.toString(),
500,
headers: <String, String>{
'content-type': 'text/plain; charset=utf-8',
},
),
);
}
}
}