FHIR-Sandbox: SMART on FHIR Healthcare Platform

A production-quality Go-based platform for integrating with Electronic Health Record (EHR) systems using the SMART on FHIR protocol. This sandbox demonstrates authentication, persistence, and dashboarding for patient and practitioner data, serving as a robust starting point for healthcare applications.

Features

  • SMART on FHIR Launch: Supports the full SMART App Launch flow (EHR launch and standalone) with OAuth2 code exchange.
  • Identity Resolution: Correctly handles practitioner identification from both practitioner and user (Practitioner/ID) fields in OAuth2 token responses.
  • Comprehensive FHIR Sync: Automatically synchronizes and persists key clinical data:
    • Patient Demographics
    • Observations (Vitals, Labs)
    • Conditions (Problems)
    • DocumentReferences
    • MedicationRequests
    • AllergyIntolerances
  • SQLite Persistence: Persists all synced data using a pure-Go SQLite driver (modernc.org/sqlite), requiring no CGO or external database server.
  • Secure Session Management: Server-side sessions stored in SQLite with secure, HttpOnly cookies.
  • Responsive Dashboard: A modern UI built with Go html/template that displays patient demographics, clinical data, and practitioner details.
  • Extensible Architecture: Modular design with clean separation of concerns (handlers, db, fhir, models, middleware, config).

Architecture

The project is structured into modular packages under /app:

  • /config: Configuration structures and URL normalization.
  • /db: Database schema, versioned migrations, and CRUD operations using modernc.org/sqlite.
  • /fhir: FHIR R4 resource definitions, SMART discovery, and FHIR client logic.
  • /handlers: HTTP request handlers (launch, auth, dashboard, sync) and template rendering.
  • /middleware: Session management middleware (loading and hard-gate protection).
  • /models: Core domain models and context keys.
  • /templates: Embedded HTML templates with layout inheritance.

Prerequisites

  • Go 1.24+
  • No external database required (uses embedded SQLite)

Getting Started

  1. Clone the repository:

    git clone https://github.com/AmanTahiliani/FHIR-Sandbox.git
    cd FHIR-Sandbox
    
  2. Run the application:

    go run app/main.go
    

    The server starts on http://localhost:8080.

  3. Test with a Sandbox: Use the SMART Health IT Sandbox:

    • App Launch URL: http://localhost:8080/launch
    • Redirect URL: http://localhost:8080/auth-redirect

    The default configuration in main.go is pre-set to work with the SmartHealthIT sandbox.

Configuration

Configuration is currently managed in app/main.go via the config.AppConfig struct. You can define multiple EHRs, set your redirect URI, and required scopes directly in the code.

// Example configuration in app/main.go
cfg := &config.AppConfig{
    DBPath: "fhir_sandbox.db",
    Server: config.ServerConfig{
        Port: 8080,
    },
    SMART: config.SMARTConfig{
        RedirectURL: "http://localhost:8080/auth-redirect",
        Scopes:      []string{"openid", "profile", "launch", "patient/*.read", "user/*.read"},
    },
    EHRs: []config.EHRConfig{
        {
            Name:         "SmartHealthIT Sandbox (R4)",
            FHIRURL:      "https://launch.smarthealthit.org/v/r4/fhir",
            ClientID:     "your-client-id",
            ClientSecret: "your-client-secret", // Optional, depending on EHR
        },
    },
}

Testing

The project includes comprehensive unit tests for database logic, FHIR parsing, and clinical data handling.

  • Run all tests:

    go test ./...
    
  • Run tests with coverage:

    go test -cover ./...
    

Future Improvements

  • Configuration Loading: Implement a robust configuration loader (e.g., spf13/viper) to load settings from files or environment variables.
  • Structured Logging: Migrate to Go 1.21's log/slog for structured, leveled logging.
  • Refresh Tokens: Implement OAuth2 refresh token logic to maintain long-lived sessions.
  • Additional Resources: Add support for Encounters, Procedures, Immunizations, etc.
  • Frontend Enhancement: Evolve the UI with HTMX or a modern JS framework for better interactivity.
  • FHIR Type Safety: Adopt a comprehensive FHIR library (e.g., google/fhir/go) for stricter type safety.
Description
No description provided
Readme 201 KiB
Languages
Go 80.7%
HTML 12.9%
CSS 6.4%