diff --git a/CHANGELOG.md b/CHANGELOG.md index 970c8401ac..b3a7b7df23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Important changes to data models, configuration, and migrations between each AppEngine version, listed here to ease deployment and troubleshooting. ## Next Release (replace with git tag when deployed) + * Note: removed required flag from `isBlocked` fields. + * Note: started deleting `Package.blocked` and `Package.blockedReason`. ## `20241217t132200-all` * Bump runtimeVersion to `2024.12.17`. diff --git a/app/lib/account/models.dart b/app/lib/account/models.dart index 25ad196dcc..14a203a062 100644 --- a/app/lib/account/models.dart +++ b/app/lib/account/models.dart @@ -52,7 +52,9 @@ class User extends db.ExpandoModel { /// [isBlocked] is set when a user account is blocked (is on administrative hold). /// When this happens user-data is preserved, but the user should not be able /// to perform any action. - @db.BoolProperty(required: true) + /// + /// TODO: remove after runtime version `2024.12.17` is no longer running. + @db.BoolProperty(required: false) bool isBlocked = false; /// `true` if user was moderated (pending moderation or deletion). diff --git a/app/lib/package/models.dart b/app/lib/package/models.dart index 451ba717d3..c764e5afc1 100644 --- a/app/lib/package/models.dart +++ b/app/lib/package/models.dart @@ -126,17 +126,11 @@ class Package extends db.ExpandoModel { /// Set to `true` if package should not be displayed anywhere, because of /// pending moderation or deletion. - @db.BoolProperty(required: true) + /// + /// TODO: remove after runtime version `2024.12.17` is no longer running. + @db.BoolProperty(required: false) bool isBlocked = false; - /// The reason why the package was blocked. - @db.StringProperty(indexed: false) - String? blockedReason; - - /// The timestamp when the package was blocked. - @db.DateTimeProperty() - DateTime? blocked; - /// `true` if package was moderated (pending moderation or deletion). @db.BoolProperty(required: true) bool isModerated = false; diff --git a/app/lib/publisher/models.dart b/app/lib/publisher/models.dart index 79a0929d6f..9fa8d8c7d3 100644 --- a/app/lib/publisher/models.dart +++ b/app/lib/publisher/models.dart @@ -61,7 +61,9 @@ class Publisher extends db.ExpandoModel { /// membership information, or invite new members. /// - Administrator roles of the publisher must not be able to publisher a new version /// for packages of the publisher, or change any of the existing package's properties. - @db.BoolProperty(required: true) + /// + /// TODO: remove after runtime version `2024.12.17` is no longer running. + @db.BoolProperty(required: false) bool isBlocked = false; /// `true` if publisher was moderated (pending moderation or deletion). diff --git a/app/lib/tool/backfill/backfill_new_fields.dart b/app/lib/tool/backfill/backfill_new_fields.dart index 7cf1a53df4..672d883f3c 100644 --- a/app/lib/tool/backfill/backfill_new_fields.dart +++ b/app/lib/tool/backfill/backfill_new_fields.dart @@ -6,8 +6,6 @@ import 'package:clock/clock.dart'; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; import 'package:pub_dev/account/models.dart'; -import 'package:pub_dev/package/api_export/api_exporter.dart'; -import 'package:pub_dev/package/backend.dart'; import 'package:pub_dev/package/models.dart'; import 'package:pub_dev/publisher/models.dart'; import 'package:pub_dev/shared/datastore.dart'; @@ -28,34 +26,6 @@ Future backfillNewFields() async { @visibleForTesting Future migrateIsBlocked() async { _logger.info('Migrating isBlocked...'); - final pkgQuery = dbService.query()..filter('isBlocked =', true); - await for (final entity in pkgQuery.run()) { - await withRetryTransaction(dbService, (tx) async { - final pkg = await tx.lookupValue(entity.key); - // sanity check - if (!pkg.isBlocked) { - return; - } - pkg - ..isModerated = true - ..moderatedAt = pkg.moderatedAt ?? pkg.blocked ?? clock.now() - ..isBlocked = false - ..blocked = null - ..blockedReason = null; - tx.insert(pkg); - }); - - // sync exported API(s) - await apiExporter?.synchronizePackage(entity.name!, forceDelete: true); - - // retract or re-populate public archive files - await packageBackend.tarballStorage.updatePublicArchiveBucket( - package: entity.name!, - ageCheckThreshold: Duration.zero, - deleteIfOlder: Duration.zero, - ); - } - final publisherQuery = dbService.query() ..filter('isBlocked =', true); await for (final entity in publisherQuery.run()) { @@ -95,12 +65,12 @@ Future migrateIsBlocked() async { Future _removeKnownUnmappedFields() async { await for (final p in dbService.query().run()) { if (p.additionalProperties.isEmpty) continue; - if (p.additionalProperties.containsKey('isWithheld') || - p.additionalProperties.containsKey('withheldReason')) { + if (p.additionalProperties.containsKey('blocked') || + p.additionalProperties.containsKey('blockedReason')) { await withRetryTransaction(dbService, (tx) async { final pkg = await tx.lookupValue(p.key); - pkg.additionalProperties.remove('isWithheld'); - pkg.additionalProperties.remove('withheldReason'); + pkg.additionalProperties.remove('blocked'); + pkg.additionalProperties.remove('blockedReason'); tx.insert(pkg); }); } diff --git a/app/test/tool/maintenance/migrate_isblocked_test.dart b/app/test/tool/maintenance/migrate_isblocked_test.dart index aa271890ae..0928704e62 100644 --- a/app/test/tool/maintenance/migrate_isblocked_test.dart +++ b/app/test/tool/maintenance/migrate_isblocked_test.dart @@ -2,7 +2,6 @@ // 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:clock/clock.dart'; import 'package:pub_dev/account/backend.dart'; import 'package:pub_dev/package/backend.dart'; import 'package:pub_dev/publisher/backend.dart'; @@ -14,24 +13,6 @@ import '../../shared/test_services.dart'; void main() { group('Migrate isBlocked', () { - testWithProfile('package', expectedLogMessages: [ - 'SHOUT Deleting object from public bucket: "packages/oxygen-1.0.0.tar.gz".', - 'SHOUT Deleting object from public bucket: "packages/oxygen-1.2.0.tar.gz".', - 'SHOUT Deleting object from public bucket: "packages/oxygen-2.0.0-dev.tar.gz".', - ], fn: () async { - final p1 = await packageBackend.lookupPackage('oxygen'); - await dbService.commit(inserts: [ - p1! - ..isBlocked = true - ..blocked = clock.now() - ..blockedReason = 'abc' - ]); - await migrateIsBlocked(); - - final p2 = await packageBackend.lookupPackage('oxygen'); - expect(p2!.isModerated, true); - }); - testWithProfile('publisher', fn: () async { final p1 = await publisherBackend.getPublisher('example.com'); await dbService.commit(inserts: [p1!..isBlocked = true]);