add methods required to fetch data from the API
This commit is contained in:
parent
e73b06916a
commit
1c84c009b4
208
src/utils/api.js
Normal file
208
src/utils/api.js
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
import config from '../config';
|
||||||
|
import 'whatwg-fetch';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Base function to make API calls
|
||||||
|
All other API methods will call this internally
|
||||||
|
Ideally, this is not to be called from the outside
|
||||||
|
See https://858.ma/api for API documentation
|
||||||
|
|
||||||
|
@param {String} action - API action to call
|
||||||
|
@param {Object} data - data to send with API call, will be JSON.stringified
|
||||||
|
@returns {Promise} - Resolves with data if successful, else throws error.
|
||||||
|
*/
|
||||||
|
export function callApi(action, data) {
|
||||||
|
let formData = new FormData();
|
||||||
|
formData.append('action', action);
|
||||||
|
formData.append('data', JSON.stringify(data));
|
||||||
|
return fetch(config.apiUrl, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.status.code === 200) {
|
||||||
|
return data.data;
|
||||||
|
} else {
|
||||||
|
throw 'API Error';
|
||||||
|
// Status code was not 200
|
||||||
|
// We need to do some sort of error handling here
|
||||||
|
// Not sure the best way to handle this
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetch all topics from backend
|
||||||
|
@param {Number} startRange - range to start from, defaults to 0
|
||||||
|
@param {Number} endRange - range to end at, defaults to 1000
|
||||||
|
@returns {Promise<Array>} array of topic objects like: {'name': '<topicName>', 'items': <no_of_items>}
|
||||||
|
*/
|
||||||
|
export function fetchAllTopics(startRange=0, endRange=1000) {
|
||||||
|
const data = {
|
||||||
|
"query": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [startRange, endRange],
|
||||||
|
"sort": [{
|
||||||
|
"key": "items",
|
||||||
|
"operator": "-"
|
||||||
|
}],
|
||||||
|
"group": "topic"
|
||||||
|
};
|
||||||
|
return callApi('find', data).then(data => data.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchAllMonths(startRange=0, endRange=500) {
|
||||||
|
const data = {
|
||||||
|
"query": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [startRange, endRange],
|
||||||
|
"sort": [{
|
||||||
|
"key": "items",
|
||||||
|
"operator": "-"
|
||||||
|
}],
|
||||||
|
"group": "month"
|
||||||
|
};
|
||||||
|
return callApi('find', data).then(data => data.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchAllDates(startRange=0, endRange=1000) {
|
||||||
|
const data = {
|
||||||
|
"query": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [startRange, endRange],
|
||||||
|
"sort": [{
|
||||||
|
"key": "items",
|
||||||
|
"operator": "-"
|
||||||
|
}],
|
||||||
|
"group": "date"
|
||||||
|
};
|
||||||
|
return callApi('find', data).then(data => data.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetch videos filtered by key
|
||||||
|
@param {String} key - key to filter by - eg. "topic"
|
||||||
|
@param {String} value - value to filter by
|
||||||
|
@param {Number} startRange - start range
|
||||||
|
@param {Number} endRange - end range
|
||||||
|
@param {String} sortKey - key to sort by, defaults to "random"
|
||||||
|
@returns {Promise<Array>} Promise resolves to array of video objects
|
||||||
|
*/
|
||||||
|
export function fetchVideosByX(key, value, startRange, endRange, sortKey='random') {
|
||||||
|
const data = {
|
||||||
|
"keys": ["editable", "modified", "title", "source", "project", "topic", "language", "duration", "id"],
|
||||||
|
"query": {
|
||||||
|
"conditions": [{
|
||||||
|
"key": key,
|
||||||
|
"value": encodeURIComponent(value),
|
||||||
|
"operator": "=="
|
||||||
|
}],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [startRange, endRange],
|
||||||
|
"sort": [{
|
||||||
|
"key": sortKey,
|
||||||
|
"operator": "-"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
return callApi('find', data).then(data => data.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetch videos filtered by topic
|
||||||
|
@param {String} topic - topic to filter by
|
||||||
|
@param {Number} startRange - start range
|
||||||
|
@param {Number} endRange - end range
|
||||||
|
@param {String} sortKey - key to sort by, defaults to "random"
|
||||||
|
@returns {Promise<Array>} Promise resolves to array of video objects
|
||||||
|
*/
|
||||||
|
export function fetchVideosByTopic(topic, startRange=0, endRange=100, sortKey='random') {
|
||||||
|
return fetchVideosByX('topic', topic, startRange, endRange, sortKey);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
month eg. "2011-11"
|
||||||
|
*/
|
||||||
|
export function fetchVideosByMonth(month, startRange=0, endRange=100, sortKey='random') {
|
||||||
|
return fetchVideosByX('month', month, startRange, endRange, sortKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
date eg. "2011-11-01"
|
||||||
|
*/
|
||||||
|
export function fetchVideosByDate(date, startRange=0, endRange=100, sortKey='random') {
|
||||||
|
return fetchVideosByX('date', date, startRange, endRange, sortKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetch places within bounding box
|
||||||
|
|
||||||
|
@param {Float} north - latitude of north bounds
|
||||||
|
@param {Float} south - latitude of south bounds
|
||||||
|
@param {Float} west - longitude of west bounds
|
||||||
|
@param {Float} east - longitude of east bounds
|
||||||
|
*/
|
||||||
|
export function fetchPlaces(north, south, west, east, startRange=0, endRange=100) {
|
||||||
|
const data = {
|
||||||
|
"itemsQuery": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"keys": ["id", "name", "alternativeNames", "geoname", "countryCode", "type", "lat", "lng", "south", "west", "north", "east", "area", "editable"],
|
||||||
|
"query": {
|
||||||
|
"conditions": [{
|
||||||
|
"key": "lat",
|
||||||
|
"value": [south, north],
|
||||||
|
"operator": "="
|
||||||
|
}, {
|
||||||
|
"key": "lng",
|
||||||
|
"value": [west, east],
|
||||||
|
"operator": "="
|
||||||
|
}],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [startRange, endRange],
|
||||||
|
"sort": [{
|
||||||
|
"key": "area",
|
||||||
|
"operator": "-"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
return callApi('findPlaces', data).then(data => data.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fetches a random place
|
||||||
|
*/
|
||||||
|
export function fetchRandomPlace() {
|
||||||
|
const data = {
|
||||||
|
"itemsQuery": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"keys": ["id", "name", "alternativeNames", "geoname", "countryCode", "type", "lat", "lng", "south", "west", "north", "east", "area", "editable"],
|
||||||
|
"query": {
|
||||||
|
"conditions": [],
|
||||||
|
"operator": "&"
|
||||||
|
},
|
||||||
|
"range": [0, 1],
|
||||||
|
"sort": [{
|
||||||
|
"key": "random",
|
||||||
|
"operator": "-"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
return callApi('findPlaces', data).then(data => data.items[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function fetchVideosByPlace(placeId, startRange=0, endRange=100, sortKey='random') {
|
||||||
|
return fetchVideosByX('place', placeId, startRange, endRange, sortKey);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user