- ✅ Ticket 1.1: Estructura Clean Architecture en backend - ✅ Ticket 1.2: Schemas Zod compartidos - ✅ Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares) - ✅ Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares) - ✅ Ticket 1.5: Eliminación de duplicidades (~50 líneas) Cambios principales: - Creada estructura Clean Architecture en backend/src/ - Schemas Zod compartidos en backend/src/shared/schemas/ - Refactorización modular de drugs y procedures - Utilidades genéricas en src/utils/ (filter, validation) - Eliminados scripts obsoletos y documentación antigua - Corregidos errores: QueryClient, import test-error-handling - Build verificado y funcionando correctamente
2 lines
2.1 KiB
JavaScript
2 lines
2.1 KiB
JavaScript
const g="guia-tes-content";const c="content-pack";let i=null;async function d(){return i||new Promise((o,n)=>{const e=indexedDB.open(g,1);e.onerror=()=>{console.warn("[IndexedDB] Error abriendo base de datos:",e.error),n(e.error)},e.onsuccess=()=>{i=e.result,o(i)},e.onupgradeneeded=r=>{const t=r.target.result;t.objectStoreNames.contains(c)||t.createObjectStore(c,{keyPath:"key"}).createIndex("timestamp","timestamp",{unique:!1})}})}async function k(o){try{const r=(await d()).transaction([c],"readwrite").objectStore(c),t={key:"content_pack",value:o,timestamp:Date.now()};await new Promise((a,u)=>{const s=r.put(t);s.onsuccess=()=>a(),s.onerror=()=>u(s.error)})}catch(n){console.warn("[IndexedDB] Error guardando Content Pack:",n);try{localStorage.setItem("content_pack",JSON.stringify(o)),localStorage.setItem("content_pack_time",Date.now().toString())}catch(e){console.error("[IndexedDB] Error en fallback a localStorage:",e)}}}async function b(o){try{const r=(await d()).transaction([c],"readonly").objectStore(c),t=await new Promise((s,m)=>{const l=r.get("content_pack");l.onsuccess=()=>s(l.result||null),l.onerror=()=>m(l.error)});if(!t)return null;const a=o||1440*60*1e3;return Date.now()-t.timestamp>a?(await S(),null):t.value}catch(n){console.warn("[IndexedDB] Error obteniendo Content Pack:",n);try{const e=localStorage.getItem("content_pack");if(!e)return null;const r=localStorage.getItem("content_pack_time");if(r){const t=o||864e5;if(Date.now()-parseInt(r)>t)return localStorage.removeItem("content_pack"),localStorage.removeItem("content_pack_time"),null}return JSON.parse(e)}catch(e){return console.error("[IndexedDB] Error en fallback a localStorage:",e),null}}}async function S(){try{const e=(await d()).transaction([c],"readwrite").objectStore(c);await new Promise((r,t)=>{const a=e.delete("content_pack");a.onsuccess=()=>r(),a.onerror=()=>t(a.error)})}catch(o){console.warn("[IndexedDB] Error eliminando Content Pack:",o);try{localStorage.removeItem("content_pack"),localStorage.removeItem("content_pack_time")}catch(n){console.error("[IndexedDB] Error en fallback a localStorage:",n)}}}export{S as deleteContentPack,b as getContentPack,d as initDB,k as saveContentPack};
|