75 lines
1.7 KiB
TypeScript
75 lines
1.7 KiB
TypeScript
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<Embalse[]> {
|
|
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<Embalse[]> {
|
|
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<Embalse[]> {
|
|
return Api._makeReq(`/embalsesCercanos/${lat}/${lon}`);
|
|
}
|
|
|
|
/**
|
|
* Método privado para enviar solicitudes
|
|
* @param endpoint Endpoint requerido
|
|
* @returns Lista de elementos
|
|
*/
|
|
private static async _makeReq<T>(endpoint: string): Promise<T[]> {
|
|
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<T>;
|
|
|
|
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;
|
|
}
|
|
}
|