Syasya fce26a2bc4
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m56s
amend api endpoints
2025-08-26 15:10:14 +08:00

89 lines
2.3 KiB
TypeScript

// app/utils/api.ts
export interface TimeSeriesEntry {
time: string;
value: number;
}
export interface TimeSeriesResponse {
consumption: TimeSeriesEntry[];
generation: TimeSeriesEntry[];
}
const API_URL =
process.env.NEXT_PUBLIC_FASTAPI_URL ;
export const crmapi = {
getProjects: async () => {
const res = await fetch(`${API_URL}/crm/projects`, {
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
},
};
export async function fetchPowerTimeseries(
site: string,
start: string,
end: string
): Promise<TimeSeriesResponse> { // <-- Change here
const params = new URLSearchParams({ site, start, end });
const res = await fetch(`${API_URL}/power-timeseries?${params.toString()}`);
if (!res.ok) {
throw new Error(`Failed to fetch data: ${res.status}`);
}
const json = await res.json();
console.log(`🔍 API response from /power-timeseries?${params.toString()}:`, json); // ✅ log here
return json; // <-- This is a single object, not an array
}
export async function fetchForecast(
lat: number,
lon: number,
dec: number,
az: number,
kwp: number
): Promise<{ time: string; forecast: number }[]> {
const query = new URLSearchParams({
lat: lat.toString(),
lon: lon.toString(),
dec: dec.toString(),
az: az.toString(),
kwp: kwp.toString(),
}).toString();
const res = await fetch(`${API_URL}/forecast?${query}`);
if (!res.ok) throw new Error("Failed to fetch forecast");
return res.json();
}
export type MonthlyKPI = {
site: string;
month: string; // "YYYY-MM"
yield_kwh: number | null;
consumption_kwh: number | null;
grid_draw_kwh: number | null;
efficiency: number | null; // 0..1 (fraction)
peak_demand_kw: number | null;
avg_power_factor: number | null; // 0..1
load_factor: number | null; // 0..1
error?: string;
};
const API = process.env.NEXT_PUBLIC_FASTAPI_URL;
export async function fetchMonthlyKpi(params: {
site: string;
month: string; // "YYYY-MM"
consumption_topic?: string;
generation_topic?: string;
}): Promise<MonthlyKPI> {
const qs = new URLSearchParams(params as Record<string, string>);
const res = await fetch(`${API}/kpi/monthly?${qs.toString()}`, { cache: "no-store" });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}