Skip to content

Commit

Permalink
List and delete admin action for package reservation. (#8121)
Browse files Browse the repository at this point in the history
  • Loading branch information
isoos authored Oct 8, 2024
1 parent 4a73f21 commit d4c325e
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 0 deletions.
4 changes: 4 additions & 0 deletions app/lib/admin/actions/actions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import 'moderation_case_update.dart';
import 'moderation_transparency_metrics.dart';
import 'package_info.dart';
import 'package_reservation_create.dart';
import 'package_reservation_delete.dart';
import 'package_reservation_list.dart';
import 'package_version_info.dart';
import 'package_version_retraction.dart';
import 'publisher_block.dart';
Expand Down Expand Up @@ -102,6 +104,8 @@ final class AdminAction {
moderationTransparencyMetrics,
packageInfo,
packageReservationCreate,
packageReservationDelete,
packageReservationList,
packageVersionInfo,
packageVersionRetraction,
publisherBlock,
Expand Down
41 changes: 41 additions & 0 deletions app/lib/admin/actions/package_reservation_delete.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// 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/package/backend.dart';
import 'package:pub_dev/shared/datastore.dart';

import 'actions.dart';

final packageReservationDelete = AdminAction(
name: 'package-reservation-delete',
summary: 'Deletes a ReservedPackage entity.',
description: '''
Deletes a ReservedPackage entity, allowing the package name use by any user.
''',
options: {
'package': 'The package reservation to be deleted.',
},
invoke: (options) async {
final package = options['package'];
InvalidInputException.check(
package != null && package.isNotEmpty,
'`package` must be given',
);

final rp = await packageBackend.lookupReservedPackage(package!);
if (rp == null) {
throw NotFoundException('ReservedPackage `$package` does not exist.');
}

await dbService.commit(deletes: [rp.key]);

return {
'ReservedPackage': {
'name': rp.name,
'emails': rp.emails,
'deleted': true,
},
};
},
);
30 changes: 30 additions & 0 deletions app/lib/admin/actions/package_reservation_list.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// 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/package/models.dart';
import 'package:pub_dev/shared/datastore.dart';

import 'actions.dart';

final packageReservationList = AdminAction(
name: 'package-reservation-list',
summary: 'Lists all ReservedPackage entities.',
description: '''
Returns the list of all ReservedPackage entities and the allowed emails.
''',
options: {},
invoke: (options) async {
final query = dbService.query<ReservedPackage>();
final list = await query.run().toList();

return {
'packages': list
.map((rp) => {
'name': rp.name,
'emails': rp.emails,
})
.toList(),
};
},
);
31 changes: 31 additions & 0 deletions app/test/admin/package_reservation_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,23 @@ void main() {
);
}

Future<Map<String, dynamic>> _list() async {
final api = createPubApiClient(authToken: siteAdminToken);
final rs = await api.adminInvokeAction(
'package-reservation-list',
AdminInvokeActionArguments(arguments: {}),
);
return rs.output;
}

Future<void> _delete(String package) async {
final api = createPubApiClient(authToken: siteAdminToken);
await api.adminInvokeAction(
'package-reservation-delete',
AdminInvokeActionArguments(arguments: {'package': package}),
);
}

testWithProfile('cannot reserve existing package', fn: () async {
await expectApiException(
_reserve('oxygen'),
Expand Down Expand Up @@ -97,5 +114,19 @@ void main() {
message: 'Package name pkg is reserved.',
);
});

testWithProfile('list and delete', fn: () async {
await _reserve('pkg', emails: ['foo@pub.dev']);
expect(await _list(), {
'packages': [
{
'name': 'pkg',
'emails': ['foo@pub.dev'],
}
]
});
await _delete('pkg');
expect(await _list(), {'packages': []});
});
});
}

0 comments on commit d4c325e

Please sign in to comment.