diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 2f8f1041e..54763259d 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,5 +1,5 @@ import * as actions from '../constants/auth'; -import {base, handleResp, getInit} from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/response'; // Check Login @@ -9,8 +9,7 @@ const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error}); export const checkLogin = () => dispatch => { dispatch(checkLoginRequest()); - fetch(`${base}/auth`, getInit('GET')) - .then(handleResp) + coralApi('/auth') .then(user => { const isAdmin = !!user.roles.filter(i => i === 'admin').length; dispatch(checkLoginSuccess(user, isAdmin)); @@ -26,8 +25,7 @@ const logOutFailure = () => ({type: actions.LOGOUT_FAILURE}); export const logout = () => dispatch => { dispatch(logOutRequest()); - fetch(`${base}/auth`, getInit('DELETE')) - .then(handleResp) + coralApi('/auth', {method: 'DELETE'}) .then(() => dispatch(logOutSuccess())) .catch(error => dispatch(logOutFailure(error))); }; diff --git a/client/coral-admin/src/actions/community.js b/client/coral-admin/src/actions/community.js index 5921573d1..8b8e883d8 100644 --- a/client/coral-admin/src/actions/community.js +++ b/client/coral-admin/src/actions/community.js @@ -9,12 +9,11 @@ import { SET_ROLE } from '../constants/community'; -import {base, getInit, handleResp} from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/response'; export const fetchCommenters = (query = {}) => dispatch => { dispatch(requestFetchCommenters()); - fetch(`${base}/user?${qs.stringify(query)}`, getInit('GET')) - .then(handleResp) + coralApi(`/user?${qs.stringify(query)}`) .then(({result, page, count, limit, totalPages}) => dispatch({ type: FETCH_COMMENTERS_SUCCESS, @@ -42,7 +41,7 @@ export const newPage = () => ({ }); export const setRole = (id, role) => dispatch => { - return fetch(`${base}/user/${id}/role`, getInit('POST', {role})) + return coralApi(`/user/${id}/role`, {method: 'POST', body: {role}}) .then(() => { return dispatch({type: SET_ROLE, id, role}); }); diff --git a/client/coral-admin/src/actions/settings.js b/client/coral-admin/src/actions/settings.js index 6a133ddb5..71106e1f7 100644 --- a/client/coral-admin/src/actions/settings.js +++ b/client/coral-admin/src/actions/settings.js @@ -1,4 +1,4 @@ -import {base, handleResp, getInit} from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/response'; export const SETTINGS_LOADING = 'SETTINGS_LOADING'; export const SETTINGS_RECEIVED = 'SETTINGS_RECEIVED'; @@ -12,8 +12,7 @@ export const SAVE_SETTINGS_FAILED = 'SAVE_SETTINGS_FAILED'; export const fetchSettings = () => dispatch => { dispatch({type: SETTINGS_LOADING}); - fetch(`${base}/settings`, getInit('GET')) - .then(handleResp) + coralApi('/settings') .then(settings => { dispatch({type: SETTINGS_RECEIVED, settings}); }) @@ -29,8 +28,7 @@ export const updateSettings = settings => { export const saveSettingsToServer = () => (dispatch, getState) => { const settings = getState().settings.toJS().settings; dispatch({type: SAVE_SETTINGS_LOADING}); - fetch(`${base}/settings`, getInit('PUT', settings)) - .then(handleResp) + coralApi('/settings', {method: 'PUT', body: settings}) .then(() => { dispatch({type: SAVE_SETTINGS_SUCCESS, settings}); }) diff --git a/client/coral-admin/src/helpers/response.js b/client/coral-admin/src/helpers/response.js deleted file mode 100644 index bccfc5a04..000000000 --- a/client/coral-admin/src/helpers/response.js +++ /dev/null @@ -1,30 +0,0 @@ -export const base = '/api/v1'; - -export const getInit = (method, body) => { - let init = { - method, - headers: new Headers({ - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }), - credentials: 'same-origin' - }; - - if (method.toLowerCase() !== 'get') { - init.body = JSON.stringify(body); - } - - return init; -}; - -export const handleResp = res => { - if (res.status === 401) { - throw new Error('Not Authorized to make this request'); - } else if (res.status > 399) { - throw new Error('Error! Status ', res.status); - } else if (res.status === 204) { - return res.text(); - } else { - return res.json(); - } -}; diff --git a/client/coral-admin/src/services/talk-adapter.js b/client/coral-admin/src/services/talk-adapter.js index 6b872d12d..15c9cf76a 100644 --- a/client/coral-admin/src/services/talk-adapter.js +++ b/client/coral-admin/src/services/talk-adapter.js @@ -1,4 +1,4 @@ -import {base, handleResp, getInit} from '../../../coral-framework/helpers/response'; +import coralApi from '../../../coral-framework/helpers/response'; /** * The adapter is a redux middleware that interecepts the actions that need @@ -33,14 +33,13 @@ export default store => next => action => { const fetchModerationQueueComments = store => Promise.all([ - fetch(`${base}/queue/comments/pending`, getInit('GET')), - fetch(`${base}/comments?status=rejected`, getInit('GET')), - fetch(`${base}/comments?action_type=flag`, getInit('GET')) + coralApi('/queue/comments/pending'), + coralApi('/comments?status=rejected'), + coralApi('/comments?action_type=flag') ]) -.then(res => Promise.all(res.map(handleResp))) -.then(res => { - res[2] = res[2].map(comment => { comment.flagged = true; return comment; }); - return res.reduce((prev, curr) => prev.concat(curr), []); +.then(([pending, rejected, flagged]) => { + flagged.forEach(comment => comment.flagged = true); + return [...pending, ...rejected, ...flagged]; }) .then(res => store.dispatch({type: 'COMMENTS_MODERATION_QUEUE_FETCH_SUCCESS', comments: res})) @@ -49,8 +48,7 @@ Promise.all([ // Update a comment. Now to update a comment we need to send back the whole object const updateComment = (store, comment) => { - fetch(`${base}/comments/${comment.get('id')}/status`, getInit('PUT', {status: comment.get('status')})) - .then(handleResp) + coralApi(`/comments/${comment.get('id')}/status`, {method: 'PUT', body: {status: comment.get('status')}}) .then(res => store.dispatch({type: 'COMMENT_UPDATE_SUCCESS', res})) .catch(error => store.dispatch({type: 'COMMENT_UPDATE_FAILED', error})); }; @@ -63,8 +61,7 @@ const createComment = (store, name, comment) => { name: name, createdAt: Date.now() }; - return fetch(`${base}/comments`, getInit('POST', body)) - .then(handleResp) + return coralApi('/comments', {method: 'POST', body}) .then(res => store.dispatch({type: 'COMMENT_CREATE_SUCCESS', comment: res})) .catch(error => store.dispatch({type: 'COMMENT_CREATE_FAILED', error})); }; diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 1058edbbb..13a9c72bc 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -2,7 +2,7 @@ import I18n from 'coral-framework/modules/i18n/i18n'; import translations from './../translations'; const lang = new I18n(translations); import * as actions from '../constants/auth'; -import {base, handleResp, getInit} from '../helpers/response'; +import coralApi, {base} from '../helpers/response'; import {addItem} from './items'; // Dialog Actions @@ -25,8 +25,7 @@ const signInFailure = error => ({type: actions.FETCH_SIGNIN_FAILURE, error}); export const fetchSignIn = (formData) => dispatch => { dispatch(signInRequest()); - fetch(`${base}/auth/local`, getInit('POST', formData)) - .then(handleResp) + coralApi('/auth/local', {method: 'POST', body: formData}) .then(({user}) => { dispatch(hideSignInDialog()); dispatch(signInSuccess(user)); @@ -74,8 +73,7 @@ const signUpFailure = error => ({type: actions.FETCH_SIGNUP_FAILURE, error}); export const fetchSignUp = formData => dispatch => { dispatch(signUpRequest()); - fetch(`${base}/user`, getInit('POST', formData)) - .then(handleResp) + coralApi('/user', {method: 'POST', body: formData}) .then(({user}) => { dispatch(signUpSuccess(user)); setTimeout(() =>{ @@ -93,8 +91,7 @@ const forgotPassowordFailure = () => ({type: actions.FETCH_FORGOT_PASSWORD_FAILU export const fetchForgotPassword = email => dispatch => { dispatch(forgotPassowordRequest(email)); - fetch(`${base}/user/request-password-reset`, getInit('POST', {email})) - .then(handleResp) + coralApi('/user/request-password-reset', {method: 'POST', body: {email}}) .then(() => dispatch(forgotPassowordSuccess())) .catch(error => dispatch(forgotPassowordFailure(error))); }; @@ -107,8 +104,7 @@ const logOutFailure = () => ({type: actions.LOGOUT_FAILURE}); export const logout = () => dispatch => { dispatch(logOutRequest()); - fetch(`${base}/auth`, getInit('DELETE')) - .then(handleResp) + coralApi('/auth', {method: 'DELETE'}) .then(() => dispatch(logOutSuccess())) .catch(error => dispatch(logOutFailure(error))); }; @@ -126,14 +122,13 @@ const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error}); export const checkLogin = () => dispatch => { dispatch(checkLoginRequest()); - fetch(`${base}/auth`, getInit('GET')) - .then((res) => { - if (res.status !== 200) { + coralApi('/auth') + .then(user => { + if (!user) { throw new Error('not logged in'); } - return res.json(); + dispatch(checkLoginSuccess(user)); }) - .then(user => dispatch(checkLoginSuccess(user))) .catch(error => dispatch(checkLoginFailure(error))); }; diff --git a/client/coral-framework/actions/items.js b/client/coral-framework/actions/items.js index 00deba5ef..2029714c7 100644 --- a/client/coral-framework/actions/items.js +++ b/client/coral-framework/actions/items.js @@ -1,4 +1,4 @@ -import {getInit, base, handleResp} from '../helpers/response'; +import coralApi from '../helpers/response'; import {fromJS} from 'immutable'; /* Item Actions */ @@ -95,8 +95,7 @@ export const appendItemArray = (id, property, value, add_to_front, item_type) => */ export function getStream (assetUrl) { return (dispatch) => { - return fetch(`${base}/stream?asset_url=${encodeURIComponent(assetUrl)}`, getInit('GET')) - .then(handleResp) + return coralApi(`/stream?asset_url=${encodeURIComponent(assetUrl)}`) .then((json) => { /* Add items to the store */ @@ -166,8 +165,7 @@ export function getStream (assetUrl) { export function getItemsArray (ids) { return (dispatch) => { - return fetch(`${base}/item/${ids}`, getInit('GET')) - .then(handleResp) + return coralApi(`/item/${ids}`) .then((json) => { for (let i = 0; i < json.items.length; i++) { dispatch(addItem(json.items[i])); @@ -196,8 +194,7 @@ export function postItem (item, type, id) { if (id) { item.id = id; } - return fetch(`${base}/${type}`, getInit('POST', item)) - .then(handleResp) + return coralApi(`/${type}`, {method: 'POST', body: item}) .then((json) => { dispatch(addItem({...item, id:json.id}, type)); return json.id; @@ -227,8 +224,7 @@ export function postAction (item_id, action_type, user_id, item_type) { user_id }; - return fetch(`${base}/${item_type}/${item_id}/actions`, getInit('POST', action)) - .then(handleResp); + return coralApi(`/${item_type}/${item_id}/actions`, {method: 'POST', body: action}); }; } @@ -249,7 +245,6 @@ export function postAction (item_id, action_type, user_id, item_type) { export function deleteAction (action_id) { return () => { - return fetch(`${base}/actions/${action_id}`, {method: 'DELETE'}) - .then(handleResp); + return coralApi(`/actions/${action_id}`, {method: 'DELETE'}); }; } diff --git a/client/coral-framework/helpers/response.js b/client/coral-framework/helpers/response.js index 83f51e3ec..1b4340dc4 100644 --- a/client/coral-framework/helpers/response.js +++ b/client/coral-framework/helpers/response.js @@ -1,23 +1,25 @@ export const base = '/api/v1'; -export const getInit = (method, body) => { - let init = { - method, +const buildOptions = (inputOptions = {}) => { + + const defaultOptions = { + method: 'GET', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, credentials: 'same-origin' }; + const options = Object.assign({}, defaultOptions, inputOptions); - if (method.toLowerCase() !== 'get') { - init.body = JSON.stringify(body); + if (options.method.toLowerCase() !== 'get') { + options.body = JSON.stringify(options.body); } - return init; + return options; }; -export const handleResp = res => { +const handleResp = res => { if (res.status === 401) { throw new Error('Not Authorized to make this request'); } else if (res.status > 399) { @@ -28,3 +30,7 @@ export const handleResp = res => { return res.json(); } }; + +export default (url, options) => { + return fetch(`${base}${url}`, buildOptions(options)).then(handleResp); +};