diff --git a/frontend/src/component/admin/auth/ScimSettings/ScimSettings.tsx b/frontend/src/component/admin/auth/ScimSettings/ScimSettings.tsx index a0a404a1b4..f0c784f464 100644 --- a/frontend/src/component/admin/auth/ScimSettings/ScimSettings.tsx +++ b/frontend/src/component/admin/auth/ScimSettings/ScimSettings.tsx @@ -11,6 +11,7 @@ import { useScimSettingsApi } from 'hooks/api/actions/useScimSettingsApi/useScim import { useScimSettings } from 'hooks/api/getters/useScimSettings/useScimSettings'; import { ScimDeleteEntityDialog } from './ScimDeleteUsersDialog'; import useAdminUsersApi from 'hooks/api/actions/useAdminUsersApi/useAdminUsersApi'; +import { useGroupApi } from 'hooks/api/actions/useGroupApi/useGroupApi'; const StyledContainer = styled('div')(({ theme }) => ({ padding: theme.spacing(3), @@ -32,6 +33,7 @@ export const ScimSettings = () => { const [tokenDialog, setTokenDialog] = useState(false); const { settings, refetch } = useScimSettings(); const { deleteScimUsers } = useAdminUsersApi(); + const { deleteScimGroups } = useGroupApi(); const [enabled, setEnabled] = useState(settings.enabled ?? true); useEffect(() => { @@ -46,7 +48,17 @@ export const ScimSettings = () => { }; const onDeleteScimGroups = async () => { - setDeleteGroupsDialog(true); + try { + await deleteScimGroups(); + setToastData({ + text: 'Scim Groups have been deleted', + type: 'success', + }); + setDeleteGroupsDialog(false); + refetch(); + } catch (error: unknown) { + setToastApiError(formatUnknownError(error)); + } }; const onDeleteScimUsers = async () => { @@ -203,7 +215,9 @@ export const ScimSettings = () => { variant='outlined' color='error' disabled={loading} - onClick={onDeleteScimGroups} + onClick={() => { + setDeleteGroupsDialog(true); + }} > Delete Groups @@ -226,14 +240,14 @@ export const ScimSettings = () => { closeDialog={() => setDeleteUsersDialog(false)} deleteEntities={onDeleteScimUsers} entityType='Users' - > + /> setDeleteGroupsDialog(false)} deleteEntities={onDeleteScimGroups} entityType='Groups' - > + /> ); diff --git a/frontend/src/hooks/api/actions/useGroupApi/useGroupApi.ts b/frontend/src/hooks/api/actions/useGroupApi/useGroupApi.ts index 7a96530e87..4f5811a1e6 100644 --- a/frontend/src/hooks/api/actions/useGroupApi/useGroupApi.ts +++ b/frontend/src/hooks/api/actions/useGroupApi/useGroupApi.ts @@ -46,10 +46,20 @@ export const useGroupApi = () => { await makeRequest(req.caller, req.id); }; + const deleteScimGroups = async () => { + const path = `api/admin/groups/scim-groups`; + const req = createRequest(path, { + method: 'DELETE', + }); + + await makeRequest(req.caller, req.id); + }; + return { createGroup, updateGroup, removeGroup, + deleteScimGroups, errors, loading, }; diff --git a/src/lib/db/group-store.ts b/src/lib/db/group-store.ts index f353be131a..dd50512836 100644 --- a/src/lib/db/group-store.ts +++ b/src/lib/db/group-store.ts @@ -354,4 +354,8 @@ export default class GroupStore implements IGroupStore { const { present } = result.rows[0]; return present; } + + async deleteScimGroups(): Promise { + await this.db(T.GROUPS).whereNotNull('scim_id').del(); + } } diff --git a/src/lib/services/group-service.ts b/src/lib/services/group-service.ts index d629211ba8..c8da53965f 100644 --- a/src/lib/services/group-service.ts +++ b/src/lib/services/group-service.ts @@ -21,6 +21,7 @@ import { GROUP_CREATED, GroupUserAdded, GroupUserRemoved, + ScimGroupsDeleted, type IBaseEvent, } from '../types/events'; import NameExistsError from '../error/name-exists-error'; @@ -310,6 +311,16 @@ export class GroupService { } } + async deleteScimGroups(auditUser: IAuditUser): Promise { + await this.groupStore.deleteScimGroups(); + await this.eventService.storeEvent( + new ScimGroupsDeleted({ + data: null, + auditUser, + }), + ); + } + private mapGroupWithUsers( group: IGroup, allGroupUsers: IGroupUser[], diff --git a/src/lib/types/stores/group-store.ts b/src/lib/types/stores/group-store.ts index 5e3cc758a9..94fcdac399 100644 --- a/src/lib/types/stores/group-store.ts +++ b/src/lib/types/stores/group-store.ts @@ -66,4 +66,6 @@ export interface IGroupStore extends Store { create(group: IStoreGroup): Promise; count(): Promise; + + deleteScimGroups(): Promise; }