Merge remote-tracking branch 'origin/staging' into staging

This commit is contained in:
dal 2025-10-02 09:50:10 -06:00
commit 69a05f0d0f
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
6 changed files with 128 additions and 91 deletions

View File

@ -1,22 +1,16 @@
import type { GetDashboardResponse } from '@buster/server-shared/dashboards';
import { type QueryClient, useQueryClient } from '@tanstack/react-query';
import last from 'lodash/last';
import { dashboardQueryKeys } from '@/api/query_keys/dashboard';
import { metricsQueryKeys } from '@/api/query_keys/metric';
import { useBusterNotifications } from '@/context/BusterNotifications';
import { setOriginalDashboard } from '@/context/Dashboards/useOriginalDashboardStore';
import { setOriginalMetric } from '@/context/Metrics/useOriginalMetricStore';
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
import { upgradeMetricToIMetric } from '@/lib/metrics/upgradeToIMetric';
import { prefetchGetMetricDataClient } from '../metrics/queryRequests';
import { initializeMetrics } from '../metrics/metricQueryHelpers';
import { getDashboardById } from './requests';
export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) => {
const { prefetchData = true } = params || {};
const queryClient = useQueryClient();
const prefetchDashboard = useGetDashboardAndInitializeMetrics({
prefetchData,
});
const { openErrorMessage } = useBusterNotifications();
const method = useMemoizedFn(
@ -24,11 +18,13 @@ export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) =>
const options = dashboardQueryKeys.dashboardGetDashboard(dashboardId, 'LATEST');
let dashboardResponse = queryClient.getQueryData(options.queryKey);
if (!dashboardResponse) {
const res = await prefetchDashboard({
const res = await getDashboardAndInitializeMetrics({
id: dashboardId,
version_number: 'LATEST',
shouldInitializeMetrics: initializeMetrics,
password,
queryClient,
shouldInitializeMetrics: initializeMetrics,
prefetchMetricsData: prefetchData,
}).catch(() => {
openErrorMessage('Failed to save metrics to dashboard. Dashboard not found');
});
@ -48,63 +44,6 @@ export const useEnsureDashboardConfig = (params?: { prefetchData?: boolean }) =>
return method;
};
export const initializeMetrics = (
metrics: GetDashboardResponse['metrics'],
queryClient: QueryClient,
prefetchData: boolean
) => {
for (const metric of Object.values(metrics)) {
const upgradedMetric = upgradeMetricToIMetric(metric, null);
queryClient.setQueryData(
metricsQueryKeys.metricsGetMetric(metric.id, metric.version_number).queryKey,
upgradedMetric
);
const isLatestVersion = metric.version_number === last(metric.versions)?.version_number;
if (isLatestVersion) {
setOriginalMetric(upgradedMetric);
queryClient.setQueryData(
metricsQueryKeys.metricsGetMetric(metric.id, 'LATEST').queryKey,
upgradedMetric
);
}
if (prefetchData) {
prefetchGetMetricDataClient(
{ id: metric.id, version_number: metric.version_number },
queryClient
);
}
}
};
export const useGetDashboardAndInitializeMetrics = (params?: { prefetchData?: boolean }) => {
const { prefetchData = true } = params || {};
const queryClient = useQueryClient();
return useMemoizedFn(
async ({
id,
version_number,
shouldInitializeMetrics = true,
password,
}: {
id: string;
version_number: number | 'LATEST';
shouldInitializeMetrics?: boolean;
password: string | undefined;
}) => {
return getDashboardAndInitializeMetrics({
id,
version_number,
password,
queryClient,
shouldInitializeMetrics,
prefetchMetricsData: prefetchData,
});
}
);
};
//Can use this in server side
export const getDashboardAndInitializeMetrics = async ({
id,
version_number,

View File

@ -3,7 +3,7 @@ import { useNavigate } from '@tanstack/react-router';
import last from 'lodash/last';
import { dashboardQueryKeys } from '@/api/query_keys/dashboard';
import { setOriginalDashboard } from '@/context/Dashboards/useOriginalDashboardStore';
import { initializeMetrics } from '../dashboardQueryHelpers';
import { initializeMetrics } from '../../metrics/metricQueryHelpers';
import { dashboardsUpdateDashboard } from '../requests';
/**

View File

@ -15,10 +15,7 @@ import {
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
import { isQueryStale } from '@/lib/query';
import { hasOrganizationId } from '../../users/userQueryHelpers';
import {
getDashboardAndInitializeMetrics,
useGetDashboardAndInitializeMetrics,
} from '../dashboardQueryHelpers';
import { getDashboardAndInitializeMetrics } from '../dashboardQueryHelpers';
import { useGetDashboardVersionNumber } from '../dashboardVersionNumber';
import { dashboardsGetList } from '../requests';
@ -36,14 +33,22 @@ export const useGetDashboard = <TData = GetDashboardResponse>(
) => {
const id = idProp || '';
const password = useProtectedAssetPassword(id);
const queryFn = useGetDashboardAndInitializeMetrics();
const queryClient = useQueryClient();
// const queryFn = useGetDashboardAndInitializeMetrics();
const { selectedVersionNumber } = useGetDashboardVersionNumber(id, versionNumberProp);
const { isFetched: isFetchedInitial, isError: isErrorInitial } = useQuery({
...dashboardQueryKeys.dashboardGetDashboard(id, 'LATEST'),
queryFn: () =>
queryFn({ id, version_number: 'LATEST', shouldInitializeMetrics: true, password }),
getDashboardAndInitializeMetrics({
id,
version_number: 'LATEST',
password,
queryClient,
shouldInitializeMetrics: true,
prefetchMetricsData: true,
}),
enabled: true,
retry(_failureCount, error) {
if (error?.message !== undefined) {
@ -61,11 +66,13 @@ export const useGetDashboard = <TData = GetDashboardResponse>(
return useQuery({
...dashboardQueryKeys.dashboardGetDashboard(id, selectedVersionNumber),
queryFn: () =>
queryFn({
getDashboardAndInitializeMetrics({
id,
version_number: selectedVersionNumber,
shouldInitializeMetrics: true,
password,
queryClient,
shouldInitializeMetrics: true,
prefetchMetricsData: true,
}),
enabled: isFetchedInitial && !isErrorInitial,
select: params?.select,
@ -80,7 +87,6 @@ export const usePrefetchGetDashboardClient = <TData = GetDashboardResponse>(
params?: Omit<UseQueryOptions<GetDashboardResponse, ApiError, TData>, 'queryKey' | 'queryFn'>
) => {
const queryClient = useQueryClient();
const queryFn = useGetDashboardAndInitializeMetrics({ prefetchData: false });
return useMemoizedFn((id: string, versionNumber: number | 'LATEST') => {
const getDashboardQueryKey = dashboardQueryKeys.dashboardGetDashboard(id, versionNumber);
@ -89,11 +95,13 @@ export const usePrefetchGetDashboardClient = <TData = GetDashboardResponse>(
return queryClient.prefetchQuery({
...dashboardQueryKeys.dashboardGetDashboard(id, versionNumber),
queryFn: () =>
queryFn({
getDashboardAndInitializeMetrics({
id,
version_number: versionNumber,
shouldInitializeMetrics: true,
version_number: 'LATEST',
password: undefined,
queryClient,
shouldInitializeMetrics: true,
prefetchMetricsData: false,
}),
...params,
});

View File

@ -1,8 +1,14 @@
import { useQueryClient } from '@tanstack/react-query';
import type { GetDashboardResponse } from '@buster/server-shared/dashboards';
import type { GetReportResponse } from '@buster/server-shared/reports';
import { type QueryClient, useQueryClient } from '@tanstack/react-query';
import last from 'lodash/last';
import { setOriginalMetric } from '@/context/Metrics/useOriginalMetricStore';
import { useMemoizedFn } from '@/hooks/useMemoizedFn';
import { upgradeMetricToIMetric } from '@/lib/metrics/upgradeToIMetric';
import type { BusterMetricDataExtended } from '../../asset_interfaces/metric';
import type { BusterMetric } from '../../asset_interfaces/metric/interfaces';
import { metricsQueryKeys } from '../../query_keys/metric';
import { prefetchGetMetricDataClient } from './getMetricQueryRequests';
export const useGetMetricMemoized = () => {
const queryClient = useQueryClient();
@ -37,3 +43,31 @@ export const useGetMetricDataMemoized = () => {
);
return getMetricDataMemoized;
};
export const initializeMetrics = (
metrics: GetDashboardResponse['metrics'] | GetReportResponse['metrics'],
queryClient: QueryClient,
prefetchData: boolean
) => {
for (const metric of Object.values(metrics)) {
const upgradedMetric = upgradeMetricToIMetric(metric, null);
queryClient.setQueryData(
metricsQueryKeys.metricsGetMetric(metric.id, metric.version_number).queryKey,
upgradedMetric
);
const isLatestVersion = metric.version_number === last(metric.versions)?.version_number;
if (isLatestVersion) {
setOriginalMetric(upgradedMetric);
queryClient.setQueryData(
metricsQueryKeys.metricsGetMetric(metric.id, 'LATEST').queryKey,
upgradedMetric
);
}
if (prefetchData) {
prefetchGetMetricDataClient(
{ id: metric.id, version_number: metric.version_number },
queryClient
);
}
}
};

View File

@ -17,7 +17,8 @@ import {
useRemoveAssetFromCollection,
} from '../collections/queryRequests';
import { useGetUserFavorites } from '../users/favorites';
import { getReportById, getReportsList, updateReport } from './requests';
import { getReportAndInitializeMetrics } from './reportQueryHelpers';
import { getReportsList, updateReport } from './requests';
/**
* Hook to get a list of reports
@ -80,9 +81,13 @@ export const prefetchGetReport = async (
await queryClient.prefetchQuery({
...reportsQueryKeys.reportsGetReport(reportId, version_number || 'LATEST'),
queryFn: () =>
getReportById({
getReportAndInitializeMetrics({
id: reportId,
version_number: typeof version_number === 'number' ? version_number : undefined,
password: undefined,
queryClient,
shouldInitializeMetrics: true,
prefetchMetricsData: false,
}),
retry: silenceAssetErrors,
});
@ -106,17 +111,20 @@ export const useGetReport = <T = GetReportResponse>(
options?: Omit<UseQueryOptions<GetReportResponse, ApiError, T>, 'queryKey' | 'queryFn'>
) => {
const password = useProtectedAssetPassword(id || '');
const queryFn = () => {
return getReportById({
id: id ?? '',
version_number: typeof versionNumber === 'number' ? versionNumber : undefined,
password,
});
};
const queryClient = useQueryClient();
return useQuery({
...reportsQueryKeys.reportsGetReport(id ?? '', versionNumber || 'LATEST'),
queryFn,
queryFn: () => {
return getReportAndInitializeMetrics({
id: id ?? '',
version_number: typeof versionNumber === 'number' ? versionNumber : undefined,
password,
queryClient,
shouldInitializeMetrics: true,
prefetchMetricsData: true,
});
},
enabled: !!id,
select: options?.select,
...options,

View File

@ -0,0 +1,48 @@
import type { QueryClient } from '@tanstack/react-query';
import last from 'lodash/last';
import { reportsQueryKeys } from '@/api/query_keys/reports';
import { initializeMetrics } from '../metrics/metricQueryHelpers';
import { getReportById } from './requests';
export const getReportAndInitializeMetrics = async ({
id,
version_number,
password,
queryClient,
shouldInitializeMetrics = true,
prefetchMetricsData = false,
}: {
id: string;
version_number: number | 'LATEST' | undefined;
password: string | undefined;
queryClient: QueryClient;
shouldInitializeMetrics: boolean;
prefetchMetricsData: boolean;
}) => {
const chosenVersionNumber = version_number === 'LATEST' ? undefined : version_number;
return getReportById({
id,
version_number: chosenVersionNumber,
password,
}).then((data) => {
const latestVersion = last(data.versions)?.version_number || 1;
const isLatestVersion = data.version_number === latestVersion;
if (isLatestVersion) {
// set the original report?
}
if (data.version_number) {
queryClient.setQueryData(
reportsQueryKeys.reportsGetReport(data.id, data.version_number).queryKey,
data
);
}
if (shouldInitializeMetrics || prefetchMetricsData) {
initializeMetrics(data.metrics, queryClient, !!prefetchMetricsData);
}
return data;
});
};