AlpuraOfflineUtil – Guía de uso
Este documento explica cómo usar la utilidad AlpuraOfflineUtil de la librería de @alpura/core, la cual provee un operador de RxJS para gestionar peticiones HTTP en modo offline.
📁 Importaciones necesarias
En tu servicio, importa AlpuraOfflineUtil desde la librería de @alpura/core.
import { AlpuraOfflineUtil } from "@alpura/core";
🧩 Método Disponible: syncWhenOffline
La utilidad expone un método estático syncWhenOffline que funciona como un operador de RxJS. Su propósito es interceptar una petición HTTP y guardarla localmente si no hay conexión a internet.
Firma
AlpuraOfflineUtil.syncWhenOffline<T>(isOnline: boolean, requestData: object)
isOnline: Un booleano que indica el estado actual de la conexión.requestData: Un objeto con los detalles de la petición a guardar (método, URL, cuerpo, etc.).
Comportamiento
- Si
isOnlineestrue: El operador no hace nada y deja que la petición HTTP continúe hacia el servidor. - Si
isOnlineesfalse: El operador intercepta la llamada, la guarda en la base de datos local (usandoAlpuraPouchDbUtil) y devuelve unObservablecon una respuesta mock que notifica al suscriptor que la operación fue guardada.
🧩 Método Disponible: syncCacheCatalog
Esta utilidad también ofrece un operador de RxJS llamado syncCacheCatalog. Su función es cachear respuestas de peticiones HTTP (generalmente catálogos o datos que no cambian a menudo) para poder consultarlas cuando no hay conexión a internet.
Firma
AlpuraOfflineUtil.syncCacheCatalog<T>(isOnline: boolean, requestData: IRequestCatalogOffline)
pouchDbKey: Unstringque funciona como identificador único para guardar y recuperar el catálogo en la base de datos local.isOnline: Un booleano que indica el estado de la conexión.size: (Opcional) Número de elementos a devolver en la paginación.offset: (Opcional) Desplazamiento o página inicial para la paginación.requestData: Un objeto con los detalles de la petición (solo el parametrourldel requestData es obligatorio)
Comportamiento
- Si
isOnlineestrue: El operador deja que la petición HTTP se complete. Cuando recibe una respuesta exitosa, la guarda (o actualiza) en la base de datos local usando lapouchDbKeyproporcionada. - Si
isOnlineesfalse: El operador intercepta la llamada y busca en la base de datos local un catálogo que coincida con lapouchDbKey.- Si lo encuentra: Devuelve un
Observablecon los datos cacheados. - Si no lo encuentra: Devuelve un
Observablecon un error, notificando que no hay conexión ni datos en caché.
- Si lo encuentra: Devuelve un
🧩 Ejemplos de uso
Para peticiones de escritura (POST, PUT, DELETE)
El operador syncWhenOffline se debe colocar dentro del .pipe() de una llamada HttpClient, típicamente en métodos que modifican datos.
import { HttpClient } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { AlpuraOfflineUtil } from '@alpura/core';
import { AlpuraStorageViewModel } from '@alpura/commons';
import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class DataService {
private http = inject(HttpClient);
private readonly storage = inject(AlpuraStorageViewModel);
createItem(itemPayload: any): Observable<any> {
const url = 'https://api.example.com/items';
// obtiene el estado de conexión
const isOnline = this.storage.getStorageMap('IS_ONLINE') as boolean;
return this.http.post(url, itemPayload).pipe(
AlpuraOfflineUtil.syncWhenOffline(isOnline, {
method: 'POST',
url,
body: itemPayload,
})
);
}
}
Para cacheo de catálogos (GET)
El operador syncCacheCatalog se utiliza en el .pipe() de llamadas HttpClient que obtienen datos que pueden ser cacheados.
import { HttpClient } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { AlpuraOfflineUtil } from '@alpura/core';
import { AlpuraStorageViewModel } from '@alpura/commons';
import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class CatalogService {
private http = inject(HttpClient);
private readonly storage = inject(AlpuraStorageViewModel);
getRoles(): Observable<any[]> {
const url = 'https://api.example.com/roles';
const POUCH_DB_KEY = 'catalog_roles';
// obtiene el estado de conexión
const isOnline = this.storage.getStorageMap('IS_ONLINE') as boolean;
return this.http.get<any[]>(url).pipe(
AlpuraOfflineUtil.syncCacheCatalog(POUCH_DB_KEY, isOnline)
);
}
}
🚀 Resultado esperado
La utilidad AlpuraOfflineUtil centraliza la lógica para gestionar peticiones HTTP cuando la aplicación está offline. Al usarla en el pipe de RxJS, se asegura que:
- Las operaciones de escritura (POST, PUT, DELETE) no se pierdan y queden en una cola para ser sincronizadas cuando la conexión se restablezca (
syncWhenOffline). - Los datos de solo lectura (GET), como catálogos, puedan ser cacheados y consultados sin conexión (
syncCacheCatalog).
Esto proporciona una experiencia de usuario más fluida y robusta frente a problemas de conectividad.