class SubscriptionsTestKit::SubscriptionCreateEndpoint
def find_heartbeat_period(subscription)
def find_heartbeat_period(subscription) subscription&.channel&.extension&.find do |e| e.url == 'http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-heartbeat-period' end end
def make_response
def make_response response.format = :json response.status = 400 begin subscription = FHIR.from_contents(request.body.string) rescue StandardError response.body = operation_outcome('error', 'invalid', 'No recognized R4 Subscription in request body').to_json return end verification_outcome = verify_subscription(subscription) if verification_outcome.present? response.body = verification_outcome.to_json return end # Deny subscription if one already created requests = requests_repo.tagged_requests(test_run.test_session_id, tags) existing_subscription_request = requests.find { |r| r.status == 201 } if existing_subscription_request.present? subscription_hash = JSON.parse(existing_subscription_request.response_body) error_text = 'Inferno only supports one subscription per test run. Subscription already created with ' \ "ID #{subscription_hash['id']}" response.body = operation_outcome('error', 'business-rule', error_text).to_json return end # Form response notification_json = notification_bundle_input(result) subscription_id = SecureRandom.uuid # We have to manipulate the raw hash so that we don't lose the _payload primitive extension subscription_hash = JSON.parse(request.body.string).merge('id' => subscription_id, 'status' => 'requested') subscription_hash['channel']['payload'] = actual_mime_type(subscription) response.status = 201 response.body = subscription_hash.to_json # Kick off notification job subscription_url = "#{request.url}/#{subscription_id}" client_endpoint = subscription.channel.endpoint bearer_token = client_access_token_input(result) test_suite_base_url = request.url.chomp('/').chomp(FHIR_SUBSCRIPTION_PATH) Inferno::Jobs.perform(Jobs::SendSubscriptionNotifications, test_run.id, test_run.test_session_id, result.id, subscription_id, subscription_url, client_endpoint, bearer_token, notification_json, test_run_identifier, test_suite_base_url) end
def tags
def tags [SUBSCRIPTION_CREATE_TAG] end
def test_run_identifier
def test_run_identifier request.headers['authorization']&.delete_prefix('Bearer ') end
def valid_url?(url)
def valid_url?(url) uri = URI.parse(url) %w[http https].include?(uri.scheme) rescue URI::InvalidURIError false end
def verify_subscription(subscription)
def verify_subscription(subscription) unless subscription.is_a? FHIR::Subscription return operation_outcome('error', 'invalid', 'No recognized R4 Subscription in request body') end unless subscription.channel&.type == 'rest-hook' return operation_outcome('error', 'business-rule', 'channel.type must be rest-hook') end unless valid_url?(subscription.channel&.endpoint) return operation_outcome('error', 'value', 'channel.endpoint is not recognized as a conformant URL') end heartbeat_period = find_heartbeat_period(subscription) operation_outcome('error', 'not-supported', 'heartbeatPeriod is not supported') unless heartbeat_period.nil? end