diff --git a/graylog2-server/src/main/java/org/graylog/plugins/onboarding/rest/OnboardingResource.java b/graylog2-server/src/main/java/org/graylog/plugins/onboarding/rest/OnboardingResource.java index 1fe840ea2e43..57c5f9ceaf33 100644 --- a/graylog2-server/src/main/java/org/graylog/plugins/onboarding/rest/OnboardingResource.java +++ b/graylog2-server/src/main/java/org/graylog/plugins/onboarding/rest/OnboardingResource.java @@ -69,7 +69,7 @@ public OnboardingState get() { @PUT @Path("/dismiss") @AuditEvent(type = OnboardingAuditEventTypes.ONBOARDING_DISMISSED) - @Operation(summary = "Update onboarding status") + @Operation(summary = "Dismiss onboarding") @ApiResponses({ @ApiResponse(responseCode = "200", description = "Updated onboarding status"), @ApiResponse(responseCode = "400", description = "Bad request, illegal status value") @@ -78,4 +78,17 @@ public OnboardingState get() { public void dismiss() { clusterConfigService.write(new OnboardingState(OnboardingStatus.DISMISSED)); } + + @PUT + @Path("/finish") + @AuditEvent(type = OnboardingAuditEventTypes.ONBOARDING_DISMISSED) + @Operation(summary = "Finish onboarding") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Updated onboarding status"), + @ApiResponse(responseCode = "400", description = "Bad request, illegal status value") + }) + @RequiresPermissions(RestPermissions.CLUSTER_CONFIG_ENTRY_EDIT) + public void finish() { + clusterConfigService.write(new OnboardingState(OnboardingStatus.FINISHED)); + } } diff --git a/graylog2-web-interface/src/components/welcome/hooks/useDismissOnboarding.ts b/graylog2-web-interface/src/components/welcome/hooks/useDismissOnboarding.ts index 9f6f3248ccf0..f0da5e033aa2 100644 --- a/graylog2-web-interface/src/components/welcome/hooks/useDismissOnboarding.ts +++ b/graylog2-web-interface/src/components/welcome/hooks/useDismissOnboarding.ts @@ -20,7 +20,6 @@ import { Onboarding } from '@graylog/server-api'; import { ONBOARDING_ELIGIBILITY_QUERY_KEY } from './useOnboardingEligibility'; -// TODO: Replace with a real backend call once the dismiss endpoint exists. const dismissOnboarding = () => Onboarding.dismiss(); const useDismissOnboarding = () => { diff --git a/graylog2-web-interface/src/components/welcome/hooks/useFinishOnboarding.ts b/graylog2-web-interface/src/components/welcome/hooks/useFinishOnboarding.ts new file mode 100644 index 000000000000..f0117513452e --- /dev/null +++ b/graylog2-web-interface/src/components/welcome/hooks/useFinishOnboarding.ts @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2020 Graylog, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * . + */ +import { useMutation, useQueryClient } from '@tanstack/react-query'; + +import { Onboarding } from '@graylog/server-api'; + +import { ONBOARDING_ELIGIBILITY_QUERY_KEY } from './useOnboardingEligibility'; + +const finishOnboarding = () => Onboarding.finish(); + +const useFinishOnboarding = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: finishOnboarding, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ONBOARDING_ELIGIBILITY_QUERY_KEY }), + }); +}; + +export default useFinishOnboarding; diff --git a/graylog2-web-interface/src/components/welcome/hooks/useOnboardingEligibility.ts b/graylog2-web-interface/src/components/welcome/hooks/useOnboardingEligibility.ts index 1693ca5b881c..bf4b8774c23f 100644 --- a/graylog2-web-interface/src/components/welcome/hooks/useOnboardingEligibility.ts +++ b/graylog2-web-interface/src/components/welcome/hooks/useOnboardingEligibility.ts @@ -20,7 +20,6 @@ import { Onboarding } from '@graylog/server-api'; export const ONBOARDING_ELIGIBILITY_QUERY_KEY = ['onboarding', 'eligibility']; -// TODO: Replace with a real backend call once the eligibility endpoint exists. const fetchOnboardingEligibility = () => Onboarding.get(); const useOnboardingEligibility = (enabled: boolean = true) => { diff --git a/graylog2-web-interface/src/pages/CollectorsOnboardingInstancePage.tsx b/graylog2-web-interface/src/pages/CollectorsOnboardingInstancePage.tsx index fcb57609699b..1b1e036288cb 100644 --- a/graylog2-web-interface/src/pages/CollectorsOnboardingInstancePage.tsx +++ b/graylog2-web-interface/src/pages/CollectorsOnboardingInstancePage.tsx @@ -30,6 +30,7 @@ import { extractErrorMessage } from 'util/extractErrorMessage'; import useDefaultInterval from 'views/hooks/useDefaultIntervalForRefresh'; import useHistory from 'routing/useHistory'; import UserNotification from 'util/UserNotification'; +import useFinishOnboarding from 'components/welcome/hooks/useFinishOnboarding'; const CollectorsOnboardingInstancePage = () => { const { instanceUid } = useParams<{ instanceUid: string }>(); @@ -37,14 +38,16 @@ const CollectorsOnboardingInstancePage = () => { const { data: instance, isLoading, error } = useInstance(instanceUid); const defaultInterval = useDefaultInterval(); + const { mutate: finish } = useFinishOnboarding(); // using useEffect to guard that the default is actually there when we call the navigate useEffect(() => { if (instance && defaultInterval) { + finish(); history.push(collectorReceivedMessagesUrl(COLLECTOR_INSTANCE_UID_FIELD, instance.instance_uid, defaultInterval)); UserNotification.success('Collector connected successfully! Showing received messages ...'); } - }, [defaultInterval, instance, history]); + }, [defaultInterval, instance, history, finish]); const content = () => { if (isLoading) return ;