spatineo / tuulituhohaukka

0 stars 0 forks source link

Hahmotelma Catalog toiminnolle #27

Open sampov2 opened 3 years ago

sampov2 commented 3 years ago
const API;

API.getAllDatasets() => { datasets: [] }

// ... saga hakee JSON:in, ja sitten tallentaa vastauksen stateen

API.getAllDatasets() => { datasets: [{id: 'foo', ... }] }

const rootCatalogUrl = 'https://foo.bar/stac/root.json';

const cache = {
  stac: {
   'https://www.google.com/hello': { ... }
  },
  fetchInProgress: {
    'https://www.google.com/world': true,
    'https://notworking.com': { error: { ... err object }, date: { ... when it happened } }
  }
}

function getCatalog(url, cache) {
  if (cache.stac[url]) return cache.stac[url];

  if (!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
    }).error(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
}

function getAllDatasets() {
  var cache = store.cache;
  var rootCatalog = getCatalog(rootCatalogUrl, cache);
  return { datasets: rootCatalog.links.filter(l => l.rel === 'child') }
}
sampov2 commented 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();