Future loadDocument()

in app/lib/search/backend.dart [73:162]


  Future<PackageDocument> loadDocument(String packageName) async {
    final p = await packageBackend.lookupPackage(packageName);
    if (p == null || p.isNotVisible) {
      throw RemovedPackageException();
    }
    final releases = await packageBackend.latestReleases(p);

    final pv = await packageBackend.lookupPackageVersion(
        packageName, releases.stable.version);
    if (pv == null) {
      throw RemovedPackageException();
    }
    final readmeAsset = await packageBackend.lookupPackageVersionAsset(
        packageName, pv.version!, AssetKind.readme);

    final scoreCard =
        await scoreCardBackend.getScoreCardData(packageName, pv.version!);

    // Find tags from latest prerelease and/or preview (if there one)
    // This allows searching for tags with `<tag>-in-prerelease`.
    // Example: `is:null-safe-in-prerelease`, or `platform:android-in-prerelease`
    Future<List<String>> loadTags(String version) async {
      final tags = <String>[];
      final prv =
          await packageBackend.lookupPackageVersion(packageName, version);
      prv?.getTags().forEach(tags.add);

      final pra = await scoreCardBackend.getScoreCardData(packageName, version);
      pra?.panaReport?.derivedTags?.forEach(tags.add);
      return tags;
    }

    final prereleaseTags = releases.showPrerelease
        ? await loadTags(releases.prerelease!.version)
        : <String>[];
    final previewTags = releases.showPreview
        ? await loadTags(releases.preview!.version)
        : <String>[];

    final tags = <String>{
      // Every package gets the show:* tags, so they can be used as override in
      // the query text.
      PackageTags.showHidden,
      PackageTags.showDiscontinued,
      PackageTags.showUnlisted,
      PackageVersionTags.showLegacy,

      // regular tags
      ...p.getTags(),
      ...pv.getTags(),
      ...?scoreCard?.panaReport?.derivedTags,
      ...prereleaseTags,
      ...previewTags,
    };

    final pubDataContent = await dartdocBackend.getTextContent(
        packageName, 'latest', 'pub-data.json',
        timeout: const Duration(minutes: 1));

    List<ApiDocPage>? apiDocPages;
    try {
      if (pubDataContent == null || pubDataContent.isEmpty) {
        _logger.info('Got empty pub-data.json for package $packageName.');
      } else {
        apiDocPages = _apiDocPagesFromPubDataText(pubDataContent);
      }
    } catch (e, st) {
      _logger.severe('Parsing pub-data.json failed.', e, st);
    }

    final popularity = popularityStorage.lookup(packageName);

    return PackageDocument(
      package: pv.package,
      version: pv.version!,
      tags: tags.toList(),
      description: compactDescription(pv.pubspec!.description),
      created: p.created,
      updated: p.lastVersionPublished,
      readme: compactReadme(readmeAsset?.textContent),
      popularity: popularity,
      likeCount: p.likes,
      grantedPoints: scoreCard?.grantedPubPoints,
      maxPoints: scoreCard?.maxPubPoints ?? 0,
      dependencies: _buildDependencies(pv.pubspec!, scoreCard),
      publisherId: p.publisherId,
      apiDocPages: apiDocPages,
      timestamp: clock.now().toUtc(),
    );
  }