Open sampov2 opened 3 years ago
export class Stac { store : any; rootCatalogUrl : string;
constructor(store : any, rootCatalogUrl : string) {
this.store = store;
this.rootCatalogUrl = rootCatalogUrl;
}
// 3 tasoa funktioita:
// 1) julkinen API
// 2) latausten käsittely
// 3) kakusta saadun tiedon perusteella tulosten muodostaminen
// Julkinen
getAllDatasets() {
var rootCatalog = this.getCatalog(this.rootCatalogUrl);
return this.produceDatasetsResult(rootCatalog);
}
// Latausten käsittely:
// 1) tarkistaa kakusta onko urli jo haettu, jos on => palauta data
// 2) tarkista ettei urlia olla jo hakemassa, jos ei => käynnistä haku
// 3) kun dataa ei vielä ole, niin palauta tyhjä "feikkikatalogi", jossa ei ole tietoja => joka ei häiritse sovelluksen toimintaa
*getCatalog(url : string) {
if (this.store.cache.stac[url]) return this.store.cache.stac[url];
// jotta typescript on tyytyväinen
var put = (xx : any) => setTimeout(() => { console.log('yay', xx) })
if (!this.store.cache.fetchInProgress[url]) {
yield put({ type: 'CATALOGUE_FETCHING', data: { url } }); // <- reducer tallentaa cache.fetchInProgress[url]:ille arvon
fetch(url).then(catalog => {
put({ type: 'CATALOG_FETCHED', data: { url, catalog } }); // <- reducer tallentaa cacheen katalogin ja poistaa fetchInProgress -tietueen
}).catch(error => {
put({ type: 'CATALOG_FETCH_FAILED', data: { url, error } }); // <- reducer tallentaa fetchInProgressiin virheen ja aikaleiman
});
}
return { links: [] }; // <- tärkeää että tässä on riittävästi kenttiä, jotta katalogeja käyttävä koodi ei kuole undefined-virheisiin
}
// Tulosten muodostaminen
produceDatasetsResult(rootCatalog : any) {
return { datasets: rootCatalog.links.filter(l => l.rel === 'child') }
}
}
let cache = { stac: { 'https://www.google.com/hello': { links: [{rel: 'self'}, {rel:'child'}] } }, fetchInProgress: { 'https://www.google.com/world': true, 'https://notworking.com': { error: { message: 'failed to retrieve' / err object / }, date: "2021-08-10T07:47:10Z" } } }
let stac : Stac = new Stac( { cache: cache }, 'https://foo.bar/stac/root.json' );
stac.getAllDatasets();