|
|
if(scopes.includes('learning')&&directLearningSync&&directLearningSync.state==='current')return{state:'current',lastSuccessAt:directLearningSync.lastSuccessAt,lagSeconds:0,pending:0,learningSource:'legacy-pull',learningPulled:number(directLearningSync.pulled),learningWritten:number(directLearningSync.written),partial:scopes.some((scope)=>!['learning','reading'].includes(scope))};
|
|
if(scopes.includes('learning')&&directLearningSync&&directLearningSync.state==='current')return{state:'current',lastSuccessAt:directLearningSync.lastSuccessAt,lagSeconds:0,pending:0,learningSource:'legacy-pull',learningPulled:number(directLearningSync.pulled),learningWritten:number(directLearningSync.written),partial:scopes.some((scope)=>!['learning','reading'].includes(scope))};
|
|
|
const datasetByScope={learning:'learning-records',courses:'course-bindings',appointments:'appointments',review:'memory-records',account:'lessons'},datasets=[...new Set(scopes.map((scope)=>datasetByScope[scope]).filter(Boolean))];if(!datasets.length)return{state:'current',lastSuccessAt:'',lagSeconds:0,pending:0};
|
|
const datasetByScope={learning:'learning-records',courses:'course-bindings',appointments:'appointments',review:'memory-records',account:'lessons'},datasets=[...new Set(scopes.map((scope)=>datasetByScope[scope]).filter(Boolean))];if(!datasets.length)return{state:'current',lastSuccessAt:'',lagSeconds:0,pending:0};
|
|
|
try{const rows=await Psql.query('SELECT "dataset","state","lastSuccessAt" FROM "LegacySyncCheckpoint" WHERE "company"=$1 AND "dataset"=ANY($2::text[])',[DEFAULT_COMPANY_ID,datasets]),pendingRow=await Psql.one('SELECT COUNT(*)::int AS total FROM "LegacySyncDeadLetter" WHERE "company"=$1 AND "dataset"=ANY($2::text[]) AND COALESCE("resolved",FALSE)=FALSE',[DEFAULT_COMPANY_ID,datasets]).catch(()=>({total:0})),lastSuccessAt=rows.map((row)=>legacyLearningIso(row.lastSuccessAt)).filter(Boolean).sort()[0]||'',lagSeconds=lastSuccessAt?Math.max(0,Math.floor((Date.now()-new Date(lastSuccessAt).getTime())/1000)):null,pending=number(pendingRow.total),healthy=rows.length===datasets.length&&rows.every((row)=>['healthy','catching_up'].includes(String(row.state||'').trim()))&&lagSeconds!==null&&lagSeconds<=10&&!pending;return{state:healthy?'current':'delayed',lastSuccessAt,lagSeconds,pending};}catch(_){return{state:'unavailable',lastSuccessAt:'',lagSeconds:null,pending:0};}
|
|
try{const rows=await Psql.query('SELECT "dataset","state","lastSuccessAt" FROM "LegacySyncCheckpoint" WHERE "company"=$1 AND "dataset"=ANY($2::text[])',[DEFAULT_COMPANY_ID,datasets]),pendingRow=await Psql.one('SELECT COUNT(*)::int AS total FROM "LegacySyncDeadLetter" WHERE "company"=$1 AND "dataset"=ANY($2::text[]) AND COALESCE("resolved",FALSE)=FALSE',[DEFAULT_COMPANY_ID,datasets]).catch(()=>({total:0})),lastSuccessAt=rows.map((row)=>legacyLearningIso(row.lastSuccessAt)).filter(Boolean).sort()[0]||'',lagSeconds=lastSuccessAt?Math.max(0,Math.floor((Date.now()-new Date(lastSuccessAt).getTime())/1000)):null,pending=number(pendingRow.total),healthy=rows.length===datasets.length&&rows.every((row)=>['healthy','catching_up'].includes(String(row.state||'').trim()))&&lagSeconds!==null&&lagSeconds<=10&&!pending;return{state:healthy?'current':'delayed',lastSuccessAt,lagSeconds,pending};}catch(_){return{state:'unavailable',lastSuccessAt:'',lagSeconds:null,pending:0};}
|