Files
dify/web/service/use-apps.ts
yyh 995c43f3dd refactor: migrate workflow queries to contracts (#35799)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-05-05 14:53:38 +00:00

173 lines
5.6 KiB
TypeScript

import type { GeneratorType } from '@/app/components/app/configuration/config/automatic/types'
import type {
ApiKeysListResponse,
AppDailyConversationsResponse,
AppDailyEndUsersResponse,
AppDailyMessagesResponse,
AppStatisticsResponse,
AppTokenCostsResponse,
AppVoicesListResponse,
WorkflowDailyConversationsResponse,
} from '@/models/app'
import type { App } from '@/types/app'
import {
useMutation,
useQuery,
useQueryClient,
} from '@tanstack/react-query'
import { consoleClient, consoleQuery } from '@/service/client'
import { get, post } from './base'
const NAME_SPACE = 'apps'
type DateRangeParams = {
start?: string
end?: string
}
const useAppFullListKey = [NAME_SPACE, 'full-list']
export const useGenerateRuleTemplate = (type: GeneratorType, disabled?: boolean) => {
return useQuery({
queryKey: [NAME_SPACE, 'generate-rule-template', type],
queryFn: () => post<{ data: string }>('instruction-generate/template', {
body: {
type,
},
}),
enabled: !disabled,
retry: 0,
})
}
export const useAppDetail = (appID: string) => {
return useQuery<App>({
queryKey: [NAME_SPACE, 'detail', appID],
queryFn: () => get<App>(`/apps/${appID}`),
enabled: !!appID,
})
}
export const useInvalidateAppList = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries({
queryKey: consoleQuery.apps.list.key(),
})
}
}
export const useDeleteAppMutation = () => {
const queryClient = useQueryClient()
return useMutation({
mutationKey: consoleQuery.apps.deleteApp.mutationKey(),
mutationFn: (appId: string) => {
return consoleClient.apps.deleteApp({
params: { appId },
})
},
onSuccess: async () => {
await Promise.all([
queryClient.invalidateQueries({
queryKey: consoleQuery.apps.list.key(),
}),
queryClient.invalidateQueries({
queryKey: useAppFullListKey,
}),
])
},
})
}
const useAppStatisticsQuery = <T>(metric: string, appId: string, params?: DateRangeParams) => {
return useQuery<T>({
queryKey: [NAME_SPACE, 'statistics', metric, appId, params],
queryFn: () => get<T>(`/apps/${appId}/statistics/${metric}`, { params }),
enabled: !!appId,
})
}
const useWorkflowStatisticsQuery = <T>(metric: string, appId: string, params?: DateRangeParams) => {
return useQuery<T>({
queryKey: [NAME_SPACE, 'workflow-statistics', metric, appId, params],
queryFn: () => get<T>(`/apps/${appId}/workflow/statistics/${metric}`, { params }),
enabled: !!appId,
})
}
export const useAppDailyMessages = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppDailyMessagesResponse>('daily-messages', appId, params)
}
export const useAppDailyConversations = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppDailyConversationsResponse>('daily-conversations', appId, params)
}
export const useAppDailyEndUsers = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppDailyEndUsersResponse>('daily-end-users', appId, params)
}
export const useAppAverageSessionInteractions = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppStatisticsResponse>('average-session-interactions', appId, params)
}
export const useAppAverageResponseTime = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppStatisticsResponse>('average-response-time', appId, params)
}
export const useAppTokensPerSecond = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppStatisticsResponse>('tokens-per-second', appId, params)
}
export const useAppSatisfactionRate = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppStatisticsResponse>('user-satisfaction-rate', appId, params)
}
export const useAppTokenCosts = (appId: string, params?: DateRangeParams) => {
return useAppStatisticsQuery<AppTokenCostsResponse>('token-costs', appId, params)
}
export const useWorkflowDailyConversations = (appId: string, params?: DateRangeParams) => {
return useWorkflowStatisticsQuery<WorkflowDailyConversationsResponse>('daily-conversations', appId, params)
}
export const useWorkflowDailyTerminals = (appId: string, params?: DateRangeParams) => {
return useWorkflowStatisticsQuery<AppDailyEndUsersResponse>('daily-terminals', appId, params)
}
export const useWorkflowTokenCosts = (appId: string, params?: DateRangeParams) => {
return useWorkflowStatisticsQuery<AppTokenCostsResponse>('token-costs', appId, params)
}
export const useWorkflowAverageInteractions = (appId: string, params?: DateRangeParams) => {
return useWorkflowStatisticsQuery<AppStatisticsResponse>('average-app-interactions', appId, params)
}
export const useAppVoices = (appId?: string, language?: string) => {
return useQuery<AppVoicesListResponse>({
queryKey: [NAME_SPACE, 'voices', appId, language || 'en-US'],
queryFn: () => get<AppVoicesListResponse>(`/apps/${appId}/text-to-audio/voices`, { params: { language: language || 'en-US' } }),
enabled: !!appId,
})
}
export const useAppApiKeys = (appId?: string, options?: { enabled?: boolean }) => {
return useQuery<ApiKeysListResponse>({
queryKey: [NAME_SPACE, 'api-keys', appId],
queryFn: () => get<ApiKeysListResponse>(`/apps/${appId}/api-keys`),
enabled: !!appId && (options?.enabled ?? true),
})
}
export const useInvalidateAppApiKeys = () => {
const queryClient = useQueryClient()
return (appId?: string) => {
if (!appId)
return
queryClient.invalidateQueries({
queryKey: [NAME_SPACE, 'api-keys', appId],
})
}
}