CMSgov/dpc-app

View on GitHub
dpc-attribution/src/main/java/gov/cms/dpc/attribution/resources/v1/EndpointResource.java

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package gov.cms.dpc.attribution.resources.v1;

import com.codahale.metrics.annotation.ExceptionMetered;
import com.codahale.metrics.annotation.Timed;
import gov.cms.dpc.attribution.jdbi.EndpointDAO;
import gov.cms.dpc.attribution.jdbi.OrganizationDAO;
import gov.cms.dpc.attribution.resources.AbstractEndpointResource;
import gov.cms.dpc.common.entities.EndpointEntity;
import gov.cms.dpc.common.entities.OrganizationEntity;
import gov.cms.dpc.fhir.FHIRExtractors;
import gov.cms.dpc.fhir.annotations.FHIR;
import gov.cms.dpc.fhir.converters.FHIREntityConverter;
import io.dropwizard.hibernate.UnitOfWork;
import org.eclipse.jetty.http.HttpStatus;
import org.hl7.fhir.dstu3.model.Endpoint;

import javax.inject.Inject;
import javax.validation.constraints.NotNull;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class EndpointResource extends AbstractEndpointResource {

    private final EndpointDAO endpointDAO;
    private final OrganizationDAO organizationDAO;
    private final FHIREntityConverter converter;

    @Inject
    public EndpointResource(FHIREntityConverter converter, EndpointDAO endpointDAO, OrganizationDAO organizationDAO) {
        this.converter = converter;
        this.endpointDAO = endpointDAO;
        this.organizationDAO = organizationDAO;
    }

    @FHIR
    @POST
    @Timed
    @ExceptionMetered
    @UnitOfWork
    @Override
    public Response createEndpoint(@NotNull Endpoint endpoint) {
        EndpointEntity entity = endpointDAO.persistEndpoint(converter.fromFHIR(EndpointEntity.class, endpoint));
        return Response.status(Response.Status.CREATED).entity(converter.toFHIR(Endpoint.class, entity)).build();
    }

    @FHIR
    @GET
    @Timed
    @ExceptionMetered
    @UnitOfWork
    @Override
    public List<Endpoint> searchEndpoints(@NotNull @QueryParam("organization") String organizationID, @QueryParam("_id") String resourceId) {
        final UUID orgUUID = FHIRExtractors.getEntityUUID(organizationID);
        UUID endpointUUID = null;
        if(resourceId!=null){
            endpointUUID = FHIRExtractors.getEntityUUID(resourceId);
        }

        final List<EndpointEntity> endpointList = this.endpointDAO.endpointSearch(orgUUID, endpointUUID);

        return endpointList
                .stream()
                .map(e -> converter.toFHIR(Endpoint.class, e))
                .collect(Collectors.toList());
    }

    @FHIR
    @GET
    @Path("/{endpointID}")
    @Timed
    @ExceptionMetered
    @UnitOfWork
    @Override
    public Endpoint fetchEndpoint(@NotNull @PathParam("endpointID") UUID endpointID) {
        final EndpointEntity endpoint = this.endpointDAO.fetchEndpoint(endpointID)
                .orElseThrow(() -> new WebApplicationException("Unable to find Endpoint", Response.Status.NOT_FOUND));

        return converter.toFHIR(Endpoint.class, endpoint);
    }

    @FHIR
    @PUT
    @Path("/{endpointID}")
    @Timed
    @ExceptionMetered
    @UnitOfWork
    @Override
    public Endpoint updateEndpoint(@NotNull @PathParam("endpointID") UUID endpointID, @NotNull Endpoint endpoint) {
        EndpointEntity updatedEntity = this.endpointDAO.persistEndpoint(converter.fromFHIR(EndpointEntity.class, endpoint));
        return converter.toFHIR(Endpoint.class, updatedEntity);
    }

    @FHIR
    @DELETE
    @Path("/{endpointID}")
    @Timed
    @ExceptionMetered
    @UnitOfWork
    @Override
    public Response deleteEndpoint(@NotNull @PathParam("endpointID") UUID endpointID) {
        final EndpointEntity endpoint = this.endpointDAO.fetchEndpoint(endpointID)
                .orElseThrow(() -> new WebApplicationException("Unable to find Endpoint", Response.Status.NOT_FOUND));
        OrganizationEntity organization = endpoint.getOrganization();
        List<EndpointEntity> endpoints = organization.getEndpoints();
        if (endpoints.size() == 1) {
            throw new WebApplicationException("Cannot delete Organization's only endpoint", HttpStatus.UNPROCESSABLE_ENTITY_422);
        }

        endpoints.removeIf(e -> endpointID.equals(e.getId()));
        organization.setEndpoints(endpoints);
        this.organizationDAO.updateOrganization(organization.getId(), organization);
        this.endpointDAO.deleteEndpoint(endpoint);

        return Response.status(Response.Status.OK).build();
    }
}