func pushPackageRelease()

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)
        }
    }