Skip to content

Commit 43173bf

Browse files
committed
feat(admin-ui): design the layout for role-permission mapping #336
1 parent ed75cb4 commit 43173bf

File tree

10 files changed

+195
-5
lines changed

10 files changed

+195
-5
lines changed

.env

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
BASE_PATH=/
22
CONFIG_API_BASE_URL=https://admin-ui-test.gluu.org
33
JANS_API_BASE_URL=https://jans-ui.jans.io
4-
API_BASE_URL=http://localhost:8080
4+
API_BASE_URL=http://localhost:8080/jans-config-api/admin-ui
55
NPM_TOKEN=
6-
SESSION_TIMEOUT_IN_MINUTES=30
6+
SESSION_TIMEOUT_IN_MINUTES=30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React, { useEffect } from 'react'
2+
import { connect } from 'react-redux'
3+
import { useTranslation } from 'react-i18next'
4+
import { Card, CardBody, FormGroup } from '../../../../app/components'
5+
import GluuViewWrapper from '../../../../app/routes/Apps/Gluu/GluuViewWrapper'
6+
import GluuRibbon from '../../../../app/routes/Apps/Gluu/GluuRibbon'
7+
//import applicationStyle from '../../../../app/routes/Apps/Gluu/styles/applicationstyle'
8+
import { getMapping } from '../../redux/actions/ApiRoleMappingActions'
9+
import {
10+
hasPermission,
11+
buildPayload,
12+
ROLE_READ,
13+
} from '../../../../app/utils/PermChecker'
14+
15+
function RoleMappingPage({ mapping, permissions, loading, dispatch }) {
16+
const { t } = useTranslation()
17+
console.log('============== ' + JSON.stringify(mapping))
18+
console.log('============== ' + JSON.stringify(loading))
19+
const options = []
20+
const userAction = {}
21+
useEffect(() => {
22+
buildPayload(userAction, 'ROLES_MAPPING', options)
23+
dispatch(getMapping(userAction))
24+
}, [])
25+
return (
26+
<Card>
27+
<GluuRibbon title={t('titles.mapping')} fromLeft />
28+
<CardBody>
29+
<FormGroup row />
30+
<FormGroup row />
31+
<GluuViewWrapper
32+
canShow={hasPermission(permissions, ROLE_READ)}
33+
></GluuViewWrapper>
34+
</CardBody>
35+
</Card>
36+
)
37+
}
38+
39+
const mapStateToProps = (state) => {
40+
return {
41+
mapping: state.apiMappingReducer.items,
42+
loading: state.apiMappingReducer.loading,
43+
permissions: state.authReducer.permissions,
44+
}
45+
}
46+
47+
export default connect(mapStateToProps)(RoleMappingPage)

plugins/admin/plugin-metadata.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ReportPage from './components/Reports/ReportPage'
33
import LicenseDetailsPage from './components/Configuration/LicenseDetailsPage'
44
import UiRoleListPage from './components/Roles/UiRoleListPage'
55
import UiPermListPage from './components/Permissions/UiPermListPage'
6+
import RoleMappingPage from './components/Mapping/RoleMappingPage'
67
import MonthlyActiveUsersPage from './components/MonthlyActiveUsersPage'
78
import ScriptListPage from './components/CustomScripts/ScriptListPage'
89
import CustomScriptAddPage from './components/CustomScripts/CustomScriptAddPage'
@@ -14,12 +15,14 @@ import scriptSaga from './redux/sagas/CustomScriptSaga'
1415
import licenseDetailsSaga from './redux/sagas/LicenseDetailsSaga'
1516
import apiRoleSaga from './redux/sagas/ApiRoleSaga'
1617
import apiPermissionSaga from './redux/sagas/ApiPermissionSaga'
18+
import roleMappingSaga from './redux/sagas/RoleMappingSaga'
1719

1820
import mauReducer from './redux/reducers/MauReducer'
1921
import scriptReducer from './redux/reducers/CustomScriptReducer'
2022
import apiRoleReducer from './redux/reducers/ApiRoleReducer'
2123
import apiPermissionReducer from './redux/reducers/ApiPermissionReducer'
2224
import licenseDetailsReducer from './redux/reducers/LicenseDetailsReducer'
25+
import apiMappingReducer from './redux/reducers/ApiMappingReducer'
2326
import {
2427
ACR_READ,
2528
ROLE_READ,
@@ -106,9 +109,9 @@ const pluginMetadata = {
106109
permission: PERMISSION_READ,
107110
},
108111
{
109-
component: UiRoleListPage,
112+
component: RoleMappingPage,
110113
path: PLUGIN_BASE_APTH + '/mapping',
111-
permission: '/config/acrs.readonly',
114+
permission: PERMISSION_READ,
112115
},
113116
{
114117
component: ScriptListPage,
@@ -142,13 +145,15 @@ const pluginMetadata = {
142145
{ name: 'apiRoleReducer', reducer: apiRoleReducer },
143146
{ name: 'apiPermissionReducer', reducer: apiPermissionReducer },
144147
{ name: 'licenseDetailsReducer', reducer: licenseDetailsReducer },
148+
{ name: 'apiMappingReducer', reducer: apiMappingReducer },
145149
],
146150
sagas: [
147151
mauSaga(),
148152
scriptSaga(),
149153
licenseDetailsSaga(),
150154
apiRoleSaga(),
151155
apiPermissionSaga(),
156+
roleMappingSaga(),
152157
],
153158
}
154159

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { GET_MAPPING, GET_MAPPING_RESPONSE } from './types'
2+
3+
export const getMapping = (action) => ({
4+
type: GET_MAPPING,
5+
payload: { action },
6+
})
7+
8+
export const getMappingResponse = (data) => ({
9+
type: GET_MAPPING_RESPONSE,
10+
payload: { data },
11+
})

plugins/admin/redux/actions/types.js

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ export const DELETE_PERMISSION = 'DELETE_PERMISSION'
4545
export const DELETE_PERMISSION_RESPONSE = 'DELETE_PERMISSION_RESPONSE'
4646
export const SET_PERMISSION_ITEM = 'SET_PERMISSION_ITEM'
4747

48+
export const GET_MAPPING = 'GET_MAPPING'
49+
export const GET_MAPPING_RESPONSE = 'GET_MAPPING_RESPONSE'
50+
4851
//License Details
4952

5053
export const GET_LICENSE_DETAILS = 'GET_LICENSE_DETAILS'

plugins/admin/redux/api/RoleApi.js

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export default class RoleApi {
44
}
55
getRoles = () => {
66
return new Promise((resolve, reject) => {
7-
console.log('=============get roles')
87
this.api.getAdminuiRoles((error, data) => {
98
this.handleResponse(error, reject, resolve, data)
109
})
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export default class RoleMappingApi {
2+
constructor(api) {
3+
this.api = api
4+
}
5+
getMappings = () => {
6+
return new Promise((resolve, reject) => {
7+
this.api.getAdminuiRolePermissions((error, data) => {
8+
this.handleResponse(error, reject, resolve, data)
9+
})
10+
})
11+
}
12+
13+
handleResponse(error, reject, resolve, data) {
14+
if (error) {
15+
reject(error)
16+
} else {
17+
resolve(data)
18+
}
19+
}
20+
}
+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export const SCRIPT = 'custom-script'
22
export const API_ROLE = 'api-role'
33
export const API_PERMISSION = 'api-permission'
4+
export const API_MAPPING = 'api-role-mapping'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { GET_MAPPING, GET_MAPPING_RESPONSE, RESET } from '../actions/types'
2+
import reducerRegistry from '../../../../app/redux/reducers/ReducerRegistry'
3+
4+
const INIT_STATE = {
5+
items: [],
6+
loading: false,
7+
}
8+
const reducerName = 'apiMappingReducer'
9+
10+
export default function apiMappingReducer(state = INIT_STATE, action) {
11+
switch (action.type) {
12+
case GET_MAPPING:
13+
console.log("==================>")
14+
return handleLoading()
15+
case GET_MAPPING_RESPONSE:
16+
if (action.payload.data) {
17+
return handleItems()
18+
} else {
19+
return handleDefault()
20+
}
21+
22+
case RESET:
23+
return {
24+
...state,
25+
items: INIT_STATE.items,
26+
loading: INIT_STATE.loading,
27+
}
28+
default:
29+
return handleDefault()
30+
}
31+
32+
function handleItems() {
33+
return {
34+
...state,
35+
items: action.payload.data,
36+
loading: false,
37+
}
38+
}
39+
40+
function handleLoading() {
41+
return {
42+
...state,
43+
loading: true,
44+
}
45+
}
46+
47+
function handleDefault() {
48+
return {
49+
...state,
50+
loading: false,
51+
}
52+
}
53+
}
54+
reducerRegistry.register(reducerName, apiMappingReducer)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { call, all, put, fork, takeLatest, select } from 'redux-saga/effects'
2+
import { getMappingResponse } from '../actions/ApiRoleMappingActions'
3+
import { API_MAPPING } from '../audit/Resources'
4+
import { FETCH } from '../../../../app/audit/UserActionType'
5+
import { getAPIAccessToken } from '../../../../app/redux/actions/AuthActions'
6+
import {
7+
isFourZeroOneError,
8+
addAdditionalData,
9+
} from '../../../../app/utils/TokenController'
10+
import { GET_MAPPING } from '../actions/types'
11+
import RoleMappingApi from '../api/RoleMappingApi'
12+
import { getClient } from '../../../../app/redux/api/base'
13+
import { postUserAction } from '../../../../app/redux/api/backend-api'
14+
const JansConfigApi = require('jans_config_api')
15+
import { initAudit } from '../../../../app/redux/sagas/SagaUtils'
16+
17+
function* newFunction() {
18+
const token = yield select((state) => state.authReducer.token.access_token)
19+
const issuer = yield select((state) => state.authReducer.issuer)
20+
const api = new JansConfigApi.AdminUIRolePermissionsMappingApi(
21+
getClient(JansConfigApi, token, issuer),
22+
)
23+
return new RoleMappingApi(api)
24+
}
25+
26+
export function* getMapping({ payload }) {
27+
const audit = yield* initAudit()
28+
try {
29+
addAdditionalData(audit, FETCH, API_MAPPING, payload)
30+
const roleApi = yield* newFunction()
31+
const data = yield call(roleApi.getRoles)
32+
yield put(getMappingResponse(data))
33+
yield call(postUserAction, audit)
34+
} catch (e) {
35+
yield put(getMappingResponse(null))
36+
if (isFourZeroOneError(e)) {
37+
const jwt = yield select((state) => state.authReducer.userinfo_jwt)
38+
yield put(getAPIAccessToken(jwt))
39+
}
40+
}
41+
}
42+
43+
export function* watchGetMapping() {
44+
console.log("=========called")
45+
yield takeLatest(GET_MAPPING, getMapping)
46+
}
47+
48+
export default function* rootSaga() {
49+
yield all([fork(watchGetMapping)])
50+
}

0 commit comments

Comments
 (0)