@@ -294,24 +294,16 @@ class AdminBackend {
294294 /// Creates a [ModeratedPackage] instance (if not already present) in
295295 /// Datastore representing the removed package. No new package with the same
296296 /// name can be published.
297- ///
298- /// Verifies the current authenticated user for admin permissions.
299- Future <void > removePackage (String packageName) async {
300- final caller =
301- await requireAuthenticatedAdmin (AdminPermission .removePackage);
302- _logger.info ('${caller .displayId }) initiated the delete '
303- 'of package $packageName ' );
304- await _removePackage (packageName);
305- }
306-
307- /// Removes the package from the Datastore and updates other related
308- /// entities. It is safe to call [removePackage] on an already removed
309- /// package, as the call is idempotent.
310- ///
311- /// Creates a [ModeratedPackage] instance (if not already present) in
312- /// Datastore representing the removed package. No new package with the same
313- /// name can be published.
314- Future <void > _removePackage (
297+ Future <
298+ ({
299+ int deletedPackages,
300+ int deletedPackageVersions,
301+ int deletedPackageVersionInfos,
302+ int deletedPackageVersionAssets,
303+ int deletedLikes,
304+ int deletedAuditLogs,
305+ int replacedByFixes,
306+ })> removePackage (
315307 String packageName, {
316308 DateTime ? moderated,
317309 }) async {
@@ -336,6 +328,7 @@ class AdminBackend {
336328 _logger.info ('Removing package from Package.replacedBy...' );
337329 final replacedByQuery = _db.query <Package >()
338330 ..filter ('replacedBy =' , packageName);
331+ var replacedByFixes = 0 ;
339332 await for (final pkg in replacedByQuery.run ()) {
340333 await withRetryTransaction (_db, (tx) async {
341334 final p = await tx.lookupOrNull <Package >(pkg.key);
@@ -346,26 +339,28 @@ class AdminBackend {
346339 p.replacedBy = null ;
347340 tx.insert (p);
348341 }
342+ replacedByFixes++ ;
349343 });
350344 }
351345
352346 _logger.info ('Removing package from PackageVersionInfo ...' );
353- await _db.deleteWithQuery (
347+ final deletedPackageVersionInfos = await _db.deleteWithQuery (
354348 _db.query <PackageVersionInfo >()..filter ('package =' , packageName));
355349
356350 _logger.info ('Removing package from PackageVersionAsset ...' );
357- await _db.deleteWithQuery (
351+ final deletedPackageVersionAssets = await _db.deleteWithQuery (
358352 _db.query <PackageVersionAsset >()..filter ('package =' , packageName));
359353
360354 _logger.info ('Removing package from Like ...' );
361- await _db.deleteWithQuery (
355+ final deletedLikes = await _db.deleteWithQuery (
362356 _db.query <Like >()..filter ('packageName =' , packageName));
363357
364358 _logger.info ('Removing package from AuditLogRecord...' );
365- await _db.deleteWithQuery (
359+ final deletedAuditLogRecords = await _db.deleteWithQuery (
366360 _db.query <AuditLogRecord >()..filter ('packages =' , packageName));
367361
368362 _logger.info ('Removing Package from Datastore...' );
363+ var deletedPackages = 0 ;
369364 await withRetryTransaction (_db, (tx) async {
370365 final package = await tx.lookupOrNull <Package >(packageKey);
371366 if (package == null ) {
@@ -376,7 +371,7 @@ class AdminBackend {
376371 return ;
377372 }
378373 tx.delete (packageKey);
379-
374+ deletedPackages = 1 ;
380375 final moderatedPkgKey =
381376 _db.emptyKey.append (ModeratedPackage , id: packageName);
382377 final moderatedPkg =
@@ -409,8 +404,15 @@ class AdminBackend {
409404 .deleteWithQuery (_db.query <PackageVersion >(ancestorKey: packageKey));
410405
411406 _logger.info ('Package "$packageName " got successfully removed.' );
412- _logger.info (
413- 'NOTICE: Redis caches referencing the package will expire given time.' );
407+ return (
408+ deletedPackages: deletedPackages,
409+ deletedPackageVersions: versions.length,
410+ deletedPackageVersionInfos: deletedPackageVersionInfos.deleted,
411+ deletedPackageVersionAssets: deletedPackageVersionAssets.deleted,
412+ deletedLikes: deletedLikes.deleted,
413+ deletedAuditLogs: deletedAuditLogRecords.deleted,
414+ replacedByFixes: replacedByFixes
415+ );
414416 }
415417
416418 /// Updates the options (e.g. retraction) of the specific package version and
@@ -454,13 +456,13 @@ class AdminBackend {
454456 /// Removes the specific package version from the Datastore and updates other
455457 /// related entities. It is safe to call [removePackageVersion] on an already
456458 /// removed version, as the call is idempotent.
457- Future <void > removePackageVersion ( String packageName, String version) async {
458- final caller =
459- await requireAuthenticatedAdmin ( AdminPermission .removePackage);
460-
461- _logger. info ( '${ caller . displayId }) initiated the delete '
462- 'of package $ packageName $ version ' );
463-
459+ Future <
460+ ({
461+ int deletedPackageVersions,
462+ int deletedPackageVersionInfos,
463+ int deletedPackageVersionAssets,
464+ })> removePackageVersion ( String packageName, String version) async {
465+ var deletedPackageVersions = 0 ;
464466 final currentDartSdk = await getCachedDartSdkVersion (
465467 lastKnownStable: toolStableDartSdkVersion);
466468 final currentFlutterSdk = await getCachedFlutterSdkVersion (
@@ -469,8 +471,7 @@ class AdminBackend {
469471 final packageKey = _db.emptyKey.append (Package , id: packageName);
470472 final package = await tx.lookupOrNull <Package >(packageKey);
471473 if (package == null ) {
472- throw Exception (
473- 'Package "$packageName " does not exists. Use full package removal without the version qualifier.' );
474+ throw Exception ('Package "$packageName " does not exists.' );
474475 }
475476
476477 final versionsQuery = tx.query <PackageVersion >(packageKey);
@@ -479,8 +480,9 @@ class AdminBackend {
479480 if (versionNames.contains (version)) {
480481 tx.delete (packageKey.append (PackageVersion , id: version));
481482 package.updated = clock.now ().toUtc ();
483+ deletedPackageVersions = 1 ;
482484 } else {
483- print ('Package $packageName does not have a version $version .' );
485+ _logger. info ('Package $packageName does not have a version $version .' );
484486 }
485487
486488 if (versionNames.length == 1 && versionNames.single == version) {
@@ -501,15 +503,15 @@ class AdminBackend {
501503 tx.insert (package);
502504 });
503505
504- print ('Removing GCS objects ...' );
506+ _logger. info ('Removing GCS objects ...' );
505507 await packageBackend.removePackageTarball (packageName, version);
506508
507- await _db.deleteWithQuery (
509+ final deletedPackageVersionInfos = await _db.deleteWithQuery (
508510 _db.query <PackageVersionInfo >()..filter ('package =' , packageName),
509511 where: (PackageVersionInfo info) => info.version == version,
510512 );
511513
512- await _db.deleteWithQuery (
514+ final deletedPackageVersionAssets = await _db.deleteWithQuery (
513515 _db.query <PackageVersionAsset >()..filter ('package =' , packageName),
514516 where: (PackageVersionAsset asset) => asset.version == version,
515517 );
@@ -518,6 +520,11 @@ class AdminBackend {
518520 await purgeScorecardData (packageName, version, isLatest: true );
519521 // trigger (eventual) re-analysis
520522 await taskBackend.trackPackage (packageName);
523+ return (
524+ deletedPackageVersions: deletedPackageVersions,
525+ deletedPackageVersionInfos: deletedPackageVersionInfos.deleted,
526+ deletedPackageVersionAssets: deletedPackageVersionAssets.deleted,
527+ );
521528 }
522529
523530 /// Handles `GET '/api/admin/packages/<package>/assigned-tags'` .
@@ -793,7 +800,7 @@ class AdminBackend {
793800 }
794801
795802 _logger.info ('Deleting moderated package: ${package .name }' );
796- await _removePackage (
803+ await removePackage (
797804 package.name! ,
798805 moderated: package.moderatedAt,
799806 );
0 commit comments