diff --git a/app/lib/frontend/handlers/custom_api.dart b/app/lib/frontend/handlers/custom_api.dart index 4e3d75347c..0141b18217 100644 --- a/app/lib/frontend/handlers/custom_api.dart +++ b/app/lib/frontend/handlers/custom_api.dart @@ -21,7 +21,6 @@ import '../../scorecard/backend.dart'; import '../../search/backend.dart'; import '../../search/search_client.dart'; import '../../search/search_service.dart'; -import '../../service/download_counts/backend.dart'; import '../../service/topics/count_topics.dart'; import '../../shared/configuration.dart'; import '../../shared/exceptions.dart'; @@ -218,38 +217,7 @@ Future packageVersionScoreHandler( {String? version}) async { checkPackageVersionParams(package, version); return (await cache.versionScore(package, version).get(() async { - final pkg = await packageBackend.lookupPackage(package); - if (pkg == null) { - throw NotFoundException.resource('package "$package"'); - } - final v = - (version == null || version == 'latest') ? pkg.latestVersion! : version; - final pv = await packageBackend.lookupPackageVersion(package, v); - if (pv == null) { - throw NotFoundException.resource('package "$package" version "$version"'); - } - - var updated = pkg.updated; - final card = await scoreCardBackend.getScoreCardData(package, v); - if (updated == null || card.updated?.isAfter(updated) == true) { - updated = card.updated; - } - - final tags = { - ...pkg.getTags(), - ...pv.getTags(), - ...?card.derivedTags, - }; - - return VersionScore( - grantedPoints: card.grantedPubPoints, - maxPoints: card.maxPubPoints, - likeCount: pkg.likes, - downloadCount30Days: - downloadCountsBackend.lookup30DaysTotalCounts(package), - tags: tags.toList(), - lastUpdated: updated, - ); + return await scoreCardBackend.getVersionScore(package, version: version); }))!; } @@ -475,15 +443,7 @@ Future getPackageOptionsHandler( shelf.Request request, String package, ) async { - checkPackageVersionParams(package); - final p = await packageBackend.lookupPackage(package); - if (p == null) { - throw NotFoundException.resource(package); - } - return PkgOptions( - isDiscontinued: p.isDiscontinued, - isUnlisted: p.isUnlisted, - ); + return await packageBackend.getPackageOptions(package); } /// Handles `PUT /api/packages//options`. diff --git a/app/lib/package/backend.dart b/app/lib/package/backend.dart index 21eec1d718..cbf918602f 100644 --- a/app/lib/package/backend.dart +++ b/app/lib/package/backend.dart @@ -419,6 +419,20 @@ class PackageBackend { return count; } + /// Returns the package options. + Future getPackageOptions(String package) async { + checkPackageVersionParams(package); + final p = await packageBackend.lookupPackage(package); + if (p == null) { + throw NotFoundException.resource(package); + } + return api.PkgOptions( + isDiscontinued: p.isDiscontinued, + replacedBy: p.replacedBy, + isUnlisted: p.isUnlisted, + ); + } + /// Updates [options] on [package]. Future updateOptions(String package, api.PkgOptions options) async { final authenticatedUser = await requireAuthenticatedWebUser(); diff --git a/app/lib/scorecard/backend.dart b/app/lib/scorecard/backend.dart index e7e03c00c7..2dace75a88 100644 --- a/app/lib/scorecard/backend.dart +++ b/app/lib/scorecard/backend.dart @@ -4,11 +4,13 @@ import 'dart:async'; +import 'package:_pub_shared/data/package_api.dart'; import 'package:clock/clock.dart'; import 'package:gcloud/service_scope.dart' as ss; import 'package:logging/logging.dart'; import 'package:meta/meta.dart'; import 'package:pool/pool.dart'; +import 'package:pub_dev/service/download_counts/backend.dart'; import 'package:pub_dev/service/download_counts/computations.dart'; import 'package:pub_dev/shared/exceptions.dart'; import 'package:pub_dev/task/backend.dart'; @@ -186,6 +188,43 @@ class ScoreCardBackend { final pv = list[1] as PackageVersion?; return PackageStatus.fromModels(p, pv); } + + /// Return the version score object served in the API. + Future getVersionScore(String package, + {String? version}) async { + final pkg = await packageBackend.lookupPackage(package); + if (pkg == null) { + throw NotFoundException.resource('package "$package"'); + } + final v = + (version == null || version == 'latest') ? pkg.latestVersion! : version; + final pv = await packageBackend.lookupPackageVersion(package, v); + if (pv == null) { + throw NotFoundException.resource('package "$package" version "$version"'); + } + + var updated = pkg.updated; + final card = await scoreCardBackend.getScoreCardData(package, v); + if (updated == null || card.updated?.isAfter(updated) == true) { + updated = card.updated; + } + + final tags = { + ...pkg.getTags(), + ...pv.getTags(), + ...?card.derivedTags, + }; + + return VersionScore( + grantedPoints: card.grantedPubPoints, + maxPoints: card.maxPubPoints, + likeCount: pkg.likes, + downloadCount30Days: + downloadCountsBackend.lookup30DaysTotalCounts(package), + tags: tags.toList(), + lastUpdated: updated, + ); + } } Future purgeScorecardData(