Future updateReportOnCard()

in app/lib/scorecard/backend.dart [183:312]


  Future<void> updateReportOnCard(
    String packageName,
    String packageVersion, {
    PanaReport? panaReport,
    DartdocReport? dartdocReport,
  }) async {
    final key = scoreCardKey(packageName, packageVersion);
    final pAndPv = await _db.lookup([key.parent!, key.parent!.parent!]);
    final version = pAndPv[0] as PackageVersion?;
    final package = pAndPv[1] as Package?;
    if (package == null || version == null) {
      throw Exception('Unable to lookup $packageName $packageVersion.');
    }

    final status = PackageStatus.fromModels(package, version);

    await db.withRetryTransaction(_db, (tx) async {
      var scoreCard = await tx.lookupOrNull<ScoreCard>(key);

      if (scoreCard == null) {
        _logger.info('Creating new ScoreCard $packageName $packageVersion.');
        scoreCard = ScoreCard.init(
          packageName: packageName,
          packageVersion: packageVersion,
          packageCreated: package.created,
          packageVersionCreated: version.created,
        );
      } else {
        _logger.info('Updating ScoreCard $packageName $packageVersion.');
        scoreCard.updated = clock.now().toUtc();
      }

      scoreCard.flags.clear();
      if (package.isDiscontinued) {
        scoreCard.addFlag(PackageFlags.isDiscontinued);
      }
      if (status.isLatestStable) {
        scoreCard.addFlag(PackageFlags.isLatestStable);
      }
      if (status.isLegacy) {
        scoreCard.addFlag(PackageFlags.isLegacy);
      }
      if (status.isObsolete) {
        scoreCard.addFlag(PackageFlags.isObsolete);
      }
      if (version.pubspec!.usesFlutter) {
        scoreCard.addFlag(PackageFlags.usesFlutter);
      }

      scoreCard.popularityScore = popularityStorage.lookup(packageName);

      scoreCard.updateReports(
        panaReport: panaReport,
        dartdocReport: dartdocReport,
      );

      bool reportIsTooBig(String reportType, List<int>? bytes) {
        if (bytes == null || bytes.isEmpty) return false;
        final size = bytes.length;
        if (size > _reportSizeDropThreshold) {
          _logger.reportError(
              '$reportType report exceeded size threshold ($size > $_reportSizeWarnThreshold)');
          return true;
        } else if (size > _reportSizeWarnThreshold) {
          _logger.warning(
              '$reportType report exceeded size threshold ($size > $_reportSizeWarnThreshold)');
        }
        return false;
      }

      if (panaReport != null &&
          reportIsTooBig(ReportType.pana, scoreCard.panaReportJsonGz)) {
        scoreCard.updateReports(
          panaReport: PanaReport(
            timestamp: clock.now().toUtc(),
            panaRuntimeInfo: null,
            reportStatus: ReportStatus.aborted,
            derivedTags: <String>[],
            allDependencies: <String>[],
            licenseFile: null,
            report: pana.Report(
              sections: [
                pana.ReportSection(
                  id: 'error',
                  title: 'Report exceeded size limit.',
                  grantedPoints: panaReport.report?.grantedPoints ?? 0,
                  maxPoints: panaReport.report?.maxPoints ?? 1,
                  status: pana.ReportStatus.partial,
                  summary: 'The `pana` report exceeded size limit. '
                      'A log about the issue has been filed, the site admins will address it soon.',
                ),
              ],
            ),
            flags: <String>[],
            urlProblems: <pana.UrlProblem>[],
          ),
        );
      }
      if (dartdocReport != null &&
          reportIsTooBig(ReportType.dartdoc, scoreCard.dartdocReportJsonGz)) {
        scoreCard.updateReports(
          dartdocReport: DartdocReport(
            timestamp: dartdocReport.timestamp,
            reportStatus: ReportStatus.aborted,
            dartdocEntry: null,
            documentationSection: pana.ReportSection(
              id: pana.ReportSectionId.documentation,
              title: pana.documentationSectionTitle,
              grantedPoints:
                  dartdocReport.documentationSection?.grantedPoints ?? 0,
              maxPoints: dartdocReport.documentationSection?.maxPoints ?? 10,
              status: pana.ReportStatus.partial,
              summary: 'The `dartdoc` report exceeded size limit. '
                  'A log about the issue has been filed, the site admins will address it soon.',
            ),
          ),
        );
      }

      tx.insert(scoreCard);
    });

    final isLatest = package.latestVersion == version.version;
    await Future.wait([
      cache.scoreCardData(packageName, packageVersion).purge(),
      cache.uiPackagePage(packageName, packageVersion).purge(),
      if (isLatest) cache.uiPackagePage(packageName, null).purge(),
      if (isLatest) cache.packageView(packageName).purge(),
    ]);
  }