All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.artipie.nuget.http.metadata.Registration Maven / Gradle / Ivy

There is a newer version: 1.5.5
Show newest version
/*
 * The MIT License (MIT) Copyright (c) 2020-2023 artipie.com
 * https://github.com/artipie/artipie/blob/master/LICENSE.txt
 */
package com.artipie.nuget.http.metadata;

import com.artipie.http.Headers;
import com.artipie.http.Response;
import com.artipie.http.async.AsyncResponse;
import com.artipie.http.rs.RsStatus;
import com.artipie.http.rs.RsWithStatus;
import com.artipie.nuget.PackageKeys;
import com.artipie.nuget.Repository;
import com.artipie.nuget.Versions;
import com.artipie.nuget.http.Resource;
import com.artipie.nuget.http.RsWithBodyNoHeaders;
import com.artipie.nuget.metadata.NuspecField;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletionStage;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonWriter;
import org.reactivestreams.Publisher;

/**
 * Registration resource.
 * See Registration pages and leaves
 *
 * @since 0.1
 */
class Registration implements Resource {

    /**
     * Repository to read data from.
     */
    private final Repository repository;

    /**
     * Package content location.
     */
    private final ContentLocation content;

    /**
     * Package identifier.
     */
    private final NuspecField id;

    /**
     * Ctor.
     *
     * @param repository Repository to read data from.
     * @param content Package content location.
     * @param id Package identifier.
     */
    Registration(
        final Repository repository,
        final ContentLocation content,
        final NuspecField id) {
        this.repository = repository;
        this.content = content;
        this.id = id;
    }

    @Override
    public Response get(final Headers headers) {
        return new AsyncResponse(
            this.pages().thenCompose(
                pages -> new CompletionStages<>(pages.stream().map(RegistrationPage::json)).all()
            ).thenApply(
                pages -> {
                    final JsonArrayBuilder items = Json.createArrayBuilder();
                    for (final JsonObject page : pages) {
                        items.add(page);
                    }
                    final JsonObject json = Json.createObjectBuilder()
                        .add("count", pages.size())
                        .add("items", items)
                        .build();
                    try (ByteArrayOutputStream out = new ByteArrayOutputStream();
                        JsonWriter writer = Json.createWriter(out)) {
                        writer.writeObject(json);
                        out.flush();
                        return new RsWithStatus(
                            new RsWithBodyNoHeaders(out.toByteArray()),
                            RsStatus.OK
                        );
                    } catch (final IOException ex) {
                        throw new UncheckedIOException(ex);
                    }
                }
            )
        );
    }

    @Override
    public Response put(
        final Headers headers,
        final Publisher body) {
        return new RsWithStatus(RsStatus.METHOD_NOT_ALLOWED);
    }

    /**
     * Enumerate version pages.
     *
     * @return List of pages.
     */
    private CompletionStage> pages() {
        return this.repository.versions(new PackageKeys(this.id)).thenApply(Versions::all)
            .thenApply(
                versions -> {
                    final List pages;
                    if (versions.isEmpty()) {
                        pages = Collections.emptyList();
                    } else {
                        pages = Collections.singletonList(
                            new RegistrationPage(this.repository, this.content, this.id, versions)
                        );
                    }
                    return pages;
                }
            );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy