mirror of
https://github.com/ThatGuySam/doesitarm.git
synced 2026-05-18 06:44:46 -07:00
Add api client helper
This commit is contained in:
parent
d96332730d
commit
201ddf7854
1 changed files with 83 additions and 0 deletions
83
helpers/api/client.js
Normal file
83
helpers/api/client.js
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
// Based on GitHub Proxy demo
|
||||
// https://gist.github.com/v1vendi/75d5e5dad7a2d1ef3fcb48234e4528cb
|
||||
|
||||
// Example uses:
|
||||
|
||||
// DoesItAPI.get() // GET /api
|
||||
// DoesItAPI.apps.get() // GET /api/apps.json
|
||||
// DoesItAPI.apps(7).get() // GET /api/apps/7.json
|
||||
// DoesItAPI.apps(7).whatever.delete() // DELETE /api/apps/7/whatever.json
|
||||
// DoesItAPI.apps.put({ whatever: 1 })
|
||||
|
||||
// GET /api/tiles/public/static/3/4/2.json?turn=37038&games=wot
|
||||
// DoesItAPI.tiles.public.static(3)(4)(`${2}.json`).get({ turn: 37, games: 'wot' })
|
||||
|
||||
import axios from 'axios'
|
||||
|
||||
import { getApiUrl } from '~/helpers/url.js'
|
||||
|
||||
// const defaultFetchMethod = (...args) => console.log(...args) // mock
|
||||
|
||||
const defaultFetchMethod = async function (...args) {
|
||||
return axios(...args)
|
||||
.then( response => response.data )
|
||||
.catch( error => {
|
||||
console.error( error )
|
||||
throw error
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const HTTP_METHODS = [
|
||||
'GET',
|
||||
'POST',
|
||||
'PUT',
|
||||
'DELETE',
|
||||
'PATCH'
|
||||
]
|
||||
|
||||
const apiBaseUrl = `${ getApiUrl().replace(/\/$/, '') }/api`
|
||||
|
||||
|
||||
export function generateAPI ( {
|
||||
apiUrl = apiBaseUrl,
|
||||
fetchMethod = defaultFetchMethod
|
||||
} = {} ) {
|
||||
|
||||
// console.log( 'apiUrl', apiUrl )
|
||||
|
||||
// a hack, so we can use field either as property or a method
|
||||
const callable = () => {}
|
||||
callable.url = apiUrl
|
||||
|
||||
return new Proxy(callable, {
|
||||
get({ url }, propKey) {
|
||||
// If we're just getting the url, return it
|
||||
if ( propKey === 'url' ) return url
|
||||
|
||||
// If we're using an HTTP method
|
||||
// then do a request to the url
|
||||
if ( HTTP_METHODS.includes(propKey.toUpperCase()) ) {
|
||||
return (data) => fetchMethod({
|
||||
url: `${ url }.json`,
|
||||
method: propKey.toUpperCase(),
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// Otherwise drill down to the next property
|
||||
// Example:
|
||||
// From DoesItAPI.kind...
|
||||
// To DoesItAPI.kind.apps...
|
||||
return generateAPI({ apiUrl: `${url}/${propKey}` })
|
||||
|
||||
},
|
||||
apply({ url }, thisArg, [arg] = []) {
|
||||
const apiUrl = arg ? `${url}/${arg}` : url
|
||||
return generateAPI({ apiUrl: apiUrl })
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
export const DoesItAPI = generateAPI()
|
||||
Loading…
Add table
Add a link
Reference in a new issue