Une pseudo API (recherche uniquement)

@tykayn m’avait demandé ça au camp CHATONS, et j’ai été très chargé cette semaine (et je pars en congés pour une semaine), mais je viens de pondre ça rapidement :
https://www.chatons.org/api

C’est PAS une vraie API, mais pour qui voudrait aller requeter une partie de la BDD, ça fait déjà une partie du job

Pour l’instant, c’est ouvert à toustes. Mais bon, comme certaines requêtes peuvent être… rudes, on pourra facilement les restreindre.

6 « J'aime »

Super d’avoir une API propre!

J’ai un petit souci, l’appel pour afficher toutes les structures n’en liste que quelques unes
https://www.chatons.org/api/chatons/all/json

Ca devrait être réglé ! (sinon, préviens moi)

Ça renvoie dix entrées, à priori trié alphabétiquement.

Arf, encore un souci, on vient de corriger !

nickel ça retourne bien tout maintenant

J’ai commencé à regarder l’API, j’ai fait un petit wrapper en javascript pour faciliter son usage :

// API wrapper
const endpoint = "https://www.chatons.org/api/chatons/"
const apiCall = async (p) => {
    const res = await fetch(`${endpoint}${p}`)
    return await res.json()
}
const list = async () => { return await apiCall("all/json") }
const structure = async id => { return await apiCall(`${id}/structure-info/json`) }
const orga = async id => { return await apiCall(`${id}/organization-info/json`) }
const infra = async id => { return await apiCall(`${id}/infrastructure-info/json`) }
const loc = async id => { return await apiCall(`${id}/location-info/json`) }
const soft = async id => { return await apiCall(`${id}/software-info/json`) }

Ensuite, pour explorer les données, j’ai fait une fonction pour tout agréger (! attention, elle met beaucoup de pression sur le serveur. Utilisez le dump que j’ai fait plutôt que de l’appeler à chaque fois) :

// Dumping API
const dump = async () => {
    const base = await list()
    //const base = (await list()).slice(0,5)

    console.log("fetching structures...")
    const withStruct = await Promise.all(base.map(c => structure(c.nid)))
    console.log("fetching organizations...")
    const withOrga = await Promise.all(base.map(c => orga(c.nid)))
    console.log("fetching infrastructures...")
    const withInfra = await Promise.all(base.map(c => infra(c.nid)))
    console.log("fetching locations...")
    const withLoc = await Promise.all(base.map(c => loc(c.nid)))
    console.log("fetching software...")
    const withSoftware = await Promise.all(base.map(c => soft(c.nid)))

    const world = base.map((c, idx) => ({
        ...c,
        structure: withStruct[idx],
        organisation: withOrga[idx],
        infrastructure: withInfra[idx],
        geoloc: withLoc[idx],
        software: withSoftware[idx],
    }))

    return world
}

// Main
(async () => {
    const data = await dump()
    console.log(data)

    const fs = require('fs');
    fs.writeFileSync('chatons.json', JSON.stringify(data));
    console.log(`${data.length} items written`)
})()

Pour récupérer et explorer le dump :

wget https://quentin.dufour.io/dl/chatons.json.gz
gzip -d chatons.json.gz
jq '.[] | select(.title_1 | contains("Deuxfleurs"))' chatons.json # par exemple hein...
jq '.[3]' chatons.json # un autre exemple, avec Altertek ici

Et du coup pour Altertek on a ça :

{
  "title_1": "Altertek",
  "nid": "6794",
  "view_node": "/chatons/altertek",
  "chaton_record_url": "https://chatons.org/chatons/altertek",
  "view_node_6": "https://www.chatons.org/api/chatons/6794/structure-info/json",
  "chaton_json_organization_info": "https://chatons.org/api/chatons/6794/organization-info/json",
  "chaton_json_infrastructure_info": "https://chatons.org/api/chatons/6794/infrastructure-info/json",
  "chaton_json_location_info": "https://chatons.org/api/chatons/6794/location-info/json",
  "chaton_json_software_info": "https://chatons.org/api/chatons/6794/software-info/json",
  "structure": [
    {
      "nid": "6794",
      "view_node": "/chatons/altertek",
      "title_1": "Altertek",
      "field_contact_email": "contact@altertek.org",
      "field_rss_feed": "",
      "field_collective_membership_ok": "Activé",
      "field_logo": "/sites/default/files/2021-12/logo-200x200.b5bef749%5B1%5D.png",
      "field_social_media": "<a href=\"https://mastodon.social/@altertek\">Mastodon</a>, <a href=\"https://twitter.com/altertek\">Twitter</a>",
      "delta": "0",
      "field_presentation": "Crée en 2020, Altertek est une association loi 1901 souhaitant promouvoir le concept d&#039;une technologie plaçant le respect de l&#039;humain et de l’environnement comme dénominateur commun de son développement.<br />\r\n<br />\r\nServices<br />\r\nL&#039;association propose une instance Jitsi ainsi qu&#039;une instance Peertube. Nous souhaitons progressivement augmenter le nombre de services disponibles selon les ressources de l&#039;association.<br />\r\nNous avons vocation à proposer des services et outils destinés au développeurs du libre.<br />\r\n<br />\r\nPartenaires<br />\r\nNous soutenons des associations ayant des valeurs similaires aux nôtres, dans leur gestion de leurs services numériques. Nous sommes déjà venus en aide à quelques associations tels que Zero Waste France, le World CleanUp Day France ou encore Alternatiba.<br />\r\n<br />\r\nInfrastructure<br />\r\nL&#039;association possède des serveurs chez Scaleway et Infomaniak. Nous avons fait le choix de n&#039;utiliser que des machines virtuelles dans des centres de données se fournissant en énergies renouvelables et ISO 50001.",
      "field_website_url": "https://altertek.org",
      "status": "On",
      "created": "lun 20/09/2021 - 23:44",
      "uid": "<a href=\"/user/4031\" hreflang=\"fr\">Alpha14</a>",
      "changed": "dim 01/01/2023 - 17:35",
      "chaton_record_url": "https://chatons.org/chatons/altertek"
    },
    {
      "nid": "6794",
      "view_node": "/chatons/altertek",
      "title_1": "Altertek",
      "field_contact_email": "contact@altertek.org",
      "field_rss_feed": "",
      "field_collective_membership_ok": "Activé",
      "field_logo": "/sites/default/files/2021-12/logo-200x200.b5bef749%5B1%5D.png",
      "field_social_media": "<a href=\"https://mastodon.social/@altertek\">Mastodon</a>, <a href=\"https://twitter.com/altertek\">Twitter</a>",
      "delta": "1",
      "field_presentation": "Crée en 2020, Altertek est une association loi 1901 souhaitant promouvoir le concept d&#039;une technologie plaçant le respect de l&#039;humain et de l’environnement comme dénominateur commun de son développement.<br />\r\n<br />\r\nServices<br />\r\nL&#039;association propose une instance Jitsi ainsi qu&#039;une instance Peertube. Nous souhaitons progressivement augmenter le nombre de services disponibles selon les ressources de l&#039;association.<br />\r\nNous avons vocation à proposer des services et outils destinés au développeurs du libre.<br />\r\n<br />\r\nPartenaires<br />\r\nNous soutenons des associations ayant des valeurs similaires aux nôtres, dans leur gestion de leurs services numériques. Nous sommes déjà venus en aide à quelques associations tels que Zero Waste France, le World CleanUp Day France ou encore Alternatiba.<br />\r\n<br />\r\nInfrastructure<br />\r\nL&#039;association possède des serveurs chez Scaleway et Infomaniak. Nous avons fait le choix de n&#039;utiliser que des machines virtuelles dans des centres de données se fournissant en énergies renouvelables et ISO 50001.",
      "field_website_url": "https://altertek.org",
      "status": "On",
      "created": "lun 20/09/2021 - 23:44",
      "uid": "<a href=\"/user/4031\" hreflang=\"fr\">Alpha14</a>",
      "changed": "dim 01/01/2023 - 17:35",
      "chaton_record_url": "https://chatons.org/chatons/altertek"
    }
  ],
  "organisation": [
    {
      "field_kitten_1": "Altertek",
      "field_kitten": "6794",
      "nid": "6797",
      "title": "<a href=\"/node/6797\" hreflang=\"fr\">Fiche fonctionnement - Altertek</a>",
      "field_user_support": "<p>Toute l'assistance s'effectue par l'intermédiaire de la page de contact: <a href=\"https://www.altertek.org/fr/contact/\">https://www.altertek.org/fr/contact/</a></p>",
      "field_structure_creation": "2019",
      "field_member_since": "<time datetime=\"2021-12-21T12:00:00Z\" class=\"datetime\">mar 21/12/2021 - 12:00</time>\n",
      "delta": "0",
      "field_service_bm": "<a href=\"/taxonomy/term/13\" hreflang=\"fr\">Services accessibles à tou⋅tes sans inscription</a>",
      "field_structure_bm": "<p>Nous fonctionnons principalement grâce à des <span>donations</span> de membres et d'organisations qui soutiennent le projet</p>",
      "field_employee_nb": "0 personnes",
      "field_user_nb": "",
      "field_volunteer_nb": "4 personnes",
      "field_structure_organization": "",
      "field_member_role": "",
      "field_structure_type": "<a href=\"/taxonomy/term/28\" hreflang=\"fr\">Association</a>"
    }
  ],
  "infrastructure": [
    {
      "src_name": "Altertek",
      "src_id": "6794",
      "infrastructure_id": "6795",
      "infrastructure_servers_countries": "France",
      "infrastructure_hoster_name": "Scaleway, Infomaniak",
      "infrastructure_technologies": "Debian, Docker, Restic, Ansible",
      "infrastructure_hosting_type": "Externalisé",
      "infrastructure_external_hosting_type": "VPS"
    }
  ],
  "geoloc": [
    {
      "src_name": "Altertek",
      "src_id": "6794",
      "infrastructure_id": "6796",
      "field_structure_hq_proximity": "",
      "field_structure_hq": "POINT (3.06201 50.63208)",
      "field_kitten_2": "Altertek",
      "field_zip_code": "59000",
      "field_country": "France",
      "field_geo_area": "",
      "field_city": "Lille"
    }
  ],
  "software": [
    {
      "src_name": "Altertek",
      "src_id": "6794",
      "infrastructure_id": "6798",
      "field_accessibility": "",
      "field_is_shared": "service mutualisé (une instance du logiciel pour tous les utilisateur⋅ices)",
      "delta": "0",
      "field_search_agreement": "Activé",
      "field_service_url": "<a href=\"https://meet.altertek.org\">https://meet.altertek.org</a>",
      "field_software": "<a href=\"/taxonomy/term/225\" hreflang=\"fr\">Jitsi Meet</a>",
      "field_access_type": "Ouvert à tou⋅te⋅s",
      "field_pool_weight": "2",
      "service_type": "Outils de communication"
    },
    {
      "src_name": "Altertek",
      "src_id": "6794",
      "infrastructure_id": "6799",
      "field_accessibility": "",
      "field_is_shared": "service mutualisé (une instance du logiciel pour tous les utilisateur⋅ices)",
      "delta": "0",
      "field_search_agreement": "Activé",
      "field_service_url": "<a href=\"https://video.altertek.org\">https://video.altertek.org</a>",
      "field_software": "<a href=\"/taxonomy/term/280\" hreflang=\"fr\">PeerTube</a>",
      "field_access_type": "Ouvert à tou⋅te⋅s",
      "field_pool_weight": "1",
      "service_type": "Diffusion en direct de flux audio et vidéo"
    }
  ]
}

L’idée je me souviens au camps c’était de voir comment, à l’aide de toutes ces informations, on pourrait orienter les gens différemment sur le site CHATONS. Voilà, j’ai toujours cette question en tête, mais en attendant, je voulais vous partager ces petits bouts de code :slight_smile:

4 « J'aime »