Skip to content

Commit d5c6182

Browse files
committed
updated the code so that if datbase selected is empty we show feedback there is nothing to fetch and do not provide labels and also enable to save users to role even though db is empty
1 parent e1096de commit d5c6182

File tree

2 files changed

+72
-39
lines changed

2 files changed

+72
-39
lines changed

src/extensions/rbac/RBACManagementModal.tsx

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const RBACManagementModal = ({ open, handleClose, currentRole, createNoti
3232
const [allowCompleted, setAllowCompleted] = useState(false);
3333
const [usersCompleted, setUsersCompleted] = useState(false);
3434
const [failed, setFailed] = useState(false);
35+
const [isDatabaseEmpty, setIsDatabaseEmpty] = useState(false);
3536

3637
useEffect(() => {
3738
if (!open) {
@@ -75,34 +76,48 @@ export const RBACManagementModal = ({ open, handleClose, currentRole, createNoti
7576

7677
const handleDatabaseSelect = (selectedOption) => {
7778
setSelectedDatabase(selectedOption.value);
78-
retrieveLabelsList(driver, selectedOption.value, (records) => parseLabelsList(selectedOption.value, records));
79+
setLabels([]);
80+
setAllowList([]);
81+
setDenyList([]);
82+
retrieveLabelsList(driver, selectedOption.value, (records) => {
83+
if (records.length === 0) {
84+
setIsDatabaseEmpty(true);
85+
} else {
86+
parseLabelsList(selectedOption.value, records);
87+
setIsDatabaseEmpty(false);
88+
}
89+
});
7990
};
8091

8192
const handleSave = async () => {
8293
createNotification('Updating', `Access for role '${currentRole}' is being updated, please wait...`);
83-
updateUsers(
84-
driver,
85-
currentRole,
86-
neo4jUsers,
87-
selectedUsers,
88-
() => setUsersCompleted(true),
89-
(failReason) => setFailed(`Operation 'ROLE-USER ASSIGNMENT' failed.\n Reason: ${failReason}`)
90-
);
91-
92-
if (selectedDatabase) {
93-
const nonFixedDenyList = denyList.filter((n) => !fixedDenyList.includes(n));
94-
const nonFixedAllowList = allowList.filter((n) => !fixedDenyList.includes(n));
95-
updatePrivileges(
94+
try {
95+
await updateUsers(
9696
driver,
97-
selectedDatabase,
9897
currentRole,
99-
labels,
100-
nonFixedDenyList,
101-
Operation.DENY,
102-
() => setDenyCompleted(true),
103-
(failReason) => setFailed(`Operation 'DENY LABEL ACCESS' failed.\n Reason: ${failReason}`)
104-
).then(() => {
105-
updatePrivileges(
98+
neo4jUsers,
99+
selectedUsers,
100+
() => setUsersCompleted(true),
101+
(failReason) => setFailed(`Operation 'ROLE-USER ASSIGNMENT' failed.\n Reason: ${failReason}`)
102+
);
103+
104+
if (selectedDatabase && labels.length > 0) {
105+
// Check if there are labels to update
106+
const nonFixedDenyList = denyList.filter((n) => !fixedDenyList.includes(n));
107+
const nonFixedAllowList = allowList.filter((n) => !fixedDenyList.includes(n));
108+
109+
await updatePrivileges(
110+
driver,
111+
selectedDatabase,
112+
currentRole,
113+
labels,
114+
nonFixedDenyList,
115+
Operation.DENY,
116+
() => setDenyCompleted(true),
117+
(failReason) => setFailed(`Operation 'DENY LABEL ACCESS' failed.\n Reason: ${failReason}`)
118+
);
119+
120+
await updatePrivileges(
106121
driver,
107122
selectedDatabase,
108123
currentRole,
@@ -112,14 +127,18 @@ export const RBACManagementModal = ({ open, handleClose, currentRole, createNoti
112127
() => setAllowCompleted(true),
113128
(failReason) => setFailed(`Operation 'ALLOW LABEL ACCESS' failed.\n Reason: ${failReason}`)
114129
);
115-
});
116-
} else {
117-
// Since there is no database selected, we don't run the DENY/ALLOW queries.
118-
// We just mark them as completed so the success message shows up.
119-
setDenyCompleted(true);
120-
setAllowCompleted(true);
130+
} else {
131+
// Since there is no database or labels selected, we don't run the DENY/ALLOW queries.
132+
// We just mark them as completed so the success message shows up.
133+
setDenyCompleted(true);
134+
setAllowCompleted(true);
135+
}
136+
} catch (error) {
137+
// Handle any errors that occur during the update process
138+
createNotification('error', `An error occurred: ${error.message}`);
139+
} finally {
140+
handleClose();
121141
}
122-
handleClose();
123142
};
124143

125144
return (
@@ -170,8 +189,13 @@ export const RBACManagementModal = ({ open, handleClose, currentRole, createNoti
170189
onChange: handleDatabaseSelect,
171190
}}
172191
/>
192+
{selectedDatabase && isDatabaseEmpty && (
193+
<p style={{ color: 'red' }}>
194+
This database is currently empty. Please select a different database or add labels to manage access.
195+
</p>
196+
)}
173197
</div>
174-
{selectedDatabase && loaded && (
198+
{selectedDatabase && !isDatabaseEmpty && loaded && (
175199
<>
176200
<br />
177201
<div style={{ display: 'flex', justifyContent: 'space-between' }}>

src/extensions/rbac/RBACUtils.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,24 @@ export const retrieveNeo4jUsers = (driver, currentRole, setNeo4jUsers, setRoleUs
217217
* @param setLabels callback to update the list of labels.
218218
*/
219219
export function retrieveLabelsList(driver, database: any, setLabels: (records: any) => void) {
220-
runCypherQuery(
221-
driver,
222-
database.value,
223-
'CALL db.labels()',
224-
{},
225-
1000,
226-
() => {},
227-
(records) => setLabels(records)
228-
);
220+
let labelsSet = false; // Flag to track if setLabels was called
221+
222+
// Wrapper around the original setLabels to set the flag when called
223+
const wrappedSetLabels = (records) => {
224+
labelsSet = true;
225+
setLabels(records);
226+
};
227+
228+
runCypherQuery(driver, database, 'CALL db.labels()', {}, 1000, () => {}, wrappedSetLabels)
229+
.then(() => {
230+
if (!labelsSet) {
231+
setLabels([]);
232+
}
233+
})
234+
.catch((error) => {
235+
console.error('Error retrieving labels:', error);
236+
setLabels([]);
237+
});
229238
}
230239

231240
/**

0 commit comments

Comments
 (0)