@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
91 lines • 4.21 kB
JavaScript
import { readDatasources } from "./datasources.js";
import { importRasterDatasourceOptionsSchema, importVectorDatasourceOptionsSchema, } from "../../../src/types/index.js";
import { isInternalRasterDatasource, isInternalVectorDatasource, getDatasetBucketName, } from "../../../src/datasources/index.js";
import { genVectorConfig } from "./genVectorConfig.js";
import { genRasterConfig } from "./genRasterConfig.js";
import { publishDatasource } from "./publishDatasource.js";
/**
* Import a dataset into the project. Must be a src file that OGR or GDAL can read.
* Importing means stripping unnecessary properties/layers,
* converting to cloud optimized format, and adding as datasource.
*/
export async function publishDatasources(projectClient, extraOptions = {}) {
const { newDatasourcePath, newDstPath, matcher } = extraOptions;
const allDatasources = await readDatasources(newDatasourcePath);
const finalDatasources = (() => {
if (!matcher) {
return allDatasources;
}
else if (Array.isArray(matcher)) {
const filteredDs = allDatasources.filter((ds) => matcher.includes(ds.datasourceId));
return filteredDs;
}
else {
return allDatasources.filter((ds) => ds.datasourceId.match(matcher));
}
})();
if (finalDatasources.length === 0) {
console.log("No datasources found");
return [];
}
// Process one at a time
let failed = 0;
let updated = 0;
for (const ds of finalDatasources) {
if (isInternalVectorDatasource(ds) && ds.geo_type === "vector") {
try {
console.log(`${ds.datasourceId} vector publish started`);
// parse import options from datasource record, is just a subset
const options = importVectorDatasourceOptionsSchema.parse(ds);
// generate full config
const config = genVectorConfig(projectClient, options, newDstPath);
await Promise.all(config.formats.map((format) => {
return publishDatasource(config.dstPath, format, config.datasourceId, getDatasetBucketName(config));
}));
console.log(`${ds.datasourceId} publish complete`);
console.log(" ");
updated += 1;
}
catch (error) {
if (error instanceof Error) {
console.log(error.message);
console.log(error.stack);
console.log(`Publishing datasource ${ds.datasourceId} failed, moving to next`);
failed += 1;
}
}
}
else if (isInternalRasterDatasource(ds) && ds.geo_type === "raster") {
try {
console.log(`${ds.datasourceId} raster publish started`);
// parse import options from datasource record, is just a subset
const options = importRasterDatasourceOptionsSchema.parse(ds);
// generate full config
const config = genRasterConfig(projectClient, options, newDstPath);
await Promise.all(config.formats.map((format) => {
return publishDatasource(config.dstPath, format, config.datasourceId, getDatasetBucketName(config));
}));
console.log(`${ds.datasourceId} publish complete`);
console.log();
updated += 1;
}
catch (error) {
if (error instanceof Error) {
console.log(error.message);
console.log(error.stack);
console.log(`Publishing datasource ${ds.datasourceId} failed, moving to next`);
failed += 1;
}
}
}
else {
console.log(`Skipping ${ds.datasourceId}, publish not supported`);
}
}
console.log(`${updated} datasources published successfully`);
if (failed > 0) {
console.log(`${failed} datasources failed to publish. Fix them and try again`);
}
return finalDatasources;
}
//# sourceMappingURL=publishDatasources.js.map