Search in sources :

Example 16 with Operation

use of gov.cms.bfd.server.war.Operation in project beneficiary-fhir-data by CMSgov.

the class CoverageResourceProvider method read.

/**
 * Adds support for the FHIR "read" operation, for {@link Coverage}s. The {@link Read} annotation
 * indicates that this method supports the read operation.
 *
 * <p>Read operations take a single parameter annotated with {@link IdParam}, and should return a
 * single resource instance.
 *
 * @param coverageId The read operation takes one parameter, which must be of type {@link IdType}
 *     and must be annotated with the {@link IdParam} annotation.
 * @return Returns a resource matching the specified {@link IdDt}, or <code>null</code> if none
 *     exists.
 */
@Read(version = false)
@Trace
public Coverage read(@IdParam IdType coverageId) {
    if (coverageId == null)
        throw new IllegalArgumentException();
    if (coverageId.getVersionIdPartAsLong() != null)
        throw new IllegalArgumentException();
    String coverageIdText = coverageId.getIdPart();
    if (coverageIdText == null || coverageIdText.trim().isEmpty())
        throw new IllegalArgumentException();
    Operation operation = new Operation(Operation.Endpoint.V1_COVERAGE);
    operation.setOption("by", "id");
    operation.publishOperationName();
    Matcher coverageIdMatcher = COVERAGE_ID_PATTERN.matcher(coverageIdText);
    if (!coverageIdMatcher.matches())
        throw new IllegalArgumentException("Unsupported ID pattern: " + coverageIdText);
    String coverageIdSegmentText = coverageIdMatcher.group(1);
    Optional<MedicareSegment> coverageIdSegment = MedicareSegment.selectByUrlPrefix(coverageIdSegmentText);
    if (!coverageIdSegment.isPresent())
        throw new ResourceNotFoundException(coverageId);
    String coverageIdBeneficiaryIdText = coverageIdMatcher.group(2);
    Beneficiary beneficiaryEntity;
    try {
        beneficiaryEntity = findBeneficiaryById(coverageIdBeneficiaryIdText, null);
        if (!beneficiaryEntity.getBeneEnrollmentReferenceYear().isPresent()) {
            throw new ResourceNotFoundException("Cannot find coverage for non present enrollment year");
        }
    } catch (NoResultException e) {
        throw new ResourceNotFoundException(new IdDt(Beneficiary.class.getSimpleName(), coverageIdBeneficiaryIdText));
    }
    Coverage coverage = CoverageTransformer.transform(metricRegistry, coverageIdSegment.get(), beneficiaryEntity);
    return coverage;
}
Also used : Matcher(java.util.regex.Matcher) MedicareSegment(gov.cms.bfd.server.war.commons.MedicareSegment) IdDt(ca.uhn.fhir.model.primitive.IdDt) Coverage(org.hl7.fhir.dstu3.model.Coverage) Operation(gov.cms.bfd.server.war.Operation) NoResultException(javax.persistence.NoResultException) ResourceNotFoundException(ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException) Beneficiary(gov.cms.bfd.model.rif.Beneficiary) Read(ca.uhn.fhir.rest.annotation.Read) Trace(com.newrelic.api.agent.Trace)

Example 17 with Operation

use of gov.cms.bfd.server.war.Operation in project beneficiary-fhir-data by CMSgov.

the class ExplanationOfBenefitResourceProvider method read.

/**
 * Adds support for the FHIR "read" operation, for {@link ExplanationOfBenefit}s. The {@link Read}
 * annotation indicates that this method supports the read operation.
 *
 * <p>Read operations take a single parameter annotated with {@link IdParam}, and should return a
 * single resource instance.
 *
 * @param eobId The read operation takes one parameter, which must be of type {@link IdType} and
 *     must be annotated with the {@link IdParam} annotation.
 * @param requestDetails a {@link RequestDetails} containing the details of the request URL, used
 *     to parse out header values
 * @return Returns a resource matching the specified {@link IdDt}, or <code>null</code> if none
 *     exists.
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
@Read(version = false)
@Trace
public ExplanationOfBenefit read(@IdParam IdType eobId, RequestDetails requestDetails) {
    if (eobId == null)
        throw new IllegalArgumentException();
    if (eobId.getVersionIdPartAsLong() != null)
        throw new IllegalArgumentException();
    String eobIdText = eobId.getIdPart();
    if (eobIdText == null || eobIdText.trim().isEmpty())
        throw new IllegalArgumentException();
    Matcher eobIdMatcher = EOB_ID_PATTERN.matcher(eobIdText);
    if (!eobIdMatcher.matches())
        throw new IllegalArgumentException("Unsupported ID pattern: " + eobIdText);
    String eobIdTypeText = eobIdMatcher.group(1);
    Optional<ClaimType> eobIdType = ClaimType.parse(eobIdTypeText);
    Boolean includeTaxNumbers = returnIncludeTaxNumbers(requestDetails);
    if (!eobIdType.isPresent())
        throw new ResourceNotFoundException(eobId);
    String eobIdClaimIdText = eobIdMatcher.group(2);
    Operation operation = new Operation(Operation.Endpoint.V1_EOB);
    operation.setOption("IncludeTaxNumbers", "" + includeTaxNumbers);
    operation.setOption("by", "id");
    operation.publishOperationName();
    Class<?> entityClass = eobIdType.get().getEntityClass();
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery criteria = builder.createQuery(entityClass);
    Root root = criteria.from(entityClass);
    eobIdType.get().getEntityLazyAttributes().stream().forEach(a -> root.fetch(a));
    criteria.select(root);
    criteria.where(builder.equal(root.get(eobIdType.get().getEntityIdAttribute()), eobIdClaimIdText));
    Object claimEntity = null;
    Long eobByIdQueryNanoSeconds = null;
    Timer.Context timerEobQuery = metricRegistry.timer(MetricRegistry.name(getClass().getSimpleName(), "query", "eob_by_id")).time();
    try {
        claimEntity = entityManager.createQuery(criteria).getSingleResult();
    } catch (NoResultException e) {
        throw new ResourceNotFoundException(eobId);
    } finally {
        eobByIdQueryNanoSeconds = timerEobQuery.stop();
        TransformerUtils.recordQueryInMdc("eob_by_id", eobByIdQueryNanoSeconds, claimEntity == null ? 0 : 1);
    }
    ExplanationOfBenefit eob = eobIdType.get().getTransformer().transform(metricRegistry, claimEntity, Optional.of(includeTaxNumbers));
    return eob;
}
Also used : CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder) Root(javax.persistence.criteria.Root) Matcher(java.util.regex.Matcher) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) Operation(gov.cms.bfd.server.war.Operation) NoResultException(javax.persistence.NoResultException) ExplanationOfBenefit(org.hl7.fhir.dstu3.model.ExplanationOfBenefit) Timer(com.codahale.metrics.Timer) ResourceNotFoundException(ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException) Read(ca.uhn.fhir.rest.annotation.Read) Trace(com.newrelic.api.agent.Trace)

Aggregations

Trace (com.newrelic.api.agent.Trace)17 Operation (gov.cms.bfd.server.war.Operation)17 NoResultException (javax.persistence.NoResultException)15 ResourceNotFoundException (ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException)13 Read (ca.uhn.fhir.rest.annotation.Read)11 Search (ca.uhn.fhir.rest.annotation.Search)11 Beneficiary (gov.cms.bfd.model.rif.Beneficiary)11 OffsetLinkBuilder (gov.cms.bfd.server.war.commons.OffsetLinkBuilder)11 IBaseResource (org.hl7.fhir.instance.model.api.IBaseResource)11 Timer (com.codahale.metrics.Timer)9 RequestHeaders (gov.cms.bfd.server.war.commons.RequestHeaders)9 CriteriaBuilder (javax.persistence.criteria.CriteriaBuilder)9 IdDt (ca.uhn.fhir.model.primitive.IdDt)7 InvalidRequestException (ca.uhn.fhir.rest.server.exceptions.InvalidRequestException)7 ArrayList (java.util.ArrayList)7 CriteriaQuery (javax.persistence.criteria.CriteriaQuery)7 Root (javax.persistence.criteria.Root)7 Description (ca.uhn.fhir.model.api.annotation.Description)5 IdParam (ca.uhn.fhir.rest.annotation.IdParam)5 OptionalParam (ca.uhn.fhir.rest.annotation.OptionalParam)5