Просмотр исходного кода

fix(mobile): restore overview and review data

彭峰 1 неделя назад
Родитель
Сommit
493a0d8239
2 измененных файлов с 2 добавлено и 1 удалено
  1. 1 1
      scripts/deploy-admin-functions.mjs
  2. 1 0
      scripts/tests/legacy-learning-pull.test.mjs

+ 1 - 1
scripts/deploy-admin-functions.mjs

@@ -2726,7 +2726,7 @@ async function appLiveScopeVersion(scope,targetId,current){
 }
 async function appLiveSyncStatus(scopes,directLearningSync){
   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 config=syncConfig();if(!config.baseUrl||!config.keyId||!config.secret)return{state:'unavailable',lastSuccessAt:'',lagSeconds:null,pending:0};
+  const env=typeof process!=='undefined'&&process.env?process.env:{},configured=Boolean(String(env.XIAOSHU_LEGACY_SYNC_BASE_URL||'').trim()&&String(env.XIAOSHU_LEGACY_SYNC_KEY_ID||'').trim()&&String(env.XIAOSHU_LEGACY_SYNC_SECRET||'').trim());if(!configured)return{state:'unavailable',lastSuccessAt:'',lagSeconds:null,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};}
 }

+ 1 - 0
scripts/tests/legacy-learning-pull.test.mjs

@@ -99,4 +99,5 @@ test('移动网关实时版本逻辑不引用运营网关的局部工具函数',
   assert.ok(liveSource, '未找到移动网关实时版本实现');
   assert.doesNotMatch(liveSource, /\btext\(/);
   assert.doesNotMatch(liveSource, /\bdateIso\(/);
+  assert.doesNotMatch(liveSource, /\bsyncConfig\(/);
 });