@@ -28,12 +28,14 @@ import { LOGIN_ROUTE, USERS_MANAGEMENT_ROUTE } from '@/constants/routes';
28
28
import { useDeleteLogStream } from '@/hooks/useDeleteLogStream' ;
29
29
import InfoModal from './infoModal' ;
30
30
import { useGetUserRole } from '@/hooks/useGetUserRoles' ;
31
+ import { getStreamsSepcificAccess , getUserSepcificStreams } from './rolesHandler' ;
32
+ import { LogStreamData } from '@/@types/parseable/api/stream' ;
31
33
32
34
const links = [
33
- { icon : IconZoomCode , label : 'Query' , pathname : '/query' } ,
34
- { icon : IconTableShortcut , label : 'Logs' , pathname : '/logs' } ,
35
- { icon : IconReportAnalytics , label : 'Stats' , pathname : '/stats' } ,
36
- { icon : IconSettings , label : 'Config' , pathname : '/config' } ,
35
+ { icon : IconZoomCode , label : 'Query' , pathname : '/query' , requiredAccess : [ "Query" , "GetSchema" ] } ,
36
+ { icon : IconTableShortcut , label : 'Logs' , pathname : '/logs' , requiredAccess : [ "Query" , "GetSchema" ] } ,
37
+ { icon : IconReportAnalytics , label : 'Stats' , pathname : '/stats' , requiredAccess : [ "GetStats" ] } ,
38
+ { icon : IconSettings , label : 'Config' , pathname : '/config' , requiredAccess : [ "PutAlert" ] } ,
37
39
] ;
38
40
39
41
type NavbarProps = Omit < MantineNavbarProps , 'children' > ;
@@ -55,7 +57,8 @@ const Navbar: FC<NavbarProps> = (props) => {
55
57
const [ searchValue , setSearchValue ] = useMountedState ( '' ) ;
56
58
const [ currentPage , setCurrentPage ] = useMountedState ( '/query' ) ;
57
59
const [ deleteStream , setDeleteStream ] = useMountedState ( '' ) ;
58
- const [ isAdmin , setIsAdmin ] = useMountedState ( false ) ;
60
+ const [ userSepecficStreams , setUserSepecficStreams ] = useMountedState < LogStreamData | null > ( null ) ;
61
+ const [ userSepecficAccess , setUserSepecficAccess ] = useMountedState < string [ ] | null > ( null ) ;
59
62
60
63
const [ disableLink , setDisableLink ] = useMountedState ( false ) ;
61
64
const [ isSubNavbarOpen , setIsSubNavbarOpen ] = useMountedState ( false ) ;
@@ -64,7 +67,6 @@ const Navbar: FC<NavbarProps> = (props) => {
64
67
65
68
const { data : streams , error, getData, resetData : resetStreamArray } = useGetLogStreamList ( ) ;
66
69
const { data : deleteData , deleteLogStreamFun } = useDeleteLogStream ( ) ;
67
-
68
70
useEffect ( ( ) => {
69
71
const listener = subNavbarTogle . subscribe ( setIsSubNavbarOpen ) ;
70
72
return ( ) => {
@@ -91,16 +93,16 @@ const Navbar: FC<NavbarProps> = (props) => {
91
93
if ( location . pathname . split ( '/' ) [ 2 ] ) {
92
94
setCurrentPage ( `/${ location . pathname . split ( '/' ) [ 2 ] } ` ) ;
93
95
}
94
- if ( streams && streams . length === 0 ) {
96
+ if ( userSepecficStreams && userSepecficStreams . length === 0 ) {
95
97
setActiveStream ( '' ) ;
96
98
setSearchValue ( '' ) ;
97
99
setDisableLink ( true ) ;
98
100
navigate ( `/` ) ;
99
101
} else if ( streamName ) {
100
- if ( streamName === deleteStream && streams ) {
102
+ if ( streamName === deleteStream && userSepecficStreams ) {
101
103
setDeleteStream ( '' ) ;
102
- handleChange ( streams [ 0 ] . name ) ;
103
- } else if ( streams && ! streams . find ( ( stream ) => stream . name === streamName ) ) {
104
+ handleChange ( userSepecficStreams [ 0 ] . name ) ;
105
+ } else if ( userSepecficStreams && ! userSepecficStreams . find ( ( stream : any ) => stream . name === streamName ) ) {
104
106
notifications . show ( {
105
107
id : 'error-data' ,
106
108
color : 'red' ,
@@ -109,18 +111,18 @@ const Navbar: FC<NavbarProps> = (props) => {
109
111
icon : < IconFileAlert size = "1rem" /> ,
110
112
autoClose : 5000 ,
111
113
} ) ;
112
- handleChange ( streams [ 0 ] . name ) ;
113
- } else if ( streams ?. find ( ( stream ) => stream . name === streamName ) ) {
114
+ handleChange ( userSepecficStreams [ 0 ] . name ) ;
115
+ } else if ( userSepecficStreams ?. find ( ( stream : any ) => stream . name === streamName ) ) {
114
116
handleChange ( streamName ) ;
115
117
}
116
- } else if ( streams && Boolean ( streams . length ) ) {
118
+ } else if ( userSepecficStreams && Boolean ( userSepecficStreams . length ) ) {
117
119
if ( location . pathname === USERS_MANAGEMENT_ROUTE ) {
118
- handleChangeWithoutRiderection ( streams [ 0 ] . name , location . pathname ) ;
120
+ handleChangeWithoutRiderection ( userSepecficStreams [ 0 ] . name , location . pathname ) ;
119
121
} else {
120
- handleChange ( streams [ 0 ] . name ) ;
122
+ handleChange ( userSepecficStreams [ 0 ] . name ) ;
121
123
}
122
124
}
123
- } , [ streams ] ) ;
125
+ } , [ userSepecficStreams ] ) ;
124
126
125
127
const handleChange = ( value : string , page : string = currentPage ) => {
126
128
handleChangeWithoutRiderection ( value , page ) ;
@@ -131,11 +133,12 @@ const Navbar: FC<NavbarProps> = (props) => {
131
133
setSearchValue ( value ) ;
132
134
setCurrentPage ( page ) ;
133
135
const now = dayjs ( ) ;
134
-
136
+ setUserSepecficAccess ( getStreamsSepcificAccess ( roles , value ) ) ;
135
137
subLogQuery . set ( ( state ) => {
136
138
state . streamName = value || '' ;
137
139
state . startTime = now . subtract ( DEFAULT_FIXED_DURATIONS . milliseconds , 'milliseconds' ) . toDate ( ) ;
138
140
state . endTime = now . toDate ( ) ;
141
+ state . access = getStreamsSepcificAccess ( roles , value ) ;
139
142
} ) ;
140
143
subLogSelectedTimeRange . set ( ( state ) => {
141
144
state . state = 'fixed' ;
@@ -167,7 +170,7 @@ const Navbar: FC<NavbarProps> = (props) => {
167
170
} , [ deleteData ] ) ;
168
171
169
172
//isAdmin
170
- const { data : adminData , getRoles, resetData } = useGetUserRole ( ) ;
173
+ const { data : roles , getRoles, resetData } = useGetUserRole ( ) ;
171
174
useEffect ( ( ) => {
172
175
if ( username ) {
173
176
getRoles ( username ) ;
@@ -178,10 +181,13 @@ const Navbar: FC<NavbarProps> = (props) => {
178
181
} , [ username ] ) ;
179
182
180
183
useEffect ( ( ) => {
181
- if ( adminData ) {
182
- setIsAdmin ( true ) ;
184
+ if ( streams && streams . length > 0 && roles && roles . length > 0 ) {
185
+ const userStreams = getUserSepcificStreams ( roles , streams as any ) ;
186
+ setUserSepecficStreams ( userStreams as any ) ;
183
187
}
184
- } , [ adminData ] ) ;
188
+
189
+ } , [ roles , streams ] ) ;
190
+
185
191
186
192
const { classes } = useNavbarStyles ( ) ;
187
193
const {
@@ -210,12 +216,15 @@ const Navbar: FC<NavbarProps> = (props) => {
210
216
onSearchChange = { ( value ) => setSearchValue ( value ) }
211
217
onDropdownClose = { ( ) => setSearchValue ( activeStream ) }
212
218
onDropdownOpen = { ( ) => setSearchValue ( '' ) }
213
- data = { streams ?. map ( ( stream ) => ( { value : stream . name , label : stream . name } ) ) ?? [ ] }
219
+ data = { userSepecficStreams ?. map ( ( stream : any ) => ( { value : stream . name , label : stream . name } ) ) ?? [ ] }
214
220
searchable
215
221
required
216
222
className = { selectStreambtn }
217
223
/>
218
224
{ links . map ( ( link ) => {
225
+ if ( link . requiredAccess && ! userSepecficAccess ?. some ( ( access :string ) => link . requiredAccess . includes ( access ) ) ) {
226
+ return null ;
227
+ }
219
228
return (
220
229
< NavLink
221
230
label = { link . label }
@@ -230,14 +239,17 @@ const Navbar: FC<NavbarProps> = (props) => {
230
239
/>
231
240
) ;
232
241
} ) }
233
- < NavLink
242
+ { ! userSepecficAccess ?. some ( ( access :string ) => [ "DeleteStream" ] . includes ( access ) ) ? null :
243
+ < NavLink
234
244
label = { 'Delete' }
235
245
icon = { < IconTrash size = "1.3rem" stroke = { 1.2 } /> }
236
246
sx = { { paddingLeft : 53 } }
237
247
onClick = { openDelete }
238
248
className = { linkBtn }
239
249
disabled = { disableLink }
240
250
/>
251
+ }
252
+
241
253
{ error && < div > { error } </ div > }
242
254
{ error && (
243
255
< NavLink
@@ -248,7 +260,7 @@ const Navbar: FC<NavbarProps> = (props) => {
248
260
sx = { { paddingLeft : 0 } }
249
261
/>
250
262
) }
251
- { isAdmin && (
263
+ { ! userSepecficAccess ?. some ( ( access : string ) => [ "ListUser" ] . includes ( access ) ) ? null :
252
264
< NavLink
253
265
pt = { 24 }
254
266
className = { ( currentPage === USERS_MANAGEMENT_ROUTE && userManagementBtnActive ) || userManagementBtn }
@@ -259,7 +271,7 @@ const Navbar: FC<NavbarProps> = (props) => {
259
271
setCurrentPage ( USERS_MANAGEMENT_ROUTE ) ;
260
272
} }
261
273
/>
262
- ) }
274
+ }
263
275
</ MantineNavbar . Section >
264
276
< MantineNavbar . Section className = { lowerContainer } >
265
277
< NavLink label = { username } icon = { < IconUser size = "1.3rem" stroke = { 1.3 } /> } className = { userBtn } component = "a" />
0 commit comments