Polymorphic Types

The Prima REST API has many resource sets that take advantage of polymorphism and inheritance to include extra data about some entities. Often, there is a base resource collection that includes data that is common to some entities as well as a typeName field to indicate the actual type of the entity.

Example: Cases

As described in the Prima Model Structure page, every Prima case will be either a ClinicalCase, HumanResearchCase or VeterinaryResearchCase. All of these cases have many data fields in common, which can be viewed and queried using the case endpoint.

Example Case Endpoint Response

            {
            "@odata.context": "https://localhost:5001/api/v1/$metadata#Case",
            "value": [
            {
            "surgicalWheelId": 2,
            "pathologistId": null,
            "priorityLevelId": 1,
            "residentPathologistId": null,
            "differentialDiagnosisId": null,
            "status": "InProcess",
            "savedIdentifier": "S20-0002",
            "surgeryDate": null,
            "typeName": "VeterinaryResearchCase",
            "id": 3
            },
            {
            "surgicalWheelId": 2,
            "pathologistId": null,
            "priorityLevelId": 1,
            "residentPathologistId": null,
            "differentialDiagnosisId": null,
            "status": "InProcess",
            "savedIdentifier": "S20-0001",
            "surgeryDate": null,
            "typeName": "ClinicalCase",
            "id": 1
            },
            {
            "surgicalWheelId": 4,
            "pathologistId": null,
            "priorityLevelId": 1,
            "residentPathologistId": null,
            "differentialDiagnosisId": null,
            "status": "InProcess",
            "savedIdentifier": "AP20-0001",
            "surgeryDate": null,
            "typeName": "HumanResearchCase",
            "id": 2
            }
            ]
            }
        

In this response we can see the typeName field on each case. So, to get some VeterinaryResearchCase specific information about the the item with 3, we can use the VeterinaryResearchCase endpoint and see a response like:

            {
  "@odata.context": "https://localhost:5001/api/v1/$metadata#VeterinaryResearchCase",
  "value": [
    {
      "animalId": 1,
      "billingId": 1,
      "studyId": null,
      "cohortId": null,
      "researcherId": null,
      "studyPhaseId": null,
      "surgicalWheelId": 2,
      "pathologistId": null,
      "priorityLevelId": 1,
      "residentPathologistId": null,
      "differentialDiagnosisId": null,
      "status": "InProcess",
      "savedIdentifier": "S20-0002",
      "surgeryDate": null,
      "typeName": "VeterinaryResearchCase",
      "id": 3
    }
  ]
}
        

This response now shows some VeterinaryResearchCase-specific data such as the animalId field.

Other examples

The same concept as the Case example also applies to many other entity endpoints such as Specimens (SurgicalSpecimens, FrozenSections, CytoSpecimens, HemoSpecimens) Slides, StainTestPanels, etc.