2baf29b3ae
Deliver encrypted health zone, observation API, baseline maturity pipeline, page-data bindings, and H5/WeChat channel integration for health P0. Co-authored-by: Cursor <cursoragent@cursor.com>
131 lines
5.1 KiB
JavaScript
131 lines
5.1 KiB
JavaScript
import { createInMemoryHealthObservationStore } from './health-observation-store.mjs';
|
|
import { createInMemoryHealthDocumentStore } from './health-document-store.mjs';
|
|
import { createInMemoryHealthObservationDraftStore } from './health-observation-draft-store.mjs';
|
|
import { createInMemoryHealthBaselineStore } from './health-baseline-store.mjs';
|
|
import { createInMemoryHealthEventStore } from './health-event-store.mjs';
|
|
import { createPageDataHealthObservationStore } from './health-page-data-observation-store.mjs';
|
|
import { createPageDataHealthDocumentStore } from './health-page-data-document-store.mjs';
|
|
import { createPageDataHealthObservationDraftStore } from './health-page-data-draft-store.mjs';
|
|
import { createPageDataHealthBaselineStore } from './health-page-data-baseline-store.mjs';
|
|
import { createPageDataHealthEventStore } from './health-page-data-event-store.mjs';
|
|
import { createHealthObservationService } from './health-observation-service.mjs';
|
|
import { createHealthObservationDraftService } from './health-observation-draft-service.mjs';
|
|
import { createHealthShareService } from './health-share-service.mjs';
|
|
import { computeHealthBaselines } from './health-baseline-engine.mjs';
|
|
import { evaluateHealthEvents } from './health-event-engine.mjs';
|
|
|
|
function shouldUsePageDataHealthStore(env = process.env) {
|
|
if (env.MEMIND_HEALTH_PAGE_DATA === '0') return false;
|
|
if (env.MEMIND_HEALTH_PAGE_DATA === '1') return true;
|
|
if (env.NODE_TEST_CONTEXT) return false;
|
|
const backend = String(env.MINDSPACE_USERDATA_BACKEND ?? '').trim().toLowerCase();
|
|
return backend === 'postgres';
|
|
}
|
|
|
|
export function createHealthDataRuntime(deps = {}) {
|
|
const env = deps.env ?? process.env;
|
|
const usePageData = deps.usePageData ?? shouldUsePageDataHealthStore(env);
|
|
const resolveWorkspaceRoot =
|
|
deps.resolveWorkspaceRoot
|
|
?? (async (userId) => {
|
|
const auth = deps.getUserAuth?.();
|
|
if (!auth?.resolveWorkingDir) return null;
|
|
return auth.resolveWorkingDir(userId);
|
|
});
|
|
|
|
let observationStore = createInMemoryHealthObservationStore();
|
|
let documentStore = createInMemoryHealthDocumentStore();
|
|
let draftStore = createInMemoryHealthObservationDraftStore();
|
|
let baselineStore = createInMemoryHealthBaselineStore();
|
|
let eventStore = createInMemoryHealthEventStore();
|
|
|
|
if (usePageData) {
|
|
observationStore = createPageDataHealthObservationStore({ resolveWorkspaceRoot, logger: deps.logger });
|
|
documentStore = createPageDataHealthDocumentStore({ resolveWorkspaceRoot, logger: deps.logger });
|
|
draftStore = createPageDataHealthObservationDraftStore({ resolveWorkspaceRoot, logger: deps.logger });
|
|
baselineStore = createPageDataHealthBaselineStore({ resolveWorkspaceRoot, logger: deps.logger });
|
|
eventStore = createPageDataHealthEventStore({ resolveWorkspaceRoot, logger: deps.logger });
|
|
}
|
|
|
|
let observationService = createHealthObservationService({ store: observationStore });
|
|
let draftService = createHealthObservationDraftService({
|
|
draftStore,
|
|
observationService,
|
|
});
|
|
let shareService = createHealthShareService({
|
|
observationService,
|
|
baselineEngine: { computeHealthBaselines },
|
|
eventEngine: { evaluateHealthEvents },
|
|
});
|
|
|
|
function rebuildServices() {
|
|
observationService = createHealthObservationService({ store: observationStore });
|
|
draftService = createHealthObservationDraftService({
|
|
draftStore,
|
|
observationService,
|
|
});
|
|
shareService = createHealthShareService({
|
|
observationService,
|
|
baselineEngine: { computeHealthBaselines },
|
|
eventEngine: { evaluateHealthEvents },
|
|
});
|
|
}
|
|
|
|
return {
|
|
get observationStore() {
|
|
return observationStore;
|
|
},
|
|
get documentStore() {
|
|
return documentStore;
|
|
},
|
|
get draftStore() {
|
|
return draftStore;
|
|
},
|
|
get baselineStore() {
|
|
return baselineStore;
|
|
},
|
|
get eventStore() {
|
|
return eventStore;
|
|
},
|
|
get observationService() {
|
|
return observationService;
|
|
},
|
|
get draftService() {
|
|
return draftService;
|
|
},
|
|
get shareService() {
|
|
return shareService;
|
|
},
|
|
get storageBackend() {
|
|
return usePageData ? 'page_data' : 'memory';
|
|
},
|
|
upgradeToPageData(nextDeps = {}) {
|
|
if (!shouldUsePageDataHealthStore(nextDeps.env ?? env)) return false;
|
|
const resolver = nextDeps.resolveWorkspaceRoot ?? resolveWorkspaceRoot;
|
|
observationStore = createPageDataHealthObservationStore({
|
|
resolveWorkspaceRoot: resolver,
|
|
logger: nextDeps.logger ?? deps.logger,
|
|
});
|
|
documentStore = createPageDataHealthDocumentStore({
|
|
resolveWorkspaceRoot: resolver,
|
|
logger: nextDeps.logger ?? deps.logger,
|
|
});
|
|
draftStore = createPageDataHealthObservationDraftStore({
|
|
resolveWorkspaceRoot: resolver,
|
|
logger: nextDeps.logger ?? deps.logger,
|
|
});
|
|
baselineStore = createPageDataHealthBaselineStore({
|
|
resolveWorkspaceRoot: resolver,
|
|
logger: nextDeps.logger ?? deps.logger,
|
|
});
|
|
eventStore = createPageDataHealthEventStore({
|
|
resolveWorkspaceRoot: resolver,
|
|
logger: nextDeps.logger ?? deps.logger,
|
|
});
|
|
rebuildServices();
|
|
return true;
|
|
},
|
|
rebuildServices,
|
|
};
|
|
}
|