1
0
mirror of https://github.com/sasjs/server.git synced 2025-12-11 03:34:35 +00:00

fix: update permission response

This commit is contained in:
2022-07-02 01:03:53 +05:00
parent f3dfc7083f
commit e516b7716d
7 changed files with 94 additions and 15 deletions

View File

@@ -171,7 +171,7 @@ components:
user: user:
$ref: '#/components/schemas/UserResponse' $ref: '#/components/schemas/UserResponse'
group: group:
$ref: '#/components/schemas/GroupResponse' $ref: '#/components/schemas/GroupDetailsResponse'
required: required:
- permissionId - permissionId
- uri - uri
@@ -1008,7 +1008,7 @@ paths:
type: array type: array
examples: examples:
'Example 1': 'Example 1':
value: [{permissionId: 123, uri: /SASjsApi/code/execute, setting: Grant, user: {id: 1, username: johnSnow01, displayName: 'John Snow', isAdmin: false}}, {permissionId: 124, uri: /SASjsApi/code/execute, setting: Grant, group: {groupId: 1, name: DCGroup, description: 'This group represents Data Controller Users'}}] value: [{permissionId: 123, uri: /SASjsApi/code/execute, setting: Grant, user: {id: 1, username: johnSnow01, displayName: 'John Snow', isAdmin: false}}, {permissionId: 124, uri: /SASjsApi/code/execute, setting: Grant, group: {groupId: 1, name: DCGroup, description: 'This group represents Data Controller Users', isActive: true, users: []}}]
summary: 'Get list of all permissions (uri, setting and userDetail).' summary: 'Get list of all permissions (uri, setting and userDetail).'
tags: tags:
- Permission - Permission

View File

@@ -20,7 +20,7 @@ export interface GroupResponse {
description: string description: string
} }
interface GroupDetailsResponse { export interface GroupDetailsResponse {
groupId: number groupId: number
name: string name: string
description: string description: string

View File

@@ -15,7 +15,7 @@ import Permission from '../model/Permission'
import User from '../model/User' import User from '../model/User'
import Group from '../model/Group' import Group from '../model/Group'
import { UserResponse } from './user' import { UserResponse } from './user'
import { GroupResponse } from './group' import { GroupDetailsResponse } from './group'
export enum PrincipalType { export enum PrincipalType {
user = 'user', user = 'user',
@@ -63,7 +63,7 @@ export interface PermissionDetailsResponse {
uri: string uri: string
setting: string setting: string
user?: UserResponse user?: UserResponse
group?: GroupResponse group?: GroupDetailsResponse
} }
@Security('bearerAuth') @Security('bearerAuth')
@@ -93,7 +93,9 @@ export class PermissionController {
group: { group: {
groupId: 1, groupId: 1,
name: 'DCGroup', name: 'DCGroup',
description: 'This group represents Data Controller Users' description: 'This group represents Data Controller Users',
isActive: true,
users: []
} }
} }
]) ])
@@ -170,7 +172,12 @@ const getAllPermissions = async (): Promise<PermissionDetailsResponse[]> =>
.populate({ path: 'user', select: 'id username displayName isAdmin -_id' }) .populate({ path: 'user', select: 'id username displayName isAdmin -_id' })
.populate({ .populate({
path: 'group', path: 'group',
select: 'groupId name description -_id' select: 'groupId name description -_id',
populate: {
path: 'users',
select: 'id username displayName isAdmin -_id',
options: { limit: 15 }
}
})) as unknown as PermissionDetailsResponse[] })) as unknown as PermissionDetailsResponse[]
const createPermission = async ({ const createPermission = async ({
@@ -185,7 +192,7 @@ const createPermission = async ({
}) })
let user: UserResponse | undefined let user: UserResponse | undefined
let group: GroupResponse | undefined let group: GroupDetailsResponse | undefined
switch (principalType) { switch (principalType) {
case PrincipalType.user: { case PrincipalType.user: {
@@ -251,7 +258,13 @@ const createPermission = async ({
group = { group = {
groupId: groupInDB.groupId, groupId: groupInDB.groupId,
name: groupInDB.name, name: groupInDB.name,
description: groupInDB.description description: groupInDB.description,
isActive: groupInDB.isActive,
users: groupInDB.populate({
path: 'users',
select: 'id username displayName isAdmin -_id',
options: { limit: 15 }
}) as unknown as UserResponse[]
} }
break break
} }

View File

@@ -29,7 +29,7 @@ const DeleteModal = ({ open, setOpen, deletePermission }: DeleteModalProps) => {
<BootstrapDialog onClose={() => setOpen(false)} open={open}> <BootstrapDialog onClose={() => setOpen(false)} open={open}>
<DialogContent dividers> <DialogContent dividers>
<Typography gutterBottom> <Typography gutterBottom>
Are you sure to delete this permission? Are you sure you want to delete this permission?
</Typography> </Typography>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>

View File

@@ -47,7 +47,7 @@ const Settings = () => {
> >
<StyledTab label="Profile" value="profile" /> <StyledTab label="Profile" value="profile" />
{appContext.mode === ModeType.Server && ( {appContext.mode === ModeType.Server && (
<StyledTab label="Permission" value="permission" /> <StyledTab label="Uri Access" value="permission" />
)} )}
</TabList> </TabList>
</Box> </Box>

View File

@@ -12,7 +12,9 @@ import {
Grid, Grid,
CircularProgress, CircularProgress,
IconButton, IconButton,
Tooltip Tooltip,
Typography,
Popover
} from '@mui/material' } from '@mui/material'
import FilterListIcon from '@mui/icons-material/FilterList' import FilterListIcon from '@mui/icons-material/FilterList'
@@ -29,6 +31,7 @@ import UpdatePermissionModal from './updatePermissionModal'
import DeleteModal from './deletePermissionModal' import DeleteModal from './deletePermissionModal'
import { import {
GroupDetailsResponse,
PermissionResponse, PermissionResponse,
RegisterPermissionPayload RegisterPermissionPayload
} from '../../utils/types' } from '../../utils/types'
@@ -401,8 +404,66 @@ const PermissionTable = ({
} }
const displayPrincipal = (permission: PermissionResponse) => { const displayPrincipal = (permission: PermissionResponse) => {
if (permission.user) return permission.user?.username if (permission.user) return permission.user.username
if (permission.group) return permission.group?.name if (permission.group) return <DisplayGroup group={permission.group} />
}
type DisplayGroupProps = {
group: GroupDetailsResponse
}
const DisplayGroup = ({ group }: DisplayGroupProps) => {
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)
const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => {
setAnchorEl(event.currentTarget)
}
const handlePopoverClose = () => {
setAnchorEl(null)
}
const open = Boolean(anchorEl)
return (
<div>
<Typography
aria-owns={open ? 'mouse-over-popover' : undefined}
aria-haspopup="true"
onMouseEnter={handlePopoverOpen}
onMouseLeave={handlePopoverClose}
>
{group.name}
</Typography>
<Popover
id="mouse-over-popover"
sx={{
pointerEvents: 'none'
}}
open={open}
anchorEl={anchorEl}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left'
}}
transformOrigin={{
vertical: 'top',
horizontal: 'left'
}}
onClose={handlePopoverClose}
disableRestoreFocus
>
<Typography sx={{ p: 1 }} variant="h6" component="div">
Group Users
</Typography>
{group.users.map((user) => (
<Typography sx={{ p: 1 }} component="li">
{user.username}
</Typography>
))}
</Popover>
</div>
)
} }
const displayPrincipalType = (permission: PermissionResponse) => { const displayPrincipalType = (permission: PermissionResponse) => {

View File

@@ -11,12 +11,17 @@ export interface GroupResponse {
description: string description: string
} }
export interface GroupDetailsResponse extends GroupResponse {
isActive: boolean
users: UserResponse[]
}
export interface PermissionResponse { export interface PermissionResponse {
permissionId: number permissionId: number
uri: string uri: string
setting: string setting: string
user?: UserResponse user?: UserResponse
group?: GroupResponse group?: GroupDetailsResponse
} }
export interface RegisterPermissionPayload { export interface RegisterPermissionPayload {