{
  "info": {
    "_postman_id": "86fc4297-e766-41fa-8211-c73f06ccece3",
    "name": "Patient Survey Engine",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Validation collection for the Patient Survey Engine, including QR check-in and front-desk roster import."
  },
  "item": [
    {
      "name": "Health",
      "item": [
        {
          "name": "GET Health",
          "request": {
            "method": "GET",
            "url": "{{baseUrl}}/health"
          }
        },
        {
          "name": "GET Config",
          "request": {
            "method": "GET",
            "url": "{{baseUrl}}/api/config"
          }
        }
      ]
    },
    {
      "name": "Auth",
      "item": [
        {
          "name": "POST Admin Login",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('admin login ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('adminToken', data.token);",
                  "pm.environment.set('orgId', data.orgId);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"username\": \"{{adminUsername}}\",\n  \"password\": \"{{adminPassword}}\"\n}"
            },
            "url": "{{baseUrl}}/api/auth/login"
          }
        },
        {
          "name": "GET Auth Me",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/auth/me"
          }
        }
      ]
    },
    {
      "name": "Locations and QR",
      "item": [
        {
          "name": "POST Create Location",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('location created', function () { pm.response.to.have.status(201); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('locationId', data.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"QR Postman Clinic\",\n  \"address\": \"1 Main St\",\n  \"contactName\": \"Desk User\",\n  \"contactEmail\": \"desk@example.com\"\n}"
            },
            "url": "{{baseUrl}}/api/organizations/{{orgId}}/locations"
          }
        },
        {
          "name": "GET Locations",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/organizations/{{orgId}}/locations"
          }
        },
        {
          "name": "GET Location QR",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('qr metadata ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('locationQrToken', data.publicToken);",
                  "pm.environment.set('locationLandingUrl', data.landingUrl);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/organizations/{{orgId}}/locations/{{locationId}}/qr"
          }
        },
        {
          "name": "POST Rotate QR",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/organizations/{{orgId}}/locations/{{locationId}}/qr/rotate"
          }
        }
      ]
    },
    {
      "name": "Front Desk",
      "item": [
        {
          "name": "POST Register Front Desk User",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" },
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"username\": \"{{frontDeskUsername}}\",\n  \"password\": \"{{frontDeskPassword}}\",\n  \"orgId\": \"{{orgId}}\",\n  \"role\": \"front_desk\",\n  \"locationId\": \"{{locationId}}\"\n}"
            },
            "url": "{{baseUrl}}/api/auth/register"
          }
        },
        {
          "name": "POST Front Desk Login",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('front desk login ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('frontDeskToken', data.token);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"username\": \"{{frontDeskUsername}}\",\n  \"password\": \"{{frontDeskPassword}}\"\n}"
            },
            "url": "{{baseUrl}}/api/auth/login"
          }
        }
      ]
    },
    {
      "name": "Rosters",
      "item": [
        {
          "name": "GET Roster Template",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "url": "{{baseUrl}}/api/rosters/template"
          }
        },
        {
          "name": "POST Roster Validate",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "file", "type": "file", "src": "sample-roster.csv" },
                { "key": "locationId", "value": "{{locationId}}", "type": "text" },
                { "key": "dateStart", "value": "{{serviceDate}}", "type": "text" },
                { "key": "dateEnd", "value": "{{serviceDate}}", "type": "text" }
              ]
            },
            "url": "{{baseUrl}}/api/rosters/import?validate=true"
          }
        },
        {
          "name": "POST Roster Import",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('roster import ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('rosterImportId', data.importId);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "file", "type": "file", "src": "sample-roster.csv" },
                { "key": "locationId", "value": "{{locationId}}", "type": "text" },
                { "key": "dateStart", "value": "{{serviceDate}}", "type": "text" },
                { "key": "dateEnd", "value": "{{serviceDate}}", "type": "text" }
              ]
            },
            "url": "{{baseUrl}}/api/rosters/import"
          }
        },
        {
          "name": "GET Roster Imports",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "url": "{{baseUrl}}/api/rosters?locationId={{locationId}}"
          }
        },
        {
          "name": "GET Roster Rows",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "url": "{{baseUrl}}/api/rosters/rows?locationId={{locationId}}&serviceDate={{serviceDate}}"
          }
        },
        {
          "name": "GET Roster Import Detail",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{frontDeskToken}}" }
            ],
            "url": "{{baseUrl}}/api/rosters/{{rosterImportId}}"
          }
        }
      ]
    },
    {
      "name": "Public QR Flow",
      "item": [
        {
          "name": "GET QR Data",
          "request": {
            "method": "GET",
            "url": "{{baseUrl}}/check-in/{{locationQrToken}}/data"
          }
        },
        {
          "name": "POST Patient Start Check-In",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('check-in ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "pm.environment.set('sessionId', data.sessionId);",
                  "pm.environment.set('patientId', data.patientId);",
                  "var token = data.redirectUrl.split('/').pop();",
                  "pm.environment.set('intakeToken', token);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Jane Doe\",\n  \"phone\": \"(555) 111-2222\",\n  \"serviceDate\": \"{{serviceDate}}\"\n}"
            },
            "url": "{{baseUrl}}/check-in/{{locationQrToken}}/patient/start"
          }
        }
      ]
    },
    {
      "name": "Intake",
      "item": [
        {
          "name": "GET Intake Data",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('intake data ok', function () { pm.response.to.have.status(200); });",
                  "var data = pm.response.json();",
                  "if (data.questionnaire && data.questionnaire.questions && data.questionnaire.questions.length > 0) {",
                  "  pm.environment.set('questionId', data.questionnaire.questions[0].id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "url": "{{baseUrl}}/intake/{{intakeToken}}/data"
          }
        },
        {
          "name": "PUT Save Intake Answer",
          "request": {
            "method": "PUT",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"questionId\": \"{{questionId}}\",\n  \"answer\": \"Yes\"\n}"
            },
            "url": "{{baseUrl}}/intake/{{intakeToken}}/answer"
          }
        },
        {
          "name": "GET Intake Progress",
          "request": {
            "method": "GET",
            "url": "{{baseUrl}}/intake/{{intakeToken}}/progress"
          }
        },
        {
          "name": "POST Submit Intake",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"answers\": [\n    { \"questionId\": \"{{questionId}}\", \"answer\": \"Yes\" }\n  ]\n}"
            },
            "url": "{{baseUrl}}/intake/{{intakeToken}}/submit"
          }
        }
      ]
    },
    {
      "name": "Responses",
      "item": [
        {
          "name": "GET Responses",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/responses"
          }
        },
        {
          "name": "GET Response Summary",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/responses/analytics/summary"
          }
        },
        {
          "name": "GET Session FHIR",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/responses/{{sessionId}}/fhir"
          }
        },
        {
          "name": "GET Response CSV Export",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/responses/export/csv"
          }
        }
      ]
    },
    {
      "name": "Patient Import and Dispatch",
      "item": [
        {
          "name": "POST Patient Import Validate",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "file", "type": "file", "src": "sample-patients.csv" }
              ]
            },
            "url": "{{baseUrl}}/api/import?validate=true"
          }
        },
        {
          "name": "POST Patient Import",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "file", "type": "file", "src": "sample-patients.csv" }
              ]
            },
            "url": "{{baseUrl}}/api/import"
          }
        },
        {
          "name": "GET Patients",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/patients"
          }
        },
        {
          "name": "POST Dispatch All",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/dispatch"
          }
        },
        {
          "name": "GET Dispatch Status",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/dispatch/status"
          }
        },
        {
          "name": "GET Dispatch Log",
          "request": {
            "method": "GET",
            "header": [
              { "key": "Authorization", "value": "Bearer {{adminToken}}" }
            ],
            "url": "{{baseUrl}}/api/dispatch/log"
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "POST Twilio Status",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"MessageSid\": \"SM_TEST_123\",\n  \"MessageStatus\": \"delivered\",\n  \"To\": \"+15551112222\"\n}"
            },
            "url": "{{baseUrl}}/webhooks/twilio/status"
          }
        },
        {
          "name": "POST Twilio Inbound HELP",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"From\": \"+15551112222\",\n  \"Body\": \"HELP\",\n  \"MessageSid\": \"SM_IN_123\"\n}"
            },
            "url": "{{baseUrl}}/webhooks/twilio/inbound"
          }
        }
      ]
    }
  ],
  "variable": [
    { "key": "baseUrl", "value": "http://localhost:3400" }
  ]
}
