import ApiResponse from "../interfaces/ApiResponse"; import Embalse from "../interfaces/Embalse"; import Env from "./Env"; /** * Wrapper API de la REST de Oracle DB */ export default class Api { /** * Conseguir todos los embalses */ static async embalses(): Promise { return Api._makeReq('/embalses'); } /** * Conseguir embalse a partir de su id * @param id ID del embalse * @returns Lista de embalses que coinciden con la búsqueda */ static async embalseById(id: string): Promise { return Api._makeReq(`/embalses/${id}`); } /** * Conseguir todos los embalses cercanos * @param lat Latitud * @param lon Longitud * @returns Lista de embalses cercanos */ static async embalsesNearby(lat: string, lon: string): Promise { return Api._makeReq(`/embalsesCercanos/${lat}/${lon}`); } /** * Método privado para enviar solicitudes * @param endpoint Endpoint requerido * @returns Lista de elementos */ private static async _makeReq(endpoint: string): Promise { let hasMore = true; let url = Env.api_base() + endpoint; let data: T[] = []; while (hasMore) { const res = await fetch(url); if (!res.ok) { throw new Error("Api error"); } const json = await res.json() as ApiResponse; data.push(...json.items); hasMore = json.hasMore; if (hasMore) { let found = false; let i = 0; while (!found) { if (json.links[i].rel === 'next') { url = json.links[i].href; found = true; } i++; } } } return data; } }