blob: b311392af5eae41d5973b45019339966095cd11c [file] [log] [blame]
// Copyright 2022 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 'package:auto_submit/exception/bigquery_exception.dart';
import 'package:auto_submit/model/big_query_revert_request_record.dart';
import 'package:auto_submit/service/bigquery.dart';
import 'package:auto_submit/service/config.dart';
import 'package:auto_submit/service/github_service.dart';
import 'package:github/github.dart';
import 'package:shelf/shelf.dart';
import '../service/log.dart';
import '../server/authenticated_request_handler.dart';
class UpdateRevertIssues extends AuthenticatedRequestHandler {
const UpdateRevertIssues({
required super.config,
required super.cronAuthProvider,
});
@override
Future<Response> get() async {
final BigqueryService bigqueryService = await config.createBigQueryService();
log.info('Updating closed revert request review issues in the database.');
final List<RevertRequestRecord> revertRequestRecords =
await bigqueryService.selectOpenReviewRequestIssueRecordsList(projectId: Config.flutterGcpProjectId);
if (revertRequestRecords.isEmpty) {
return Response.ok('No open revert reviews to update.');
}
final GithubService githubService =
await config.createGithubService(RepositorySlug(Config.flutter, Config.flutter));
for (RevertRequestRecord revertRequestRecord in revertRequestRecords) {
await updateIssue(
revertRequestRecord: revertRequestRecord,
bigqueryService: bigqueryService,
githubService: githubService,
);
}
return Response.ok('Finished processing revert review updates.');
}
/// Update the review issue associated with the revert request if it has been
/// closed.
Future<bool> updateIssue({
required RevertRequestRecord revertRequestRecord,
required BigqueryService bigqueryService,
required GithubService githubService,
}) async {
bool updated = false;
log.info('Processing review issue# ${revertRequestRecord.reviewIssueNumber}.');
try {
// Get the revert review issue.
Issue issue = await githubService.getIssue(
slug: RepositorySlug(Config.flutter, Config.flutter),
issueNumber: revertRequestRecord.reviewIssueNumber!,
);
if (issue.isClosed) {
log.info('Updating review issue# ${issue.number} in database.');
await bigqueryService.updateReviewRequestIssue(
projectId: Config.flutterGcpProjectId,
reviewIssueLandedTimestamp: issue.closedAt!,
reviewIssueNumber: revertRequestRecord.reviewIssueNumber!,
reviewIssueClosedBy: issue.closedBy!.login!,
);
log.info('Review issue# ${issue.number} updated successfully.');
updated = true;
}
} on BigQueryException catch (exception) {
log.severe(
'An error occured while validating and updating review issue# ${revertRequestRecord.reviewIssueNumber}. Exception: ${exception.cause}',
);
}
return updated;
}
}