Reporting REST API (Design Page)

Background

The reportingrest module was created "long ago" when Darius Jazayeri and Ben Wolfe were working with Pentaho and before the OpenMRS REST API was realized. Per Darius Jazayeri: "it works, but probably not with the 'right' RESTful API." Reporting's REST API does not have its own JIRA project. Any REST-related work for reporting has been done in the REPORT project.

Goals

  • An intentionally-designed, externally-usable format for report definitions (e.g., a well-described JSON format)
    • Historically, the reporting framework has used XStream heavily to serialize objects. We'd like to move away from using serialized auto-generated XML of Java classes for definitions, perhaps toward a more formal, standard, and nicer format for defining reports.
  • TBD

Design Ideas

 

/report

/report?download=true vs. /report/{uuid}/raw or /report/{uuid}/download (get URL from /report/{uuid} resource)

/report/{uuid}/request (or "run")
list of prior/current requests

/report/{uuid}/request/{uuid}
status ± link to download

/query (e.g., cohort)
question: would we want /query?type=cohort, or to have /cohort (cohortdefinition, encounterquery, ...)


Darius: I would expect resources for cohortquery, encounterquery, obsquery, etc (not one single "query" resource, and also not one resource for every query implementation, like "gendercohortdefinition")


Mike: you need to be able to *both* create a new definition (e.g. persist it to the DB) and *also* execute a query based on a definition


GET /patientquery => lists saved cohort queries


POST /patientquery => creates a new cohort query (persists it to the DB)


GET /patientquery/{uuid}/request => list available runs of this query that I could download (or, are still in progress)


POST /patientquery/{uuid}/request => asynchronously execute a new run of this query


GET /patientquery/{uuid}/request => list available requests/runs of this query


GET /patientquery/{uuid}/request/{uuid} => get result of a specific request/run of this query


POST /patientquery/{uuid}/execute => synchronously execute a new run of this query


POST /patientquery/request => execute a new run of a (dynamically-defined) cohort query by its definition (asynchronous, instantly returns a link to the request)


POST /patientquery/execute => execute a new run of a (dynamically-defined) cohort query by its definition (synchronous, returns actual result, after a while)


Burke: "execute" is bad because it's an action verb, not a resource name


/data (e.g., calculation)


/dataset

 

See Also