in Sources/PackageRegistryExample/Controllers/CreatePackageReleaseController.swift [39:88]
func pushPackageRelease(request: Request) async throws -> Response {
let package = try request.getPackageParam(validating: true)
let version = try request.getVersionParam(removingExtension: ".zip")
guard let requestBody = request.body.string else {
throw PackageRegistry.APIError.badRequest("Missing request body")
}
do {
_ = try await self.packageReleases.get(package: package, version: version)
// A release already exists! Return 409 (4.6)
throw PackageRegistry.APIError.conflict("\(package)@\(version) already exists")
} catch DataAccessError.notFound {
// Release doesn't exist yet. Proceed.
let createRequest = try FormDataDecoder().decode(CreatePackageReleaseRequest.self, from: requestBody, boundary: "boundary")
guard let archiveData = createRequest.sourceArchive else {
throw PackageRegistry.APIError.unprocessableEntity("Source archive is either missing or invalid")
}
let metadata = createRequest.metadata
// Analyze the source archive
let (checksum, manifests) = try await self.processSourceArchive(archiveData)
// Insert into database
_ = try await self.packageReleases.create(
package: package,
version: version,
repositoryURL: metadata?.repositoryURL,
commitHash: metadata?.commitHash,
checksum: checksum,
sourceArchive: archiveData,
manifests: manifests
)
let response = CreatePackageReleaseResponse(
scope: package.scope.description,
name: package.name.description,
version: version.description,
metadata: metadata,
checksum: checksum
)
let location = "\(self.configuration.api.baseURL)/\(package.scope)/\(package.name)/\(version)"
var headers = HTTPHeaders()
headers.replaceOrAdd(name: .location, value: location)
return Response.json(status: .created, body: response, headers: headers)
}
}