create roles helper

This commit is contained in:
Riley Davis
2017-05-11 14:23:02 -06:00
parent 964b934efb
commit 14b483d089
9 changed files with 31 additions and 30 deletions
+3 -5
View File
@@ -14,8 +14,7 @@ export const handleLogin = (email, password, recaptchaResponse) => dispatch => {
return dispatch(checkLoginFailure('not logged in'));
}
const isAdmin = !!user.roles.filter(i => i === 'ADMIN').length;
dispatch(checkLoginSuccess(user, isAdmin));
dispatch(checkLoginSuccess(user));
})
.catch(error => {
@@ -41,7 +40,7 @@ export const requestPasswordReset = email => dispatch => {
// Check Login
const checkLoginRequest = () => ({type: actions.CHECK_LOGIN_REQUEST});
const checkLoginSuccess = (user, isAdmin) => ({type: actions.CHECK_LOGIN_SUCCESS, user, isAdmin});
const checkLoginSuccess = (user) => ({type: actions.CHECK_LOGIN_SUCCESS, user});
const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error});
export const checkLogin = () => dispatch => {
@@ -52,8 +51,7 @@ export const checkLogin = () => dispatch => {
return dispatch(checkLoginFailure('not logged in'));
}
const isAdmin = !!user.roles.filter(i => i === 'ADMIN').length;
dispatch(checkLoginSuccess(user, isAdmin));
dispatch(checkLoginSuccess(user));
})
.catch(error => {
console.error(error);
@@ -6,6 +6,7 @@ import {toggleModal as toggleShortcutModal} from '../actions/moderation';
import {fetchConfig} from '../actions/config';
import {FullLoading} from '../components/FullLoading';
import AdminLogin from '../components/AdminLogin';
import roleUtils from 'coral-framework/utils/roles';
class LayoutContainer extends Component {
componentWillMount () {
@@ -16,7 +17,7 @@ class LayoutContainer extends Component {
}
render () {
const {
isAdmin,
user,
loggedIn,
loadingUser,
loginError,
@@ -26,7 +27,7 @@ class LayoutContainer extends Component {
const {handleLogout, toggleShortcutModal, TALK_RECAPTCHA_PUBLIC} = this.props;
if (loadingUser) { return <FullLoading />; }
if (!isAdmin) {
if (roleUtils.canAccessAdmin(user)) {
return <AdminLogin
loginMaxExceeded={loginMaxExceeded}
handleLogin={this.props.handleLogin}
@@ -35,7 +36,7 @@ class LayoutContainer extends Component {
recaptchaPublic={TALK_RECAPTCHA_PUBLIC}
errorMessage={loginError} />;
}
if (isAdmin && loggedIn) {
if (roleUtils.canAccessAdmin(user) && loggedIn) {
return <Layout handleLogout={handleLogout} toggleShortcutModal={toggleShortcutModal} {...this.props} />;
}
return <FullLoading />;
-2
View File
@@ -4,7 +4,6 @@ import * as actions from '../constants/auth';
const initialState = Map({
loggedIn: false,
user: null,
isAdmin: false,
loginError: null,
loginMaxExceeded: false,
passwordRequestSuccess: null
@@ -24,7 +23,6 @@ export default function auth (state = initialState, action) {
return state
.set('loggedIn', true)
.set('loadingUser', false)
.set('isAdmin', action.isAdmin)
.set('user', action.user);
case actions.LOGOUT_SUCCESS:
return initialState;
@@ -1,6 +1,7 @@
import React from 'react';
import I18n from 'coral-framework/modules/i18n/i18n';
import translations from 'coral-framework/translations';
import rolesHelper from 'coral-framework/utils/roles';
const lang = new I18n(translations);
import {TabBar, Tab, TabContent, Button} from 'coral-ui';
@@ -38,7 +39,7 @@ export default class Embed extends React.Component {
render () {
const {activeTab, logout, viewAllComments, commentId} = this.props;
const {asset: {totalCommentCount}} = this.props.root;
const {loggedIn, isAdmin, user} = this.props.auth;
const {loggedIn, user} = this.props.auth;
const userBox = <UserBox user={user} onLogout={logout} onShowProfile={this.handleShowProfile}/>;
@@ -48,7 +49,7 @@ export default class Embed extends React.Component {
<TabBar onChange={this.changeTab} activeTab={activeTab}>
<Tab><Count count={totalCommentCount}/></Tab>
<Tab>{lang.t('myProfile')}</Tab>
<Tab restricted={!isAdmin}>Configure Stream</Tab>
<Tab restricted={!rolesHelper.canAccessConfig(user)}>Configure Stream</Tab>
</TabBar>
{
commentId &&
@@ -11,6 +11,7 @@ import QuestionBox from 'coral-plugin-questionbox/QuestionBox';
import IgnoredCommentTombstone from './IgnoredCommentTombstone';
import SuspendedAccount from 'coral-framework/components/SuspendedAccount';
import RestrictedContent from 'coral-framework/components/RestrictedContent';
import rolesHelper from 'coral-framework/utils/roles';
import ChangeUsernameContainer
from 'coral-sign-in/containers/ChangeUsernameContainer';
@@ -37,7 +38,7 @@ class Stream extends React.Component {
removeCommentTag,
pluginProps,
ignoreUser,
auth: {loggedIn, isAdmin, user},
auth: {loggedIn, user},
commentCountCache,
editName
} = this.props;
@@ -111,7 +112,7 @@ class Stream extends React.Component {
{loggedIn &&
user &&
<ChangeUsernameContainer loggedIn={loggedIn} user={user} />}
{loggedIn && <ModerationLink assetId={asset.id} isAdmin={isAdmin} />}
{loggedIn && <ModerationLink assetId={asset.id} isAdmin={rolesHelper.canModerate(user)} />}
{/* the highlightedComment is isolated after the user followed a permalink */}
{highlightedComment
+3 -4
View File
@@ -108,7 +108,7 @@ export const cleanState = () => ({type: actions.CLEAN_STATE});
const signInRequest = () => ({type: actions.FETCH_SIGNIN_REQUEST});
// TODO: revisit login redux flow.
// const signInSuccess = (user, isAdmin) => ({type: actions.FETCH_SIGNIN_SUCCESS, user, isAdmin});
// const signInSuccess = (user) => ({type: actions.FETCH_SIGNIN_SUCCESS, user});
//
const signInFailure = error => ({type: actions.FETCH_SIGNIN_FAILURE, error});
@@ -236,7 +236,7 @@ export const invalidForm = error => ({type: actions.INVALID_FORM, error});
// Check Login
const checkLoginRequest = () => ({type: actions.CHECK_LOGIN_REQUEST});
const checkLoginSuccess = (user, isAdmin) => ({type: actions.CHECK_LOGIN_SUCCESS, user, isAdmin});
const checkLoginSuccess = (user) => ({type: actions.CHECK_LOGIN_SUCCESS, user});
const checkLoginFailure = error => ({type: actions.CHECK_LOGIN_FAILURE, error});
export const checkLogin = () => dispatch => {
@@ -247,8 +247,7 @@ export const checkLogin = () => dispatch => {
throw new Error('Not logged in');
}
const isAdmin = !!result.user.roles.filter(i => i === 'ADMIN').length;
dispatch(checkLoginSuccess(result.user, isAdmin));
dispatch(checkLoginSuccess(result.user));
})
.catch(error => {
console.error(error);
+1 -5
View File
@@ -4,7 +4,6 @@ import * as actions from '../constants/auth';
const initialState = Map({
isLoading: false,
loggedIn: false,
isAdmin: false,
user: null,
showSignInDialog: false,
showCreateUsernameDialog: false,
@@ -79,12 +78,10 @@ export default function auth (state = initialState, action) {
return state
.set('checkedInitialLogin', true)
.set('loggedIn', true)
.set('isAdmin', action.isAdmin)
.set('user', purge(action.user));
case actions.FETCH_SIGNIN_SUCCESS:
return state
.set('loggedIn', true)
.set('isAdmin', action.isAdmin)
.set('user', purge(action.user));
case actions.FETCH_SIGNIN_FAILURE:
return state
@@ -120,8 +117,7 @@ export default function auth (state = initialState, action) {
return state
.set('user', null)
.set('isLoading', false)
.set('loggedIn', false)
.set('isAdmin', false);
.set('loggedIn', false);
case actions.INVALID_FORM:
return state
.set('error', action.error);
+10
View File
@@ -0,0 +1,10 @@
import includes from 'lodash/includes';
export default {
canAccessConfig: (user) => includes(user.roles, 'ADMIN'),
canChangeRoles: user => includes(user.roles, 'ADMIN'),
hasStaffTag: user => includes(user.roles, 'ADMIN', 'MODERATOR', 'STAFF'),
canViewUserEmails: user => includes(user.roles, 'ADMIN'),
canModerate: user => includes(user.roles, 'ADMIN', 'MODERATOR'),
canAccessAdmin: user => includes(user.roles, 'ADMIN', 'MODERATOR')
};
+4 -7
View File
@@ -395,13 +395,10 @@ module.exports = class UsersService {
return Promise.reject(new Error(`role ${role} is not supported`));
}
return UserModel.update({
id: id
}, {
$addToSet: {
roles: role
}
});
// 5.11.2017 - Restricting this to a hierarchical system like WordPress
// where you can only set one role at a time.
// I'm not changing the data structure here, because I don't want a migration
return UserModel.update({id}, {$set: {roles: [role]}});
}
/**