CMSgov/dpc-app

View on GitHub
dpc-api/src/main/java/gov/cms/dpc/api/cli/organizations/OrganizationRegistration.java

Summary

Maintainability
A
0 mins
Test Coverage
F
35%
package gov.cms.dpc.api.cli.organizations;

import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.rest.client.api.IGenericClient;
import gov.cms.dpc.api.cli.AbstractAttributionCommand;
import io.dropwizard.core.setup.Bootstrap;
import net.sourceforge.argparse4j.impl.Arguments;
import net.sourceforge.argparse4j.inf.Namespace;
import net.sourceforge.argparse4j.inf.Subparser;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.hl7.fhir.dstu3.model.Bundle;
import org.hl7.fhir.dstu3.model.Organization;
import org.hl7.fhir.dstu3.model.Parameters;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.UUID;

public class OrganizationRegistration extends AbstractAttributionCommand {

    private static final String ORG_FILE = "org-file";

    public OrganizationRegistration() {
        super("register", "Register Organization");
    }

    @Override
    public void addAdditionalOptions(Subparser subparser) {
        // Location of FHIR organization file
        subparser
                .addArgument("-f", "--file")
                .dest(ORG_FILE)
                .type(String.class)
                .required(true)
                .help("FHIR Organization resource to register with system");

        subparser
                .addArgument("--no-token")
                .dest("no-token")
                .type(Boolean.class)
                .action(Arguments.storeTrue())
                .help("Skip generating access token when registering organization");

        subparser
                .addArgument("-a", "--api")
                .dest("api-service")
                .type(String.class)
                .setDefault("http://localhost:9911/tasks")
                .help("URL of API service for generating client token (must include /tasks endpoint). Only required if generating a token");
    }

    @Override
    public void run(Bootstrap<?> bootstrap, Namespace namespace) throws Exception {
        System.out.println("Registering Organization");

        // Read the file and parse it
        final Path filePath = FileSystems.getDefault().getPath(namespace.getString(ORG_FILE)).normalize().toAbsolutePath();
        Bundle organization;
        try (FileInputStream fileInputStream = new FileInputStream(new File(filePath.toUri()))) {
            final IParser parser = ctx.newJsonParser();
            organization = (Bundle) parser.parseResource(fileInputStream);
        }

        final boolean noToken = Boolean.parseBoolean(namespace.getString("no-token"));
        final String apiService = namespace.getString("api-service");

        registerOrganization(organization, namespace.getString(ATTR_HOSTNAME), noToken, apiService);
    }

    private void registerOrganization(Bundle organization, String attributionService, boolean noToken, String apiService) throws IOException, URISyntaxException {
        System.out.println(String.format("Connecting to Attribution service at: %s", attributionService));
        final IGenericClient client = ctx.newRestfulGenericClient(attributionService);

        final Parameters parameters = new Parameters();

        parameters
                .addParameter().setResource(organization);

        UUID organizationID = null;
        try {
            final Organization createdOrg = client
                    .operation()
                    .onType(Organization.class)
                    .named("submit")
                    .withParameters(parameters)
                    .returnResourceType(Organization.class)
                    .encodedJson()
                    .execute();

            organizationID = UUID.fromString(createdOrg.getIdElement().getIdPart());
            System.out.println(String.format("Registered organization: %s", organizationID));

        } catch (Exception e) {
            System.err.println(String.format("Unable to register organization. %s", e.getMessage()));
            System.exit(1);
        }

        // Now, create a token, unless --no-token has been passed
        if (!noToken) {
            System.out.println(String.format("Connecting to API service at: %s", apiService));
            try (final CloseableHttpClient httpClient = HttpClients.createDefault()) {
                final URIBuilder builder = new URIBuilder(String.format("%s/generate-token", apiService));
                builder.setParameter("organization", organizationID.toString());

                final HttpPost httpPost = new HttpPost(builder.build());

                try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                    final String token = EntityUtils.toString(response.getEntity());
                    System.out.println(String.format("Organization token: %s", token));
                }
            }
        }
    }
}