94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { API_ENDPOINTS } from "@/api/config";
|
|
import { requestJson } from "@/api/http";
|
|
import { Change, FeatureCollection, Geometry } from "@/lib/useEditorState";
|
|
|
|
export type GeometriesBBoxQuery = {
|
|
minLng: number;
|
|
minLat: number;
|
|
maxLng: number;
|
|
maxLat: number;
|
|
time?: number;
|
|
entity_id?: string;
|
|
};
|
|
|
|
export type GeometryCreatePayload = {
|
|
geometry: Geometry;
|
|
time_start?: number | null;
|
|
time_end?: number | null;
|
|
binding?: string[];
|
|
entity_id?: string | null;
|
|
entity_ids?: string[];
|
|
};
|
|
|
|
export type GeometryUpdatePayload = {
|
|
geometry: Geometry;
|
|
time_start?: number | null;
|
|
time_end?: number | null;
|
|
binding?: string[];
|
|
entity_id?: string | null;
|
|
entity_ids?: string[];
|
|
};
|
|
|
|
export type GeometryCreateResponse = {
|
|
id: string;
|
|
};
|
|
|
|
export type BatchSaveResponse = {
|
|
success: boolean;
|
|
applied: number;
|
|
};
|
|
|
|
function buildBBoxQueryString(params: GeometriesBBoxQuery): string {
|
|
const query = new URLSearchParams({
|
|
minLng: String(params.minLng),
|
|
minLat: String(params.minLat),
|
|
maxLng: String(params.maxLng),
|
|
maxLat: String(params.maxLat),
|
|
});
|
|
|
|
if (params.time !== undefined) {
|
|
query.set("time", String(params.time));
|
|
}
|
|
|
|
if (params.entity_id) {
|
|
query.set("entity_id", params.entity_id);
|
|
}
|
|
|
|
return query.toString();
|
|
}
|
|
|
|
export async function fetchGeometriesByBBox(params: GeometriesBBoxQuery): Promise<FeatureCollection> {
|
|
const url = `${API_ENDPOINTS.geometries}?${buildBBoxQueryString(params)}`;
|
|
return requestJson<FeatureCollection>(url);
|
|
}
|
|
|
|
export async function saveGeometryBatchChanges(changes: Change[]): Promise<BatchSaveResponse> {
|
|
return requestJson<BatchSaveResponse>(API_ENDPOINTS.geometriesBatch, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ changes }),
|
|
});
|
|
}
|
|
|
|
export async function createGeometry(payload: GeometryCreatePayload): Promise<GeometryCreateResponse> {
|
|
return requestJson<GeometryCreateResponse>(API_ENDPOINTS.geometries, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(payload),
|
|
});
|
|
}
|
|
|
|
export async function updateGeometry(id: string | number, payload: GeometryUpdatePayload): Promise<{ success: boolean }> {
|
|
return requestJson<{ success: boolean }>(`${API_ENDPOINTS.geometries}/${id}`, {
|
|
method: "PUT",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(payload),
|
|
});
|
|
}
|
|
|
|
export async function deleteGeometry(id: string | number): Promise<{ success: boolean }> {
|
|
return requestJson<{ success: boolean }>(`${API_ENDPOINTS.geometries}/${id}`, {
|
|
method: "DELETE",
|
|
});
|
|
}
|