in Sources/PackageRegistryExample/Controllers/PackageReleasesController.swift [27:56]
func listForPackage(request: Request) async throws -> Response {
let scope = try request.getPackageScopeParam()
// Client may append .json extension to the URI (4.1)
let name = try request.getPackageNameParam(removingExtension: ".json")
let package = PackageIdentity(scope: scope, name: name)
let list = try await self.packageReleases.list(for: package)
guard !list.isEmpty else {
throw DataAccessError.notFound
}
var links = [String]()
// Link to the latest published release - `list` is already sorted with most recent first
let latest = list.first! // !-safe since list is not empty at this point
links.append("<\(self.configuration.api.baseURL)/\(package.scope)/\(package.name)/\(latest.version)>; rel=\"latest-version\"")
// Link to source repository, if any
if let repositoryURL = latest.repositoryURL {
links.append("<\(repositoryURL)>; rel=\"canonical\"")
}
var headers = HTTPHeaders()
headers.setLinkHeader(links)
let response = PackageReleasesResponse(
releases: Dictionary(list.map { ($0.version.description, PackageReleasesResponse.ReleaseInfo.from($0, baseURL: self.configuration.api.baseURL)) },
uniquingKeysWith: { first, _ in first })
)
return Response.json(status: .ok, body: response, headers: headers)
}