Skip to content

Latest commit

 

History

History
260 lines (195 loc) · 5.39 KB

File metadata and controls

260 lines (195 loc) · 5.39 KB

DataNexus

Ruby client for the DataNexus API.

Installation

gem 'data_nexus'

Usage

client = DataNexus::Client.new(
  api_key: ENV['DATANEXUS_API_KEY'],
  base_url: 'https://datanexus.darthealth.com'  # optional
)

Program Members

List Members

Filters are required. Valid combinations:

  • born_on + employee_id
  • born_on + first_name + last_name
  • born_on + first_name_prefix + last_name_prefix
collection = client.programs('program-id').members.list(
  born_on: '1980-01-15',
  employee_id: 'EMP123'
)

collection.data.each do |member|
  puts "#{member[:first_name]} #{member[:last_name]}"
end

Search Members

Search for members within a program. Returns a bounded result set (max 10 results) with a more_results flag indicating if additional matches exist.

Valid parameter combinations:

  • born_on + employee_id
  • born_on + first_name + last_name
  • born_on + first_name + last_name + employee_id
  • born_on + first_name_prefix + last_name_prefix
  • born_on + first_name_prefix + last_name_prefix + employee_id
# Search by employee ID and DOB
result = client.programs('program-id').search_members(
  born_on: '1980-01-15',
  employee_id: 'EMP123'
)

result[:data].each do |member|
  puts "#{member[:first_name]} #{member[:last_name]}"
end

puts "More results available" if result[:more_results]

# Search by name and DOB
result = client.programs('program-id').search_members(
  born_on: '1980-01-15',
  first_name: 'George',
  last_name: 'Washington'
)

# Search by name prefix and DOB
result = client.programs('program-id').search_members(
  born_on: '1980-01-15',
  first_name_prefix: 'G',
  last_name_prefix: 'Was'
)

Note: Unlike list, search_members does not support pagination. It returns up to 10 results with a more_results boolean. An ArgumentError will be raised if an invalid parameter combination is provided.

Note: Depending on your API key, search_members may be the only method you have access to. Contact your DataNexus representative for more information about your API key's permissions.

Pagination

collection.each_page do |page|
  page.data.each { |member| process(member) }
end

# Or iterate all records directly
collection.each { |member| process(member) }

# Manual pagination
if collection.next_page?
  next_collection = collection.next_page
end

Find Member

member = client.programs('program-id').members('member-id').find
puts member[:first_name]

Update Member

response = client.programs('program-id').members('member-id').update(
  member: { phone_number: '+15551234567' }
)

Household Members

household = client.programs('program-id').members('member-id').household
household.each { |member| puts member[:first_name] }

Member Consents

Create Consent

response = client.programs('program-id').members('member-id').consents.create(
  consent: {
    category: 'sms',
    member_response: true,
    consent_details: { sms_phone_number: '+15558675309' }
  }
)
# program_id is automatically injected

Find Consent

consent = client.programs('program-id').members('member-id').consents.find(123)
puts consent[:category]

Update Consent

response = client.programs('program-id').members('member-id').consents.update(123,
  consent: { member_response: false }
)

Delete Consent

client.programs('program-id').members('member-id').consents.delete(123)

Member Enrollments

Create Enrollment

response = client.programs('program-id').members('member-id').enrollments.create(
  enrollment: {
    enrolled_at: '2024-01-01T00:00:00Z',
    expires_at: '2025-01-01T00:00:00Z'
  }
)
# program_id is automatically injected

Find Enrollment

enrollment = client.programs('program-id').members('member-id').enrollments.find(123)
puts enrollment[:enrolled_at]

Update Enrollment

response = client.programs('program-id').members('member-id').enrollments.update(123,
  enrollment: { expires_at: '2026-01-01T00:00:00Z' }
)

Delete Enrollment

client.programs('program-id').members('member-id').enrollments.delete(123)

Top-Level Members

You can also access members without a program scope:

List Members

collection = client.members.list(
  first_name: 'George',
  last_name: 'Washington',
  born_on: '1976-07-04'
)

# Filter by program eligibility
collection = client.members.list(program_id: 'program-uuid')

# Filter by update time
collection = client.members.list(updated_since: '2024-01-01T00:00:00Z')

# Pagination
collection = client.members.list(first: 50, after: 'cursor')

Find Member

member = client.members.find('member-id')
puts member[:first_name]

Update Member

response = client.members.update('member-id',
  member: { phone_number: '+15551234567' }
)

Error Handling

begin
  client.programs('id').members('id').find
rescue DataNexus::AuthenticationError
  # 401
rescue DataNexus::NotFoundError
  # 404
rescue DataNexus::UnprocessableEntityError
  # 422
rescue DataNexus::RateLimitError => e
  sleep(e.retry_after)
rescue DataNexus::APIError => e
  puts "#{e.status}: #{e.message}"
end

Development

cp .mise.local.toml.example .mise.local.toml
# Edit .mise.local.toml with your test credentials
bundle install
bundle exec rspec
bundle exec rubocop

License

MIT