From 843c3a16c890dab668552c81195b7118af94c6b9 Mon Sep 17 00:00:00 2001 From: Belen Curcio Date: Mon, 15 May 2017 14:48:12 -0300 Subject: [PATCH] Admin share same network interface, and unifying actions --- client/coral-admin/src/actions/auth.js | 75 ++++++++++++------- client/coral-admin/src/constants/auth.js | 4 +- .../src/containers/LayoutContainer.js | 56 +++++++++----- client/coral-admin/src/reducers/auth.js | 4 +- .../coral-admin/src/services/PymConnection.js | 2 +- client/coral-admin/src/services/client.js | 4 +- .../src/services/fragmentMatcher.js | 10 +-- client/coral-admin/src/services/transport.js | 11 --- client/coral-framework/actions/auth.js | 2 +- 9 files changed, 96 insertions(+), 72 deletions(-) delete mode 100644 client/coral-admin/src/services/transport.js diff --git a/client/coral-admin/src/actions/auth.js b/client/coral-admin/src/actions/auth.js index 89b56d4dc..faa18a199 100644 --- a/client/coral-admin/src/actions/auth.js +++ b/client/coral-admin/src/actions/auth.js @@ -1,7 +1,12 @@ import * as actions from '../constants/auth'; +import * as Storage from 'coral-framework/helpers/storage'; import coralApi from 'coral-framework/helpers/response'; +import {handleAuthToken, logout} from 'coral-framework/actions/auth'; + +//============================================================================== +// SIGN IN +//============================================================================== -// Log In. export const handleLogin = (email, password, recaptchaResponse) => dispatch => { dispatch({type: actions.LOGIN_REQUEST}); const params = {method: 'POST', body: {email, password}}; @@ -9,27 +14,44 @@ export const handleLogin = (email, password, recaptchaResponse) => dispatch => { params.headers = {'X-Recaptcha-Response': recaptchaResponse}; } return coralApi('/auth/local', params) - .then(({user}) => { + .then(({user, token}) => { if (!user) { + Storage.removeItem('token'); return dispatch(checkLoginFailure('not logged in')); } - + dispatch(handleAuthToken(token)); const isAdmin = !!user.roles.filter(i => i === 'ADMIN').length; dispatch(checkLoginSuccess(user, isAdmin)); }) .catch(error => { - + console.log(error); if (error.translation_key === 'LOGIN_MAXIMUM_EXCEEDED') { - dispatch({type: actions.LOGIN_MAXIMUM_EXCEEDED, message: error.translation_key}); + dispatch({ + type: actions.LOGIN_MAXIMUM_EXCEEDED, + message: error.translation_key + }); } else { dispatch({type: actions.LOGIN_FAILURE, message: error.translation_key}); } }); }; -const forgotPassowordRequest = () => ({type: actions.FETCH_FORGOT_PASSWORD_REQUEST}); -const forgotPassowordSuccess = () => ({type: actions.FETCH_FORGOT_PASSWORD_SUCCESS}); -const forgotPassowordFailure = () => ({type: actions.FETCH_FORGOT_PASSWORD_FAILURE}); +//============================================================================== +// FORGOT PASSWORD +//============================================================================== + + +const forgotPassowordRequest = () => ({ + type: actions.FETCH_FORGOT_PASSWORD_REQUEST +}); + +const forgotPassowordSuccess = () => ({ + type: actions.FETCH_FORGOT_PASSWORD_SUCCESS +}); + +const forgotPassowordFailure = () => ({ + type: actions.FETCH_FORGOT_PASSWORD_FAILURE +}); export const requestPasswordReset = email => dispatch => { dispatch(forgotPassowordRequest(email)); @@ -38,17 +60,31 @@ export const requestPasswordReset = email => dispatch => { .catch(error => dispatch(forgotPassowordFailure(error))); }; -// Check Login +//============================================================================== +// CHECK LOGIN +//============================================================================== -const checkLoginRequest = () => ({type: actions.CHECK_LOGIN_REQUEST}); -const checkLoginSuccess = (user, isAdmin) => ({type: actions.CHECK_LOGIN_SUCCESS, user, isAdmin}); -const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error}); +const checkLoginRequest = () => ({ + type: actions.CHECK_LOGIN_REQUEST +}); + +const checkLoginSuccess = (user, isAdmin) => ({ + type: actions.CHECK_LOGIN_SUCCESS, + user, + isAdmin +}); + +const checkLoginFailure = error => ({ + type: actions.CHECK_LOGIN_FAILURE, + error +}); export const checkLogin = () => dispatch => { dispatch(checkLoginRequest()); return coralApi('/auth') .then(({user}) => { if (!user) { + Storage.removeItem('token'); return dispatch(checkLoginFailure('not logged in')); } @@ -59,17 +95,4 @@ export const checkLogin = () => dispatch => { console.error(error); dispatch(checkLoginFailure(`${error.translation_key}`)); }); -}; - -// LogOut Actions - -const logOutRequest = () => ({type: actions.LOGOUT_REQUEST}); -const logOutSuccess = () => ({type: actions.LOGOUT_SUCCESS}); -const logOutFailure = () => ({type: actions.LOGOUT_FAILURE}); - -export const logout = () => dispatch => { - dispatch(logOutRequest()); - return coralApi('/auth', {method: 'DELETE'}) - .then(() => dispatch(logOutSuccess())) - .catch(error => dispatch(logOutFailure(error))); -}; +}; \ No newline at end of file diff --git a/client/coral-admin/src/constants/auth.js b/client/coral-admin/src/constants/auth.js index 610b21c89..a0c06f72e 100644 --- a/client/coral-admin/src/constants/auth.js +++ b/client/coral-admin/src/constants/auth.js @@ -2,9 +2,7 @@ export const CHECK_LOGIN_REQUEST = 'CHECK_LOGIN_REQUEST'; export const CHECK_LOGIN_SUCCESS = 'CHECK_LOGIN_SUCCESS'; export const CHECK_LOGIN_FAILURE = 'CHECK_LOGIN_FAILURE'; -export const LOGOUT_REQUEST = 'LOGOUT_REQUEST'; -export const LOGOUT_SUCCESS = 'LOGOUT_SUCCESS'; -export const LOGOUT_FAILURE = 'LOGOUT_FAILURE'; +export const LOGOUT = 'LOGOUT'; export const LOGIN_REQUEST = 'LOGIN_REQUEST'; export const LOGIN_SUCCESS = 'LOGIN_SUCCESS'; diff --git a/client/coral-admin/src/containers/LayoutContainer.js b/client/coral-admin/src/containers/LayoutContainer.js index 42e2baade..04a83e39b 100644 --- a/client/coral-admin/src/containers/LayoutContainer.js +++ b/client/coral-admin/src/containers/LayoutContainer.js @@ -1,20 +1,21 @@ import React, {Component} from 'react'; import {connect} from 'react-redux'; import Layout from '../components/ui/Layout'; -import {checkLogin, handleLogin, logout, requestPasswordReset} from '../actions/auth'; -import {toggleModal as toggleShortcutModal} from '../actions/moderation'; import {fetchConfig} from '../actions/config'; +import {logout} from 'coral-framework/actions/auth'; import {FullLoading} from '../components/FullLoading'; import AdminLogin from '../components/AdminLogin'; +import {toggleModal as toggleShortcutModal} from '../actions/moderation'; +import {checkLogin, handleLogin, requestPasswordReset} from '../actions/auth'; class LayoutContainer extends Component { - componentWillMount () { + componentWillMount() { const {checkLogin, fetchConfig} = this.props; checkLogin(); fetchConfig(); } - render () { + render() { const { isAdmin, loggedIn, @@ -24,19 +25,34 @@ class LayoutContainer extends Component { passwordRequestSuccess } = this.props.auth; - const {handleLogout, toggleShortcutModal, TALK_RECAPTCHA_PUBLIC} = this.props; - if (loadingUser) { return ; } + const { + handleLogout, + toggleShortcutModal, + TALK_RECAPTCHA_PUBLIC + } = this.props; + if (loadingUser) { + return ; + } if (!isAdmin) { - return ; + return ( + + ); } if (isAdmin && loggedIn) { - return ; + return ( + + ); } return ; } @@ -44,19 +60,19 @@ class LayoutContainer extends Component { const mapStateToProps = state => ({ auth: state.auth.toJS(), - TALK_RECAPTCHA_PUBLIC: state.config.get('data').get('TALK_RECAPTCHA_PUBLIC', null) + TALK_RECAPTCHA_PUBLIC: state.config + .get('data') + .get('TALK_RECAPTCHA_PUBLIC', null) }); const mapDispatchToProps = dispatch => ({ checkLogin: () => dispatch(checkLogin()), fetchConfig: () => dispatch(fetchConfig()), - handleLogin: (username, password, recaptchaResponse) => dispatch(handleLogin(username, password, recaptchaResponse)), + handleLogin: (username, password, recaptchaResponse) => + dispatch(handleLogin(username, password, recaptchaResponse)), requestPasswordReset: email => dispatch(requestPasswordReset(email)), toggleShortcutModal: toggle => dispatch(toggleShortcutModal(toggle)), handleLogout: () => dispatch(logout()) }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(LayoutContainer); +export default connect(mapStateToProps, mapDispatchToProps)(LayoutContainer); diff --git a/client/coral-admin/src/reducers/auth.js b/client/coral-admin/src/reducers/auth.js index a7054ddfa..1e080d37e 100644 --- a/client/coral-admin/src/reducers/auth.js +++ b/client/coral-admin/src/reducers/auth.js @@ -26,10 +26,8 @@ export default function auth (state = initialState, action) { .set('loadingUser', false) .set('isAdmin', action.isAdmin) .set('user', action.user); - case actions.LOGOUT_SUCCESS: + case actions.LOGOUT: return initialState; - case actions.LOGIN_REQUEST: - return state.set('loginError', null); case actions.LOGIN_SUCCESS: return state.set('loginMaxExceeded', false).set('loginError', null); case actions.LOGIN_FAILURE: diff --git a/client/coral-admin/src/services/PymConnection.js b/client/coral-admin/src/services/PymConnection.js index ca592b824..1ac24ec45 100644 --- a/client/coral-admin/src/services/PymConnection.js +++ b/client/coral-admin/src/services/PymConnection.js @@ -3,7 +3,7 @@ import Pym from '../../node_modules/pym.js'; const pym = new Pym.Child({polling: 100}); export default pym; -export const link = (url) => (e) => { +export const link = url => e => { e.preventDefault(); pym.sendMessage('navigate', url); }; diff --git a/client/coral-admin/src/services/client.js b/client/coral-admin/src/services/client.js index 7d65f3f92..ff8216373 100644 --- a/client/coral-admin/src/services/client.js +++ b/client/coral-admin/src/services/client.js @@ -1,5 +1,5 @@ import ApolloClient, {addTypename} from 'apollo-client'; -import getNetworkInterface from './transport'; +import {networkInterface} from 'coral-framework/services/transport'; import fragmentMatcher from './fragmentMatcher'; export const client = new ApolloClient({ @@ -12,5 +12,5 @@ export const client = new ApolloClient({ } return null; }, - networkInterface: getNetworkInterface() + networkInterface }); diff --git a/client/coral-admin/src/services/fragmentMatcher.js b/client/coral-admin/src/services/fragmentMatcher.js index 531708f31..3b57de0b1 100644 --- a/client/coral-admin/src/services/fragmentMatcher.js +++ b/client/coral-admin/src/services/fragmentMatcher.js @@ -39,7 +39,7 @@ const fm = new IntrospectionFragmentMatcher({ {name: 'DefaultAction'}, {name: 'FlagAction'}, {name: 'DontAgreeAction'} - ], + ] }, { kind: 'INTERFACE', @@ -48,18 +48,18 @@ const fm = new IntrospectionFragmentMatcher({ {name: 'DefaultActionSummary'}, {name: 'FlagActionSummary'}, {name: 'DontAgreeActionSummary'} - ], + ] }, { kind: 'INTERFACE', name: 'AssetActionSummary', possibleTypes: [ {name: 'DefaultAssetActionSummary'}, - {name: 'FlagAssetActionSummary'}, + {name: 'FlagAssetActionSummary'} ] } - ], - }, + ] + } } }); diff --git a/client/coral-admin/src/services/transport.js b/client/coral-admin/src/services/transport.js deleted file mode 100644 index 2bd6ac636..000000000 --- a/client/coral-admin/src/services/transport.js +++ /dev/null @@ -1,11 +0,0 @@ -import {createNetworkInterface} from 'apollo-client'; - -export default function getNetworkInterface(apiUrl = '/api/v1/graph/ql', headers = {}) { - return new createNetworkInterface({ - uri: apiUrl, - opts: { - credentials: 'same-origin', - headers, - }, - }); -} diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 976b8ee1f..98c87845f 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -139,7 +139,7 @@ const signInFailure = error => ({ // AUTH TOKEN //============================================================================== -const handleAuthToken = token => dispatch => { +export const handleAuthToken = token => dispatch => { Storage.setItem('exp', jwtDecode(token).exp); Storage.setItem('token', token); dispatch({type: 'HANDLE_AUTH_TOKEN'});