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;
}