Merge branch 'api-util' of 858/frontend into master

This commit is contained in:
ahmedayman055 2018-12-05 18:55:55 +00:00 committed by Gitea
commit 35f154f8c8

208
src/utils/api.js Normal file
View 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);
}