From: Mathieu Suen Date: Fri, 26 May 2023 14:58:05 +0000 (+0200) Subject: SONAR-19347 Add synchronize now button for Github X-Git-Tag: 10.1.0.73491~196 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=80e01984fcffe2c76f61d76c34620edfb73f68be;p=sonarqube.git SONAR-19347 Add synchronize now button for Github --- diff --git a/server/sonar-web/src/main/js/api/provisioning.ts b/server/sonar-web/src/main/js/api/provisioning.ts index 10220bb92c2..fbadc9dee85 100644 --- a/server/sonar-web/src/main/js/api/provisioning.ts +++ b/server/sonar-web/src/main/js/api/provisioning.ts @@ -46,3 +46,7 @@ export function activateGithubProvisioning(): Promise { export function deactivateGithubProvisioning(): Promise { return post('/api/github_provisioning/disable').catch(throwGlobalError); } + +export function syncNowGithubProvisioning(): Promise { + return post('/api/github_provisioning/sync').catch(throwGlobalError); +} diff --git a/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx b/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx index e011d74d7bb..5d7cb2544c7 100644 --- a/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx +++ b/server/sonar-web/src/main/js/app/components/GitHubSynchronisationWarning.tsx @@ -19,18 +19,15 @@ */ import { formatDistance } from 'date-fns'; import * as React from 'react'; -import { useContext } from 'react'; import { FormattedMessage } from 'react-intl'; import Link from '../../components/common/Link'; import CheckIcon from '../../components/icons/CheckIcon'; import { Alert } from '../../components/ui/Alert'; import { translate, translateWithParameters } from '../../helpers/l10n'; import { useSyncStatusQuery } from '../../queries/github-sync'; -import { Feature } from '../../types/features'; import { GithubStatusEnabled } from '../../types/provisioning'; import { TaskStatuses } from '../../types/tasks'; import './SystemAnnouncement.css'; -import { AvailableFeaturesContext } from './available-features/AvailableFeaturesContext'; interface LastSyncProps { short?: boolean; @@ -100,10 +97,7 @@ function LastSyncAlert({ info, short }: LastSyncProps) { } function GitHubSynchronisationWarning({ short }: GitHubSynchronisationWarningProps) { - const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes( - Feature.GithubProvisioning - ); - const { data } = useSyncStatusQuery({ enabled: hasGithubProvisioning }); + const { data } = useSyncStatusQuery(); if (!data) { return null; @@ -113,7 +107,7 @@ function GitHubSynchronisationWarning({ short }: GitHubSynchronisationWarningPro <> {!short && data?.nextSync && ( <> - + {translate( data.nextSync.status === TaskStatuses.Pending ? 'settings.authentication.github.synchronization_pending' diff --git a/server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAuthenticationTab.tsx b/server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAuthenticationTab.tsx index 5df3bcdc37d..1f2348a1f62 100644 --- a/server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAuthenticationTab.tsx +++ b/server/sonar-web/src/main/js/apps/settings/components/authentication/GithubAuthenticationTab.tsx @@ -30,6 +30,7 @@ import DeleteIcon from '../../../../components/icons/DeleteIcon'; import EditIcon from '../../../../components/icons/EditIcon'; import { Alert } from '../../../../components/ui/Alert'; import { translate, translateWithParameters } from '../../../../helpers/l10n'; +import { useSyncNow } from '../../../../queries/github-sync'; import { AlmKeys } from '../../../../types/alm-settings'; import { ExtendedSettingDefinition } from '../../../../types/settings'; import { DOCUMENTATION_LINK_SUFFIXES } from './Authentication'; @@ -78,6 +79,7 @@ export default function GithubAuthenticationTab(props: GithubAuthenticationProps } = useGithubConfiguration(definitions); const hasDifferentProvider = data?.provider !== undefined && data.provider !== Provider.Github; + const { canSyncNow, synchronizeNow } = useSyncNow(); const handleCreateConfiguration = () => { setShowEditModal(true); @@ -220,6 +222,15 @@ export default function GithubAuthenticationTab(props: GithubAuthenticationProps />

{githubProvisioningStatus && } +
+ +
) : (

diff --git a/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/IdentityProvider.ts b/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/IdentityProvider.ts index d5b5858339a..1396ec4dc1f 100644 --- a/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/IdentityProvider.ts +++ b/server/sonar-web/src/main/js/apps/settings/components/authentication/queries/IdentityProvider.ts @@ -52,11 +52,7 @@ export function useScimStatusQuery() { } export function useGithubStatusQuery() { - const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes( - Feature.GithubProvisioning - ); - - const res = useSyncStatusQuery({ enabled: hasGithubProvisioning }); + const res = useSyncStatusQuery(); return { ...res, data: res.data?.enabled }; } diff --git a/server/sonar-web/src/main/js/queries/github-sync.ts b/server/sonar-web/src/main/js/queries/github-sync.ts index d2be1351260..67f7e3c8edf 100644 --- a/server/sonar-web/src/main/js/queries/github-sync.ts +++ b/server/sonar-web/src/main/js/queries/github-sync.ts @@ -17,9 +17,33 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import { useQuery } from '@tanstack/react-query'; -import { fetchGithubProvisioningStatus } from '../api/provisioning'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useContext } from 'react'; +import { fetchGithubProvisioningStatus, syncNowGithubProvisioning } from '../api/provisioning'; +import { AvailableFeaturesContext } from '../app/components/available-features/AvailableFeaturesContext'; +import { Feature } from '../types/features'; -export const useSyncStatusQuery = ({ enabled }: { enabled?: boolean }) => { - return useQuery(['github_sync', 'status'], fetchGithubProvisioningStatus, { enabled }); -}; +export function useSyncStatusQuery() { + const hasGithubProvisioning = useContext(AvailableFeaturesContext).includes( + Feature.GithubProvisioning + ); + return useQuery(['github_sync', 'status'], fetchGithubProvisioningStatus, { + enabled: hasGithubProvisioning, + refetchInterval: 10_000, + }); +} + +export function useSyncNow() { + const queryClient = useQueryClient(); + const { data } = useSyncStatusQuery(); + const mutation = useMutation(syncNowGithubProvisioning, { + onSuccess: () => { + queryClient.invalidateQueries(['github_sync']); + }, + }); + + return { + synchronizeNow: mutation.mutate, + canSyncNow: data && data.enabled && !data.nextSync && !mutation.isLoading, + }; +} diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 291c3fedba3..246c5c5c0d5 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -1386,6 +1386,7 @@ settings.authentication.github.form.provisioning_with_github=Automatic user and settings.authentication.github.form.provisioning_with_github.description=Users and groups are automatically provisioned from your GitHub organizations. Once activated, managed users and groups can only be modified from your GitHub organizations/teams. Existing local users and groups will be kept. settings.authentication.github.form.provisioning_with_github.description.doc=For more details, see {documentation}. settings.authentication.github.form.provisioning.disabled=Your current edition does not support provisioning with GitHub. See the {documentation} for more information. +settings.authentication.github.synchronize_now=Synchronize now settings.authentication.github.synchronization_in_progress=Synchronization is in progress. settings.authentication.github.synchronization_pending=Synchronization is scheduled. settings.authentication.github.synchronization_successful=Last synchronization was done {0} ago.