Files
enfrancais-app/src/api/api.js
T
2021-06-10 13:56:37 +02:00

93 lines
2.3 KiB
JavaScript

import axios from 'axios'
import { print } from 'graphql/language/printer'
import { Node, Nodes, NodesTrees } from '@/api/queries'
import * as nodesFragments from '@/api/fragments'
const api = axios.create({
baseURL: window.location.origin + '/api/gql',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
}
})
export default {
getQueryString (query, levels) {
const FRAGMENTS_NAMES = ['NodeInitial', 'NodePartial', 'NodeFull']
const names = levels.map(level => FRAGMENTS_NAMES[level])
const fragments = names.map(name => '...' + name).join('\n')
const fragmentsDefs = names.map(name => print(nodesFragments[name])).join('\n')
return print(query).replace('FRAGMENTS', fragments) + fragmentsDefs
},
query (query, variables = {}) {
return api
.post('', { query: print(query), variables })
.then(response => {
return response.data.data
})
},
queryNodes (ids, levels) {
return api.post('', {
query: this.getQueryString(Nodes, levels),
variables: { ids }
}).then(response => response.data.data)
},
queryNode (id, levels) {
return api.post('', {
query: this.getQueryString(Node, levels),
variables: { id }
}).then(response => response.data.data)
},
queryRecursiveNodes (ids, depth = 4) {
const baseQuery = print(NodesTrees)
const prodFragment = `
... on Textprod {
parents: text_de_depart {
id
}
siblings: text_en_rebond {
id
FRAGMENT_REF
}
}
`
const refFragment = `
... on Textref {
siblings: text_en_rebond {
id
FRAGMENT_REF
}
children: text_produits {
id
FRAGMENT_PROD
}
}
`
function formatFragment (str, depth) {
if (depth > 0) {
return formatFragment(
str.replaceAll('FRAGMENT_REF', refFragment).replaceAll('FRAGMENT_PROD', prodFragment),
--depth
)
} else {
return str.replaceAll('FRAGMENT_REF', '').replaceAll('FRAGMENT_PROD', '')
}
}
return api.post('', {
query: baseQuery.replace('FRAGMENT', formatFragment(refFragment + prodFragment, depth)),
variables: { id: ids[0] }
}).then(response => response.data.data.node)
}
}