Skip to content

Commit 1ad42dd

Browse files
committed
[backend] RBAC creation of roles screen
1 parent a2ce9ec commit 1ad42dd

File tree

9 files changed

+28
-95
lines changed

9 files changed

+28
-95
lines changed

openbas-api/src/main/java/io/openbas/migration/V4_10__List_Widget_config_update.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

openbas-api/src/main/java/io/openbas/migration/V4_12__Update_Role_table.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

openbas-api/src/main/java/io/openbas/rest/group/GroupApi.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import static java.time.Instant.now;
77
import static java.util.stream.Collectors.toList;
88
import static java.util.stream.StreamSupport.stream;
9-
import java.util.Set;
10-
import java.util.stream.Collectors;
119

1210
import io.openbas.database.model.*;
1311
import io.openbas.database.repository.*;
@@ -47,7 +45,6 @@ public class GroupApi extends RestBehavior {
4745
private GroupRepository groupRepository;
4846
private UserRepository userRepository;
4947
private RoleService roleService;
50-
private RoleRepository roleRepository;
5148

5249
@Autowired
5350
public void setOrganizationRepository(OrganizationRepository organizationRepository) {
@@ -157,9 +154,15 @@ public Group updateGroupRoles(
157154
.findById(groupId)
158155
.orElseThrow(() -> new ElementNotFoundException("Group not found with id: " + groupId));
159156

160-
Spliterator<Role> newRoles =
161-
roleRepository.findAllById(input.getRoleIds()).spliterator();
162-
group.setRoles(stream(newRoles, false).collect(toList()));
157+
group.setRoles(
158+
input.getRoleIds().stream()
159+
.map(
160+
id ->
161+
roleService
162+
.findById(id)
163+
.orElseThrow(
164+
() -> new ElementNotFoundException("Role not found with id: " + id)))
165+
.collect(toList()));
163166

164167
return groupRepository.save(group);
165168
}
@@ -265,9 +268,4 @@ public void deleteGrant(@PathVariable String grantId) {
265268
public void deleteGroup(@PathVariable String groupId) {
266269
groupRepository.deleteById(groupId);
267270
}
268-
269-
@Autowired
270-
public void setRoleRepository(RoleRepository roleRepository) {
271-
this.roleRepository = roleRepository;
272-
}
273271
}

openbas-front/src/actions/roles/roles-actions.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Dispatch } from 'redux';
22

33
import type { RoleCreateInput } from '../../admin/components/settings/roles/RoleForm';
44
import { delReferential, getReferential, postReferential, putReferential, simplePostCall } from '../../utils/Action';
5-
import { type Role, type SearchPaginationInput } from '../../utils/api-types';
5+
import { type RoleOutput, type SearchPaginationInput } from '../../utils/api-types';
66
import * as schema from '../Schema';
77

88
const ROLES_URI = '/api/roles';
@@ -12,12 +12,12 @@ export const searchRoles = (paginationInput: SearchPaginationInput) => {
1212
return simplePostCall(uri, data);
1313
};
1414

15-
export const fetchRoles = () => (dispatch: Dispatch): Promise<Role[]> => {
15+
export const fetchRoles = () => (dispatch: Dispatch): Promise<RoleOutput[]> => {
1616
const uri = `${ROLES_URI}`;
1717
return getReferential(schema.arrayOfRoles, uri)(dispatch);
1818
};
1919

20-
export const deleteRole = (roleId: Role['role_id']) => (dispatch: Dispatch) => {
20+
export const deleteRole = (roleId: RoleOutput['role_id']) => (dispatch: Dispatch) => {
2121
const uri = `${ROLES_URI}/${roleId}`;
2222
return delReferential(uri, 'roles', roleId)(dispatch);
2323
};
@@ -27,7 +27,7 @@ export const createRole = (data: RoleCreateInput) => (dispatch: Dispatch) => {
2727
return postReferential(schema.role, uri, data)(dispatch);
2828
};
2929

30-
export const updateRole = (roleId: Role['role_id'], data: RoleCreateInput) => (dispatch: Dispatch) => {
30+
export const updateRole = (roleId: RoleOutput['role_id'], data: RoleCreateInput) => (dispatch: Dispatch) => {
3131
const uri = `${ROLES_URI}/${roleId}`;
3232
return putReferential(schema.role, uri, data)(dispatch);
3333
};

openbas-front/src/admin/components/settings/roles/CreateRole.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import { useState } from 'react';import { createRole } from '../../../../actions/roles/roles-actions';import { type RoleResult } from '../../../../actions/roles/roles-helper';import ButtonCreate from '../../../../components/common/ButtonCreate';import Drawer from '../../../../components/common/Drawer';import { useFormatter } from '../../../../components/i18n';import type { Role } from '../../../../utils/api-types';import { useAppDispatch } from '../../../../utils/hooks';import RoleForm, { type RoleCreateInput } from './RoleForm';interface CreateRoleProps { onCreate?: (result: Role) => void }const CreateRole = ({ onCreate }: CreateRoleProps) => { // Standard hooks const [open, setOpen] = useState(false); const { t } = useFormatter(); const dispatch = useAppDispatch(); const onSubmit = (data: RoleCreateInput) => { dispatch(createRole(data)) .then((result: RoleResult) => { if (onCreate) { const roleCreated = result.entities.roles[result.result]; onCreate(roleCreated); } return (result.result ? setOpen(false) : result); }); }; return ( <> <ButtonCreate onClick={() => setOpen(true)} style={{ right: 230 }} /> <Drawer open={open} handleClose={() => setOpen(false)} title={t('Create a new role')} > <RoleForm onSubmit={onSubmit} handleClose={() => setOpen(false)} editing={false} /> </Drawer> </> );};export default CreateRole;
1+
import { useState } from 'react';import { createRole } from '../../../../actions/roles/roles-actions';import { type RoleResult } from '../../../../actions/roles/roles-helper';import ButtonCreate from '../../../../components/common/ButtonCreate';import Drawer from '../../../../components/common/Drawer';import { useFormatter } from '../../../../components/i18n';import type { RoleOutput } from '../../../../utils/api-types';import { useAppDispatch } from '../../../../utils/hooks';import RoleForm, { type RoleCreateInput } from './RoleForm';interface CreateRoleProps { onCreate?: (result: RoleOutput) => void }const CreateRole = ({ onCreate }: CreateRoleProps) => { // Standard hooks const [open, setOpen] = useState(false); const { t } = useFormatter(); const dispatch = useAppDispatch(); const onSubmit = (data: RoleCreateInput) => { dispatch(createRole(data)) .then((result: RoleResult) => { if (onCreate) { const roleCreated = result.entities.roles[result.result]; onCreate(roleCreated); } return (result.result ? setOpen(false) : result); }); }; return ( <> <ButtonCreate onClick={() => setOpen(true)} style={{ right: 230 }} /> <Drawer open={open} handleClose={() => setOpen(false)} title={t('Create a new role')} > <RoleForm onSubmit={onSubmit} handleClose={() => setOpen(false)} editing={false} /> </Drawer> </> );};export default CreateRole;

openbas-front/src/admin/components/settings/roles/RolePopover.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import ButtonPopover from '../../../../components/common/ButtonPopover';
66
import DialogDelete from '../../../../components/common/DialogDelete';
77
import Drawer from '../../../../components/common/Drawer';
88
import { useFormatter } from '../../../../components/i18n';
9-
import { type Role } from '../../../../utils/api-types';
9+
import { type RoleOutput } from '../../../../utils/api-types';
1010
import { useAppDispatch } from '../../../../utils/hooks';
1111
import RoleForm from './RoleForm';
1212

1313
export interface RolePopoverProps {
1414
onDelete?: (result: string) => void;
15-
onUpdate?: (result: Role) => void;
16-
role: Role;
15+
onUpdate?: (result: RoleOutput) => void;
16+
role: RoleOutput;
1717
}
1818

1919
const RolePopover: FunctionComponent<RolePopoverProps> = ({ onDelete, onUpdate, role }) => {

openbas-front/src/admin/components/settings/roles/Roles.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import PaginationComponentV2 from '../../../../components/common/queryable/pagin
99
import { buildSearchPagination } from '../../../../components/common/queryable/QueryableUtils';
1010
import { useQueryableWithLocalStorage } from '../../../../components/common/queryable/useQueryableWithLocalStorage';
1111
import { useFormatter } from '../../../../components/i18n';
12-
import type { Role, SearchPaginationInput } from '../../../../utils/api-types';
12+
import type { RoleOutput, SearchPaginationInput } from '../../../../utils/api-types';
1313
import SecurityMenu from '../SecurityMenu';
1414
import CreateRole from './CreateRole';
1515
import RolePopover from './RolePopover';
@@ -29,15 +29,15 @@ const Roles = () => {
2929
const [searchParams] = useSearchParams();
3030
const [search] = searchParams.getAll('search');
3131

32-
const [roles, setRoles] = useState<Role[]>([]);
32+
const [roles, setRoles] = useState<RoleOutput[]>([]);
3333
const [loading, setLoading] = useState<boolean>(true);
3434

3535
const { queryableHelpers, searchPaginationInput } = useQueryableWithLocalStorage('role', buildSearchPagination({
3636
sorts: initSorting('role_name', 'ASC'),
3737
textSearch: search,
3838
}));
3939

40-
const secondaryAction = (role: Role) => (
40+
const secondaryAction = (role: RoleOutput) => (
4141
<RolePopover
4242
onDelete={result => setRoles(roles.filter(r => (r.role_id !== result)))}
4343
onUpdate={result => setRoles(roles.map(r => (r.role_id !== result.role_id ? r : result)))}
@@ -72,7 +72,7 @@ const Roles = () => {
7272
disableFilters
7373
/>
7474
<RolesList roles={roles} queryableHelpers={queryableHelpers} loading={loading} secondaryAction={secondaryAction} />
75-
<CreateRole onCreate={(result: Role) => setRoles([...roles, result])} />
75+
<CreateRole onCreate={(result: RoleOutput) => setRoles([...roles, result])} />
7676

7777
</div>
7878
<SecurityMenu />

openbas-front/src/admin/components/settings/roles/RolesList.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import SortHeadersComponentV2 from '../../../../components/common/queryable/sort
99
import useBodyItemsStyles from '../../../../components/common/queryable/style/style';
1010
import { useFormatter } from '../../../../components/i18n';
1111
import PaginatedListLoader from '../../../../components/PaginatedListLoader';
12-
import { type Role } from '../../../../utils/api-types';
12+
import { type RoleOutput } from '../../../../utils/api-types';
1313

1414
interface RolesListProps {
15-
roles: Role[];
15+
roles: RoleOutput[];
1616
queryableHelpers: QueryableHelpers;
1717
loading: boolean;
18-
secondaryAction?: (role: Role) => ReactNode;
18+
secondaryAction?: (role: RoleOutput) => ReactNode;
1919
}
2020

2121
const useStyles = makeStyles()(() => ({
@@ -46,13 +46,13 @@ const RolesList = ({
4646
field: 'role_name',
4747
label: t('Name'),
4848
isSortable: true,
49-
value: (role: Role) => role.role_name,
49+
value: (role: RoleOutput) => role.role_name,
5050
},
5151
{
5252
field: 'role_created_at',
5353
label: t('Platform creation date'),
5454
isSortable: true,
55-
value: (role: Role) => {
55+
value: (role: RoleOutput) => {
5656
if (!role.role_created_at) {
5757
return '-';
5858
}
@@ -63,7 +63,7 @@ const RolesList = ({
6363
field: 'role_updated_at',
6464
label: t('Modification date'),
6565
isSortable: true,
66-
value: (role: Role) => {
66+
value: (role: RoleOutput) => {
6767
if (!role.role_updated_at) {
6868
return '-';
6969
}
@@ -94,7 +94,7 @@ const RolesList = ({
9494
? <PaginatedListLoader Icon={HelpOutlineOutlined} headers={headers} headerStyles={inlineStyles} />
9595
: (
9696
<div>
97-
{roles.map((role: Role) => (
97+
{roles.map((role: RoleOutput) => (
9898
<ListItem
9999
key={role.role_id}
100100
classes={{ root: classes.item }}

openbas-front/src/utils/api-types.d.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5835,12 +5835,3 @@ export interface WidgetLayout {
58355835
/** @format int32 */
58365836
widget_layout_y: number;
58375837
}
5838-
5839-
export interface Role {
5840-
role_id: string;
5841-
role_name: string;
5842-
role_created_at: string;
5843-
role_updated_at: string;
5844-
role_description?: string;
5845-
role_capabilities: string[];
5846-
}

0 commit comments

Comments
 (0)