diff options
author | guillaume-peoch-sonarsource <guillaume.peoch@sonarsource.com> | 2023-11-30 12:09:06 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2023-12-22 20:03:01 +0000 |
commit | e4e087dd7877352e2d77f9531535258224820e9f (patch) | |
tree | 1ac7d7cc6a7645b796a1702500e2829f8dc63d09 /server/sonar-web/src/main/js/queries | |
parent | 3cbfd8163ffdc42f89631382031dd115c0df65b6 (diff) | |
download | sonarqube-e4e087dd7877352e2d77f9531535258224820e9f.tar.gz sonarqube-e4e087dd7877352e2d77f9531535258224820e9f.zip |
SONAR-21119 UI for GitLab Authentication tab with users and groups provisioning
Diffstat (limited to 'server/sonar-web/src/main/js/queries')
-rw-r--r-- | server/sonar-web/src/main/js/queries/identity-provider.ts | 132 |
1 files changed, 131 insertions, 1 deletions
diff --git a/server/sonar-web/src/main/js/queries/identity-provider.ts b/server/sonar-web/src/main/js/queries/identity-provider.ts index c37a6248494..68bddee21bc 100644 --- a/server/sonar-web/src/main/js/queries/identity-provider.ts +++ b/server/sonar-web/src/main/js/queries/identity-provider.ts @@ -21,18 +21,23 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { isEqual, keyBy, partition, pick, unionBy } from 'lodash'; import { useContext } from 'react'; +import { getActivity } from '../api/ce'; import { activateGithubProvisioning, activateScim, addGithubRolesMapping, checkConfigurationValidity, + createGitLabConfiguration, deactivateGithubProvisioning, deactivateScim, + deleteGitLabConfiguration, deleteGithubRolesMapping, + fetchGitLabConfigurations, fetchGithubProvisioningStatus, fetchGithubRolesMapping, fetchIsScimEnabled, syncNowGithubProvisioning, + updateGitLabConfiguration, updateGithubRolesMapping, } from '../api/provisioning'; import { getSystemInfo } from '../api/system'; @@ -41,7 +46,8 @@ import { addGlobalSuccessMessage } from '../helpers/globalMessages'; import { translate } from '../helpers/l10n'; import { mapReactQueryResult } from '../helpers/react-query'; import { Feature } from '../types/features'; -import { GitHubMapping } from '../types/provisioning'; +import { AlmSyncStatus, GitHubMapping } from '../types/provisioning'; +import { TaskStatuses, TaskTypes } from '../types/tasks'; import { SysInfoCluster } from '../types/types'; const MAPPING_STALE_TIME = 60_000; @@ -183,3 +189,127 @@ export function useGithubRolesMappingMutation() { }, }); } + +export function useGitLabConfigurationsQuery() { + return useQuery(['identity_provider', 'gitlab_config', 'list'], fetchGitLabConfigurations); +} + +export function useCreateGitLabConfigurationMutation() { + const client = useQueryClient(); + return useMutation({ + mutationFn: (data: Parameters<typeof createGitLabConfiguration>[0]) => + createGitLabConfiguration(data), + onSuccess(data) { + client.setQueryData(['identity_provider', 'gitlab_config', 'list'], { + configurations: [data], + page: { + pageIndex: 1, + pageSize: 1, + total: 1, + }, + }); + }, + }); +} + +export function useUpdateGitLabConfigurationMutation() { + const client = useQueryClient(); + return useMutation({ + mutationFn: ({ + id, + data, + }: { + id: Parameters<typeof updateGitLabConfiguration>[0]; + data: Parameters<typeof updateGitLabConfiguration>[1]; + }) => updateGitLabConfiguration(id, data), + onSuccess(data) { + client.invalidateQueries({ queryKey: ['identity_provider'] }); + client.setQueryData(['identity_provider', 'gitlab_config', 'list'], { + configurations: [data], + page: { + pageIndex: 1, + pageSize: 1, + total: 1, + }, + }); + }, + }); +} + +export function useDeleteGitLabConfigurationMutation() { + const client = useQueryClient(); + return useMutation({ + mutationFn: (id: Parameters<typeof deleteGitLabConfiguration>[0]) => + deleteGitLabConfiguration(id), + onSuccess() { + client.setQueryData(['identity_provider', 'gitlab_config', 'list'], { + configurations: [], + page: { + pageIndex: 1, + pageSize: 1, + total: 0, + }, + }); + }, + }); +} + +export function useGitLabSyncStatusQuery() { + const getLastSync = async () => { + const lastSyncTasks = await getActivity({ + type: TaskTypes.GitlabProvisioning, + p: 1, + ps: 1, + status: [TaskStatuses.Success, TaskStatuses.Failed, TaskStatuses.Canceled].join(','), + }); + const lastSync = lastSyncTasks?.tasks[0]; + if (!lastSync) { + return undefined; + } + const summary = lastSync.infoMessages ? lastSync.infoMessages?.join(', ') : ''; + const errorMessage = lastSync.errorMessage ?? ''; + return { + executionTimeMs: lastSync?.executionTimeMs ?? 0, + startedAt: +new Date(lastSync?.startedAt ?? 0), + finishedAt: +new Date(lastSync?.startedAt ?? 0) + (lastSync?.executionTimeMs ?? 0), + warningMessage: + lastSync.warnings && lastSync.warnings.length > 0 + ? lastSync.warnings?.join(', ') + : undefined, + status: lastSync?.status as + | TaskStatuses.Success + | TaskStatuses.Failed + | TaskStatuses.Canceled, + ...(lastSync.status === TaskStatuses.Success ? { summary } : {}), + ...(lastSync.status !== TaskStatuses.Success ? { errorMessage } : {}), + }; + }; + + const getNextSync = async () => { + const nextSyncTasks = await getActivity({ + type: TaskTypes.GitlabProvisioning, + p: 1, + ps: 1, + status: [TaskStatuses.Pending, TaskStatuses.InProgress].join(','), + }); + const nextSync = nextSyncTasks?.tasks[0]; + if (!nextSync) { + return undefined; + } + return { status: nextSync.status as TaskStatuses.Pending | TaskStatuses.InProgress }; + }; + + return useQuery( + ['identity_provider', 'gitlab_sync', 'status'], + async () => { + const [lastSync, nextSync] = await Promise.all([getLastSync(), getNextSync()]); + return { + lastSync, + nextSync, + } as AlmSyncStatus; + }, + { + refetchInterval: 10_000, + }, + ); +} |