Skip to content
This repository has been archived by the owner on Sep 11, 2020. It is now read-only.

Commit

Permalink
feat: crée des flux geojson dynamiques (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
NeoBahamut authored Mar 19, 2020
1 parent 15015e7 commit 59abf35
Show file tree
Hide file tree
Showing 13 changed files with 300 additions and 63 deletions.
6 changes: 5 additions & 1 deletion api/_utils/fetch.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const fetch = require('node-fetch')

const apiFetch = async (url, body) => {
const apiFetch = async (url, body, token = '') => {
const params = {
method: 'post',
headers: {
Expand All @@ -9,6 +9,10 @@ const apiFetch = async (url, body) => {
body
}

if (token) {
params.headers.authorization = `Bearer ${token}`
}

const res = await fetch(url, params)

return res.json()
Expand Down
4 changes: 2 additions & 2 deletions api/_utils/file-import.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const fs = require('fs').promises
const fs = require('fs')

module.exports = async path => (await fs.readFile(path, 'utf8')).toString()
module.exports = path => fs.readFileSync(path, 'utf8').toString()
8 changes: 6 additions & 2 deletions api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ const apiFetch = require('./_utils/fetch')

const apiUrl = process.env.API_URL

const apiGet = async (prop, { query, variables = {} }) => {
const res = await apiFetch(apiUrl, JSON.stringify({ query, variables }))
const apiGet = async (prop, { query, variables = {} }, token = '') => {
const res = await apiFetch(
apiUrl,
JSON.stringify({ query, variables }),
token
)

return res && res.data && res.data[prop]
}
Expand Down
21 changes: 11 additions & 10 deletions api/queries.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
const { join } = require('path')
const fileImport = require('./_utils/file-import')

const queries = async () => {
const titresQuery = await fileImport(join(__dirname, 'queries/titres.gql'))
const domainesQuery = await fileImport(
join(__dirname, 'queries/domaines.gql')
)
const typesQuery = await fileImport(join(__dirname, 'queries/types.gql'))
const statutsQuery = await fileImport(join(__dirname, 'queries/statuts.gql'))
const titresQuery = fileImport(join(__dirname, 'queries/titres.gql'))
const domainesQuery = fileImport(join(__dirname, 'queries/domaines.gql'))
const typesQuery = fileImport(join(__dirname, 'queries/types.gql'))
const statutsQuery = fileImport(join(__dirname, 'queries/statuts.gql'))
const tokenQuery = fileImport(join(__dirname, 'queries/token.gql'))

return { titresQuery, domainesQuery, typesQuery, statutsQuery }
module.exports = {
titresQuery,
domainesQuery,
typesQuery,
statutsQuery,
tokenQuery
}

module.exports = queries
10 changes: 8 additions & 2 deletions api/queries/titres.gql
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@ query Titres(
$typesIds: [ID!]
$domainesIds: [ID!]
$statutsIds: [ID!]
$substances: String
$entreprises: String
$noms: String
$references: String
$substances: String
$territoires: String
) {
titres(
typesIds: $typesIds
domainesIds: $domainesIds
statutsIds: $statutsIds
substances: $substances
entreprises: $entreprises
noms: $noms
references: $references
substances: $substances
territoires: $territoires
) {
...titre
}
Expand Down
11 changes: 11 additions & 0 deletions api/queries/token.gql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
mutation Token($email: String!, $motDePasse: String!) {
utilisateurTokenCreer(email: $email, motDePasse: $motDePasse) {
utilisateur {
id
email
nom
prenom
}
token
}
}
4 changes: 4 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ const serveIndex = require('serve-index')
const port = process.env.NODE_PORT
const app = express()

const { titresAuth, titresGet } = require('./titres/index')

app.use(compression())

app.use(
Expand All @@ -14,6 +16,8 @@ app.use(
serveIndex('public', { icons: true, view: 'details' })
)

app.get('/titres', titresAuth, titresGet)

app.listen(port, () => {
console.log(`Url: http://localhost:${port}`)
})
86 changes: 83 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@
"serve-index": "^1.9.1"
},
"devDependencies": {
"@types/node": "^13.9.1",
"@types/compression": "^1.7.0",
"@types/express": "^4.17.3",
"@types/node": "^13.9.2",
"@types/node-fetch": "^2.5.5",
"@types/serve-index": "^1.7.30",
"commitizen": "^4.0.3",
"conventional-github-releaser": "^3.1.3",
"cz-conventional-changelog": "^3.1.0",
Expand Down
39 changes: 17 additions & 22 deletions public-build/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ const { join } = require('path')
var { job } = require('cron')

const apiGet = require('../api/index')
const queries = require('../api/queries')
const {
titresQuery,
domainesQuery,
typesQuery,
statutsQuery
} = require('../api/queries')
const geojsonFormat = require('../utils/geojson-format')

const fileCreate = require('./_utils/file-create')
Expand All @@ -28,22 +33,20 @@ const domainesCouleurs = {
}

const metasBuild = (definition, metas) =>
Object.keys(definition).reduce((metasObj, metaIdsName) => {
const metaName = `${metaIdsName.slice(0, -3)}`
Object.keys(definition).reduce(
(metasObj, metaIdsName) => {
const metaName = `${metaIdsName.slice(0, -3)}`

// TODO: refactoriser pour éviter les effets de bords dans le reduce
metasObj[metaName] = []
return definition[metaIdsName].reduce((metasObj, metaId) => {
const meta = metas[metaName].find(m => m.id === metaId)

definition[metaIdsName].reduce((metasObj, metaId) => {
const meta = metas[metaName].find(m => m.id === metaId)
metasObj[metaName].push(meta)

metasObj[metaName].push(meta)

return metasObj
}, metasObj)

return metasObj
}, {})
return metasObj
}, metasObj)
},
{ domaines: [], statuts: [], types: [] }
)

const geojsonsBuild = async (definitions, query, metas) =>
definitions.reduce(async (geojsons, definition) => {
Expand Down Expand Up @@ -118,14 +121,6 @@ const metasFormat = metas =>

const run = async () => {
try {
// importe les requêtes graphQL
const {
titresQuery,
domainesQuery,
typesQuery,
statutsQuery
} = await queries()

// efface le dossier cible et son contenu
await directoryDelete(join(__dirname, EXPORT_DIRECTORY))

Expand Down
46 changes: 28 additions & 18 deletions public/readme.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---

Flux géographiques Camino
https://flux.camino.beta.gouv.fr

---

Expand All @@ -22,7 +23,9 @@ Les flux géographiques Camino exposent les informations administratives et géo

Les données sont publiées au format Geojson. C'est un format ouvert et réutilisable qui permet notamment l’utilisation de ces données par des services tiers ou des logiciels de visualisation ou gestion d’information géographique.

Ces flux sont mis à jour quotidiennement.
Deux types de flux sont proposés:
- des flux statiques mis à jour quotidiennement accessibles à https://flux.camino.beta.gouv.fr
- des flux dynamiques accessibles à https://flux.camino.beta.gouv.fr/titres permettent de configurer le contenu en fonction de paramètres de requête d'url et offrent un accès avec authentification Basic Auth.

Ces flux sont générés via les services de l’API Camino.

Expand All @@ -32,21 +35,6 @@ L'API, qui offre des possibilités de requêtes avancées plus souples et compl

---

Comment utiliser les flux géographiques Camino ?

---

> Avec le Géoportail : www.geoportail.gouv.fr
Bouton clef à molette à droite “Accéder aux outils cartographiques” > “Importer des données” > Format “geojson” > “par url” > copier-coller l’url d’un des flux Camino > ajouter un titre > importer.

> Avec QGIS : http://qgis.org
Glisser-déposer l’un des fichiers flux geojson préalablement téléchargé dans un projet Qgis ouvert.

> Avec un webservice tiers : http://geojson.io
Copier-coller le contenu d’un des flux dans l’éditeur JSON ou “Open” et sélectionner l’un des flux préalablement téléchargé et ouvrir.

---

Informations disponibles dans les flux géographiques Camino

---
Expand All @@ -59,7 +47,6 @@ Informations disponibles dans les flux géographiques Camino
"type": "type de titre",
"domaine": "type de domaine minier",
"statut": "statut du titre [demande initiale / valide / modification en instance / demande classée / échu]",
"volume": “volume si applicable”,
"surface": “surface légale indiquée dans l’acte”,
"substances": “liste des substances légales”,
"titulaires": “nom du ou des titulaires du titre”,
Expand Down Expand Up @@ -94,13 +81,36 @@ Les périmètres de titres miniers peuvent prendre la forme d’un ou plusieurs

---

Liste des flux géographiques disponibles.
Utiliser les flux statiques

---

> Avec le Géoportail : www.geoportail.gouv.fr
Bouton clef à molette à droite “Accéder aux outils cartographiques” > “Importer des données” > Format “geojson” > “par url” > copier-coller l’url d’un des flux Camino > ajouter un titre > importer.

> Avec QGIS : http://qgis.org
Glisser-déposer l’un des fichiers flux geojson préalablement téléchargé dans un projet Qgis ouvert.

> Avec un webservice tiers : http://geojson.io
Copier-coller le contenu d’un des flux dans l’éditeur JSON ou “Open” et sélectionner l’un des flux préalablement téléchargé et ouvrir.

Flux géographiques disponibles :

La liste des flux géographiques de Camino est disponible dans le fichier “infos.json” (https://flux.camino.beta.gouv.fr/geojson/infos.json)

Ils sont disponibles par :
- type de domaine minier,
- type de titre et autorisation,
- type de statut de validité.

---

Utiliser les flux dynamiques

---

Basic Auth (à compléter)

Paramètres d'url (à compléter)

> Avec le Qgis
Loading

0 comments on commit 59abf35

Please sign in to comment.