diff --git a/README.md b/README.md index efd801c..42200d8 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,14 @@ ] } ``` - In the example above: - - `"$id"` field is the URL from which the schema will be available at. + In the example above: - - `"$ref"` field is a reference to the URL where your existing schema is published. The first `"$ref"` field refers to the URL where the Open Attestation schema is at. + - `"$id"` field is the URL from which the schema will be available at. + + - `"$ref"` field is a reference to the URL where your existing schema is published. The first `"$ref"` field refers to the URL where the Open Attestation schema is at. 1. Add tests for your schema. ->_If you are uncertain of the structure of an Open Attestation document, you can refer to [this](https://openattestation.com/docs/verifiable-document/raw-document) and append your existing sample document with the required fields. -``` +> If you are uncertain of the structure of an Open Attestation document, you can refer to [this](https://openattestation.com/docs/verifiable-document/raw-document) and append your existing sample document with the required fields. + diff --git a/package.json b/package.json index 7cbdb36..fec874f 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "mkdirp": "^1.0.4", "prettier": "^1.19.1", "prettier-plugin-svelte": "^1.4.1", - "quicktype": "^15.0.207", + "quicktype": "^15.0.258", "semantic-release": "^17.2.1", "svelte": "^3.29.4", "ts-jest": "^24.1.0", diff --git a/scripts/post-install.js b/scripts/post-install.js index 929a587..06a444f 100644 --- a/scripts/post-install.js +++ b/scripts/post-install.js @@ -10,7 +10,7 @@ const generate = ({ path, rootTypeName }) => { console.log(`Creating types from src/${path}/schema.json`); mkdirp.sync(`src/__generated__/${path}`); execSync( - `${quicktype} -s schema -o src/__generated__/${path}/schema.ts -t ${rootTypeName} --just-types src/${path}/schema.json --no-date-times + `${quicktype} -s schema -o src/__generated__/${path}/schema.ts -t ${rootTypeName} --just-types src/${path}/schema.json --no-date-times --acronym-style original ` ); }; @@ -18,7 +18,7 @@ const generate = ({ path, rootTypeName }) => { if (fs.existsSync(quicktype) && process.env.npm_config_production !== "true") { generate({ path: "sg/gov/tech/geekout/1.0", rootTypeName: "Geekout" }); generate({ path: "sg/gov/tech/notarise/1.0", rootTypeName: "Notarise" }); - // generate({ path: "sg/gov/moh/healthcert/1.0", rootTypeName: "HealthCert" }); + generate({ path: "sg/gov/moh/healthcert/1.0", rootTypeName: "HealthCert" }); } else { console.log("Not running quicktype"); } diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-wrapped.json b/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-wrapped.json deleted file mode 100644 index ff99e23..0000000 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-wrapped.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "version": "https://schema.openattestation.com/2.0/schema.json", - "data": { - "id": "e17eaac2-131e-4439-b4c3-6af4e5fa3616:string:TEST001", - "name": "0eeb7cc0-99ae-45f3-9100-812578396635:string:HealthCert", - "validFrom": "e35a9fa1-77f9-4650-8737-6f9158f034a3:string:2020-11-20", - "fhirVersion": "5d29d4ec-2054-4f56-9deb-59139f2ba5b8:string:4.0.1", - "fhirBundle": { - "resourceType": "a1b71b9a-92d1-4ccb-aedf-0532507580e9:string:Bundle", - "type": "7944aacc-d0a6-401b-96d9-dfe7bb4aebd1:string:collection", - "entry": [ - { - "resourceType": "5bfb67e2-d650-47ea-8d78-a27e98b3ff57:string:Patient", - "extension": [ - { - "url": "96915138-f2f3-448a-9144-0ccb68068c18:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { "text": "a7f4ab3f-0bca-470e-88d0-9fc58629dc7f:string:SG" } - } - ], - "identifier": [ - { - "type": "5877095d-01c9-4f49-ae3b-2d6587e7b6ec:string:PPN", - "value": "252dffca-0595-4289-8bab-a7d140ae32ef:string:E7831177G" - }, - { - "type": { "text": "a033a6dd-21fc-4213-a68a-746de45128ba:string:NRIC" }, - "value": "294c0eee-59b8-4f46-b384-537a4e820baf:string:S9098989Z" - } - ], - "name": [{ "text": "5c0d9152-113c-4928-a815-ce103387f1e2:string:Tan Chen Chen" }], - "gender": "1edc4c1f-fd6a-4995-90cd-23b81e734d84:string:female", - "birthDate": "01d4cc79-5413-422e-8b82-645b1c150dee:string:1990-01-15" - }, - { - "resourceType": "972e003d-6177-4e0a-903c-067c0c380b07:string:Specimen", - "type": { - "coding": [ - { - "system": "120231fb-0922-43b5-a626-633fbf2e8556:string:http://snomed.info/sct", - "code": "179c2cc9-c199-4ac9-a0ea-dc4d71f8f719:string:258500001", - "display": "4f143088-cd8f-48d4-a550-65c93b0b1667:string:Nasopharyngeal swab" - } - ] - }, - "collection": { "collectedDateTime": "92578a8e-6c60-4183-ac4e-1d7f2c0a3ea7:string:2020-09-27T06:15:00Z" } - }, - { - "resourceType": "c5f79f15-ee82-4de9-a4f9-99c218f062c0:string:Observation", - "identifier": [ - { - "value": "8773f171-4a47-4f3a-98f2-e5b09a2f0166:string:123456789", - "type": "80f35c44-242c-4f02-abe5-4388d8c95f62:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "b5b20a79-9e68-4f44-b783-672c18de6186:string:http://loinc.org", - "code": "e51fa2c3-aece-4ab2-b2e4-73ec957fa7ad:string:94531-1", - "display": "92f6dcf1-bdee-4e3f-a75d-6adbc4a825b7:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "cbeb9195-12c7-4a55-a1d1-c0feb80dea04:string:http://snomed.info/sct", - "code": "9de6d399-d731-4c33-9c55-31e71300e8d1:string:260385009", - "display": "aea30270-29d1-4fe9-8598-3d91770dc69f:string:Negative" - } - ] - }, - "effectiveDateTime": "a6095bd8-ddf3-4ccb-93ae-f5792f972ad9:string:2020-09-28T06:15:00Z", - "status": "1dd3521e-9a99-4668-b138-74aa26f078ef:string:final", - "performer": { "name": [{ "text": "438747d9-23b8-405b-b6a0-96a295339198:string:Dr Michael Lim" }] }, - "qualification": [ - { - "identifier": "7d4af18c-743d-4597-8947-2a2cc55005a1:string:MCR 123214", - "issuer": "072f9986-a504-40c1-bda9-b5b61c4f6e28:string:MOH" - } - ] - }, - { - "resourceType": "a1d436ae-fd5a-4f28-8b6b-97172b4ddb60:string:Organization", - "name": "1abc6819-ab7b-4bed-b060-9d3a526d978d:string:MacRitchie Medical Clinic", - "type": "a2b5ff78-4674-45cf-88fd-5e9736ba878c:string:Licensed Healthcare Provider", - "endpoint": { "address": "fee45ebf-802f-40be-9edc-a63183503268:string:https://www.macritchieclinic.com.sg" }, - "contact": { - "telecom": [ - { - "system": "433fc729-ad28-40e8-9392-7a6e11b8951b:string:phone", - "value": "a3cab34d-ace0-4313-b93c-ab394189963c:string:+6563113111" - } - ], - "address": { - "type": "0cf47b0e-6fdd-46e1-a3c0-35bc9f7c2c75:string:physical", - "use": "59ab2fe1-d8c0-4ab0-ad17-eab8c9e5d5dd:string:work", - "text": "17d723a1-37f3-4d00-b544-5d7951602b0f:string:MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "ae5fdb9e-8bb9-478c-83eb-994edcc528d4:string:Organization", - "name": "648b1f1a-7d8f-4944-909c-1481b54cc646:string:MacRitchie Laboratory", - "type": "67072e6b-6ae7-4db1-8dea-2586effbe028:string:Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "0e8bc03d-2095-4b5c-afe8-605833341ec3:string:phone", - "value": "5d36ffbb-0442-4747-8686-bb5e758d7e25:string:+6562711188" - } - ], - "address": { - "type": "d2e587ca-985a-4728-8d4c-9a3c43434d7f:string:physical", - "use": "81f241b3-ffc6-49df-ba8d-0e3f6beea424:string:work", - "text": "584df6a2-1183-4e9f-ae99-f7956a7c600f:string:2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "name": "9354e278-90ff-41f2-9265-d7f12b64c88a:string:GovTech", - "documentStore": "9e40eaa1-d026-40be-8131-e18dc5a87f96:string:0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", - "identityProof": { - "type": "d21c5a0a-866f-4a0c-83e7-1b0f64d0a799:string:DNS-TXT", - "location": "fb531056-6d2f-4b42-b81f-e4c570099898:string:example.openattestation.com" - } - } - ], - "$template": { - "name": "389d4e76-44f3-4b6a-8845-6e988126fb63:string:HEALTHCERT", - "type": "ce0b78be-469f-477e-873c-946e0305fdca:string:EMBEDDED_RENDERER", - "url": "4bfe5153-86d5-4857-8fdd-99a22c9b119d:string:https://govtech-renderer.openattestation.com/" - }, - "notarisationMetadata": { - "reference": "b5bedb44-fe3c-4ff5-9245-b58bb81a5535:string:JESAPPELLEGROOT", - "notarisedOn": "604d831d-0135-402b-9691-87a7a311d674:string:2020-09-27T06:15:00Z", - "passportNumber": "4fb9dbcd-e3bc-4e72-aa70-25261badb355:string:13TR0987XV" - }, - "attachments": [ - { - "filename": "5d35105b-909a-40b2-9075-55cc16deecc7:string:Original Healthcerts", - "type": "68ce278e-71ec-4216-b2b0-fa73bf55e408:string:text/open-attestation", - "data": "19647ffb-9370-4e99-b17f-ae6324c6a41f:string:ewogICJ2ZXJzaW9uIjogImh0dHBzOi8vc2NoZW1hLm9wZW5hdHRlc3RhdGlvbi5jb20vMi4wL3NjaGVtYS5qc29uIiwKICAiZGF0YSI6IHsKICAgICJpZCI6ICIzZDQ0MjRkMS0yODQ4LTQ3NTktODQ1MC1lN2EwMDc0Y2ZhYmE6c3RyaW5nOlRFU1QwMDEiLAogICAgIm5hbWUiOiAiOTQ2MTNmOGMtMjU4NS00OTBiLWE5MzItZTE5ODA5NzViNjI1OnN0cmluZzpIZWFsdGhDZXJ0IiwKICAgICJ2YWxpZEZyb20iOiAiNzExMmQzNTYtODZmZC00YjkzLTk3NDgtODEzNWI5ZTgzZWRmOnN0cmluZzoyMDIwLTExLTIwIiwKICAgICJmaGlyVmVyc2lvbiI6ICI3NDg0ZWQ4OS05ZGIwLTRmZWMtOGNlOS1iZjc2NmE2NTYxZjg6c3RyaW5nOjQuMC4xIiwKICAgICJmaGlyQnVuZGxlIjogewogICAgICAicmVzb3VyY2VUeXBlIjogIjdlNGJjZTYwLWQ4MDctNDVlOC1hZDVmLWY2NTdkOGFlNzI5MDpzdHJpbmc6QnVuZGxlIiwKICAgICAgInR5cGUiOiAiZGEyMDJlZjYtZWM0Yy00Yzk1LWJhYzktYmU0MjQzMGMxYzFiOnN0cmluZzpjb2xsZWN0aW9uIiwKICAgICAgImVudHJ5IjogWwogICAgICAgIHsKICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiNTk2ZmJhYjUtYjA4Ny00NGY4LWJkNzItNWQ2ODQ2Nzg4NmRlOnN0cmluZzpQYXRpZW50IiwKICAgICAgICAgICJleHRlbnNpb24iOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidXJsIjogImY0N2JmYzljLTE2MjUtNDAzNC1hMTZlLWQxZDgwYzMyNTkxMTpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLAogICAgICAgICAgICAgICJjb2RlIjogewogICAgICAgICAgICAgICAgInRleHQiOiAiYTk1ZDhiMDEtZWU1Yy00ZTg1LTgzY2ItYWM4OTFlMDgzNzEyOnN0cmluZzpTRyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiaWRlbnRpZmllciI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJ0eXBlIjogImU4ODIwOTY2LWIzNGQtNDVlNy1iNmZhLTVhM2RkYmMyZTI3NjpzdHJpbmc6UFBOIiwKICAgICAgICAgICAgICAidmFsdWUiOiAiYjdhMmE1MjAtNWI3ZS00NzhiLWEwNWEtMmI0YTJjNWRjYzdiOnN0cmluZzpFNzgzMTE3N0ciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICJ0ZXh0IjogIjE2MjkzODM2LTBhNTgtNDk2ZC1hZTM3LTAyYzJhMTNjZjI0ODpzdHJpbmc6TlJJQyIKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJ2YWx1ZSI6ICJmMTNlM2M4Yi1jZWIyLTRmNzItYmIzMi00NjM4MzRhZTkwOWM6c3RyaW5nOlM5MDk4OTg5WiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJuYW1lIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInRleHQiOiAiNDE3OGFiYWItNThmZC00YjQzLTlhMGMtMWMxNGUzNzAyZjE5OnN0cmluZzpUYW4gQ2hlbiBDaGVuIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgImdlbmRlciI6ICI5OWRkMGVlNy0xNTU3LTQ4MDYtYTRiZS0xMTM0NDM2Y2M2MmM6c3RyaW5nOmZlbWFsZSIsCiAgICAgICAgICAiYmlydGhEYXRlIjogIjE0NGVkY2RkLTU1MmMtNGIzYy05ODE3LTUzNWNjYWJlNWUxZjpzdHJpbmc6MTk5MC0wMS0xNSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiZGRiMzBmMTEtMmU1YS00YjNlLWEwYTQtYmM0MjY3ZTU3YmMyOnN0cmluZzpTcGVjaW1lbiIsCiAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgImNvZGluZyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic3lzdGVtIjogIjAwYzAzYjkxLWNjOTQtNDllNC1hNjQ2LWY5YmQxZmM2Yjg5ZDpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICI0YmU5YWFkNS02M2JjLTQ5ZDEtOTBmZC02NzkxNmJkZTUzNWU6c3RyaW5nOjI1ODUwMDAwMSIsCiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICI2MmFlODg0YS0wOGRkLTRmYjktODg3ZS00N2E0YWY1ZDFkYzc6c3RyaW5nOk5hc29waGFyeW5nZWFsIHN3YWIiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgImNvbGxlY3Rpb24iOiB7CiAgICAgICAgICAgICJjb2xsZWN0ZWREYXRlVGltZSI6ICIyMTRiODRjMy1hNmEyLTQwYmItODMwMC1mYmYxNjhhMmFiYjU6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICJhOGZkMzMxNi01ZGQ5LTQ0OTYtYWI0MC1hYTU2ZDMxYzFmMzE6c3RyaW5nOk9ic2VydmF0aW9uIiwKICAgICAgICAgICJpZGVudGlmaWVyIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInZhbHVlIjogImE2ZTNmOTliLTRhYzItNDQ3My1iYzJlLTRjY2Q2NTM4ZTRkZTpzdHJpbmc6MTIzNDU2Nzg5IiwKICAgICAgICAgICAgICAidHlwZSI6ICIxYzA0ZWEzZC1jMzhlLTQ0MGYtYjQ0NC0zN2QyNWNlYjEwOWE6c3RyaW5nOkFDU04iCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiY29kZSI6IHsKICAgICAgICAgICAgImNvZGluZyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic3lzdGVtIjogIjIzMDNmMTI1LTI3N2YtNGIxMy1iYTRhLWFhYmNlYzYxYTI4YjpzdHJpbmc6aHR0cDovL2xvaW5jLm9yZyIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICI0MzVkNWE4My05ZmM0LTQ3ODMtODk1MC02YzM5MjQxNWZjNmM6c3RyaW5nOjk0NTMxLTEiLAogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiNDIzYTczODctZDM4Yi00Y2QwLThjNjYtYTkwNmM4YTgyYWY2OnN0cmluZzpSZXZlcnNlIHRyYW5zY3JpcHRpb24gcG9seW1lcmFzZSBjaGFpbiByZWFjdGlvbiAoclJULVBDUikgdGVzdCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAidmFsdWVDb2RlYWJsZUNvbmNlcHQiOiB7CiAgICAgICAgICAgICJjb2RpbmciOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICI0NTEwOGNjNi03OTJhLTRhZmQtOTQxNi03YzU4ODgzZGFhOWE6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiMDBhODJkZmItOGQzYy00Yjk4LTk1M2ItNThkYzEzNzMyNWI4OnN0cmluZzoyNjAzODUwMDkiLAogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiNTRmZTZjYzUtZGIyMC00MDdkLTgxNDUtM2VhZTU2MzI1NjFlOnN0cmluZzpOZWdhdGl2ZSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiZWZmZWN0aXZlRGF0ZVRpbWUiOiAiMGM4MTQxYjMtNjhhZC00NjQzLWIyNTgtMDlmMDYxZmUxNDkxOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsCiAgICAgICAgICAic3RhdHVzIjogIjA0NDg5NGY2LTBiY2EtNDVlYy1hMzk1LWE4MmU2YWM0YjExNDpzdHJpbmc6ZmluYWwiLAogICAgICAgICAgInBlcmZvcm1lciI6IHsKICAgICAgICAgICAgIm5hbWUiOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRleHQiOiAiOWNlYjcyMjAtMDU5ZC00ODAwLWFjYmMtYzk3NWYzMGRhZDNjOnN0cmluZzpEciBNaWNoYWVsIExpbSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAicXVhbGlmaWNhdGlvbiI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJpZGVudGlmaWVyIjogImI5YmE4NDM0LTc2MjAtNDEzZS1hNDdmLTBmMzkxNzFiMzE2YTpzdHJpbmc6TUNSIDEyMzIxNCIsCiAgICAgICAgICAgICAgImlzc3VlciI6ICJhNzU0YzUyOS03OGI4LTQ4NDctOGY2Ny05Mjk0MTdkMDVkZTY6c3RyaW5nOk1PSCIKICAgICAgICAgICAgfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICIyOWQzMWRiZC1hYThlLTQxMWEtYmM0NS1mY2MyZTI4ZmVhM2Q6c3RyaW5nOk9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAibmFtZSI6ICIwNmU0Y2YxZi0yOGFiLTRmOGUtOWIxMy02YzljNDYzOTMyNWU6c3RyaW5nOk1hY1JpdGNoaWUgTWVkaWNhbCBDbGluaWMiLAogICAgICAgICAgInR5cGUiOiAiZmQ5ZTVhNDAtMDgyNS00ZjNjLThkOTktZDJkMjdjOWZiNjY0OnN0cmluZzpMaWNlbnNlZCBIZWFsdGhjYXJlIFByb3ZpZGVyIiwKICAgICAgICAgICJlbmRwb2ludCI6IHsKICAgICAgICAgICAgImFkZHJlc3MiOiAiYzQ3NzhmZWMtY2IyNi00NDFiLWJlNmYtNTc3YzJjYzExYzYzOnN0cmluZzpodHRwczovL3d3dy5tYWNyaXRjaGllY2xpbmljLmNvbS5zZyIKICAgICAgICAgIH0sCiAgICAgICAgICAiY29udGFjdCI6IHsKICAgICAgICAgICAgInRlbGVjb20iOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICIwMDcxNzY5Yi01ZTZmLTQ2OTQtYTI4Zi04MTUxMmM3ZTNlZTU6c3RyaW5nOnBob25lIiwKICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxN2FlZjBmMi1lNzA5LTRhYjYtODBjMS03ZTA5YTBiZTY0YWM6c3RyaW5nOis2NTYzMTEzMTExIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiMjA5OGFhMTAtMTFhMS00MDIwLTljZjctYTk3YjIxNDQ5ZmQ4OnN0cmluZzpwaHlzaWNhbCIsCiAgICAgICAgICAgICAgInVzZSI6ICJlYWVhYWQ5NC1kMzhmLTRiMDYtODFkNS1mMjA4NGUxMjMzMDE6c3RyaW5nOndvcmsiLAogICAgICAgICAgICAgICJ0ZXh0IjogImFmMWVjOTU4LTg1MDMtNDcxZi04YzQwLWYzNGUzMzc2ZTFhZjpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCBUaG9tc29uIFJvYWQgU2luZ2Fwb3JlIDEyMzAwMCIKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICI3ZjliOTQ4Ny03MzljLTQ5OTUtODI5ZS0zOWU1MjQwOWQ3YWQ6c3RyaW5nOk9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAibmFtZSI6ICIwZmVlNjNkNy0yMDFkLTRhYjAtODI1ZC03NTEzNTNiYzQwMjA6c3RyaW5nOk1hY1JpdGNoaWUgTGFib3JhdG9yeSIsCiAgICAgICAgICAidHlwZSI6ICI0ZDgzZmRkZC0wZDMzLTQ1ZWEtYjUzOC0wMThlNzViODdlYWY6c3RyaW5nOkFjY3JlZGl0ZWQgTGFib3JhdG9yeSIsCiAgICAgICAgICAiY29udGFjdCI6IHsKICAgICAgICAgICAgInRlbGVjb20iOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICI5Y2FlODdhNi1jNGYwLTRlNzAtYTFhYi05ZDM4NmUzMjRmOTk6c3RyaW5nOnBob25lIiwKICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJjNjdmNDlmOS1lODllLTRjODItYmNiYS1iZTliMDM2MTI2OWY6c3RyaW5nOis2NTYyNzExMTg4IgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiZWNmMDY0NDUtNzc5NC00YmE5LWJlNDktNTVmM2NkNjk1MjIxOnN0cmluZzpwaHlzaWNhbCIsCiAgICAgICAgICAgICAgInVzZSI6ICIzYTBjN2QwMC1lMmM2LTRlMDctOGIyMC04NzE2NzlmYjY3NzA6c3RyaW5nOndvcmsiLAogICAgICAgICAgICAgICJ0ZXh0IjogImNkMjU3MDhlLTNjYWEtNGFiZi1hMWE1LWJiMDNlMGU4MGE2ZTpzdHJpbmc6MiBUaG9tc29uIEF2ZW51ZSA0IFNpbmdhcG9yZSAwOTg4ODgiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICAiaXNzdWVycyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImIzNWE4YTNlLWQ0YmUtNDAyMy05YzM5LWNmNDg0YTVhNWE3NTpzdHJpbmc6R292VGVjaCIsCiAgICAgICAgImRvY3VtZW50U3RvcmUiOiAiNzQxYzQ2ZWUtYmFiMi00MTg5LWE5NTktZWY5NTU5NDhjZGFjOnN0cmluZzoweDhGYzU3MjA0YzM1ZmI5MzE3RDkxMjg1ZUY1MkQ2Yjg5MkVDMDhjRDMiLAogICAgICAgICJpZGVudGl0eVByb29mIjogewogICAgICAgICAgInR5cGUiOiAiZjA5YmUyMjctN2Q3My00NDMzLWJjY2QtMDEzOGYzODk5MjM2OnN0cmluZzpETlMtVFhUIiwKICAgICAgICAgICJsb2NhdGlvbiI6ICJhYjFiYTgxZC1mYjQzLTRlODAtYjllMC1hNjRmMTUzMmM5Y2U6c3RyaW5nOmV4YW1wbGUub3BlbmF0dGVzdGF0aW9uLmNvbSIKICAgICAgICB9CiAgICAgIH0KICAgIF0sCiAgICAiJHRlbXBsYXRlIjogewogICAgICAibmFtZSI6ICIzOGYyOWQ1Yi1jYWZmLTRmMjAtYWU4Ny0xNjI4OGRmOTcwMjU6c3RyaW5nOkhFQUxUSENFUlQiLAogICAgICAidHlwZSI6ICIxZjVmMDZmMS1hNmJiLTQ5ZDEtOWU3My05ZTQzNDA4ZjEyMjU6c3RyaW5nOkVNQkVEREVEX1JFTkRFUkVSIiwKICAgICAgInVybCI6ICI2ZWRmMzZjNy0zYzYyLTRmNmUtYmUwYS03MmJmNzc0NTAyNDY6c3RyaW5nOmh0dHBzOi8vZ292dGVjaC1yZW5kZXJlci5vcGVuYXR0ZXN0YXRpb24uY29tLyIKICAgIH0sCiAgICAicmVjaXBpZW50IjogewogICAgICAibmFtZSI6ICIwNmM1YmQ0OS00MzM2LTQ3MDktODFlMy1mOGJhMTQzZjQ5ZmE6c3RyaW5nOkpvaG4gRG9lIgogICAgfQogIH0sCiAgInNpZ25hdHVyZSI6IHsKICAgICJ0eXBlIjogIlNIQTNNZXJrbGVQcm9vZiIsCiAgICAidGFyZ2V0SGFzaCI6ICJiZmIyY2Q2MTU5NDQ3NmMzNTE1ZmIwNDcwYzgwZmU2Y2MyNGZlZTM5ZWNkZGQwYzlmNzc0OWEyNzg5Mzc5MTQ4IiwKICAgICJwcm9vZiI6IFtdLAogICAgIm1lcmtsZVJvb3QiOiAiYmZiMmNkNjE1OTQ0NzZjMzUxNWZiMDQ3MGM4MGZlNmNjMjRmZWUzOWVjZGRkMGM5Zjc3NDlhMjc4OTM3OTE0OCIKICB9Cn0=" - } - ] - }, - "signature": { - "type": "SHA3MerkleProof", - "targetHash": "21ac9da78d932b39923ba8a37946b0326f40d9a561808b4a0856382e52304d00", - "proof": [], - "merkleRoot": "21ac9da78d932b39923ba8a37946b0326f40d9a561808b4a0856382e52304d00" - } -} diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised.test.ts b/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised.test.ts deleted file mode 100644 index bc6902b..0000000 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import Ajv from "ajv"; -import schema from "./healthcert-notarised-schema.json"; -import sampleDocJson from "./healthcert-notarised-document.json"; -import axios from "axios"; - -function loadSchema(uri: string) { - return axios.get(uri).then(res => { - return res.data; - }); -} -const ajv = new Ajv({ allErrors: true, loadSchema: loadSchema }); -let validator: Ajv.ValidateFunction; - -// eslint-disable-next-line jest/no-disabled-tests -describe("schema", () => { - beforeAll(async () => { - validator = await ajv.compileAsync(schema); - }); - it("should work with valid json", () => { - expect(validator(sampleDocJson)).toBe(true); - }); -}); diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-document.json b/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-document.json deleted file mode 100644 index 1e02fc1..0000000 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-document.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "id": "TEST001", - "name": "HealthCert", - "validFrom": "2020-11-20", - "fhirVersion": "4.0.1", - "fhirBundle": { - "resourceType": "Bundle", - "type": "collection", - "entry": [ - { - "resourceType": "Patient", - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { - "text": "SG" - } - } - ], - "identifier": [ - { - "type": "PPN", - "value": "E7831177G" - }, - { - "type": { - "text": "NRIC" - }, - "value": "S9098989Z" - } - ], - "name": [ - { - "text": "Tan Chen Chen" - } - ], - "gender": "female", - "birthDate": "1990-01-15" - }, - { - "resourceType": "Specimen", - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "258500001", - "display": "Nasopharyngeal swab" - } - ] - }, - "collection": { - "collectedDateTime": "2020-09-27T06:15:00Z" - } - }, - { - "resourceType": "Observation", - "identifier": [ - { - "value": "123456789", - "type": "ACSN" - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "code": "94531-1", - "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "260385009", - "display": "Negative" - } - ] - }, - "effectiveDateTime": "2020-09-28T06:15:00Z", - "status": "final", - "performer": { - "name": [ - { - "text": "Dr Michael Lim" - } - ] - }, - "qualification": [ - { - "identifier": "MCR 123214", - "issuer": "MOH" - } - ] - }, - { - "resourceType": "Organization", - "name": "MacRitchie Medical Clinic", - "type": "Licensed Healthcare Provider", - "endpoint": { - "address": "https://www.macritchieclinic.com.sg" - }, - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6563113111" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "Organization", - "name": "MacRitchie Laboratory", - "type": "Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "phone", - "value": "+6562711188" - } - ], - "address": { - "type": "physical", - "use": "work", - "text": "2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "name": "GovTech", - "documentStore": "0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", - "identityProof": { - "type": "DNS-TXT", - "location": "example.openattestation.com" - } - } - ], - "$template": { - "name": "HEALTHCERT", - "type": "EMBEDDED_RENDERER", - "url": "https://govtech-renderer.openattestation.com/" - } -} diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-wrapped.json b/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-wrapped.json deleted file mode 100644 index 2537f00..0000000 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-wrapped.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "version": "https://schema.openattestation.com/2.0/schema.json", - "data": { - "id": "8fe73bcc-cd40-4c89-99fd-53b5b2a3cbd9:string:TEST001", - "name": "58ddbb62-fce9-4e07-8a93-525a02b739fb:string:HealthCert", - "validFrom": "abf14b32-271e-446c-82ea-1a18900e14cd:string:2020-11-20", - "fhirVersion": "d33403bb-dc6e-4d24-9e4c-0110d36e4895:string:4.0.1", - "fhirBundle": { - "resourceType": "5ec37986-d37b-4c65-a88f-0812ce3d0f68:string:Bundle", - "type": "9fa19016-c551-4410-9ac4-56ac76b1796e:string:collection", - "entry": [ - { - "resourceType": "e689ab35-bf48-4141-a7c0-820bd92a0b14:string:Patient", - "extension": [ - { - "url": "84df1aeb-0545-4bcb-a986-8a7301d8ee44:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", - "code": { "text": "4d3565cc-148f-4f1e-ada4-c612bcb3ca2a:string:SG" } - } - ], - "identifier": [ - { - "type": "98831e6d-e946-4150-b574-4de79c98b5b0:string:PPN", - "value": "ff127a46-b37d-4675-85ee-838c149ed891:string:E7831177G" - }, - { - "type": { "text": "4da4910a-51e1-4fd6-9b3f-73dc4e03a953:string:NRIC" }, - "value": "011bc801-b9ce-4d8e-a460-0c64366c5aff:string:S9098989Z" - } - ], - "name": [{ "text": "5890354f-116c-48f8-9ef4-3db1f1cde579:string:Tan Chen Chen" }], - "gender": "e6744950-b367-49fa-9aa0-9b61ed7205dd:string:female", - "birthDate": "acfddba3-a7b6-430b-90b4-db238207b645:string:1990-01-15" - }, - { - "resourceType": "f3ef0926-a53e-4916-951e-3ffb3a68694d:string:Specimen", - "type": { - "coding": [ - { - "system": "17c9624a-7c1d-4a78-90cc-353635ff5f32:string:http://snomed.info/sct", - "code": "b7b15d03-d548-498b-b564-8272912ddc24:string:258500001", - "display": "f8f0bd56-58b1-4d4a-b18b-77e7af9ebe79:string:Nasopharyngeal swab" - } - ] - }, - "collection": { "collectedDateTime": "fed1f0c2-d842-4325-aacf-f481d4c63c71:string:2020-09-27T06:15:00Z" } - }, - { - "resourceType": "e3bf3abd-fc22-4e92-93ed-f67108ce92ed:string:Observation", - "identifier": [ - { - "value": "8c80d98b-91ae-49ad-9a11-f9d32724db3d:string:123456789", - "type": "290cf05b-9969-4f5f-9d9d-258ac4ae39a5:string:ACSN" - } - ], - "code": { - "coding": [ - { - "system": "2505748e-7231-4339-9107-fae3cdca1cb7:string:http://loinc.org", - "code": "e6aed6d5-cc01-4ab0-91b8-4cd1e304fb83:string:94531-1", - "display": "dd1a51c2-31e2-4061-9e4a-f1c6799df43f:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" - } - ] - }, - "valueCodeableConcept": { - "coding": [ - { - "system": "91cd3725-891f-4031-8efc-df185a0b6ad3:string:http://snomed.info/sct", - "code": "6db8e134-5a0d-40dc-bc65-275cd793421c:string:260385009", - "display": "a0cfd138-2522-4657-b84a-bcacf6ad2d46:string:Negative" - } - ] - }, - "effectiveDateTime": "64e824fa-29ef-4580-b7a2-b5561972082e:string:2020-09-28T06:15:00Z", - "status": "0281fe06-ef43-45c7-8b06-37ba6f84c893:string:final", - "performer": { "name": [{ "text": "11cfe5d8-da18-40d5-bcd4-d02cc74dc0a8:string:Dr Michael Lim" }] }, - "qualification": [ - { - "identifier": "c4f2caeb-f478-431c-b0fb-f2cdc3c72b26:string:MCR 123214", - "issuer": "eeaecc3c-894c-4261-8a3d-160188b19a50:string:MOH" - } - ] - }, - { - "resourceType": "df8e8273-36d4-4dcc-85c2-581095d44424:string:Organization", - "name": "6b842523-73fb-45fd-9cee-8108a4d5e836:string:MacRitchie Medical Clinic", - "type": "8013dbdc-170a-4bff-8be9-949b72f2205c:string:Licensed Healthcare Provider", - "endpoint": { "address": "784d35b7-8bba-4a97-a6b7-1819f556455d:string:https://www.macritchieclinic.com.sg" }, - "contact": { - "telecom": [ - { - "system": "9557bde5-7b00-4f16-8cf4-3d44bfdce0d0:string:phone", - "value": "7eff670e-c49b-424e-a99f-1f2813f260be:string:+6563113111" - } - ], - "address": { - "type": "1f33d243-ffb9-4c06-913e-01c5529fdbe0:string:physical", - "use": "2aa09467-d1c5-46fe-8c06-42c262ce5c5d:string:work", - "text": "f5afc0fe-04a5-44c8-9f2a-8e9ff357727f:string:MacRitchie Hospital Thomson Road Singapore 123000" - } - } - }, - { - "resourceType": "76e0f03a-c2b2-4d0a-9f1a-6d207cc8ce1d:string:Organization", - "name": "8cdd94a3-8557-4f58-a140-0e489a67091f:string:MacRitchie Laboratory", - "type": "b095e28c-4d7b-4c90-a5cd-02caa41831ee:string:Accredited Laboratory", - "contact": { - "telecom": [ - { - "system": "25c8b7dd-1e12-46ad-8c88-c7aab013dcbc:string:phone", - "value": "beeec470-880b-4b41-b346-9035a966afa1:string:+6562711188" - } - ], - "address": { - "type": "a614f222-1131-4f2d-8b4d-345028e1ce6b:string:physical", - "use": "aaedf624-c47c-4649-b4b0-7985b81ef057:string:work", - "text": "7f937c56-508b-4df4-acd5-2e47edf5f98a:string:2 Thomson Avenue 4 Singapore 098888" - } - } - } - ] - }, - "issuers": [ - { - "name": "dc30ac11-3668-46f0-9160-5eb71c82df45:string:GovTech", - "documentStore": "edb7fd27-6fd5-47c1-bda0-6a8d408494b4:string:0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", - "identityProof": { - "type": "195d5364-2beb-4228-9f43-39ed6d0a4a04:string:DNS-TXT", - "location": "660f72c6-84d5-4a42-86da-806a842bc875:string:example.openattestation.com" - } - } - ], - "$template": { - "name": "80103ca7-ca8e-432a-98fd-9a41650e0bba:string:HEALTHCERT", - "type": "f15815b4-4a59-4027-a0b3-1e7b51aadd6b:string:EMBEDDED_RENDERER", - "url": "4451b0ad-5c25-4d68-a631-99ca9577673e:string:https://govtech-renderer.openattestation.com/" - } - }, - "signature": { - "type": "SHA3MerkleProof", - "targetHash": "fb87b406b63b399d8518f50a2ec8f891e2718d14e3193b677618a5acba0a95f2", - "proof": [], - "merkleRoot": "fb87b406b63b399d8518f50a2ec8f891e2718d14e3193b677618a5acba0a95f2" - } -} diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-document.json b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-document.json similarity index 61% rename from src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-document.json rename to src/sg/gov/moh/healthcert/1.0/healthcert-notarised-document.json index 72c479e..21a2273 100644 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-document.json +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-document.json @@ -146,15 +146,16 @@ } ], "$template": { - "name": "HEALTHCERT", + "name": "HEALTH_CERT", "type": "EMBEDDED_RENDERER", - "url": "https://govtech-renderer.openattestation.com/" + "url": "https://healthcert.renderer.moh.gov.sg/" }, "notarisationMetadata": { "reference": "JESAPPELLEGROOT", "notarisedOn": "2020-09-27T06:15:00Z", "passportNumber": "13TR0987XV" }, + "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAA9CAMAAABGHucuAAABaFBMVEX///9YWVsAgGbR09RssaT9/f1aW127vcCKjI/x8vJaqpoAgmn5+fmAgYT19fViY2VdXmAAhWz8/f1sbnBkZWjf4OGUlpmRk5YAh29naGqnqayHiYyEhoh8foEAkXxfYGOanJ95e32dn6J2eHv1+vmXmZwvnYkAjHXx9/bj5OXJy82xs7aho6bd3t+3ubxpa22WxryusLKqra90dXjNztCOkJPAwcTo8vBvcXOeysCkpqn5/Pvq6+zc7OfQ0dPFxsh8uawAlH/39/fCxMa0trgCloLa3N201c7GyMpTqJcAinLr7Ozl5ufW19mq0Mhxc3XP5N9hrZ8Ajnjt7e7U5+KQw7iGvrJxtKaBvK9MpZQQmIXY2dvU1delzsVosKLj7+zn6OnH4NrV19g4n43L4tzA3Na82tKKwLUamobs9fPu7/C42NE+oY/7+/vX6eSw08uwsrRHpJIlm4h2tqm6vL5DopHU1tfR5uBe1I8GAAAWUklEQVR42uzY61PTQBQF8HOvTQUiYqtgFYnVVqkvKIoPUBAFxaLTAZFSqqjIQxgqjI/Rf9+hu+3ukhbTJjoZp7+P3WnyIWfOvQn+nczqQmnOZuZEaXkCmvja2FSka2H582wabW1NsVbXbVbsiAUhs/Qtpn7eHoujrc0rKzvIh0RwYCeSYNPrWbT9V6YiRyqOzcfRojWHXewJANkEu02h7T+yx38UK+cttOC7zXUsIf2V6yqizZOToyNXLnSnUt0dyaHnFsKpwF44W2hWpixj+bWYLZS5pvDhiewup5zLlbTw2Rvwo7ND9wqGd/rZZfgx3Sd9QcVkjzSJwJzvEM7DZXFmIEqac8lehNFV9qbQbK6ecUX5Pg5sDrK0+1rsVEsZHJjY5pp1+DFJurcwXCBNH/zoJ+EBhNskdSIwwyTcxCHX+k6Ry9lFhM9+IbJSYt3V/Nbm7v5+PtuVMEdYM9LymisWhL05rsiJvasrDSntqMrKwIfbpDsGXS/pZuDHuerjdAUtMI9ImoahMxmles69Qzh9Zs2+ap0cK/Y8miD/OZhG1WasktpvIm96tLlmFz50HBGsK642a9lHkm4cCtpdBOYFSeZAHx2mBk6NIpTmWTFqo8xKuYWkZvUAJThRXOYDcxko1hxXjcGH4cbB6rxoPIUT8GGapJ+uoAVmnIQz0Fjj1FhPOBetNVaeQPNB363vw6u9mCysODTpifgsVxQbrHl5tO4lGa5DM0K6S/DjJgnRp6h4rIIWELUR9kN52k9HuRTKL8xZVt5Dt87cQp+U1LUMO3KFNyO6wlXzaN11MryAEj9NuiT86CYh5Q5aUKweEs5rueom3cUHqdNR0v1ACC2wsgpdkZUIPMqztAFTl16K7mDZ6QDGR9QdrGkyHIcPVnWqXoHQ3yMMIDDX3LV74gIpA0PXAODLp8vaiL+DEHrGyg50s6zk4E3cYWEQpq36Reaw5AQxPu6436cG5IHUCx96SRrCX3OPpEVU9VFN6pg2/7Uee47Qice4xmm8fa3Am1WWFmB46NSdqQ9tdYPWWWdIOOuqpbeiyeQBXbTgw3GSbuGvSZJwGlUzVDNuQXNCJWsEoaPS4wrDG+PIm+0GXw+mWPoF3QZXFYMYH79pt/a3JIIoOgPuCsYbVB4SEpJI+UoySxA1tTTN0nx8Si/N8lHmq69/v2R35s69u+OH31fnJxGEHebsufecO545iGUxyickLcgcCFXXQ7fc9Nx/bJazNMAYlKmoWWcYyyaHXK1VxJYbU2XvYIj9Z2ygFkvLuelbZhdJLA0fhS5GDY1zOPkX5aNBiVU1rfwh7JpmB8q9+VzT2gfT7iI0mO4ZNrm52tVMIfOizxGl0WthhZrUq+5CgvNIauzxXJU5Ub0qZodNznOpYHEcZ/Y/IkSDjLzkVVkf3/UwG3teC0030bheXoEBjKnegiBjvKtC5LvhtdDJAANeGyK8sR8248BAvVhIhROFYtnQpZlg2HCPddt939L0ZB0QaCC8/Se9+z0RQvtFuo67+oJsjuoMcPwwwRUEF5xZZZ5L+Pyw6WLeWHDVwakersJH2jqjjj2e6VM/eIFmcUNc4Iw5MMfJFYRMsKkredtoCMyOkpB1rOKa2dy7YYZ1BWFI4CzFBSacpJ9BLZZuRp2cZC3hrns88UVnAuaBcASl2rua5kOP3p0euZaPjJ/ElbMWda6uuI1PsL+jYY5hPiIxOyZIIbQrfhy339100cGBHk5gjiINzHMHugKMER6ZIZspCSRKBGX6pBfykDOTGI26S3afpm9GvQ8dLRTlHw6ucgFo/wB9SgrawTC+u7ZYsYORtsVf9/fPP2y80af4m+9UXEBJfdKEgZwD7eEO2naSFtW3agyjNn3RfCo6//an4F0sIlZLiWURKjHbJSQNWyoKxICpBB33Sn0YYE2suOxEe47fuH3jEe6CbocDHKND0MgycyLmtxEiaXCRPSSGMSAoob20Z2h5dLRARLpSpgt9xhAO9CFoCfxi9KNYyfv9qAfQP11C3f6+p0WUQMnoZ5c219Qh09ak+gHoNFey4xSXj4qfEGTMXvIYTbMHU9wF5q6Sf5mcIk+GLQ9gqoc3h8IcBF9JQJP7MXwII5CA+tQKHos85EwSMmYpXw93h9eR2ST0MywQ6XaTU1RwuUMtli4f/SbChDUPQf9XZuPJZb+nVUQdzkEw1xhZ8mBclOBi6enBb7gNOfbj23DK2taq6Dy4KHYLCU5Am6WyybXoAcdJduIhJyCFpEHfldJGXukQsSXmK9YKxJgBCJ4lyQRFQZawBCxPO8PaE49dhHfVQMm3tsWqgTSd21oiX5xcklt8x2bW06indazRnr5fuEcomo6TWkaH/drzfUG+A1T348zAxMrYu9ogN1V1mAPQV7Qn/B4Seo3oT1AdnOMUOJ+YneASqfiwC1e9pIAFb5cnrEseYsoajzlZMaBCM5u0ZoYFIq1BBXXbuhbrCJ65P4mO73kW3zDWtyGo1V8CB9kqdqhz+GUXZsGYmemRbfnkBnKcmwZjsadWD9ZnlQ/QBfTVDAiynOHjeEZWfsX3VgIsVM7SUWJgVSmAxUfpjOky4/bTnVgxgShDU432DOc4UU1LE9V+fM2zcgF0BfdIkR+YKLzS6syUYhwP4sP3vCEW6EznHGr6HJann2F1c4CZ7U335jVz2JKuxfqyBoSbFL082udFVI9O2v5iTWmN2gAfoIIdWr8Zobn7pnW4xn4cfd9c1S+hjyVlJnTJmjhNSuELmdB7o8LSaxEDOo8Jct5hdYAxfEOv0pKWXbCa2CwH2FWpAjtB2BhvUAUrI4eXDQkLYSLFgivNkqwhYbBWkMZpQqbbF1y+rvyS8Zl1IckpSTUDMhtYnmaGpUhuV9UabcCv8pqo6rXSJHfILU8+JVnmBe2P7rsch5hnKvqhldI4h8/AK6iuNaAdnJqoiQ5Q6BwUOi8mVign0tIJdHNWc2L/12X6Lr/mAEm0DfEK0LBhatjWCV/jVUY8FG9XaRKugpsnN3scP/a5VkJvO0Un1H6B+NCx1B15GUXgZ50LdOLMJn7DDMsPcvVcki8i2Y8mLYDk9NfTJ7U3L0Y6lAPDHaKjn+wnwvYN+iNCIDpq7vMILGkOr0Zj11lF1CNEycaa0v39tn9+wSycynHAmYx+gFjQD6QC7Bh75l7sAdHv+DIS/KDbRvhE7I13wh8WZawTTCIiVtARex2TXn0dJ2VGAv5eAZQfWr0SoCezTAB0r8dQqlwcQmNU9XwM0IutJavgCkvLI4mq9Ih+gBjpNf13mjYHsY6I+jmFaV9zZubwuioLGvVPwtEuGzXwqIcGsO7ELh8Q/eTgfjfiogGqIM+8HnFpCebUW/OT2O5EVZm15DixlsO4SXnkEugMoZ0vv7Tgh40jilDGUdIgB74DAmIBjuK8DLwylNfHXaOwblzmBuny8AyLrLHL9WASKlJ6HD7to6OfpcX3JZForaFOnNTVI/dx5KUmp99SHeI2cxBrRCFhR8y2oXfuGnbdh8WGYdl1adPTyDOPikdV5sKAAVVnRnG8b2OK/NPDKFaAsF/pUR7YqDInjL0Mdo1wpWEDV6IwU7DCKYbpFsdn6STVOShNYx2/guUBJU2ShmQERV+5HSYymcQTzw0YwSS4M3/5GU/5aGi+rUku3lIhA+cA9e3EpQ+7qxjWC7CUNfvimxyHQjeEiRWUcpJBnnlMPPIqKMoojDFDSFFKbA/uX0L2IBFHjJVbnFH179ZHe4NKlpYln9FDPEQQDwgpfCh1opUzCHeSikeYWEW0PELhcdISFtFqgN9KfQPMzP+FGkad44l0CZnGCxcCnmuSix1NBPtCmUAbMy6kTCr+YEep0NsxJgE7ugvEAmlfoV/HAL8JERECwn1KibVKT62G8MbsMQwqU3/au9aupIIoeg0vj+QlkKICiqKFCigpqCiEpeaT1MxMzceytPcql/X3i+By5uyZaa2yD7Vkf0Ov98LM9jz2OWfIRjKyPgox0gxwuQN8GCALFPK5VeNkPZoMMse8XkVF4STcalFJrChrRrAQxh/cak/oOno22KTrGcbaWBwKYzSGmUOZUby9AdEC7rHh7BO2QCT9+Br/wR2Nz3pMJk0v8VGchlU2jDc6sWuVR1xdpqHH6gwnFRQb16BpP45hG7l+hiJTnSCHTGNjPPal2sjrwd9iaaGknKJcU9B/CPRtmswheiBe81nWW20FSv4o2BZwBM+Q1YlNMkgAyibH+EMfmGhJomSrnY0QPSfmcymWwWtrL3G1duTjE6+mjy1nku6ghTmu0/PXIEaahaG2cTAQAC8EOzkwcPQQVcz4lrweDPRWQGUbVXr7YcUM3Arr5MP2rC+KRr6XUrhfxq52tEyf4Bly5nBIx5NoiVWAB18lVFJQ0CJWt6U10HL0BuhyHcYFvbVHPau6DhWQNI+zR/SRVQQLPVNgEUYhWPGpiGW6LIyQ9+Lv4ZgZOOjswNwyyL2e0LToRYPpUc5od8uzwHO3CK8ajS+Ej+ACxxYsb/X5XO6weqaJzp4LMbrakuWNS7JFQwrsET+JWbDhOSJWj+HuomKLRzRp2y0IdCqnkETBrtndkGvtc93aZmgwH2VPCk46vBGwCB4Ixn2ws4D74L36iJeEeUoAGGzcgXWyj4elBTDSSZyJw4btaSGwsRzaF92Yoblj2YzYWEIwT8/keva5ZnTwjXruIiZ6wrJ+whpbG7j7uEPE8tRp4N8WI49+dnpI1qGCl/JuGMWZhLpFP6/qRZikBICY2+cct7nEWL0bYqQsGGO1f82h94qrTG0SxXvMIB8yrxdXmaJV7mrtJit821FZZSOFF6oiT1gI30/Kllua1jSrxzSzp2XqaWBoFWxeO5BZiVrdG97dKEk/ArEGaC155JFTZNX6bIng8kOmHeWp0JRy0VXJqy/txj2fgBhpgkwSuSuEqwu8l5uagwQcqHPcD9Zf93rJ64GQEAcL6FBZRKrwO5QjhbsgHuEpM2NtFgNrksFL6tmTYvcwd6Bt5LwYLkivmINHarDE04Zp0RB7hP31HFBaR5FHkiWF+gZ6JbGysHwB0O99Cimz2F/HtlA2DJEfGaHwmcdILspLtCP8prMFvNc68BJcXh+YO+YJTxWN9UmUyfogWgNd3wVDfSBdsvQrJsVJCwng5BbG7pj8PdFNeIUplHsFb0SHj2WRWJui+xgVqr5xp2BM+liEnKVqswYdqtrGdi+UbBeBfn5Qn0XOB03D2FfQ1QPZ+yC9xn5Uj4m86pOaCh4BL8FiRYAOrJiUVpxOMIgLEWdMRoPViTU8DH8KK3LHwyc6RRRb5d9j7I7J3zQ4TXlSjEgJI2gyEstwBA7N3wjE6rIL0UOULWxWIVKZVhHvlIjIQxUz0gITr2kgWi9L6rkV6BY8duiDrGtPolKmaK8ahZyuQ26D6gRegn8NBVQRlhNeF2leyA4/c/tZgoIdkYvKtuQtplti6BW4iyngISv/QYz+GkIpcJpoGYdogpFYqcUlIxam2ANiBS3ABvVmeElsVFM1o1f+t8I+YG41CN1MGUkHcg+IxcO4ZDfMKLgftx0VC3evQB/RTKQGFMdRVICndFe0lbRq/qRUka5jlQ5TcdFQOYbp2xWVrn+lLt+8Ees6JzygPyRlFS1MDBVTlEFjmlHDS9ZvuIBjOS8ShvGstTVPf2dhE/w+ECvLl2OYewZ/Sgp1Ml5erHfWSTM/KFuO+6gUNG5Sp+OHSSZC+XFPTLqpDSzYuvLMuPuPLXe431kjC7eZXgyTMAPoSlqPztqx+dXZeMp8/RnEqwq6WqL+YuMquzA9WQhr7MRLPLNhF/I9sjCUASZ01ODWjhATqbmlC7KWVqrhfFgoHCXCdCWk2EQsMjhpnjN7qS3N8dOipUiKL+FZW9Fhl+FOjgfl4osXRwr7iQBVngQmoo2bmKJc3uWt2xxPC1qER3IIk2QMynRm0yMzTpJ4mXMuQqAvW9tQuvpwb44WKRpAYrXES0lX8qFTMZvW0ULoGX4bmJ0QCD4Dvki5m3NtcDT7MtDIFNLJo6MziN2XNS0MO5ru0TMufIRfCcbz9o/XSz/vcS6ZwLsBOcUWtquDL0dQPlQyFOlwTsmVYCZk+tXFl69ERktNIIQGKr30Yo3XYTzrpnmc6xGlUoiR4pCi6mDnzjlLRXHtEaz24EDGLjB1lUQ2PR6R6dMi7haC5zAQi7AHIulLrkoUlsXft9Uasnb5NUhf1N0TMSIWnldptRd+rH6FRfljzUDevYciySGk2ECsFF8OJ4bUiE6TMnEtQpgLzVruJaPZfVvt134khNz0UgEpCTqiEVPj3GY6YdQV5wVl+FLKYw/xba6Tq9UhIxSR3q2wXtFn93AiniYZRNu2N720U8ZqIfUVSz0z78JKwuVfgL6/zI+Wv7q9+XmrSrLWgpUqLOR5ltkKKTYQywM+axzjFplX1CKOCHVCiDopSTojal4NUwwG8HdxS+lSNlPd8bWoEV3N8cJdhnjJkbJr/knWmVkD2EfBMxdpbpcA0du9p4fSzHL70AM6YegLP+Q9T6xRIPbk6cmucEV4qdHv8OlKvHDhvP6E/DPG6t03dJAkUPZEyFPDz/M/rtttI16xFBv2rwT6YBHOxwN0m8JO+HELUj3WZThSCEkeIFSklnlAcD/O5YIJ9dlw68QsOO7BwSrOq+pKlJ7zFfacHqR97pHFIzBqmUUk6v1jUAAQG9CCR6HMJez3gqgm3ZNvtzVHSYCIIZ7XkfMzjG8rck/DTgDnWrfaaHaIpdhIrKAJNt7LNCDAFC8dl+x84daMLhwplEXUbTkGiRwT7yaBGC4jaLFvkcVIeDbcnQHF2e4PaVgENa9F5Sn4CHsfD8Vmg/wjpxrB6SC4WifebpDuhIPycmNfjLcoF4bE654XjraoMUrF0/YAdZSCVg4/J284V2crDQ0loPgjzw65MMXuEXJ8nLQgDE9x4/EIZXibsMz+mXljDSa9JlTVEy8Q9v5DogjQOXogBsP9bOM8BsCN5+KEul1Elx5S6akojihWgFaTKQMwGxEeMPKB3p4DJtOyhtltp2s9p6JmqcSOJmNcyRtGYbPx6rK6qfkhwVcd3kY8qN2kFfGu9nPp+p9xfeB8RXCbYwmmWLSHyV4+P2rspa2Ot3AUms1rKS3113whAyWntVmVwQnTkOAdGajtQLx7VThu7MDaBesx89y49DcYG+womshWp7/2q77aXqSsm9QnP+nYM8S8o6e3YawmH9YfumarIqk8BA4ReDwZasTsEToNTsT+qCfj6w3GB0tu8Rg2F7jaYvVhg8Ha6oymjN8BtNVdJKrReevC3diX1iXTispvX7xY3jCNv4nCxmZ5pX2lvLfDB1uv7j5PmJ9uXyxcvN+cnjP+Csy14uPHE784MdG7+GOT3cZvYvu05HCUDrbV25tcty26jD9BIDnhSDtKxdU//8DHxepbs6392Z4NQ5rkSt6ZNa/7xWDlOaOJG44Z0uGvhUKMxUy7R0YTNxoR0uGvh7N27Nds4iYjRDr8NfE63Pxy3SYsJEmHvzaO9prEaqKOHOjw18PT3VibpSqNGU3cYPSDDn9tJM42pqc3XuWNJm40oo36UxNN/A3A7IjDaKKJvwY6Pevf/DLXJv5XpKFCrsZ3fTXH9LHs2cUAAAAASUVORK5CYII=", "attachments": [ { "filename": "Original Healthcerts", diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-schema.json b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-schema.json similarity index 78% rename from src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-schema.json rename to src/sg/gov/moh/healthcert/1.0/healthcert-notarised-schema.json index 75e5364..b93c657 100644 --- a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-notarised-schema.json +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-schema.json @@ -4,7 +4,7 @@ "type": "object", "allOf": [ { - "$ref": "https://schema.openattestation.com/2.0/schema.json" + "$ref": "https://schemata.openattestation.com/sg/gov/moh/healthcert/1.0/schema.json" }, { "$ref": "https://schemata.openattestation.com/sg/gov/tech/notarise/1.0/notarise-open-attestation-schema.json" diff --git a/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-wrapped.json b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-wrapped.json new file mode 100644 index 0000000..2893f99 --- /dev/null +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised-wrapped.json @@ -0,0 +1,157 @@ +{ + "version": "https://schema.openattestation.com/2.0/schema.json", + "data": { + "id": "a7fa9ef8-807a-4ca0-9541-661e70d95ed8:string:TEST001", + "name": "376ccc44-40bf-47d4-b56a-6110f315a645:string:HealthCert", + "validFrom": "06367225-1d36-4de1-887a-8247d6535664:string:2020-11-20", + "fhirVersion": "8552e510-d459-418e-808c-c43ecb24af88:string:4.0.1", + "fhirBundle": { + "resourceType": "ff3ce1ea-d5e6-4856-8a33-cae51be426f2:string:Bundle", + "type": "357c1b15-09b2-4185-b24d-7c7ea66e5638:string:collection", + "entry": [ + { + "resourceType": "356fdfb7-3962-48ac-9b06-ef5f8d802253:string:Patient", + "extension": [ + { + "url": "8be3a3a1-4227-4ded-8758-b7f781d823df:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", + "code": { "text": "c383144f-8dfd-4089-8af5-96396db657c6:string:SG" } + } + ], + "identifier": [ + { + "type": "bf54d179-814a-42d2-9525-4eaa13d1ed07:string:PPN", + "value": "0b4aa860-ea5b-4109-860f-70e2cebdbb1b:string:E7831177G" + }, + { + "type": { "text": "c0bb401c-3eb1-4bef-ad8b-fefdee0ae717:string:NRIC" }, + "value": "0c898cd0-e43e-4009-bbf0-240f39135ed3:string:S9098989Z" + } + ], + "name": [{ "text": "8298f08a-37a5-4c3f-8c21-bb120b7ea715:string:Tan Chen Chen" }], + "gender": "c893c03d-fc5c-4805-bb8d-9cb6970a400d:string:female", + "birthDate": "e652d7e7-5057-4512-b988-3ae04b93028f:string:1990-01-15" + }, + { + "resourceType": "2ab8557d-f40e-49d8-9e99-93de61983423:string:Specimen", + "type": { + "coding": [ + { + "system": "fe8e1965-65d5-45b5-8acb-c0506013db8d:string:http://snomed.info/sct", + "code": "76487aad-a238-4bd6-a943-4d741ff2f72d:string:258500001", + "display": "d53f1d4f-8149-41f6-8f73-15c8a68d24e3:string:Nasopharyngeal swab" + } + ] + }, + "collection": { "collectedDateTime": "2189e066-d212-450f-a8b7-61ffcb0a8446:string:2020-09-27T06:15:00Z" } + }, + { + "resourceType": "0890f895-cd51-418b-a144-a6a115adf441:string:Observation", + "identifier": [ + { + "value": "88467571-14ad-45f3-9d16-ca3254fe4127:string:123456789", + "type": "7b5ea0b5-5102-47fe-aa50-cd04c1990465:string:ACSN" + } + ], + "code": { + "coding": [ + { + "system": "bbdbae1d-e2a3-4397-bc08-0faffdeab8e9:string:http://loinc.org", + "code": "ba4e4909-195d-43ec-b8ed-b8b1e2c790f1:string:94531-1", + "display": "361844eb-4c8e-400f-a363-e3b7392d493a:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "4b7f7261-c584-4cd3-a45c-edb250398c62:string:http://snomed.info/sct", + "code": "a23f7379-f9cc-4562-bfee-02c0b8c0daa7:string:260385009", + "display": "f8a8ef2d-3ca7-429a-8c6c-42580c1ed88c:string:Negative" + } + ] + }, + "effectiveDateTime": "bee51310-6bee-428c-b42a-d2be476d3616:string:2020-09-28T06:15:00Z", + "status": "0b809115-fa54-4fcf-b0e7-87df3b9e85da:string:final", + "performer": { "name": [{ "text": "1c4e6212-60eb-4c3a-9468-1efe6d71907f:string:Dr Michael Lim" }] }, + "qualification": [ + { + "identifier": "741e4c1c-7fa0-4260-aa11-075310ee00f7:string:MCR 123214", + "issuer": "07969be5-265a-4457-81c2-6fde9b5e3169:string:MOH" + } + ] + }, + { + "resourceType": "b6036bee-e16e-4ea3-aa25-133cee339755:string:Organization", + "name": "be2d5d59-4aad-41ee-b1a7-61af587a11e3:string:MacRitchie Medical Clinic", + "type": "91da263a-fa19-42ad-a119-09817f3e825d:string:Licensed Healthcare Provider", + "endpoint": { "address": "2b4d2639-9613-4a8a-a187-3db14521af07:string:https://www.macritchieclinic.com.sg" }, + "contact": { + "telecom": [ + { + "system": "4f2b5630-4276-4781-9119-3099d76ecc6c:string:phone", + "value": "7c7845a7-32df-4696-aefc-2b786e4ebdd0:string:+6563113111" + } + ], + "address": { + "type": "f870a8bf-c107-4bf5-bb4e-1f9cd2a4ee09:string:physical", + "use": "bfba8617-706d-444c-9c2b-3956de84b54f:string:work", + "text": "87af8471-0426-44cf-8732-b97adb4fde62:string:MacRitchie Hospital Thomson Road Singapore 123000" + } + } + }, + { + "resourceType": "346fdcaa-1816-4d01-9727-0111bc33e72b:string:Organization", + "name": "05fffcc3-9069-4db6-8948-8923f1858134:string:MacRitchie Laboratory", + "type": "f8a03ff8-d358-4848-835e-efdd04c6062c:string:Accredited Laboratory", + "contact": { + "telecom": [ + { + "system": "14377f76-fe50-4cc6-b555-0f6730004272:string:phone", + "value": "c8abd7a1-562b-4ace-a8dd-7b81c8d8dbf1:string:+6562711188" + } + ], + "address": { + "type": "b02fc7b4-4644-4d95-bce4-452ad8f1aad0:string:physical", + "use": "6c54eff6-eb63-427b-b144-135d89bfa4a1:string:work", + "text": "da0305a2-a0a0-4399-a207-3f13a85df3c0:string:2 Thomson Avenue 4 Singapore 098888" + } + } + } + ] + }, + "issuers": [ + { + "name": "e4eece74-1221-48bb-81e9-1a820532dd94:string:GovTech", + "documentStore": "d53caa04-8cb0-4586-a6b1-b3043a1d3640:string:0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", + "identityProof": { + "type": "44a52896-e4f1-48f9-904e-d69fa9bbb73a:string:DNS-TXT", + "location": "211bd34a-6289-4bbb-8291-6fd2cf356abb:string:example.openattestation.com" + } + } + ], + "$template": { + "name": "51273429-4231-4d2f-9439-c7e04ee1bfb9:string:HEALTH_CERT", + "type": "6f574150-2402-4662-94f1-bdcb6f95c7b6:string:EMBEDDED_RENDERER", + "url": "f1c5a7d6-6a5e-4dfb-8043-715a4c30e6c9:string:https://healthcert.renderer.moh.gov.sg/" + }, + "notarisationMetadata": { + "reference": "65acfbe4-8225-4d0e-8ec0-6e524f6f56b8:string:JESAPPELLEGROOT", + "notarisedOn": "945e1446-8e4a-4ead-b9d0-40f52105d6a4:string:2020-09-27T06:15:00Z", + "passportNumber": "72029340-5534-46a7-a74c-6edb50479776:string:13TR0987XV" + }, + "logo": "5d315d0c-da7b-42ef-968f-7a2b666677a6:string:data:image/png;base64,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", + "attachments": [ + { + "filename": "aa15e486-d4d3-44c2-ad2e-f785e644a358:string:Original Healthcerts", + "type": "0d6b2ded-2699-43e7-9612-a012d849e073:string:text/open-attestation", + "data": "6a12e829-1e89-4e05-ba7e-a055fa7608b7:string:ewogICJ2ZXJzaW9uIjogImh0dHBzOi8vc2NoZW1hLm9wZW5hdHRlc3RhdGlvbi5jb20vMi4wL3NjaGVtYS5qc29uIiwKICAiZGF0YSI6IHsKICAgICJpZCI6ICIzZDQ0MjRkMS0yODQ4LTQ3NTktODQ1MC1lN2EwMDc0Y2ZhYmE6c3RyaW5nOlRFU1QwMDEiLAogICAgIm5hbWUiOiAiOTQ2MTNmOGMtMjU4NS00OTBiLWE5MzItZTE5ODA5NzViNjI1OnN0cmluZzpIZWFsdGhDZXJ0IiwKICAgICJ2YWxpZEZyb20iOiAiNzExMmQzNTYtODZmZC00YjkzLTk3NDgtODEzNWI5ZTgzZWRmOnN0cmluZzoyMDIwLTExLTIwIiwKICAgICJmaGlyVmVyc2lvbiI6ICI3NDg0ZWQ4OS05ZGIwLTRmZWMtOGNlOS1iZjc2NmE2NTYxZjg6c3RyaW5nOjQuMC4xIiwKICAgICJmaGlyQnVuZGxlIjogewogICAgICAicmVzb3VyY2VUeXBlIjogIjdlNGJjZTYwLWQ4MDctNDVlOC1hZDVmLWY2NTdkOGFlNzI5MDpzdHJpbmc6QnVuZGxlIiwKICAgICAgInR5cGUiOiAiZGEyMDJlZjYtZWM0Yy00Yzk1LWJhYzktYmU0MjQzMGMxYzFiOnN0cmluZzpjb2xsZWN0aW9uIiwKICAgICAgImVudHJ5IjogWwogICAgICAgIHsKICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiNTk2ZmJhYjUtYjA4Ny00NGY4LWJkNzItNWQ2ODQ2Nzg4NmRlOnN0cmluZzpQYXRpZW50IiwKICAgICAgICAgICJleHRlbnNpb24iOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidXJsIjogImY0N2JmYzljLTE2MjUtNDAzNC1hMTZlLWQxZDgwYzMyNTkxMTpzdHJpbmc6aHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL3BhdGllbnQtbmF0aW9uYWxpdHkiLAogICAgICAgICAgICAgICJjb2RlIjogewogICAgICAgICAgICAgICAgInRleHQiOiAiYTk1ZDhiMDEtZWU1Yy00ZTg1LTgzY2ItYWM4OTFlMDgzNzEyOnN0cmluZzpTRyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiaWRlbnRpZmllciI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJ0eXBlIjogImU4ODIwOTY2LWIzNGQtNDVlNy1iNmZhLTVhM2RkYmMyZTI3NjpzdHJpbmc6UFBOIiwKICAgICAgICAgICAgICAidmFsdWUiOiAiYjdhMmE1MjAtNWI3ZS00NzhiLWEwNWEtMmI0YTJjNWRjYzdiOnN0cmluZzpFNzgzMTE3N0ciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICJ0ZXh0IjogIjE2MjkzODM2LTBhNTgtNDk2ZC1hZTM3LTAyYzJhMTNjZjI0ODpzdHJpbmc6TlJJQyIKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJ2YWx1ZSI6ICJmMTNlM2M4Yi1jZWIyLTRmNzItYmIzMi00NjM4MzRhZTkwOWM6c3RyaW5nOlM5MDk4OTg5WiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJuYW1lIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInRleHQiOiAiNDE3OGFiYWItNThmZC00YjQzLTlhMGMtMWMxNGUzNzAyZjE5OnN0cmluZzpUYW4gQ2hlbiBDaGVuIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgImdlbmRlciI6ICI5OWRkMGVlNy0xNTU3LTQ4MDYtYTRiZS0xMTM0NDM2Y2M2MmM6c3RyaW5nOmZlbWFsZSIsCiAgICAgICAgICAiYmlydGhEYXRlIjogIjE0NGVkY2RkLTU1MmMtNGIzYy05ODE3LTUzNWNjYWJlNWUxZjpzdHJpbmc6MTk5MC0wMS0xNSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJyZXNvdXJjZVR5cGUiOiAiZGRiMzBmMTEtMmU1YS00YjNlLWEwYTQtYmM0MjY3ZTU3YmMyOnN0cmluZzpTcGVjaW1lbiIsCiAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgImNvZGluZyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic3lzdGVtIjogIjAwYzAzYjkxLWNjOTQtNDllNC1hNjQ2LWY5YmQxZmM2Yjg5ZDpzdHJpbmc6aHR0cDovL3Nub21lZC5pbmZvL3NjdCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICI0YmU5YWFkNS02M2JjLTQ5ZDEtOTBmZC02NzkxNmJkZTUzNWU6c3RyaW5nOjI1ODUwMDAwMSIsCiAgICAgICAgICAgICAgICAiZGlzcGxheSI6ICI2MmFlODg0YS0wOGRkLTRmYjktODg3ZS00N2E0YWY1ZDFkYzc6c3RyaW5nOk5hc29waGFyeW5nZWFsIHN3YWIiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgImNvbGxlY3Rpb24iOiB7CiAgICAgICAgICAgICJjb2xsZWN0ZWREYXRlVGltZSI6ICIyMTRiODRjMy1hNmEyLTQwYmItODMwMC1mYmYxNjhhMmFiYjU6c3RyaW5nOjIwMjAtMDktMjdUMDY6MTU6MDBaIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICJhOGZkMzMxNi01ZGQ5LTQ0OTYtYWI0MC1hYTU2ZDMxYzFmMzE6c3RyaW5nOk9ic2VydmF0aW9uIiwKICAgICAgICAgICJpZGVudGlmaWVyIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInZhbHVlIjogImE2ZTNmOTliLTRhYzItNDQ3My1iYzJlLTRjY2Q2NTM4ZTRkZTpzdHJpbmc6MTIzNDU2Nzg5IiwKICAgICAgICAgICAgICAidHlwZSI6ICIxYzA0ZWEzZC1jMzhlLTQ0MGYtYjQ0NC0zN2QyNWNlYjEwOWE6c3RyaW5nOkFDU04iCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAiY29kZSI6IHsKICAgICAgICAgICAgImNvZGluZyI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic3lzdGVtIjogIjIzMDNmMTI1LTI3N2YtNGIxMy1iYTRhLWFhYmNlYzYxYTI4YjpzdHJpbmc6aHR0cDovL2xvaW5jLm9yZyIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICI0MzVkNWE4My05ZmM0LTQ3ODMtODk1MC02YzM5MjQxNWZjNmM6c3RyaW5nOjk0NTMxLTEiLAogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiNDIzYTczODctZDM4Yi00Y2QwLThjNjYtYTkwNmM4YTgyYWY2OnN0cmluZzpSZXZlcnNlIHRyYW5zY3JpcHRpb24gcG9seW1lcmFzZSBjaGFpbiByZWFjdGlvbiAoclJULVBDUikgdGVzdCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAidmFsdWVDb2RlYWJsZUNvbmNlcHQiOiB7CiAgICAgICAgICAgICJjb2RpbmciOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICI0NTEwOGNjNi03OTJhLTRhZmQtOTQxNi03YzU4ODgzZGFhOWE6c3RyaW5nOmh0dHA6Ly9zbm9tZWQuaW5mby9zY3QiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiMDBhODJkZmItOGQzYy00Yjk4LTk1M2ItNThkYzEzNzMyNWI4OnN0cmluZzoyNjAzODUwMDkiLAogICAgICAgICAgICAgICAgImRpc3BsYXkiOiAiNTRmZTZjYzUtZGIyMC00MDdkLTgxNDUtM2VhZTU2MzI1NjFlOnN0cmluZzpOZWdhdGl2ZSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiZWZmZWN0aXZlRGF0ZVRpbWUiOiAiMGM4MTQxYjMtNjhhZC00NjQzLWIyNTgtMDlmMDYxZmUxNDkxOnN0cmluZzoyMDIwLTA5LTI4VDA2OjE1OjAwWiIsCiAgICAgICAgICAic3RhdHVzIjogIjA0NDg5NGY2LTBiY2EtNDVlYy1hMzk1LWE4MmU2YWM0YjExNDpzdHJpbmc6ZmluYWwiLAogICAgICAgICAgInBlcmZvcm1lciI6IHsKICAgICAgICAgICAgIm5hbWUiOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRleHQiOiAiOWNlYjcyMjAtMDU5ZC00ODAwLWFjYmMtYzk3NWYzMGRhZDNjOnN0cmluZzpEciBNaWNoYWVsIExpbSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAicXVhbGlmaWNhdGlvbiI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJpZGVudGlmaWVyIjogImI5YmE4NDM0LTc2MjAtNDEzZS1hNDdmLTBmMzkxNzFiMzE2YTpzdHJpbmc6TUNSIDEyMzIxNCIsCiAgICAgICAgICAgICAgImlzc3VlciI6ICJhNzU0YzUyOS03OGI4LTQ4NDctOGY2Ny05Mjk0MTdkMDVkZTY6c3RyaW5nOk1PSCIKICAgICAgICAgICAgfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICIyOWQzMWRiZC1hYThlLTQxMWEtYmM0NS1mY2MyZTI4ZmVhM2Q6c3RyaW5nOk9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAibmFtZSI6ICIwNmU0Y2YxZi0yOGFiLTRmOGUtOWIxMy02YzljNDYzOTMyNWU6c3RyaW5nOk1hY1JpdGNoaWUgTWVkaWNhbCBDbGluaWMiLAogICAgICAgICAgInR5cGUiOiAiZmQ5ZTVhNDAtMDgyNS00ZjNjLThkOTktZDJkMjdjOWZiNjY0OnN0cmluZzpMaWNlbnNlZCBIZWFsdGhjYXJlIFByb3ZpZGVyIiwKICAgICAgICAgICJlbmRwb2ludCI6IHsKICAgICAgICAgICAgImFkZHJlc3MiOiAiYzQ3NzhmZWMtY2IyNi00NDFiLWJlNmYtNTc3YzJjYzExYzYzOnN0cmluZzpodHRwczovL3d3dy5tYWNyaXRjaGllY2xpbmljLmNvbS5zZyIKICAgICAgICAgIH0sCiAgICAgICAgICAiY29udGFjdCI6IHsKICAgICAgICAgICAgInRlbGVjb20iOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICIwMDcxNzY5Yi01ZTZmLTQ2OTQtYTI4Zi04MTUxMmM3ZTNlZTU6c3RyaW5nOnBob25lIiwKICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICIxN2FlZjBmMi1lNzA5LTRhYjYtODBjMS03ZTA5YTBiZTY0YWM6c3RyaW5nOis2NTYzMTEzMTExIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiMjA5OGFhMTAtMTFhMS00MDIwLTljZjctYTk3YjIxNDQ5ZmQ4OnN0cmluZzpwaHlzaWNhbCIsCiAgICAgICAgICAgICAgInVzZSI6ICJlYWVhYWQ5NC1kMzhmLTRiMDYtODFkNS1mMjA4NGUxMjMzMDE6c3RyaW5nOndvcmsiLAogICAgICAgICAgICAgICJ0ZXh0IjogImFmMWVjOTU4LTg1MDMtNDcxZi04YzQwLWYzNGUzMzc2ZTFhZjpzdHJpbmc6TWFjUml0Y2hpZSBIb3NwaXRhbCBUaG9tc29uIFJvYWQgU2luZ2Fwb3JlIDEyMzAwMCIKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInJlc291cmNlVHlwZSI6ICI3ZjliOTQ4Ny03MzljLTQ5OTUtODI5ZS0zOWU1MjQwOWQ3YWQ6c3RyaW5nOk9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAibmFtZSI6ICIwZmVlNjNkNy0yMDFkLTRhYjAtODI1ZC03NTEzNTNiYzQwMjA6c3RyaW5nOk1hY1JpdGNoaWUgTGFib3JhdG9yeSIsCiAgICAgICAgICAidHlwZSI6ICI0ZDgzZmRkZC0wZDMzLTQ1ZWEtYjUzOC0wMThlNzViODdlYWY6c3RyaW5nOkFjY3JlZGl0ZWQgTGFib3JhdG9yeSIsCiAgICAgICAgICAiY29udGFjdCI6IHsKICAgICAgICAgICAgInRlbGVjb20iOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN5c3RlbSI6ICI5Y2FlODdhNi1jNGYwLTRlNzAtYTFhYi05ZDM4NmUzMjRmOTk6c3RyaW5nOnBob25lIiwKICAgICAgICAgICAgICAgICJ2YWx1ZSI6ICJjNjdmNDlmOS1lODllLTRjODItYmNiYS1iZTliMDM2MTI2OWY6c3RyaW5nOis2NTYyNzExMTg4IgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImFkZHJlc3MiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiZWNmMDY0NDUtNzc5NC00YmE5LWJlNDktNTVmM2NkNjk1MjIxOnN0cmluZzpwaHlzaWNhbCIsCiAgICAgICAgICAgICAgInVzZSI6ICIzYTBjN2QwMC1lMmM2LTRlMDctOGIyMC04NzE2NzlmYjY3NzA6c3RyaW5nOndvcmsiLAogICAgICAgICAgICAgICJ0ZXh0IjogImNkMjU3MDhlLTNjYWEtNGFiZi1hMWE1LWJiMDNlMGU4MGE2ZTpzdHJpbmc6MiBUaG9tc29uIEF2ZW51ZSA0IFNpbmdhcG9yZSAwOTg4ODgiCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICAiaXNzdWVycyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImIzNWE4YTNlLWQ0YmUtNDAyMy05YzM5LWNmNDg0YTVhNWE3NTpzdHJpbmc6R292VGVjaCIsCiAgICAgICAgImRvY3VtZW50U3RvcmUiOiAiNzQxYzQ2ZWUtYmFiMi00MTg5LWE5NTktZWY5NTU5NDhjZGFjOnN0cmluZzoweDhGYzU3MjA0YzM1ZmI5MzE3RDkxMjg1ZUY1MkQ2Yjg5MkVDMDhjRDMiLAogICAgICAgICJpZGVudGl0eVByb29mIjogewogICAgICAgICAgInR5cGUiOiAiZjA5YmUyMjctN2Q3My00NDMzLWJjY2QtMDEzOGYzODk5MjM2OnN0cmluZzpETlMtVFhUIiwKICAgICAgICAgICJsb2NhdGlvbiI6ICJhYjFiYTgxZC1mYjQzLTRlODAtYjllMC1hNjRmMTUzMmM5Y2U6c3RyaW5nOmV4YW1wbGUub3BlbmF0dGVzdGF0aW9uLmNvbSIKICAgICAgICB9CiAgICAgIH0KICAgIF0sCiAgICAiJHRlbXBsYXRlIjogewogICAgICAibmFtZSI6ICIzOGYyOWQ1Yi1jYWZmLTRmMjAtYWU4Ny0xNjI4OGRmOTcwMjU6c3RyaW5nOkhFQUxUSENFUlQiLAogICAgICAidHlwZSI6ICIxZjVmMDZmMS1hNmJiLTQ5ZDEtOWU3My05ZTQzNDA4ZjEyMjU6c3RyaW5nOkVNQkVEREVEX1JFTkRFUkVSIiwKICAgICAgInVybCI6ICI2ZWRmMzZjNy0zYzYyLTRmNmUtYmUwYS03MmJmNzc0NTAyNDY6c3RyaW5nOmh0dHBzOi8vZ292dGVjaC1yZW5kZXJlci5vcGVuYXR0ZXN0YXRpb24uY29tLyIKICAgIH0sCiAgICAicmVjaXBpZW50IjogewogICAgICAibmFtZSI6ICIwNmM1YmQ0OS00MzM2LTQ3MDktODFlMy1mOGJhMTQzZjQ5ZmE6c3RyaW5nOkpvaG4gRG9lIgogICAgfQogIH0sCiAgInNpZ25hdHVyZSI6IHsKICAgICJ0eXBlIjogIlNIQTNNZXJrbGVQcm9vZiIsCiAgICAidGFyZ2V0SGFzaCI6ICJiZmIyY2Q2MTU5NDQ3NmMzNTE1ZmIwNDcwYzgwZmU2Y2MyNGZlZTM5ZWNkZGQwYzlmNzc0OWEyNzg5Mzc5MTQ4IiwKICAgICJwcm9vZiI6IFtdLAogICAgIm1lcmtsZVJvb3QiOiAiYmZiMmNkNjE1OTQ0NzZjMzUxNWZiMDQ3MGM4MGZlNmNjMjRmZWUzOWVjZGRkMGM5Zjc3NDlhMjc4OTM3OTE0OCIKICB9Cn0=" + } + ] + }, + "signature": { + "type": "SHA3MerkleProof", + "targetHash": "9cac4a4dd76527a367de9408043f3717d6b3432d3d88ac7f7672f947845c745a", + "proof": [], + "merkleRoot": "9cac4a4dd76527a367de9408043f3717d6b3432d3d88ac7f7672f947845c745a" + } +} diff --git a/src/sg/gov/moh/healthcert/1.0/healthcert-notarised.test.ts b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised.test.ts new file mode 100644 index 0000000..89a4224 --- /dev/null +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-notarised.test.ts @@ -0,0 +1,80 @@ +import Ajv from "ajv"; +import schema from "./healthcert-notarised-schema.json"; +import sampleDocJson from "./healthcert-notarised-document.json"; +import axios from "axios"; +import { cloneDeep, omit } from "lodash"; + +function loadSchema(uri: string) { + return axios.get(uri).then(res => { + return res.data; + }); +} +const ajv = new Ajv({ allErrors: true, loadSchema: loadSchema }); +let validator: Ajv.ValidateFunction; + +// eslint-disable-next-line jest/no-disabled-tests +describe("schema", () => { + beforeAll(async () => { + validator = await ajv.compileAsync(schema); + }); + it("should work with valid json", () => { + expect(validator(sampleDocJson)).toBe(true); + }); + + //To test if healthcert schema is correctly merged + it("should return array of errors without fhirVersion", () => { + const badDoc = omit(cloneDeep(sampleDocJson), "fhirVersion"); + expect(validator(badDoc)).toBe(false); + expect(validator.errors).toMatchInlineSnapshot(` + Array [ + Object { + "dataPath": "", + "keyword": "required", + "message": "should have required property 'fhirVersion'", + "params": Object { + "missingProperty": "fhirVersion", + }, + "schemaPath": "#/required", + }, + ] + `); + }); + + //To test if oa schema is correctly merged + it("should return array of errors without issuers", () => { + const badDoc = omit(cloneDeep(sampleDocJson), "issuers"); + expect(validator(badDoc)).toBe(false); + expect(validator.errors).toMatchInlineSnapshot(` + Array [ + Object { + "dataPath": "", + "keyword": "required", + "message": "should have required property 'issuers'", + "params": Object { + "missingProperty": "issuers", + }, + "schemaPath": "#/required", + }, + ] + `); + }); + + //To test if notarized schema is correctly merged + it("should return array of errors without notarisationMetadata", () => { + const badDoc = omit(cloneDeep(sampleDocJson), "notarisationMetadata"); + expect(validator(badDoc)).toBe(false); + expect(validator.errors).toMatchInlineSnapshot(` + Array [ + Object { + "dataPath": "", + "keyword": "required", + "message": "should have required property 'notarisationMetadata'", + "params": Object { + "missingProperty": "notarisationMetadata", + }, + "schemaPath": "https://schemata.openattestation.com/sg/gov/tech/notarise/1.0/schema.json/required", + }, + ] + `); + }); +}); diff --git a/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-document.json b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-document.json new file mode 100644 index 0000000..20d7d01 --- /dev/null +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-document.json @@ -0,0 +1,154 @@ +{ + "id": "TEST001", + "name": "HealthCert", + "validFrom": "2020-11-20", + "fhirVersion": "4.0.1", + "fhirBundle": { + "resourceType": "Bundle", + "type": "collection", + "entry": [ + { + "resourceType": "Patient", + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/patient-nationality", + "code": { + "text": "SG" + } + } + ], + "identifier": [ + { + "type": "PPN", + "value": "E7831177G" + }, + { + "type": { + "text": "NRIC" + }, + "value": "S9098989Z" + } + ], + "name": [ + { + "text": "Tan Chen Chen" + } + ], + "gender": "female", + "birthDate": "1990-01-15" + }, + { + "resourceType": "Specimen", + "type": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "258500001", + "display": "Nasopharyngeal swab" + } + ] + }, + "collection": { + "collectedDateTime": "2020-09-27T06:15:00Z" + } + }, + { + "resourceType": "Observation", + "identifier": [ + { + "value": "123456789", + "type": "ACSN" + } + ], + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "94531-1", + "display": "Reverse transcription polymerase chain reaction (rRT-PCR) test" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "260385009", + "display": "Negative" + } + ] + }, + "effectiveDateTime": "2020-09-28T06:15:00Z", + "status": "final", + "performer": { + "name": [ + { + "text": "Dr Michael Lim" + } + ] + }, + "qualification": [ + { + "identifier": "MCR 123214", + "issuer": "MOH" + } + ] + }, + { + "resourceType": "Organization", + "name": "MacRitchie Medical Clinic", + "type": "Licensed Healthcare Provider", + "endpoint": { + "address": "https://www.macritchieclinic.com.sg" + }, + "contact": { + "telecom": [ + { + "system": "phone", + "value": "+6563113111" + } + ], + "address": { + "type": "physical", + "use": "work", + "text": "MacRitchie Hospital Thomson Road Singapore 123000" + } + } + }, + { + "resourceType": "Organization", + "name": "MacRitchie Laboratory", + "type": "Accredited Laboratory", + "contact": { + "telecom": [ + { + "system": "phone", + "value": "+6562711188" + } + ], + "address": { + "type": "physical", + "use": "work", + "text": "2 Thomson Avenue 4 Singapore 098888" + } + } + } + ] + }, + "issuers": [ + { + "name": "GovTech", + "documentStore": "0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", + "identityProof": { + "type": "DNS-TXT", + "location": "example.openattestation.com" + } + } + ], + "$template": { + "name": "HEALTH_CERT", + "type": "EMBEDDED_RENDERER", + "url": "https://healthcert.renderer.moh.gov.sg/" + }, + "logo": "data:image/png;base64,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" +} diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-schema.json b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-schema.json similarity index 100% rename from src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation-schema.json rename to src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-schema.json diff --git a/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-wrapped.json b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-wrapped.json new file mode 100644 index 0000000..b10124f --- /dev/null +++ b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation-wrapped.json @@ -0,0 +1,145 @@ +{ + "version": "https://schema.openattestation.com/2.0/schema.json", + "data": { + "id": "40807d1a-f208-458b-bb28-c4292c9b2c03:string:TEST001", + "name": "eb911918-3943-44ed-9a8f-c556d7fab1ec:string:HealthCert", + "validFrom": "ac0af0a7-dce4-463e-b7ec-3ae663644e1c:string:2020-11-20", + "fhirVersion": "966a9137-e3cc-4024-bc62-2cd8b4c7648e:string:4.0.1", + "fhirBundle": { + "resourceType": "99429fa7-4631-4017-9559-85eafb0a85f2:string:Bundle", + "type": "fd3d0218-acfd-42f7-a214-e14e315c420b:string:collection", + "entry": [ + { + "resourceType": "1bab067d-5f68-4141-9d20-48434444ac1f:string:Patient", + "extension": [ + { + "url": "f18e96c6-4a1e-4d60-8c97-8066dcd38921:string:http://hl7.org/fhir/StructureDefinition/patient-nationality", + "code": { "text": "84de67db-93fe-4d34-8c60-61d8e1c5ac59:string:SG" } + } + ], + "identifier": [ + { + "type": "88bdd823-72e1-4625-b698-48d4c4ec8ed7:string:PPN", + "value": "02be76fe-fc54-444b-87ef-c328c36e93ea:string:E7831177G" + }, + { + "type": { "text": "5609f993-36aa-4e40-b4d5-130b366c0a7f:string:NRIC" }, + "value": "45b71d50-5e76-4b78-9dcc-8b54b5509319:string:S9098989Z" + } + ], + "name": [{ "text": "1782abe5-9058-4591-a639-519d19925c39:string:Tan Chen Chen" }], + "gender": "fc9bce33-3517-4999-acea-f66de915df82:string:female", + "birthDate": "7d97871a-dbd4-4062-b5fa-8aadbb4a0e35:string:1990-01-15" + }, + { + "resourceType": "c6532b9a-ef1b-428a-a5ab-76258456aa77:string:Specimen", + "type": { + "coding": [ + { + "system": "18c406fc-ec77-4fb8-b2ba-ae567fe99a71:string:http://snomed.info/sct", + "code": "8d86c5af-d784-4524-b759-411a57d41dd1:string:258500001", + "display": "a8cb9839-d2ec-442d-a448-84545428f1d4:string:Nasopharyngeal swab" + } + ] + }, + "collection": { "collectedDateTime": "523a5e1c-5685-49e6-a41f-de35a0459410:string:2020-09-27T06:15:00Z" } + }, + { + "resourceType": "7bb32736-d3da-4482-8822-24117197400a:string:Observation", + "identifier": [ + { + "value": "56fb05c5-6d94-4af6-836c-fbcca9ca1cfa:string:123456789", + "type": "068633b0-7d3e-4e3b-a1ba-6c23d1abb3f1:string:ACSN" + } + ], + "code": { + "coding": [ + { + "system": "78445249-1264-4f4e-9425-0431c976f048:string:http://loinc.org", + "code": "db3bf128-5e17-4b76-b994-deb2b5382a22:string:94531-1", + "display": "f4ba6bf0-7aae-4dc3-91ab-7a449d3b1dbc:string:Reverse transcription polymerase chain reaction (rRT-PCR) test" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "d932f2ea-e4c4-43fc-841c-1a68e9c2ef59:string:http://snomed.info/sct", + "code": "ee6d20d0-7db5-46f4-b31b-65966f001b70:string:260385009", + "display": "4ea1c272-2aca-4e92-8b6f-3d6fd9a39c4c:string:Negative" + } + ] + }, + "effectiveDateTime": "1f50f061-cb9b-41ad-9782-248ea846526c:string:2020-09-28T06:15:00Z", + "status": "1bcc192e-b884-4739-ac64-3bf35d14809c:string:final", + "performer": { "name": [{ "text": "9e817d90-94f5-474e-b87b-ff4f5bfa998c:string:Dr Michael Lim" }] }, + "qualification": [ + { + "identifier": "c1ecc812-dcbc-4b08-8040-8d97e5df3adf:string:MCR 123214", + "issuer": "fee7c8a1-a51c-4e05-aab9-5efa1852ab9a:string:MOH" + } + ] + }, + { + "resourceType": "7ea7ce9e-af7f-42f4-82b8-c8ca8c0cdffe:string:Organization", + "name": "db382cba-a524-49df-959d-8bad772fb54e:string:MacRitchie Medical Clinic", + "type": "e8b8e6d7-3eb0-4014-a505-c9b40f04f1bb:string:Licensed Healthcare Provider", + "endpoint": { "address": "3cc87a33-ce2e-4ea2-97e7-011c7657b832:string:https://www.macritchieclinic.com.sg" }, + "contact": { + "telecom": [ + { + "system": "6726dd0e-f1c5-4284-b2f7-f216147251ba:string:phone", + "value": "cbddf641-8ca1-497c-b710-7cea65f98a79:string:+6563113111" + } + ], + "address": { + "type": "2a82e81b-06c6-4701-855d-8f3924bf9263:string:physical", + "use": "c61ffb4a-586a-47c0-869b-5a18a2adbe31:string:work", + "text": "62b2b788-754b-4be6-b718-fd1fc71830d7:string:MacRitchie Hospital Thomson Road Singapore 123000" + } + } + }, + { + "resourceType": "d2243f32-4cf6-409a-9cdf-b98970569c46:string:Organization", + "name": "a4466d40-081a-4b52-b9f8-e137db454bdd:string:MacRitchie Laboratory", + "type": "544bc46a-a1a5-46e7-8cfe-2ee9041dda94:string:Accredited Laboratory", + "contact": { + "telecom": [ + { + "system": "63ee61a6-b07e-4cdf-9100-99c0a91a9121:string:phone", + "value": "a45ce31d-870e-4625-a619-2e420d47afd2:string:+6562711188" + } + ], + "address": { + "type": "c9643a1b-384f-48bf-bc3d-deb6d6428b31:string:physical", + "use": "a30f310d-f633-4608-846b-8cc9289f1ecc:string:work", + "text": "3ebc6f70-eee3-49cc-93e3-e05bf8b904ab:string:2 Thomson Avenue 4 Singapore 098888" + } + } + } + ] + }, + "issuers": [ + { + "name": "1f00ac06-9c39-42df-942a-93d28f47c3f5:string:GovTech", + "documentStore": "7bbda3dc-492e-43f5-871e-c11befa8ab73:string:0x8Fc57204c35fb9317D91285eF52D6b892EC08cD3", + "identityProof": { + "type": "fc146a29-6986-4c2e-b750-485b5aec999c:string:DNS-TXT", + "location": "9226e7a1-ada3-4d3a-9b1d-0857e724c5fd:string:example.openattestation.com" + } + } + ], + "$template": { + "name": "4fbeba97-7008-4a93-a818-3c95ab055c49:string:HEALTH_CERT", + "type": "21280482-aebb-4e12-a711-605cc80bd806:string:EMBEDDED_RENDERER", + "url": "a6fcfb4e-79d8-4b43-afa1-9fe56db38a22:string:https://healthcert.renderer.moh.gov.sg/" + }, + "logo": "413588af-882a-4c98-b151-3e381dff25ab:string:data:image/png;base64,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" + }, + "signature": { + "type": "SHA3MerkleProof", + "targetHash": "a368009ad4c73ee2ad15a8818c88940220e467795830b4fc80a4e8e472c12c95", + "proof": [], + "merkleRoot": "a368009ad4c73ee2ad15a8818c88940220e467795830b4fc80a4e8e472c12c95" + } +} diff --git a/src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation.test.ts b/src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation.test.ts similarity index 100% rename from src/sg/gov/moh/healthcert/1.0-draft/healthcert-open-attestation.test.ts rename to src/sg/gov/moh/healthcert/1.0/healthcert-open-attestation.test.ts diff --git a/src/sg/gov/moh/healthcert/1.0-draft/sample-document.json b/src/sg/gov/moh/healthcert/1.0/sample-document.json similarity index 100% rename from src/sg/gov/moh/healthcert/1.0-draft/sample-document.json rename to src/sg/gov/moh/healthcert/1.0/sample-document.json diff --git a/src/sg/gov/moh/healthcert/1.0-draft/schema.json b/src/sg/gov/moh/healthcert/1.0/schema.json similarity index 98% rename from src/sg/gov/moh/healthcert/1.0-draft/schema.json rename to src/sg/gov/moh/healthcert/1.0/schema.json index 8389152..836f5ac 100644 --- a/src/sg/gov/moh/healthcert/1.0-draft/schema.json +++ b/src/sg/gov/moh/healthcert/1.0/schema.json @@ -46,7 +46,7 @@ "properties": { "resourceType": { "type": "string", - "const": "Patient" + "enum": ["Patient"] }, "extension": { "type": "array", @@ -146,7 +146,7 @@ "properties": { "resourceType": { "type": "string", - "const": "Specimen" + "enum": ["Specimen"] }, "type": { "description": "The kind of material that forms the specimen.", @@ -177,14 +177,13 @@ "code", "valueCodeableConcept", "effectiveDateTime", - "performer", "qualification", "status" ], "properties": { "resourceType": { "type": "string", - "const": "Observation" + "enum": ["Observation"] }, "identifier": { "description": "A unique identifier assigned to this observation.", @@ -289,7 +288,7 @@ "properties": { "resourceType": { "type": "string", - "const": "Organization" + "enum": ["Organization"] }, "name": { "description": "A name associated with the organization.", @@ -405,7 +404,7 @@ "properties": { "resourceType": { "description": "This is a Bundle resource", - "const": "Bundle" + "enum": ["Bundle"] }, "type": { "description": "Indicates the purpose of this bundle - how it is intended to be used.", @@ -415,7 +414,6 @@ "entry": { "description": "An entry in a bundle resource - will contain information about Patient, Speciment, Observation or Organization.", "type": "array", - "additionalItems": true, "minItems": 5, "items": { "oneOf": [ diff --git a/src/sg/gov/moh/healthcert/1.0-draft/schema.test.ts b/src/sg/gov/moh/healthcert/1.0/schema.test.ts similarity index 98% rename from src/sg/gov/moh/healthcert/1.0-draft/schema.test.ts rename to src/sg/gov/moh/healthcert/1.0/schema.test.ts index ba605b2..fb844e0 100644 --- a/src/sg/gov/moh/healthcert/1.0-draft/schema.test.ts +++ b/src/sg/gov/moh/healthcert/1.0/schema.test.ts @@ -153,12 +153,14 @@ describe("schema", () => { Array [ Object { "dataPath": ".fhirBundle.resourceType", - "keyword": "const", - "message": "should be equal to constant", + "keyword": "enum", + "message": "should be equal to one of the allowed values", "params": Object { - "allowedValue": "Bundle", + "allowedValues": Array [ + "Bundle", + ], }, - "schemaPath": "#/properties/fhirBundle/properties/resourceType/const", + "schemaPath": "#/properties/fhirBundle/properties/resourceType/enum", }, ] `); @@ -245,7 +247,6 @@ describe("schema", () => { it("should fail when entry is missing a resourceType", () => { const document = omit(cloneDeep(sampleDocument), "fhirBundle.entry[0].resourceType"); expect(validator(document)).toBe(false); - // TODO add more contain equal :) expect(validator.errors).toContainEqual({ dataPath: ".fhirBundle.entry[0]", keyword: "required", @@ -255,6 +256,8 @@ describe("schema", () => { }, schemaPath: "#/definitions/Patient/required" }); + // this is for specimen and observation, there is a problem in ajv with $ref + // https://github.com/ajv-validator/ajv/issues/512 expect(validator.errors).toContainEqual({ dataPath: ".fhirBundle.entry[0]", keyword: "required", @@ -264,6 +267,15 @@ describe("schema", () => { }, schemaPath: "#/required" }); + expect(validator.errors).toContainEqual({ + dataPath: ".fhirBundle.entry[0]", + keyword: "required", + message: "should have required property 'resourceType'", + params: { + missingProperty: "resourceType" + }, + schemaPath: "#/definitions/Organization/required" + }); }); describe("Patient", () => { @@ -896,19 +908,6 @@ describe("schema", () => { }); }); - it("should fail when performer is missing", () => { - const document = omit(cloneDeep(sampleDocument), "fhirBundle.entry[2].performer"); - expect(validator(document)).toBe(false); - expect(validator.errors).toContainEqual({ - dataPath: ".fhirBundle.entry[2]", - keyword: "required", - message: "should have required property 'performer'", - params: { - missingProperty: "performer" - }, - schemaPath: "#/required" - }); - }); it("should fail when performer name is missing", () => { const document = omit(cloneDeep(sampleDocument), "fhirBundle.entry[2].performer.name"); expect(validator(document)).toBe(false);