Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
4 changes: 3 additions & 1 deletion app/lib/account/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ class User extends db.ExpandoModel<String> {
/// [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).
Expand Down
12 changes: 3 additions & 9 deletions app/lib/package/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -126,17 +126,11 @@ class Package extends db.ExpandoModel<String> {

/// 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;
Expand Down
4 changes: 3 additions & 1 deletion app/lib/publisher/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ class Publisher extends db.ExpandoModel<String> {
/// 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).
Expand Down
38 changes: 4 additions & 34 deletions app/lib/tool/backfill/backfill_new_fields.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -28,34 +26,6 @@ Future<void> backfillNewFields() async {
@visibleForTesting
Future<void> migrateIsBlocked() async {
_logger.info('Migrating isBlocked...');
final pkgQuery = dbService.query<Package>()..filter('isBlocked =', true);
await for (final entity in pkgQuery.run()) {
await withRetryTransaction(dbService, (tx) async {
final pkg = await tx.lookupValue<Package>(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<Publisher>()
..filter('isBlocked =', true);
await for (final entity in publisherQuery.run()) {
Expand Down Expand Up @@ -95,12 +65,12 @@ Future<void> migrateIsBlocked() async {
Future<void> _removeKnownUnmappedFields() async {
await for (final p in dbService.query<Package>().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<Package>(p.key);
pkg.additionalProperties.remove('isWithheld');
pkg.additionalProperties.remove('withheldReason');
pkg.additionalProperties.remove('blocked');
pkg.additionalProperties.remove('blockedReason');
tx.insert(pkg);
});
}
Expand Down
19 changes: 0 additions & 19 deletions app/test/tool/maintenance/migrate_isblocked_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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]);
Expand Down
Loading