Skip to content

Commit

Permalink
Admin action for getting moderation case info. (#7727)
Browse files Browse the repository at this point in the history
  • Loading branch information
isoos committed May 14, 2024
1 parent 6683ac3 commit a2b17d0
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 3 deletions.
2 changes: 2 additions & 0 deletions app/lib/admin/actions/actions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'moderate_package.dart';
import 'moderate_package_versions.dart';
import 'moderate_publisher.dart';
import 'moderate_user.dart';
import 'moderation_case_info.dart';
import 'publisher_block.dart';
import 'publisher_members_list.dart';
import 'remove_package_from_publisher.dart';
Expand Down Expand Up @@ -78,6 +79,7 @@ final class AdminAction {
moderatePackageVersion,
moderatePublisher,
moderateUser,
moderationCaseInfo,
publisherBlock,
publisherMembersList,
removePackageFromPublisher,
Expand Down
44 changes: 44 additions & 0 deletions app/lib/admin/actions/moderation_case_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) 2024, 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 'package:pub_dev/admin/backend.dart';

import 'actions.dart';

final moderationCaseInfo = AdminAction(
name: 'moderation-case-info',
summary: 'Gets the moderation case information.',
description: '''
Loads and displays the moderation case information.
''',
options: {
'case': 'The caseId to be loaded.',
},
invoke: (options) async {
final caseId = options['case'];
InvalidInputException.check(
caseId != null && caseId.isNotEmpty,
'case must be given',
);

final mc = await adminBackend.lookupModerationCase(caseId!);
if (mc == null) {
throw NotFoundException.resource(caseId);
}

return {
'caseId': mc.caseId,
'reporterEmail': mc.reporterEmail,
'kind': mc.kind,
'opened': mc.opened.toIso8601String(),
if (mc.resolved != null) 'resolved': mc.resolved!.toIso8601String(),
'source': mc.source,
'status': mc.status,
'subject': mc.subject,
'url': mc.url,
if (mc.appealedCaseId != null) 'appealedCaseId': mc.appealedCaseId,
'actionLog': mc.getActionLog().toJson(),
};
},
);
4 changes: 2 additions & 2 deletions app/lib/admin/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ class ModerationSubjectKind {
static const user = 'user';
}

@JsonSerializable(includeIfNull: false)
@JsonSerializable(includeIfNull: false, explicitToJson: true)
class ModerationActionLog {
final List<ModerationActionLogEntry> entries;

Expand All @@ -291,7 +291,7 @@ enum ModerationAction {
revert,
}

@JsonSerializable(includeIfNull: false)
@JsonSerializable(includeIfNull: false, explicitToJson: true)
class ModerationActionLogEntry {
final DateTime timestamp;
final String subject;
Expand Down
2 changes: 1 addition & 1 deletion app/lib/admin/models.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions app/test/package/moderate_package_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,40 @@ void main() {
await (await createFakeAuthPubApiClient(email: adminAtPubDevEmail))
.setPackageOptions('oxygen', PkgOptions(isUnlisted: true));
expect(optionsUpdates.isUnlisted, true);

final api = createPubApiClient(authToken: siteAdminToken);
final info = await api.adminInvokeAction(
'moderation-case-info',
AdminInvokeActionArguments(arguments: {
'case': mc.caseId,
}),
);
expect(info.toJson(), {
'output': {
'caseId': isNotEmpty,
'reporterEmail': 'user@pub.dev',
'kind': 'notification',
'opened': isNotEmpty,
'source': 'external-notification',
'status': 'pending',
'subject': 'package:oxygen',
'url': null,
'actionLog': {
'entries': [
{
'timestamp': isNotEmpty,
'subject': 'package:oxygen',
'moderationAction': 'apply'
},
{
'timestamp': isNotEmpty,
'subject': 'package:oxygen',
'moderationAction': 'revert'
}
]
}
}
});
});

testWithProfile('API endpoints return not found', fn: () async {
Expand Down

0 comments on commit a2b17d0

Please sign in to comment.