Smile CDR v2023.08.PRE
On this page:

22.6Master Data Management User Interface (MDMUI)
Experimental

 
This is a preview feature initially introduced in Smile CDR 2023.05. Feedback is welcome. Please get in touch to discuss if you are interested in using MDMUI during the preview of this new feature. Its license status may change in a future release.

MDMUI is a user-facing application designed to make it easy for administrators to accept or refute links created by MDM (Master Data Management). It includes the ability to search for a particular resource, view a list of all potential matches and potential duplicates, and assign tasks to users for workload management.

MDMUI currently supports FHIR R4 endpoints only.

MDM UI Resources

MDM UI will create FHIR resources for its own workflow management, these will be tagged with the tag "https://smilecdr.com/fhir/ns/mdm/ui/NamingSystem/tags|MDM_UI". It will create new resources in the following scenarios:

  • A Task resource will be created to track each POSSIBLE_MATCH and POSSIBLE_DUPLICATE link created by MDM on the feed. This will be created by the MDM Interceptor mentioned in the Setup section below.
  • A Practioner resource will be created for each User that logs in to represent the user responsible for linking/unlinking records.
  • A PractionerRole will be created for each user to note if they are a data steward or an admin user (defaults to data steward for all new users).
  • An Organization will be created if it does not already exist with the identifier specified in the MDM UI module configuration, and the PractitionerRoles will be tied to that Organization.

22.6.1Setup

 

MDM UI depends on having certain components already configured in Smile. Please follow these steps to configure a fresh Smile install to work with MDMUI.

  1. Add Subscription Matcher module
  • Add module of type Subscription Matcher (All FHIR Versions)
  • Select dependency FHIR Storage module as FHIR Storage (R4 RDBMS)
  • Create and start module
  1. Add MDM Module
  • Add module of type mdm
  • Set interceptor bean type to ca.cdr.endpoint.mdm.ui.interceptor.MDMInterceptorContext
  • Set scripts for matching and survivorship
  • Select dependency Subscription Matcher from step 1 above
  • Start module
  1. Configure FHIR Storage R4 RDBMS (persistence) module:
  • Enable MDM mode
  • Enable message subscription
  • Restart persistence
  1. Configure smart outbound module (smart_auth):
  • Disable “Enforce approved scopes to restrict permissions”
  • Enable CORS to future MDMUI app port (cannot use * here due to logout URL constraints)
  • Restart module
  1. Configure JSON Admin API (admin_json) endpoint
  • Enable CORS to * or MDMUI app port
  • Enable OpenID Connect Security
  • Add dependency for OpenID Connect Authentication to smart_auth
  • Restart module
  1. Configure FHIR REST endpoint
  • Add module FHIR REST Endpoint (All FHIR Versions)
  • Set value for Fixed Value for Endpoint Base URL to the externally visible URL for this endpoint ( e.g. http://localhost:8000/ or https://mydomain.com/fhir/)
  • Under HTTP Listener configure a Listener Port (any port not in use e.g. 8000)
  • Enable OpenID Connect Security
  • Enable CORS to * or MDM UI port
  • Add dependency for OpenID Connect Authentication to smart_auth
  • Add dependency for FHIR Storage Module (any FHIR version) to persistence (FHIR Storage (R4 RDBMS))
  • Start module
  1. Configure OIDC client
  • Under Users & Authorization OpenID Connect Clients, use the "Add Client" button to add a new OIDC client
  • Enter a Client ID and Client Name of your choice (e.g. "MDM_UI")
  • Select Authorized Grant Types: Authorization Code, Refresh Token, and JWT Bearer Token
  • Set Authorized Redirect URLs to the base URL for your new MDM UI instance, e.g. http://localhost:8080/ or other port/context path of your choice
  • Set Scopes to: cdr_all_user_authorities launch/patient launch/practitioner offline_access openid profile
  • Create Client to create the client
  1. Add MDM UI Module
  • Add module of type MDM UI
  • Set Organization Identifier - a new Organization resource will be created if one does not exist with the given system|identifier
  • Set JSON admin URL to the public facing URL for accessing the JSON admin API
  • Set OIDC client ID (should match ID of OIDC client created above), issuer url, logout url for smart auth
  • Set HTTP Listener Port (e.g. 8080) - should match the redirect URL of the OIDC client and any CORS settings configured above
  • Enable Allow Anonymous Access - the MDM UI app provides its own OpenID Connect authentication
  • Select all dependencies
  • Start module
  1. Add Custom Search Parameters:
  • POST the following bundle of Search Parameter resources to your FHIR R4 endpoint:
{
   "resourceType": "Bundle",
   "type": "batch",
   "entry": [
      {
         "fullUrl": "SearchParameter/Task-relevant-history",
         "resource": {
            "resourceType": "SearchParameter",
            "id": "Task-relevant-history",
            "name": "Task relevant history",
            "url": "https://smilecdr.com/fhir/ns/mdm/ui/SearchParameter/Task-relevant-history",
            "status": "active",
            "description": "Search by Provenance records relating to this Task",
            "code": "relevant-history",
            "base": [
               "Task"
            ],
            "type": "reference",
            "expression": "Task.relevantHistory",
            "target": [
               "Provenance"
            ]
         },
         "request": {
            "method": "PUT",
            "url": "SearchParameter/Task-relevant-history",
            "ifNoneExist": "SearchParameter?base=Task&code=relevant-history&status=active"
         }
      },
      {
         "fullUrl": "SearchParameter/Task-restriction-recipient",
         "resource": {
            "resourceType": "SearchParameter",
            "id": "Task-restriction-recipient",
            "url": "https://smilecdr.com/fhir/ns/mdm/ui/SearchParameter/Task-restriction-recipient",
            "status": "active",
            "name": "Task restriction recipient",
            "description": "Search by task restriction recipient reference",
            "code": "restriction-recipient",
            "base": [
               "Task"
            ],
            "type": "reference",
            "expression": "Task.restriction.recipient",
            "target": [
               "Patient",
               "Practitioner",
               "PractitionerRole",
               "RelatedPerson",
               "Group",
               "Organization"
            ]
         },
         "request": {
            "method": "PUT",
            "url": "SearchParameter/Task-restriction-recipient",
            "ifNoneExist": "SearchParameter?base=Task&code=restriction-recipient&status=active"
         }
      },
      {
         "fullUrl": "SearchParameter/Task-owner-or-restriction-recipient",
         "resource": {
            "resourceType": "SearchParameter",
            "id": "Task-owner-or-restriction-recipient",
            "url": "https://smilecdr.com/fhir/ns/mdm/ui/SearchParameter/Task-owner-or-restriction-recipient",
            "name": "Task owner or restriction recipient",
            "status": "active",
            "description": "Search by task owner or restriction recipient reference",
            "code": "owner-or-recipient",
            "base": [
               "Task"
            ],
            "type": "reference",
            "expression": "Task.owner | Task.restriction.recipient",
            "target": [
               "CareTeam",
               "Device",
               "Group",
               "HealthcareService",
               "Organization",
               "Patient",
               "Practitioner",
               "PractitionerRole",
               "RelatedPerson"
            ]
         },
         "request": {
            "method": "PUT",
            "url": "SearchParameter/Task-owner-or-restriction-recipient",
            "ifNoneExist": "SearchParameter?base=Task&code=owner-or-recipient&status=active"
         }
      },
      {
         "fullUrl": "SearchParameter/Task-restriction-recipient-exists",
         "resource": {
            "resourceType": "SearchParameter",
            "id": "Task-restriction-recipient-exists",
            "url": "https://smilecdr.com/fhir/ns/mdm/ui/SearchParameter/Task-restriction-recipient-exists",
            "name": "Task restriction recipient if exists",
            "status": "active",
            "description": "A server match on whether Task recipient exists, alternative to using the :missing operator.",
            "code": "task-recipient-exists",
            "base": [
               "Task"
            ],
            "type": "string",
            "expression": "Task.restriction.recipient.exists()"
         },
         "request": {
            "method": "PUT",
            "url": "SearchParameter/Task-restriction-recipient-exists",
            "ifNoneExist": "SearchParameter?base=Task&code=task-recipient-exists&status=active"
         }
      }
   ]
}
  1. Use the MDM UI app
  • You should now be ready to view MDM UI at the port and context path specified in step 7 above! ( e.g. http://localhost:8080/mdm_ui)
  • If you are using a web proxy to expose ports externally you will need to configure the following endpoints for external access:
    • MDM UI port and context path
    • FHIR endpoint
    • Smart outbound security module
    • JSON Admin API