submitReport static method
Implementation
static Future<BugReport> submitReport(
BugReportRequest submitReportRequest, {
LogBuffer? logBuffer,
}) async {
final uri = Uri.parse('$_apiUrl/bug_reports');
final request =
http.MultipartRequest('POST', uri)
..fields['api_token'] = submitReportRequest.apiToken
..fields['app_install[id]'] =
submitReportRequest.appInstall.id.toString()
..fields['bug_report[description]'] =
submitReportRequest.report.description ?? 'no description'
..fields['bug_report[steps_to_reproduce]'] =
submitReportRequest.report.stepsToReproduce ??
'no steps to reproduce'
..fields['bug_report[user_identifier]'] =
submitReportRequest.report.userIdentifier ?? 'no user identifier'
..fields.addAll(await (_deviceStatusProvider ?? Api.deviceStatus)());
if (submitReportRequest.report.attachments?.isNotEmpty ?? false) {
await Future.wait(
submitReportRequest.report.attachments!.map((attachment) async {
if (attachment.path != null) {
request.files.add(
await http.MultipartFile.fromPath(
'bug_report[attachments][]',
attachment.path!,
filename: attachment.name,
),
);
}
}),
);
}
// Attach captured logs as a text file, if available.
if (logBuffer != null && !logBuffer.isEmpty) {
try {
final logContent = logBuffer.export();
request.files.add(
http.MultipartFile.fromString(
'bug_report[attachments][]',
logContent,
filename: 'console-logs.txt',
),
);
} catch (e) {
debugPrint('Critic: failed to attach log capture: $e');
}
}
final streamedResponse = await _client.send(request);
print('Response: ${streamedResponse.statusCode}');
final body = await streamedResponse.stream.bytesToString();
print(body);
if (streamedResponse.statusCode == 200 ||
streamedResponse.statusCode == 201) {
return BugReport.fromJson(json.decode(body));
} else {
throw Exception('Response code: ${streamedResponse.statusCode}, $body');
}
}