Skip to content

Commit a363d9e

Browse files
Merge pull request #36 from terminusdb/dashboard-review
review access-control component
2 parents d1c0eaf + 214eaee commit a363d9e

35 files changed

+871
-588
lines changed

package-lock.json

Lines changed: 577 additions & 416 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"./packages/react-worker",
66
"./packages/tdb-react-layout",
77
"./packages/tdb-access-control-component",
8-
"./packages/tdb-dashboard"
8+
"./packages/tdb-dashboard",
9+
"../terminusdb-documents-ui/src/index.js"
910
]
1011
}

packages/tdb-access-control-component/src/TeamMembers.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import {Row, Tab, Tabs} from "react-bootstrap"
33
import {NewMemberModal} from "./roles/NewMemberModal"
44
import {INVITATION_TAB, MEMBERS_TAB} from "./constants"
5-
import {RiUserShared2Fill} from "react-icons/ri"
6-
import {FaUsers} from "react-icons/fa"
5+
import {RiTeamLine, RiUserShared2Fill} from "react-icons/ri"
6+
import {FaUsers,FaUserEdit,FaUserFriends} from "react-icons/fa"
77
import {InvitationsList} from "./roles/InvitationsList"
88
import {MembersList} from "./roles/MembersList"
99
import {defaultSetting} from "./utils/default"
@@ -45,17 +45,17 @@ export const TeamMembers = ({organization,currentUser,accessControlDashboard,opt
4545
</Tab>
4646
}
4747
{ settings.tabs.ORGANIZATION_LIST &&
48-
<Tab eventKey={"ORGANIZATION_LIST"} title={<span><RiUserShared2Fill className="mr-1"/>{"ORGANIZATIONS"}</span>}>
48+
<Tab eventKey={"ORGANIZATION_LIST"} title={<span><FaUserFriends className="mr-1"/>{"TEAMS"}</span>}>
4949
<OrganizationList options={settings} accessControlDashboard={accessControlDashboard}/>
5050
</Tab>
5151
}
5252
{settings.tabs.ALL_USER &&
53-
<Tab eventKey={"ALL_USER"} title={<span><RiUserShared2Fill className="mr-1"/>{"ALL THE USERS"}</span>}>
53+
<Tab eventKey={"ALL_USER"} title={<span><RiUserShared2Fill className="mr-1"/>{"USERS"}</span>}>
5454
<AllUserList options={settings} accessControlDashboard={accessControlDashboard}/>
5555
</Tab>
5656
}
5757
{ settings.tabs.ROLES_LIST &&
58-
<Tab eventKey={"ROLES_LIST"} title={<span><RiUserShared2Fill className="mr-1"/>{"ROLE List"}</span>}>
58+
<Tab eventKey={"ROLES_LIST"} title={<span><FaUserEdit className="mr-1"/>{"ROLES"}</span>}>
5959
<RoleListTable options={settings} accessControlDashboard={accessControlDashboard}/>
6060
</Tab>
6161
}

packages/tdb-access-control-component/src/ViewConfig.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,31 @@ export const getListConfigBase = (limit,getActionButtons) => {
3939

4040
export const getRoleListConfig = (limit,getActionButtons) => {
4141
const tabConfig= TerminusClient.View.table();
42-
tabConfig.column_order("name","actions")
42+
tabConfig.column_order("name","action","actions")
4343
tabConfig.column("name").header("Role Name")
44+
45+
tabConfig.column("action").header("Action List")
46+
tabConfig.column("action").render(formatActions)
4447
tabConfig.column("actions").header(" ")
4548
tabConfig.column("actions").render(getActionButtons)
4649
tabConfig.pager("local")
4750
tabConfig.pagesize(limit)
4851
return tabConfig
4952
}
5053

54+
function formatActions (cell){
55+
const columnId= cell.column.id
56+
const columnAction = cell.row.original[columnId]
57+
if(!Array.isArray(columnAction))return ""
58+
return columnAction.map((item,index)=><p className="mb-0" key={`${index}__key`}>{item}</p>)
59+
60+
}
61+
5162
function formatRoles (cell) {
5263
const columnId= cell.column.id
5364
const rolesList = cell.row.original[columnId]
5465
if(!Array.isArray(rolesList))return ""
55-
return rolesList.map((item,index)=><p key={`${index}__key`}>{item["@id"]}</p>
66+
return rolesList.map((item,index)=><p className="mb-0" key={`${index}__key`}>{item["@id"]}</p>
5667
)
5768
}
5869

packages/tdb-access-control-component/src/accessControlDashboard.js

Lines changed: 68 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,53 @@
11
//every component
22
import {UTILS} from '@terminusdb/terminusdb-client'
3-
3+
import {filterCapability} from "./utils/searchResult"
44
export const AccessControlDashboard = (clientAccessControl)=>{
55

66
let __rolesList = []
77
let __teamUserRoles = null // an array of roles
88
let __teamUserActions = null
9-
let __userDBRoles = null
10-
let __dbUserActions = null
9+
10+
let __databasesUserRoles = null // all the dbs capabilities of present
11+
let __dbUserRoles = null // the current database user roles
12+
let __dbUserActions = null // the current database actions
13+
1114
let __clientAccessControl = clientAccessControl
1215
//let __currentUser =
1316

1417
async function callGetRolesList(roleRemoveFilter){
15-
try{
16-
const list = await __clientAccessControl.getAccessRoles()
17-
__rolesList= list
18-
if(roleRemoveFilter){
19-
__rolesList = list.filter(item => !roleRemoveFilter[item["@id"]])
20-
}
21-
22-
return __rolesList
23-
}catch(err){
24-
console.log('I can not get the role list',err)
18+
try{
19+
const list = await __clientAccessControl.getAccessRoles()
20+
__rolesList= list
21+
if(roleRemoveFilter){
22+
__rolesList = list.filter(item => !roleRemoveFilter[item["@id"]])
2523
}
24+
25+
return __rolesList
26+
}catch(err){
27+
console.log('I can not get the role list',err)
28+
}
2629
}
2730

28-
// review with database capability
29-
// before we have to fix team
31+
// review with database capability
32+
// before we have to fix team
33+
// if we have a database role we can see the database id no the database name but we use the database name to identify a
34+
// database inside the dashboard and in the client
3035
async function callGetUserTeamRole(userName,orgName){
3136
try{
3237
const result = await __clientAccessControl.getTeamUserRoles(userName,orgName)
3338
let teamRoles = []
39+
let dbUserRole = {}
3440
if(result && result.capability && result.capability.length>0){
3541
if(result.capability.length ===1){
3642
teamRoles = result.capability[0].role
3743
}else{
3844
const orgId = `Organization/${UTILS.encodeURISegment(orgName)}`
39-
const cap = result.capability.find(item=>item.scope === orgId)
40-
teamRoles = cap && cap.role ? cap.role : []
45+
const {role,databases} = filterCapability(result.capability,orgId)
46+
teamRoles = role || []
47+
dbUserRole = databases
4148
}
4249
}
43-
setTeamActions(teamRoles)
50+
setTeamActions(teamRoles,dbUserRole)
4451
}catch(err){
4552
if(err.data && err.status === 404 && err.data["api:message"]){
4653
throw new Error(err.data["api:message"])
@@ -67,30 +74,28 @@ export const AccessControlDashboard = (clientAccessControl)=>{
6774
return actionsObj
6875
}
6976

70-
const setTeamActions = (teamRoles,dbUserRole) =>{
77+
const setTeamActions = (teamRoles,databasesUserRoles) =>{
7178
// const database = databaseRoles.find(element => element["name"]["@value"] === dataproduct);
7279
//const role = database ? database['role'] : teamRole
7380
__teamUserRoles = teamRoles
7481
__teamUserActions = formatActionsRoles(teamRoles)
75-
__userDBRoles = dbUserRole
76-
//if change the team I reset the __dbUserActions === at the teamActions
82+
// all the database capabilities
83+
__databasesUserRoles = databasesUserRoles
84+
// I have to find a way to set the db_user actions
85+
__dbUserRoles = null
7786
__dbUserActions = null
7887
}
7988

89+
// ??
8090
const setDBUserActions = (id) =>{
81-
if(!id) {
82-
__dbUserActions = null
83-
return
84-
}
85-
if(!Array.isArray(__userDBRoles)) return
86-
const database = __userDBRoles.find(element => element["name"]["@value"] === id);
87-
const role = database ? database['role'] : null
88-
//no role could be a new database
89-
if(!role || role === __teamUserRole){
90-
__dbUserActions = __teamUserActions
91-
}else{
92-
__dbUserActions = formatActionsRoles(role)
93-
}
91+
__dbUserActions = null
92+
__dbUserRoles = null
93+
if(!__databasesUserRoles) return
94+
const databaseRoles = __databasesUserRoles[id]
95+
if(databaseRoles){
96+
__dbUserRoles = databaseRoles
97+
__dbUserActions = formatActionsRoles(databaseRoles)
98+
}
9499
}
95100

96101
const isAdmin = () =>{
@@ -107,31 +112,43 @@ export const AccessControlDashboard = (clientAccessControl)=>{
107112
return __teamUserActions[DELETE_DATABASE] ? true : false
108113
}
109114

115+
116+
const checkDBManagmentAccess = (actionName) =>{
117+
// no team roles the access is always false
118+
if(!__teamUserActions)return false
119+
if( __teamUserActions[actionName]) return true
120+
if(__dbUserActions && __dbUserActions[actionName]) return true
121+
return false
122+
}
110123
//!!!TO BE REVIEW
111124
// I have to move this check at database-level
112125
const schemaWrite = () =>{
113-
if(!__teamUserActions)return false
114-
return __teamUserActions[SCHEMA_WRITE_ACCESS] ? true : false
126+
return checkDBManagmentAccess(SCHEMA_WRITE_ACCESS)
115127
}
116128

117129
const classFrame = () =>{
118-
if(!__teamUserActions)return false
119-
return __teamUserActions[CLASS_FRAME] ? true : false
130+
return checkDBManagmentAccess(CLASS_FRAME)
120131
}
121132

122133
const instanceRead = () =>{
123-
if(!__teamUserActions)return false
124-
return __teamUserActions[INSTANCE_READ_ACCESS] ? true : false
134+
return checkDBManagmentAccess(INSTANCE_READ_ACCESS)
125135
}
126136

127137
const instanceWrite = () =>{
128-
if(!__teamUserActions)return false
129-
return __teamUserActions[INSTANCE_WRITE_ACCESS] ? true : false
138+
console.log("INSTANCE_WRITE_ACCESS", checkDBManagmentAccess(INSTANCE_WRITE_ACCESS))
139+
return checkDBManagmentAccess(INSTANCE_WRITE_ACCESS)
130140
}
131141

132142
const branch = () =>{
133-
if(!__teamUserActions)return false
134-
return __teamUserActions[BRANCH] ? true : false
143+
return checkDBManagmentAccess(BRANCH)
144+
}
145+
146+
const commitRead = () =>{
147+
return checkDBManagmentAccess(COMMIT_READ_ACCESS)
148+
}
149+
150+
const commitWrite = () =>{
151+
return checkDBManagmentAccess(COMMIT_WRITE_ACCESS)
135152
}
136153

137154
const getRolesList = () =>{
@@ -147,8 +164,14 @@ export const AccessControlDashboard = (clientAccessControl)=>{
147164
return __teamUserRoles
148165
}
149166

167+
const getDatabaseUserRoles = () =>{
168+
return __dbUserRoles
169+
}
150170

151-
return {createDB,
171+
return {getDatabaseUserRoles,
172+
commitRead,
173+
commitWrite,
174+
createDB,
152175
classFrame,
153176
instanceRead,
154177
instanceWrite,

packages/tdb-access-control-component/src/hooks/AccessControlHook.js

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React , { useState } from "react"
22
import {UTILS} from "@terminusdb/terminusdb-client"
3+
import {filterCapability} from "../utils/searchResult"
34

45
export const AccessControlHook=(accessControlDashboard,options)=> {
56
//to load the items list
@@ -15,7 +16,7 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
1516
const [teamRequestAccessList,setTeamRequestAccessList] =useState([])
1617

1718
//review
18-
const [rolesList,setRolesList]=useState(accessControlDashboard.getRolesList())
19+
const [rolesList,setRolesList]=useState([])
1920
const [resultTable,setResultTable]=useState([])
2021

2122
const formatMessage = (err)=>{
@@ -53,11 +54,11 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
5354
/*
5455
* I can not use the general one because I need in accessControl
5556
*/
56-
async function getRolesList(){
57+
async function getRolesList(roleRemoveFilter){
5758
resetStatus()
5859
const errorMessage = "I can not get the roles list"
5960
try{
60-
const result = await accessControlDashboard.callGetRolesList()
61+
const result = await accessControlDashboard.callGetRolesList(roleRemoveFilter)
6162
setRolesList (result.reverse())
6263
if(successMessage)setSuccessMessage(successMessage)
6364
}catch(err){
@@ -128,24 +129,8 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
128129
}finally{
129130
setLoading(false)
130131
}
131-
132132
}
133133

134-
function filterCapability (capArr,orgId){
135-
let role;
136-
let databases= {}
137-
capArr.forEach(cap => {
138-
if(cap.scope === orgId){
139-
role = cap.role
140-
}else if(cap.scope.startsWith("UserDatabase")){
141-
databases[cap.scope] = cap.role
142-
}
143-
144-
})
145-
146-
return {role,databases}
147-
}
148-
149134
async function getOrgUsersLocal(orgName){
150135
setLoading(true)
151136
try{
@@ -270,10 +255,44 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
270255
}
271256
}
272257

258+
async function createOrganizationRemote(teamName){
259+
resetStatus()
260+
const currentBaseUrl =clientAccessControl.baseURL
261+
try{
262+
/*
263+
* I need to override the baseUrl for the remoteCall
264+
*/
265+
clientAccessControl.baseURL = currentBaseUrl+"/private"
266+
await clientAccessControl.createOrganization(teamName)
267+
268+
return true
269+
}catch(err){
270+
setError(formatMessage(err))
271+
return false
272+
}finally{
273+
clientAccessControl.baseURL = currentBaseUrl
274+
setLoading(false)
275+
}
276+
}
277+
278+
279+
async function createOrganizationAndCapability(teamName,userId,roles){
280+
resetStatus()
281+
try{
282+
const teamId = await clientAccessControl.createOrganization(teamName)
283+
await clientAccessControl.manageCapability(userId,teamId,roles,"grant")
284+
return true
285+
}catch(err){
286+
setError(formatMessage(err))
287+
return false
288+
}finally{
289+
setLoading(false)
290+
}
291+
}
273292
/*
274293
* local database
275294
*/
276-
async function manageCapability(teamId,operation,roles, username,password){
295+
async function manageCapability(teamId,operation,roles, userId,password){
277296
setLoading(true)
278297
try{
279298
//const user = await clientAccessControl.addUser(name,password)
@@ -283,7 +302,7 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
283302
}
284303
else return item
285304
})
286-
await clientAccessControl.manageCapability(username, teamId, rolesIds, operation)
305+
await clientAccessControl.manageCapability(userId, teamId, rolesIds, operation)
287306
return true
288307
}catch(err){
289308
setError(formatMessage(err))
@@ -346,7 +365,9 @@ export const AccessControlHook=(accessControlDashboard,options)=> {
346365
}
347366
}
348367

349-
return {getOrgUsersLocal,
368+
return {createOrganizationAndCapability,
369+
createOrganizationRemote,
370+
getOrgUsersLocal,
350371
createElementByName,
351372
deleteElementByName,
352373
getResultTable,
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export {TeamMembers} from './TeamMembers';
2-
export {AccessControlDashboard} from './accessControlDashboard';
2+
export {AccessControlDashboard} from './accessControlDashboard';
3+
export {AccessControlHook} from './hooks/AccessControlHook';

0 commit comments

Comments
 (0)