{"id":1832,"date":"2026-01-20T12:24:12","date_gmt":"2026-01-20T12:24:12","guid":{"rendered":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/?p=1832"},"modified":"2026-02-09T07:59:06","modified_gmt":"2026-02-09T07:59:06","slug":"telemedicine-architecture","status":"publish","type":"post","link":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/kivicare-telemed-addon\/documentation\/core-concepts-telemed-addon\/telemedicine-architecture\/","title":{"rendered":"Telemedicine Architecture"},"content":{"rendered":"<div class=\"nolwrap\">\n<p>The KiviCare Telemedicine Addon is built on a modular provider-based architecture. This ensures that while Zoom is the primary focus, the system is flexible enough to handle various video backends.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\uddfa\ufe0f System Overview<\/h2>\n\n\n\n<p>The integration consists of three main layers:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. The Provider Layer (<code>app\/telemed\/<\/code>)<\/h3>\n\n\n\n<p>The <code>KCTZoom<\/code> class extends the <code>KCAbstractTelemedProvider<\/code> from KiviCare Core. It encapsulates all vendor-specific logic:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API endpoint management.<\/li>\n\n\n\n<li>Formatting data for Zoom\u2019s specific REST requirements.<\/li>\n\n\n\n<li>Token lifecycle management (Refresh\/Revoke).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. The Persistence Layer (<code>app\/models\/<\/code>)<\/h3>\n\n\n\n<p>This layer handles the mapping between WordPress and Zoom.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mapping Table:<\/strong> Stores the Zoom Meeting ID, UUID, and unique URLs against a KiviCare Appointment ID.<\/li>\n\n\n\n<li><strong>User Meta:<\/strong> Stores individual doctor tokens and configuration preferences.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. The Controller Layer (<code>app\/controllers\/api\/<\/code>)<\/h3>\n\n\n\n<p>The <code>KCTZoomController<\/code> exposes REST endpoints used by the React-based frontend:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GET \/authorize<\/code>: Generates the OAuth URL.<\/li>\n\n\n\n<li><code>GET \/callback<\/code>: Handles the redirect from Zoom and saves tokens.<\/li>\n\n\n\n<li><code>PUT \/test-connection<\/code>: Validates credentials in real-time.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd04 Interaction Diagram<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sequenceDiagram\n    participant P as Patient\/Doctor\n    participant WP as WordPress (KiviCare)\n    participant Z as Zoom API\n\n    P-&gt;&gt;WP: Creates Appointment\n    WP-&gt;&gt;Z: POST \/users\/me\/meetings\n    Z--&gt;&gt;WP: Returns Meeting JSON (Join\/Start URLs)\n    WP-&gt;&gt;WP: Save to kc_appointment_zoom_mappings\n    WP--&gt;&gt;P: Displays \"Start\/Join\" Button<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 File Structure Highlights<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>app\/telemed\/KCTZoom.php<\/code><\/strong>: The &#8220;Brain&#8221; of the integration.<\/li>\n\n\n\n<li><strong><code>app\/database\/migrations\/<\/code><\/strong>: Defines the SQL schema for meeting storage.<\/li>\n\n\n\n<li><strong><code>app\/controllers\/api\/KCTZoomController.php<\/code><\/strong>: The entry point for all frontend requests.<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>The KiviCare Telemedicine Addon is built on a modular provider-based architecture. This ensures that while Zoom is the primary focus, the system is flexible enough to handle various video backends. \ud83d\uddfa\ufe0f System Overview The integration consists of three main layers: 1. The Provider Layer (app\/telemed\/) The KCTZoom class extends the KCAbstractTelemedProvider from KiviCare Core. It [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"parent":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55],"tags":[],"class_list":["post-1832","post","type-post","status-publish","format-standard","hentry","category-core-concepts-telemed-addon"],"featured_image_src":null,"author_info":{"display_name":"wordpressadminiq","author_link":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/author\/wordpressadminiq\/"},"_links":{"self":[{"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/posts\/1832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/comments?post=1832"}],"version-history":[{"count":2,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/posts\/1832\/revisions"}],"predecessor-version":[{"id":2959,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/posts\/1832\/revisions\/2959"}],"wp:attachment":[{"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/media?parent=1832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/categories?post=1832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/documentation.iqonic.design\/kivicare-wordpress\/wp-json\/wp\/v2\/tags?post=1832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}