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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user