getPackageDetail method

  1. @Route.get('/webapi/package/<name>/<version>')
Future<Response> getPackageDetail(
  1. Request req,
  2. String name,
  3. String version
)

Implementation

@Route.get('/webapi/package/<name>/<version>')
Future<shelf.Response> getPackageDetail(
    shelf.Request req, String name, String version) async {
  var package = await metaStore.queryPackage(name);
  if (package == null) {
    return _okWithJson({'error': 'package not exists'});
  }

  UnpubVersion? packageVersion;
  if (version == 'latest') {
    packageVersion = package.versions.last;
  } else {
    packageVersion =
        package.versions.firstWhereOrNull((item) => item.version == version);
  }
  if (packageVersion == null) {
    return _okWithJson({'error': 'version not exists'});
  }

  var versions = package.versions
      .map((v) => DetailViewVersion(v.version, v.createdAt))
      .toList();
  versions.sort((a, b) {
    return semver.Version.prioritize(
        semver.Version.parse(b.version), semver.Version.parse(a.version));
  });

  var pubspec = packageVersion.pubspec;
  List<String?> authors;
  if (pubspec['author'] != null) {
    authors = RegExp(r'<(.*?)>')
        .allMatches(pubspec['author'])
        .map((match) => match.group(1))
        .toList();
  } else if (pubspec['authors'] != null) {
    authors = (pubspec['authors'] as List)
        .map((author) => RegExp(r'<(.*?)>').firstMatch(author)!.group(1))
        .toList();
  } else {
    authors = [];
  }

  var depMap = (pubspec['dependencies'] as Map? ?? {}).cast<String, String>();

  var data = WebapiDetailView(
    package.name,
    packageVersion.version,
    packageVersion.pubspec['description'] ?? '',
    packageVersion.pubspec['homepage'] ?? '',
    package.uploaders ?? [],
    packageVersion.createdAt,
    packageVersion.readme,
    packageVersion.changelog,
    versions,
    authors,
    depMap.keys.toList(),
    getPackageTags(packageVersion.pubspec),
  );

  return _okWithJson({'data': data.toJson()});
}