{ "openapi": "3.0.3", "info": { "title": "CLQMS API", "description": "Clinical Laboratory Quality Management System REST API", "version": "1.0.0", "contact": { "name": "CLQMS Development Team" } }, "servers": [ { "url": "http://localhost/clqms01/", "description": "Development server" } ], "components": { "securitySchemes": { "jwtAuth": { "type": "apiKey", "in": "cookie", "name": "token", "description": "JWT token stored in HTTP-only cookie" } }, "schemas": { "ApiResponse": { "type": "object", "properties": { "status": { "type": "string", "enum": ["success", "failed"], "description": "Response status" }, "message": { "type": "string", "description": "Response message" }, "data": { "type": "object", "description": "Response data payload" } } }, "Patient": { "type": "object", "properties": { "InternalPID": { "type": "integer", "description": "Internal patient ID" }, "PatientID": { "type": "string", "maxLength": 30, "description": "Patient identifier" }, "AlternatePID": { "type": "string", "maxLength": 30, "description": "Alternate patient ID" }, "Prefix": { "type": "string", "maxLength": 10, "description": "Name prefix" }, "NameFirst": { "type": "string", "minLength": 1, "maxLength": 60, "description": "First name" }, "NameMiddle": { "type": "string", "minLength": 1, "maxLength": 60, "description": "Middle name" }, "NameLast": { "type": "string", "minLength": 1, "maxLength": 60, "description": "Last name" }, "NameMaiden": { "type": "string", "minLength": 1, "maxLength": 60, "description": "Maiden name" }, "Suffix": { "type": "string", "maxLength": 10, "description": "Name suffix" }, "Sex": { "type": "string", "description": "Gender (M/F)" }, "Birthdate": { "type": "string", "format": "date", "description": "Date of birth" }, "PlaceOfBirth": { "type": "string", "maxLength": 100, "description": "Place of birth" }, "Street_1": { "type": "string", "maxLength": 255, "description": "Address line 1" }, "Street_2": { "type": "string", "maxLength": 255, "description": "Address line 2" }, "Street_3": { "type": "string", "maxLength": 255, "description": "Address line 3" }, "City": { "type": "string", "description": "City" }, "Province": { "type": "string", "description": "Province/State" }, "ZIP": { "type": "string", "maxLength": 10, "description": "Postal code" }, "EmailAddress1": { "type": "string", "format": "email", "maxLength": 100, "description": "Primary email" }, "EmailAddress2": { "type": "string", "format": "email", "maxLength": 100, "description": "Secondary email" }, "Phone": { "type": "string", "pattern": "^\\+?[0-9]{8,15}$", "description": "Phone number" }, "MobilePhone": { "type": "string", "pattern": "^\\+?[0-9]{8,15}$", "description": "Mobile phone number" }, "PatIdt": { "$ref": "#/components/schemas/PatientIdentifier" }, "PatAtt": { "type": "array", "items": { "$ref": "#/components/schemas/PatientAttribute" }, "description": "Patient attributes/addresses" } } }, "PatientIdentifier": { "type": "object", "properties": { "IdentifierType": { "type": "string", "description": "Identifier type (KTP, PASS, SSN, SIM, KTAS)" }, "Identifier": { "type": "string", "maxLength": 255, "description": "Identifier value" } } }, "PatientAttribute": { "type": "object", "properties": { "Address": { "type": "string", "description": "Patient address" } } }, "PatVisit": { "type": "object", "properties": { "PatVisitID": { "type": "integer", "description": "Patient visit ID" }, "InternalPID": { "type": "integer", "description": "Internal patient ID" }, "VisitDate": { "type": "string", "format": "date-time", "description": "Visit date/time" }, "VisitType": { "type": "string", "description": "Type of visit" }, "DepartmentID": { "type": "integer", "description": "Department ID" }, "ProviderID": { "type": "integer", "description": "Provider/Doctor ID" }, "VisitStatus": { "type": "string", "description": "Visit status" } } }, "OrderTest": { "type": "object", "properties": { "OrderID": { "type": "integer", "description": "Order ID" }, "InternalPID": { "type": "integer", "description": "Patient ID" }, "PatVisitID": { "type": "integer", "description": "Visit ID" }, "OrderDateTime": { "type": "string", "format": "date-time", "description": "Order date/time" }, "Priority": { "type": "string", "description": "Order priority" }, "OrderStatus": { "type": "string", "enum": ["ORD", "SCH", "ANA", "VER", "REV", "REP"], "description": "Order status" }, "OrderingProvider": { "type": "string", "description": "Ordering provider" }, "DepartmentID": { "type": "integer", "description": "Department ID" }, "WorkstationID": { "type": "integer", "description": "Workstation ID" }, "Tests": { "type": "array", "items": { "$ref": "#/components/schemas/OrderTestItem" } } } }, "OrderTestItem": { "type": "object", "properties": { "TestID": { "type": "integer", "description": "Test ID" }, "TestCode": { "type": "string", "description": "Test code" }, "TestName": { "type": "string", "description": "Test name" } } }, "Specimen": { "type": "object", "properties": { "SID": { "type": "integer", "description": "Specimen ID" }, "OrderID": { "type": "integer", "description": "Order ID" }, "InternalPID": { "type": "integer", "description": "Patient ID" }, "SpecimenType": { "type": "string", "description": "Specimen type" }, "ContainerCode": { "type": "string", "description": "Container code" }, "CollectionDateTime": { "type": "string", "format": "date-time", "description": "Collection date/time" }, "ReceivedDateTime": { "type": "string", "format": "date-time", "description": "Received date/time" }, "Status": { "type": "string", "description": "Specimen status" } } }, "TestDefinition": { "type": "object", "properties": { "TestID": { "type": "integer", "description": "Test ID" }, "TestCode": { "type": "string", "description": "Test code" }, "TestName": { "type": "string", "description": "Test name" }, "SpecimenType": { "type": "string", "description": "Required specimen type" }, "DepartmentID": { "type": "integer", "description": "Department ID" }, "Category": { "type": "string", "description": "Test category" } } }, "ValueSet": { "type": "object", "properties": { "ValueSetID": { "type": "integer", "description": "Value set ID" }, "ValueSetKey": { "type": "string", "description": "Value set key" }, "Name": { "type": "string", "description": "Value set name" }, "Description": { "type": "string", "description": "Value set description" }, "Items": { "type": "array", "items": { "$ref": "#/components/schemas/ValueSetItem" } } } }, "ValueSetItem": { "type": "object", "properties": { "ItemID": { "type": "integer", "description": "Item ID" }, "Value": { "type": "string", "description": "Item value/code" }, "Label": { "type": "string", "description": "Item display label" }, "Sequence": { "type": "integer", "description": "Display order" } } }, "ValueSetDef": { "type": "object", "properties": { "VSetDefID": { "type": "integer", "description": "Value set definition ID" }, "ValueSetKey": { "type": "string", "description": "Value set key" }, "Name": { "type": "string", "description": "Definition name" } } }, "Location": { "type": "object", "properties": { "LocationID": { "type": "integer", "description": "Location ID" }, "Code": { "type": "string", "description": "Location code" }, "Name": { "type": "string", "description": "Location name" }, "Type": { "type": "string", "description": "Location type" }, "ParentID": { "type": "integer", "description": "Parent location ID" } } }, "Contact": { "type": "object", "properties": { "ContactID": { "type": "integer", "description": "Contact ID" }, "Name": { "type": "string", "description": "Contact name" }, "Type": { "type": "string", "description": "Contact type" }, "Phone": { "type": "string", "description": "Phone number" }, "Email": { "type": "string", "format": "email", "description": "Email address" } } }, "Organization": { "type": "object", "properties": { "AccountID": { "type": "integer", "description": "Account ID" }, "AccountCode": { "type": "string", "description": "Account code" }, "AccountName": { "type": "string", "description": "Account name" } } }, "Site": { "type": "object", "properties": { "SiteID": { "type": "integer", "description": "Site ID" }, "SiteCode": { "type": "string", "description": "Site code" }, "SiteName": { "type": "string", "description": "Site name" }, "AccountID": { "type": "integer", "description": "Account ID" } } }, "Department": { "type": "object", "properties": { "DepartmentID": { "type": "integer", "description": "Department ID" }, "DepartmentCode": { "type": "string", "description": "Department code" }, "DepartmentName": { "type": "string", "description": "Department name" }, "SiteID": { "type": "integer", "description": "Site ID" } } }, "Discipline": { "type": "object", "properties": { "DisciplineID": { "type": "integer", "description": "Discipline ID" }, "DisciplineCode": { "type": "string", "description": "Discipline code" }, "DisciplineName": { "type": "string", "description": "Discipline name" } } }, "Workstation": { "type": "object", "properties": { "WorkstationID": { "type": "integer", "description": "Workstation ID" }, "WorkstationCode": { "type": "string", "description": "Workstation code" }, "WorkstationName": { "type": "string", "description": "Workstation name" }, "DepartmentID": { "type": "integer", "description": "Department ID" } } }, "AreaGeo": { "type": "object", "properties": { "AreaGeoID": { "type": "integer", "description": "Area ID" }, "ParentID": { "type": "integer", "description": "Parent area ID" }, "AreaName": { "type": "string", "description": "Area name" }, "Level": { "type": "integer", "description": "Geographic level" } } }, "SpecimenContainerDef": { "type": "object", "properties": { "ContainerDefID": { "type": "integer", "description": "Container definition ID" }, "ContainerCode": { "type": "string", "description": "Container code" }, "ContainerName": { "type": "string", "description": "Container name" }, "Volume": { "type": "string", "description": "Required volume" }, "SpecimenType": { "type": "string", "description": "Specimen type" } } }, "SpecimenPrep": { "type": "object", "properties": { "PrepID": { "type": "integer", "description": "Preparation ID" }, "PrepCode": { "type": "string", "description": "Preparation code" }, "PrepName": { "type": "string", "description": "Preparation name" } } }, "SpecimenStatus": { "type": "object", "properties": { "StatusID": { "type": "integer", "description": "Status ID" }, "StatusCode": { "type": "string", "description": "Status code" }, "StatusName": { "type": "string", "description": "Status name" } } }, "Counter": { "type": "object", "properties": { "CounterID": { "type": "integer", "description": "Counter ID" }, "CounterName": { "type": "string", "description": "Counter name" }, "CounterValue": { "type": "integer", "description": "Current counter value" }, "CounterPrefix": { "type": "string", "description": "Counter prefix" }, "CounterSuffix": { "type": "string", "description": "Counter suffix" } } }, "Error": { "type": "object", "properties": { "status": { "type": "string", "enum": ["failed"], "description": "Error status" }, "message": { "type": "string", "description": "Error message" } } }, "LoginRequest": { "type": "object", "required": ["username", "password"], "properties": { "username": { "type": "string", "description": "Username" }, "password": { "type": "string", "format": "password", "description": "Password" } } }, "LoginResponse": { "type": "object", "properties": { "status": { "type": "string", "enum": ["success"] }, "code": { "type": "integer", "description": "HTTP status code" }, "message": { "type": "string", "description": "Response message" } } } } }, "security": [ { "jwtAuth": [] } ], "paths": { "/v2/auth/login": { "post": { "tags": ["Authentication"], "summary": "User login", "description": "Authenticate user and receive JWT token in HTTP-only cookie", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/LoginRequest" } } } }, "responses": { "200": { "description": "Login successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginResponse" } } } }, "401": { "description": "Invalid credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/v2/auth/logout": { "post": { "tags": ["Authentication"], "summary": "User logout", "description": "Clear JWT token cookie", "responses": { "200": { "description": "Logout successful" } } } }, "/v2/auth/check": { "get": { "tags": ["Authentication"], "summary": "Check authentication status", "description": "Verify if JWT token is valid", "responses": { "200": { "description": "Authenticated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse" } } } }, "401": { "description": "Not authenticated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/api/auth/login": { "post": { "tags": ["Authentication"], "summary": "User login (legacy)", "description": "Authenticate user and receive JWT token in HTTP-only cookie", "requestBody": { "required": true, "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/LoginRequest" } } } }, "responses": { "200": { "description": "Login successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginResponse" } } } }, "401": { "description": "Invalid credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/api/auth/register": { "post": { "tags": ["Authentication"], "summary": "Register new user", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["username", "password"], "properties": { "username": { "type": "string" }, "password": { "type": "string", "format": "password" } } } } } }, "responses": { "201": { "description": "User created successfully" }, "409": { "description": "Username already exists" } } } }, "/api/patient": { "get": { "tags": ["Patient"], "summary": "List patients", "description": "Get list of patients with optional filtering", "parameters": [ { "name": "InternalPID", "in": "query", "schema": { "type": "integer" } }, { "name": "PatientID", "in": "query", "schema": { "type": "string" } }, { "name": "Name", "in": "query", "schema": { "type": "string" } }, { "name": "Birthdate", "in": "query", "schema": { "type": "string", "format": "date" } } ], "responses": { "200": { "description": "List of patients", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse" } } } } } }, "post": { "tags": ["Patient"], "summary": "Create patient", "description": "Create a new patient record", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Patient" } } } }, "responses": { "201": { "description": "Patient created successfully" }, "400": { "description": "Validation error" } } }, "patch": { "tags": ["Patient"], "summary": "Update patient", "description": "Update an existing patient record", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Patient" } } } }, "responses": { "200": { "description": "Patient updated successfully" }, "400": { "description": "Validation error" } } }, "delete": { "tags": ["Patient"], "summary": "Delete patient (soft delete)", "description": "Soft delete a patient record", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["InternalPID"], "properties": { "InternalPID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Patient deleted successfully" }, "400": { "description": "Invalid patient ID" }, "404": { "description": "Patient not found" } } } }, "/api/patient/{InternalPID}": { "get": { "tags": ["Patient"], "summary": "Get patient by ID", "parameters": [ { "name": "InternalPID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Patient details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse" } } } } } } }, "/api/patient/check": { "get": { "tags": ["Patient"], "summary": "Check patient existence", "parameters": [ { "name": "PatientID", "in": "query", "schema": { "type": "string" } }, { "name": "EmailAddress1", "in": "query", "schema": { "type": "string", "format": "email" } } ], "responses": { "200": { "description": "Check result", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "string" }, "message": { "type": "string" }, "data": { "type": "boolean", "description": "true if not exists (available), false if exists" } } } } } }, "400": { "description": "Missing required parameter" } } } }, "/api/patvisit": { "get": { "tags": ["Patient Visit"], "summary": "List patient visits", "responses": { "200": { "description": "List of visits" } } }, "post": { "tags": ["Patient Visit"], "summary": "Create patient visit", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PatVisit" } } } }, "responses": { "201": { "description": "Visit created successfully" } } }, "patch": { "tags": ["Patient Visit"], "summary": "Update patient visit", "responses": { "200": { "description": "Visit updated successfully" } } }, "delete": { "tags": ["Patient Visit"], "summary": "Delete patient visit (soft delete)", "responses": { "200": { "description": "Visit deleted successfully" } } } }, "/api/patvisit/patient/{InternalPID}": { "get": { "tags": ["Patient Visit"], "summary": "Get visits by patient", "parameters": [ { "name": "InternalPID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "List of patient visits" } } } }, "/api/patvisit/{PatVisitID}": { "get": { "tags": ["Patient Visit"], "summary": "Get visit by ID", "parameters": [ { "name": "PatVisitID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Visit details" } } } }, "/api/ordertest": { "get": { "tags": ["Order Test"], "summary": "List test orders", "parameters": [ { "name": "InternalPID", "in": "query", "schema": { "type": "integer" }, "description": "Filter by patient ID" } ], "responses": { "200": { "description": "List of orders" } } }, "post": { "tags": ["Order Test"], "summary": "Create test order", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["InternalPID"], "properties": { "InternalPID": { "type": "integer", "description": "Patient ID" }, "PatVisitID": { "type": "integer", "description": "Visit ID (optional)" }, "Priority": { "type": "string", "description": "Order priority" }, "Tests": { "type": "array", "items": { "type": "integer", "description": "Test IDs" } } } } } } }, "responses": { "201": { "description": "Order created successfully" }, "400": { "description": "Validation error" } } }, "patch": { "tags": ["Order Test"], "summary": "Update test order", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "OrderID": { "type": "integer" }, "Priority": { "type": "string" }, "OrderStatus": { "type": "string" }, "OrderingProvider": { "type": "string" }, "DepartmentID": { "type": "integer" }, "WorkstationID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Order updated successfully" } } }, "delete": { "tags": ["Order Test"], "summary": "Delete test order (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["OrderID"], "properties": { "OrderID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Order deleted successfully" } } } }, "/api/ordertest/{OrderID}": { "get": { "tags": ["Order Test"], "summary": "Get order by ID", "parameters": [ { "name": "OrderID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Order details" } } } }, "/api/ordertest/status": { "post": { "tags": ["Order Test"], "summary": "Update order status", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["OrderID", "OrderStatus"], "properties": { "OrderID": { "type": "integer" }, "OrderStatus": { "type": "string", "enum": ["ORD", "SCH", "ANA", "VER", "REV", "REP"], "description": "Order status code" } } } } } }, "responses": { "200": { "description": "Status updated successfully" }, "400": { "description": "Invalid status" } } } }, "/api/specimen": { "get": { "tags": ["Specimen"], "summary": "List specimens", "responses": { "200": { "description": "List of specimens" } } }, "post": { "tags": ["Specimen"], "summary": "Create specimen", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Specimen" } } } }, "responses": { "201": { "description": "Specimen created successfully" } } }, "patch": { "tags": ["Specimen"], "summary": "Update specimen", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Specimen" } } } }, "responses": { "200": { "description": "Specimen updated successfully" } } } }, "/api/specimen/{SID}": { "get": { "tags": ["Specimen"], "summary": "Get specimen by ID", "parameters": [ { "name": "SID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Specimen details" } } } }, "/api/specimen/container": { "get": { "tags": ["Specimen"], "summary": "List container definitions", "responses": { "200": { "description": "List of containers" } } }, "post": { "tags": ["Specimen"], "summary": "Create container definition", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenContainerDef" } } } }, "responses": { "201": { "description": "Container created successfully" } } }, "patch": { "tags": ["Specimen"], "summary": "Update container definition", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenContainerDef" } } } }, "responses": { "200": { "description": "Container updated successfully" } } } }, "/api/specimen/container/{ContainerDefID}": { "get": { "tags": ["Specimen"], "summary": "Get container definition by ID", "parameters": [ { "name": "ContainerDefID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Container details" } } } }, "/api/specimen/prep": { "get": { "tags": ["Specimen"], "summary": "List specimen preparations", "responses": { "200": { "description": "List of preparations" } } }, "post": { "tags": ["Specimen"], "summary": "Create specimen preparation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenPrep" } } } }, "responses": { "201": { "description": "Preparation created successfully" } } }, "patch": { "tags": ["Specimen"], "summary": "Update specimen preparation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenPrep" } } } }, "responses": { "200": { "description": "Preparation updated successfully" } } } }, "/api/specimen/status": { "get": { "tags": ["Specimen"], "summary": "List specimen statuses", "responses": { "200": { "description": "List of statuses" } } }, "post": { "tags": ["Specimen"], "summary": "Create specimen status", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenStatus" } } } }, "responses": { "201": { "description": "Status created successfully" } } }, "patch": { "tags": ["Specimen"], "summary": "Update specimen status", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpecimenStatus" } } } }, "responses": { "200": { "description": "Status updated successfully" } } } }, "/api/specimen/collection": { "get": { "tags": ["Specimen"], "summary": "List specimen collections", "responses": { "200": { "description": "List of collections" } } }, "post": { "tags": ["Specimen"], "summary": "Create specimen collection", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "201": { "description": "Collection created successfully" } } }, "patch": { "tags": ["Specimen"], "summary": "Update specimen collection", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "200": { "description": "Collection updated successfully" } } } }, "/api/tests": { "get": { "tags": ["Tests"], "summary": "List test definitions", "responses": { "200": { "description": "List of tests" } } }, "post": { "tags": ["Tests"], "summary": "Create test definition", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestDefinition" } } } }, "responses": { "201": { "description": "Test created successfully" } } }, "patch": { "tags": ["Tests"], "summary": "Update test definition", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TestDefinition" } } } }, "responses": { "200": { "description": "Test updated successfully" } } } }, "/api/tests/{TestID}": { "get": { "tags": ["Tests"], "summary": "Get test definition by ID", "parameters": [ { "name": "TestID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Test details" } } } }, "/api/location": { "get": { "tags": ["Location"], "summary": "List locations", "responses": { "200": { "description": "List of locations" } } }, "post": { "tags": ["Location"], "summary": "Create location", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Location" } } } }, "responses": { "201": { "description": "Location created successfully" } } }, "patch": { "tags": ["Location"], "summary": "Update location", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Location" } } } }, "responses": { "200": { "description": "Location updated successfully" } } }, "delete": { "tags": ["Location"], "summary": "Delete location (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["LocationID"], "properties": { "LocationID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Location deleted successfully" } } } }, "/api/location/{LocationID}": { "get": { "tags": ["Location"], "summary": "Get location by ID", "parameters": [ { "name": "LocationID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Location details" } } } }, "/api/contact": { "get": { "tags": ["Contact"], "summary": "List contacts", "responses": { "200": { "description": "List of contacts" } } }, "post": { "tags": ["Contact"], "summary": "Create contact", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Contact" } } } }, "responses": { "201": { "description": "Contact created successfully" } } }, "patch": { "tags": ["Contact"], "summary": "Update contact", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Contact" } } } }, "responses": { "200": { "description": "Contact updated successfully" } } }, "delete": { "tags": ["Contact"], "summary": "Delete contact (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["ContactID"], "properties": { "ContactID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Contact deleted successfully" } } } }, "/api/contact/{ContactID}": { "get": { "tags": ["Contact"], "summary": "Get contact by ID", "parameters": [ { "name": "ContactID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Contact details" } } } }, "/api/occupation": { "get": { "tags": ["Contact"], "summary": "List occupations", "responses": { "200": { "description": "List of occupations" } } }, "post": { "tags": ["Contact"], "summary": "Create occupation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "OccupationCode": { "type": "string" }, "OccupationName": { "type": "string" } } } } } }, "responses": { "201": { "description": "Occupation created successfully" } } }, "patch": { "tags": ["Contact"], "summary": "Update occupation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "OccupationID": { "type": "integer" }, "OccupationCode": { "type": "string" }, "OccupationName": { "type": "string" } } } } } }, "responses": { "200": { "description": "Occupation updated successfully" } } } }, "/api/occupation/{OccupationID}": { "get": { "tags": ["Contact"], "summary": "Get occupation by ID", "parameters": [ { "name": "OccupationID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Occupation details" } } } }, "/api/medicalspecialty": { "get": { "tags": ["Contact"], "summary": "List medical specialties", "responses": { "200": { "description": "List of specialties" } } }, "post": { "tags": ["Contact"], "summary": "Create medical specialty", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "SpecialtyCode": { "type": "string" }, "SpecialtyName": { "type": "string" } } } } } }, "responses": { "201": { "description": "Specialty created successfully" } } }, "patch": { "tags": ["Contact"], "summary": "Update medical specialty", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "SpecialtyID": { "type": "integer" }, "SpecialtyCode": { "type": "string" }, "SpecialtyName": { "type": "string" } } } } } }, "responses": { "200": { "description": "Specialty updated successfully" } } } }, "/api/medicalspecialty/{SpecialtyID}": { "get": { "tags": ["Contact"], "summary": "Get medical specialty by ID", "parameters": [ { "name": "SpecialtyID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Specialty details" } } } }, "/api/organization/account": { "get": { "tags": ["Organization"], "summary": "List accounts", "responses": { "200": { "description": "List of accounts" } } }, "post": { "tags": ["Organization"], "summary": "Create account", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Organization" } } } }, "responses": { "201": { "description": "Account created successfully" } } }, "patch": { "tags": ["Organization"], "summary": "Update account", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Organization" } } } }, "responses": { "200": { "description": "Account updated successfully" } } }, "delete": { "tags": ["Organization"], "summary": "Delete account (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["AccountID"], "properties": { "AccountID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Account deleted successfully" } } } }, "/api/organization/account/{AccountID}": { "get": { "tags": ["Organization"], "summary": "Get account by ID", "parameters": [ { "name": "AccountID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Account details" } } } }, "/api/organization/site": { "get": { "tags": ["Organization"], "summary": "List sites", "responses": { "200": { "description": "List of sites" } } }, "post": { "tags": ["Organization"], "summary": "Create site", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Site" } } } }, "responses": { "201": { "description": "Site created successfully" } } }, "patch": { "tags": ["Organization"], "summary": "Update site", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Site" } } } }, "responses": { "200": { "description": "Site updated successfully" } } }, "delete": { "tags": ["Organization"], "summary": "Delete site (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["SiteID"], "properties": { "SiteID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Site deleted successfully" } } } }, "/api/organization/site/{SiteID}": { "get": { "tags": ["Organization"], "summary": "Get site by ID", "parameters": [ { "name": "SiteID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Site details" } } } }, "/api/organization/discipline": { "get": { "tags": ["Organization"], "summary": "List disciplines", "responses": { "200": { "description": "List of disciplines" } } }, "post": { "tags": ["Organization"], "summary": "Create discipline", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Discipline" } } } }, "responses": { "201": { "description": "Discipline created successfully" } } }, "patch": { "tags": ["Organization"], "summary": "Update discipline", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Discipline" } } } }, "responses": { "200": { "description": "Discipline updated successfully" } } }, "delete": { "tags": ["Organization"], "summary": "Delete discipline (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["DisciplineID"], "properties": { "DisciplineID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Discipline deleted successfully" } } } }, "/api/organization/discipline/{DisciplineID}": { "get": { "tags": ["Organization"], "summary": "Get discipline by ID", "parameters": [ { "name": "DisciplineID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Discipline details" } } } }, "/api/organization/department": { "get": { "tags": ["Organization"], "summary": "List departments", "responses": { "200": { "description": "List of departments" } } }, "post": { "tags": ["Organization"], "summary": "Create department", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Department" } } } }, "responses": { "201": { "description": "Department created successfully" } } }, "patch": { "tags": ["Organization"], "summary": "Update department", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Department" } } } }, "responses": { "200": { "description": "Department updated successfully" } } }, "delete": { "tags": ["Organization"], "summary": "Delete department (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["DepartmentID"], "properties": { "DepartmentID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Department deleted successfully" } } } }, "/api/organization/department/{DepartmentID}": { "get": { "tags": ["Organization"], "summary": "Get department by ID", "parameters": [ { "name": "DepartmentID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Department details" } } } }, "/api/organization/workstation": { "get": { "tags": ["Organization"], "summary": "List workstations", "responses": { "200": { "description": "List of workstations" } } }, "post": { "tags": ["Organization"], "summary": "Create workstation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Workstation" } } } }, "responses": { "201": { "description": "Workstation created successfully" } } }, "patch": { "tags": ["Organization"], "summary": "Update workstation", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Workstation" } } } }, "responses": { "200": { "description": "Workstation updated successfully" } } }, "delete": { "tags": ["Organization"], "summary": "Delete workstation (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["WorkstationID"], "properties": { "WorkstationID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Workstation deleted successfully" } } } }, "/api/organization/workstation/{WorkstationID}": { "get": { "tags": ["Organization"], "summary": "Get workstation by ID", "parameters": [ { "name": "WorkstationID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Workstation details" } } } }, "/api/valueset": { "get": { "tags": ["Value Set"], "summary": "List value sets", "parameters": [ { "name": "key", "in": "query", "schema": { "type": "string" }, "description": "Filter by value set key" } ], "responses": { "200": { "description": "List of value sets" } } }, "post": { "tags": ["Value Set"], "summary": "Refresh value sets", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "key": { "type": "string", "description": "Value set key to refresh" } } } } } }, "responses": { "200": { "description": "Value sets refreshed" } } } }, "/api/valueset/{key}": { "get": { "tags": ["Value Set"], "summary": "Get value set by key", "parameters": [ { "name": "key", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Value set details" } } } }, "/api/valueset/items": { "get": { "tags": ["Value Set"], "summary": "List value set items", "parameters": [ { "name": "key", "in": "query", "schema": { "type": "string" }, "description": "Filter by value set key" } ], "responses": { "200": { "description": "List of value set items" } } }, "post": { "tags": ["Value Set"], "summary": "Create value set item", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "ValueSetID": { "type": "integer" }, "Value": { "type": "string" }, "Label": { "type": "string" }, "Sequence": { "type": "integer" } } } } } }, "responses": { "201": { "description": "Item created successfully" } } } }, "/api/valueset/items/{ItemID}": { "get": { "tags": ["Value Set"], "summary": "Get value set item by ID", "parameters": [ { "name": "ItemID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Item details" } } }, "put": { "tags": ["Value Set"], "summary": "Update value set item", "parameters": [ { "name": "ItemID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "Value": { "type": "string" }, "Label": { "type": "string" }, "Sequence": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Item updated successfully" } } }, "delete": { "tags": ["Value Set"], "summary": "Delete value set item", "parameters": [ { "name": "ItemID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Item deleted successfully" } } } }, "/api/result/valueset": { "get": { "tags": ["Result Value Set"], "summary": "List result value sets", "description": "CRUD operations for result value sets", "responses": { "200": { "description": "List of result value sets" } } }, "post": { "tags": ["Result Value Set"], "summary": "Create result value set", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValueSet" } } } }, "responses": { "201": { "description": "Value set created successfully" } } } }, "/api/result/valueset/{ValueSetID}": { "get": { "tags": ["Result Value Set"], "summary": "Get result value set by ID", "parameters": [ { "name": "ValueSetID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Value set details" } } }, "put": { "tags": ["Result Value Set"], "summary": "Update result value set", "parameters": [ { "name": "ValueSetID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValueSet" } } } }, "responses": { "200": { "description": "Value set updated successfully" } } }, "delete": { "tags": ["Result Value Set"], "summary": "Delete result value set", "parameters": [ { "name": "ValueSetID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Value set deleted successfully" } } } }, "/api/result/valuesetdef": { "get": { "tags": ["Result Value Set Definition"], "summary": "List value set definitions", "description": "CRUD operations for value set definitions", "responses": { "200": { "description": "List of value set definitions" } } }, "post": { "tags": ["Result Value Set Definition"], "summary": "Create value set definition", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValueSetDef" } } } }, "responses": { "201": { "description": "Definition created successfully" } } } }, "/api/result/valuesetdef/{VSetDefID}": { "get": { "tags": ["Result Value Set Definition"], "summary": "Get value set definition by ID", "parameters": [ { "name": "VSetDefID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Definition details" } } }, "put": { "tags": ["Result Value Set Definition"], "summary": "Update value set definition", "parameters": [ { "name": "VSetDefID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValueSetDef" } } } }, "responses": { "200": { "description": "Definition updated successfully" } } }, "delete": { "tags": ["Result Value Set Definition"], "summary": "Delete value set definition", "parameters": [ { "name": "VSetDefID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Definition deleted successfully" } } } }, "/api/counter": { "get": { "tags": ["Counter"], "summary": "List counters", "responses": { "200": { "description": "List of counters" } } }, "post": { "tags": ["Counter"], "summary": "Create counter", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Counter" } } } }, "responses": { "201": { "description": "Counter created successfully" } } }, "patch": { "tags": ["Counter"], "summary": "Update counter", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Counter" } } } }, "responses": { "200": { "description": "Counter updated successfully" } } }, "delete": { "tags": ["Counter"], "summary": "Delete counter (soft delete)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["CounterID"], "properties": { "CounterID": { "type": "integer" } } } } } }, "responses": { "200": { "description": "Counter deleted successfully" } } } }, "/api/counter/{CounterID}": { "get": { "tags": ["Counter"], "summary": "Get counter by ID", "parameters": [ { "name": "CounterID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Counter details" } } } }, "/api/areageo": { "get": { "tags": ["Area Geo"], "summary": "List geographic areas", "responses": { "200": { "description": "List of geographic areas" } } } }, "/api/areageo/provinces": { "get": { "tags": ["Area Geo"], "summary": "List provinces", "responses": { "200": { "description": "List of provinces" } } } }, "/api/areageo/cities": { "get": { "tags": ["Area Geo"], "summary": "List cities", "parameters": [ { "name": "province_id", "in": "query", "schema": { "type": "integer" }, "description": "Filter by province ID" } ], "responses": { "200": { "description": "List of cities" } } } }, "/api/demo/order": { "post": { "tags": ["Demo"], "summary": "Create demo order", "description": "Create a demo test order (no auth required)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "201": { "description": "Demo order created" } } } }, "/api/demo/orders": { "get": { "tags": ["Demo"], "summary": "List demo orders", "description": "List demo test orders (no auth required)", "responses": { "200": { "description": "List of demo orders" } } } }, "/api/edge/results": { "post": { "tags": ["Edge"], "summary": "Receive instrument results", "description": "Receive test results from tiny-edge middleware (no auth required)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "200": { "description": "Results received" } } } }, "/api/edge/orders": { "get": { "tags": ["Edge"], "summary": "Get orders for edge", "description": "Get orders for instrument integration (no auth required)", "responses": { "200": { "description": "Orders for edge" } } } }, "/api/edge/orders/{OrderID}/ack": { "post": { "tags": ["Edge"], "summary": "Acknowledge order", "description": "Acknowledge order receipt by edge (no auth required)", "parameters": [ { "name": "OrderID", "in": "path", "required": true, "schema": { "type": "integer" } } ], "responses": { "200": { "description": "Order acknowledged" } } } }, "/api/edge/status": { "post": { "tags": ["Edge"], "summary": "Receive instrument status", "description": "Receive status updates from instruments (no auth required)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } }, "responses": { "200": { "description": "Status received" } } } } }, "tags": [ { "name": "Authentication", "description": "User authentication endpoints" }, { "name": "Patient", "description": "Patient management endpoints" }, { "name": "Patient Visit", "description": "Patient visit management endpoints" }, { "name": "Order Test", "description": "Test order management endpoints" }, { "name": "Specimen", "description": "Specimen management endpoints" }, { "name": "Tests", "description": "Test definition endpoints" }, { "name": "Location", "description": "Location management endpoints" }, { "name": "Contact", "description": "Contact management endpoints" }, { "name": "Organization", "description": "Organization management endpoints" }, { "name": "Value Set", "description": "Value set library endpoints" }, { "name": "Result Value Set", "description": "Result-specific value set CRUD endpoints" }, { "name": "Result Value Set Definition", "description": "Value set definition CRUD endpoints" }, { "name": "Counter", "description": "Counter management endpoints" }, { "name": "Area Geo", "description": "Geographic area endpoints" }, { "name": "Demo", "description": "Demo/test endpoints (no auth)" }, { "name": "Edge", "description": "Instrument integration endpoints (no auth)" } ] }