Files
Malackathon-frontend/src/helpers/Api.ts
2024-10-17 20:23:10 +02:00

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;
}
}