245 lines
13 KiB
TypeScript
245 lines
13 KiB
TypeScript
import { apiGet, apiMultipart, apiPost } from './client'
|
|
import type {
|
|
DatasetCreateResponse,
|
|
DatasetListResponse,
|
|
RasterMetadataResponse,
|
|
RasterInspectResponse,
|
|
RasterStatsResponse,
|
|
RasterPreviewResponse,
|
|
JobRead,
|
|
VectorBBoxResponse,
|
|
VectorStatsResponse,
|
|
VectorSelectionRequest,
|
|
VectorSelectionDeriveRequest,
|
|
VectorSelectionResponse,
|
|
VectorSummary,
|
|
RasterNdviRequest,
|
|
RasterNdwiRequest,
|
|
RasterNdbiRequest,
|
|
OrthophotoAcquireRequest,
|
|
OrthophotoProductRead,
|
|
DhmvAcquireRequest,
|
|
FloodHazardAcquireRequest,
|
|
FloodHazardProductRead,
|
|
FloodHazardSelectionResponse,
|
|
BathymetryProfileAcquireRequest,
|
|
BathymetrySourceRead,
|
|
DhmvProductRead,
|
|
TerrainSelectionResponse,
|
|
ThematicRasterAcquireRequest,
|
|
ThematicRasterProductRead,
|
|
ThematicRasterSelectionResponse,
|
|
SourceFreshnessReport,
|
|
SourceCatalogProbeReport,
|
|
GrbRefreshPlan,
|
|
} from '../../types'
|
|
|
|
const DATASET_PAGE_SIZE = 200
|
|
|
|
async function listProjectDatasets(projectId: string): Promise<DatasetListResponse> {
|
|
const items: DatasetCreateResponse[] = []
|
|
let offset = 0
|
|
let total: number | null = null
|
|
do {
|
|
const page = await apiGet<DatasetListResponse>(
|
|
`/api/v1/projects/${projectId}/datasets?limit=${DATASET_PAGE_SIZE}&offset=${offset}`,
|
|
)
|
|
if (total === null) {
|
|
total = page.total
|
|
} else if (page.total !== total) {
|
|
throw new Error('De datasetlijst wijzigde tijdens het laden. Vernieuw de werkruimte.')
|
|
}
|
|
items.push(...page.items)
|
|
if (page.items.length === 0) {
|
|
break
|
|
}
|
|
offset += page.items.length
|
|
} while (offset < (total ?? 0))
|
|
if (total !== null && items.length !== total) {
|
|
throw new Error(`Niet alle datasets konden worden geladen (${items.length}/${total}).`)
|
|
}
|
|
return { items, total: total ?? 0, limit: items.length, offset: 0 }
|
|
}
|
|
|
|
export const datasetsApi = {
|
|
list: listProjectDatasets,
|
|
sourceFreshness: (projectId: string): Promise<SourceFreshnessReport> =>
|
|
apiGet<SourceFreshnessReport>(`/api/v1/projects/${projectId}/datasets/source-freshness`),
|
|
sourceCatalogProbes: (projectId: string, refresh = false): Promise<SourceCatalogProbeReport> =>
|
|
apiGet<SourceCatalogProbeReport>(
|
|
`/api/v1/projects/${projectId}/datasets/source-catalog-probes?refresh=${refresh ? 'true' : 'false'}`,
|
|
),
|
|
grbRefreshPlan: (projectId: string, refreshCatalog = false): Promise<GrbRefreshPlan> =>
|
|
apiGet<GrbRefreshPlan>(
|
|
`/api/v1/projects/${projectId}/datasets/grb-refresh-plan?refresh_catalog=${refreshCatalog ? 'true' : 'false'}`,
|
|
),
|
|
upload: (
|
|
projectId: string,
|
|
payload: {
|
|
file: File
|
|
datasetType: string
|
|
source: string
|
|
datasetRole: string
|
|
sourceName?: string
|
|
referenceLayerName?: string
|
|
sourceMetadataJson?: string
|
|
provenanceMetadataJson?: string
|
|
areaId?: string
|
|
temporalSeriesKey?: string
|
|
observedAt?: string
|
|
validFrom?: string
|
|
validTo?: string
|
|
temporalGranularity?: string
|
|
sourceVersion?: string
|
|
},
|
|
): Promise<DatasetCreateResponse> => {
|
|
const form = new FormData()
|
|
form.append('file', payload.file)
|
|
form.append('dataset_type', payload.datasetType)
|
|
form.append('source', payload.source)
|
|
form.append('dataset_role', payload.datasetRole)
|
|
if (payload.sourceName) {
|
|
form.append('source_name', payload.sourceName)
|
|
}
|
|
if (payload.referenceLayerName) {
|
|
form.append('reference_layer_name', payload.referenceLayerName)
|
|
}
|
|
if (payload.sourceMetadataJson) {
|
|
form.append('source_metadata_json', payload.sourceMetadataJson)
|
|
}
|
|
if (payload.provenanceMetadataJson) {
|
|
form.append('provenance_metadata_json', payload.provenanceMetadataJson)
|
|
}
|
|
if (payload.areaId) {
|
|
form.append('area_id', payload.areaId)
|
|
}
|
|
if (payload.temporalSeriesKey) {
|
|
form.append('temporal_series_key', payload.temporalSeriesKey)
|
|
}
|
|
if (payload.observedAt) {
|
|
form.append('observed_at', payload.observedAt)
|
|
}
|
|
if (payload.validFrom) {
|
|
form.append('valid_from', payload.validFrom)
|
|
}
|
|
if (payload.validTo) {
|
|
form.append('valid_to', payload.validTo)
|
|
}
|
|
if (payload.temporalGranularity) {
|
|
form.append('temporal_granularity', payload.temporalGranularity)
|
|
}
|
|
if (payload.sourceVersion) {
|
|
form.append('source_version', payload.sourceVersion)
|
|
}
|
|
return apiMultipart<DatasetCreateResponse>(`/api/v1/projects/${projectId}/datasets/upload`, form)
|
|
},
|
|
acquireOrthophoto: (projectId: string, payload: OrthophotoAcquireRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/orthophoto/acquire`, payload),
|
|
listOrthophotoProducts: (projectId: string): Promise<{ items: OrthophotoProductRead[]; total: number }> =>
|
|
apiGet<{ items: OrthophotoProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/orthophoto/products`),
|
|
orthophotoImageUrl: (projectId: string, datasetId: string): string =>
|
|
`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/image`,
|
|
acquireDhmv: (projectId: string, payload: DhmvAcquireRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/dhmv/acquire`, payload),
|
|
listDhmvProducts: (projectId: string): Promise<{ items: DhmvProductRead[]; total: number }> =>
|
|
apiGet<{ items: DhmvProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/dhmv/products`),
|
|
selectTerrain: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string },
|
|
): Promise<TerrainSelectionResponse> =>
|
|
apiPost<TerrainSelectionResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/terrain/select`, payload),
|
|
selectTerrainPartitions: (
|
|
projectId: string,
|
|
payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string; product_key: string },
|
|
): Promise<TerrainSelectionResponse> =>
|
|
apiPost<TerrainSelectionResponse>(`/api/v1/projects/${projectId}/datasets/raster/terrain/select`, payload),
|
|
acquireFloodHazard: (projectId: string, payload: FloodHazardAcquireRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/flood-hazard/acquire`, payload),
|
|
listFloodHazardProducts: (projectId: string): Promise<{ items: FloodHazardProductRead[]; total: number }> =>
|
|
apiGet<{ items: FloodHazardProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/flood-hazard/products`),
|
|
selectFloodHazard: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string },
|
|
): Promise<FloodHazardSelectionResponse> =>
|
|
apiPost<FloodHazardSelectionResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/flood-hazard/select`, payload),
|
|
selectFloodHazardPartitions: (
|
|
projectId: string,
|
|
payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string; product_key: string },
|
|
): Promise<FloodHazardSelectionResponse> =>
|
|
apiPost<FloodHazardSelectionResponse>(`/api/v1/projects/${projectId}/datasets/raster/flood-hazard/select`, payload),
|
|
listBathymetrySources: (projectId: string): Promise<{ items: BathymetrySourceRead[]; total: number }> =>
|
|
apiGet<{ items: BathymetrySourceRead[]; total: number }>(
|
|
`/api/v1/projects/${projectId}/datasets/bathymetry/sources`,
|
|
),
|
|
acquireBathymetryProfiles: (projectId: string, payload: BathymetryProfileAcquireRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/bathymetry/profiles/acquire`, payload),
|
|
acquireThematicRaster: (projectId: string, payload: ThematicRasterAcquireRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/thematic-raster/acquire`, payload),
|
|
listThematicRasterProducts: (projectId: string): Promise<{ items: ThematicRasterProductRead[]; total: number }> =>
|
|
apiGet<{ items: ThematicRasterProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/thematic-raster/products`),
|
|
selectThematicRaster: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string },
|
|
): Promise<ThematicRasterSelectionResponse> =>
|
|
apiPost<ThematicRasterSelectionResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/thematic/select`, payload),
|
|
refreshMetadata: (projectId: string, datasetId: string): Promise<DatasetCreateResponse> =>
|
|
apiPost<DatasetCreateResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/metadata/refresh`, {}),
|
|
inspectRaster: (projectId: string, datasetId: string): Promise<RasterInspectResponse> =>
|
|
apiGet<RasterInspectResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/inspect`),
|
|
rasterStats: (projectId: string, datasetId: string): Promise<RasterStatsResponse> =>
|
|
apiGet<RasterStatsResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/stats`),
|
|
inspectVector: (projectId: string, datasetId: string): Promise<{ dataset: DatasetCreateResponse; summary: VectorSummary | null; metadata: unknown }> =>
|
|
apiGet<{ dataset: DatasetCreateResponse; summary: VectorSummary | null; metadata: unknown }>(
|
|
`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/inspect`,
|
|
),
|
|
vectorBbox: (projectId: string, datasetId: string): Promise<VectorBBoxResponse> =>
|
|
apiGet<VectorBBoxResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/bbox`),
|
|
vectorSummary: (projectId: string, datasetId: string): Promise<VectorSummary> =>
|
|
apiGet<VectorSummary>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/summary`),
|
|
vectorStats: (projectId: string, datasetId: string): Promise<VectorStatsResponse> =>
|
|
apiGet<VectorStatsResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/stats`),
|
|
selectVectorFeatures: (projectId: string, datasetId: string, payload: VectorSelectionRequest): Promise<VectorSelectionResponse> =>
|
|
apiPost<VectorSelectionResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/select`, payload),
|
|
deriveVectorSelection: (projectId: string, datasetId: string, payload: VectorSelectionDeriveRequest): Promise<DatasetCreateResponse> =>
|
|
apiPost<DatasetCreateResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/select/derive`, payload),
|
|
vectorClip: (projectId: string, datasetId: string, payload: { area_id: string; output_name?: string }) =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/clip`, payload),
|
|
vectorBuffer: (projectId: string, datasetId: string, payload: { distance_m: number; dissolve?: boolean; output_name?: string }) =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/buffer`, payload),
|
|
vectorIntersect: (projectId: string, datasetId: string, payload: { other_dataset_id: string; output_name?: string }) =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/intersect`, payload),
|
|
rasterMetadata: (projectId: string, datasetId: string): Promise<RasterMetadataResponse> =>
|
|
apiGet<RasterMetadataResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/metadata`),
|
|
rasterInspect: (projectId: string, datasetId: string): Promise<RasterInspectResponse> =>
|
|
apiGet<RasterInspectResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/inspect`),
|
|
rasterTile: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { tile_size?: number; overlap?: number; output_name?: string } = {},
|
|
): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/tile`, payload),
|
|
rasterReproject: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { target_crs: string; resampling?: string; output_name?: string },
|
|
): Promise<JobRead> => apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/reproject`, payload),
|
|
rasterNdvi: (projectId: string, datasetId: string, payload: RasterNdviRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndvi`, payload),
|
|
rasterNdwi: (projectId: string, datasetId: string, payload: RasterNdwiRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndwi`, payload),
|
|
rasterNdbi: (projectId: string, datasetId: string, payload: RasterNdbiRequest): Promise<JobRead> =>
|
|
apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndbi`, payload),
|
|
rasterPreview: (projectId: string, datasetId: string): Promise<RasterPreviewResponse> =>
|
|
apiGet<RasterPreviewResponse>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/preview`),
|
|
rasterClip: (
|
|
projectId: string,
|
|
datasetId: string,
|
|
payload: { area_id: string; output_name?: string },
|
|
): Promise<JobRead> => apiPost<JobRead>(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/clip`, payload),
|
|
getContent: (projectId: string, datasetId: string): Promise<GeoJSON.FeatureCollection> =>
|
|
apiGet<GeoJSON.FeatureCollection>(`/api/v1/projects/${projectId}/datasets/${datasetId}/content`),
|
|
}
|