@eka-care/patient-ts-sdk
Version:
TypeScript SDK for Trinity Patient Profile Management System
149 lines (148 loc) • 4.33 kB
JavaScript
/**
* Data loading service for synchronizing minified patient data
*/
import { HttpClient } from '../client';
import { MinifiedMethods } from '../methods/minified';
import { IndexedDBService } from './indexeddb';
/**
* Service for loading minified patient data into IndexedDB
*/
export class DataLoaderService {
constructor(config) {
this.isLoading = false;
this.abortController = null;
const client = new HttpClient(config);
this.minifiedMethods = new MinifiedMethods(client);
this.indexedDB = new IndexedDBService(config.workspaceId);
}
/**
* Initialize the data loader service
*/
async init() {
// IndexedDB is already initialized in constructor,
// but ensure it's properly initialized
await this.indexedDB.init();
}
/**
* Check if data loading is in progress
*/
isLoadingData() {
return this.isLoading;
}
/**
* Check if local data exists
*/
async hasLocalData() {
return await this.indexedDB.hasData();
}
/**
* Load all minified patient data into IndexedDB
*/
async loadAllData(callbacks) {
if (this.isLoading) {
throw new Error('Data loading is already in progress');
}
this.isLoading = true;
this.abortController = new AbortController();
try {
await this.syncAllPages(callbacks);
if (callbacks?.onComplete) {
callbacks.onComplete();
}
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
if (callbacks?.onError) {
callbacks.onError(errorMessage);
}
throw error;
}
finally {
this.isLoading = false;
this.abortController = null;
}
}
/**
* Stop data loading
*/
stopLoading() {
if (this.abortController) {
this.abortController.abort();
}
this.isLoading = false;
}
/**
* Clear all local data
*/
async clearLocalData() {
await this.indexedDB.clearData();
}
/**
* Get IndexedDB service for direct access
*/
getIndexedDB() {
return this.indexedDB;
}
/**
* Close database connection
*/
close() {
this.indexedDB.close();
}
/**
* Sync all pages of minified data
*/
async syncAllPages(callbacks) {
let page = 1;
let totalLoaded = 0;
const limit = 1000;
while (true) {
if (this.abortController?.signal.aborted) {
throw new Error('Data loading was aborted');
}
// Fetch page data
const patientsResponse = await this.minifiedMethods.getPage(page, limit);
const patients = patientsResponse?.data || [];
let localPatients = [];
if (patients.length > 0) {
// Convert to local format
localPatients = patients.map((p) => ({
oid: p.oid,
u_ate: p.u_ate,
fln: p.fln,
mobile: p.mobile,
username: p.username,
gen: p.gen,
dob: p.dob,
is_age: p.is_age,
abha: p.abha,
}));
}
// Store in IndexedDB
await this.indexedDB.batchStore(localPatients);
totalLoaded += patients.length;
// Report progress
if (callbacks?.onProgress) {
callbacks.onProgress({
progress: totalLoaded,
total: totalLoaded, // We don't know total until complete
isComplete: false,
});
}
// Move to next page
page++;
// If we got less than limit, we're done
if (patients.length < limit) {
break;
}
}
// Final progress update
if (callbacks?.onProgress) {
callbacks.onProgress({
progress: totalLoaded,
total: totalLoaded,
isComplete: true,
});
}
}
}