diff --git a/web/__tests__/app/app-access-control-flow.test.tsx b/web/__tests__/app/app-access-control-flow.test.tsx index e1284bfc5b..c7620e4340 100644 --- a/web/__tests__/app/app-access-control-flow.test.tsx +++ b/web/__tests__/app/app-access-control-flow.test.tsx @@ -56,7 +56,7 @@ vi.mock('@/hooks/use-async-window-open', () => ({ useAsyncWindowOpen: () => vi.fn(), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: () => ({ data: { result: true }, isLoading: false, diff --git a/web/__tests__/app/app-publisher-flow.test.tsx b/web/__tests__/app/app-publisher-flow.test.tsx index d4bf56e7e4..289fcea6de 100644 --- a/web/__tests__/app/app-publisher-flow.test.tsx +++ b/web/__tests__/app/app-publisher-flow.test.tsx @@ -64,7 +64,7 @@ vi.mock('@/hooks/use-async-window-open', () => ({ useAsyncWindowOpen: () => mockOpenAsyncWindow, })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: () => ({ data: { result: true }, isLoading: false, diff --git a/web/__tests__/apps/app-card-operations-flow.test.tsx b/web/__tests__/apps/app-card-operations-flow.test.tsx index b0854072d2..04ffbed316 100644 --- a/web/__tests__/apps/app-card-operations-flow.test.tsx +++ b/web/__tests__/apps/app-card-operations-flow.test.tsx @@ -129,7 +129,7 @@ vi.mock('@/service/workflow', () => ({ fetchWorkflowDraft: vi.fn().mockResolvedValue({ environment_variables: [] }), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: () => ({ data: { result: true }, isLoading: false }), })) diff --git a/web/__tests__/explore/installed-app-flow.test.tsx b/web/__tests__/explore/installed-app-flow.test.tsx index 34bfac5cd6..040307c2d1 100644 --- a/web/__tests__/explore/installed-app-flow.test.tsx +++ b/web/__tests__/explore/installed-app-flow.test.tsx @@ -11,7 +11,7 @@ import { render, screen, waitFor } from '@testing-library/react' import InstalledApp from '@/app/components/explore/installed-app' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' -import { useGetUserCanAccessApp } from '@/service/access-control' +import { useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { useGetInstalledAppAccessModeByAppId, useGetInstalledAppMeta, useGetInstalledAppParams, useGetInstalledApps } from '@/service/use-explore' import { AppModeEnum } from '@/types/app' @@ -19,7 +19,7 @@ vi.mock('@/context/web-app-context', () => ({ useWebAppStore: vi.fn(), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: vi.fn(), })) diff --git a/web/app/(shareLayout)/components/authenticated-layout.tsx b/web/app/(shareLayout)/components/authenticated-layout.tsx index a7b65f33fe..7341d48f62 100644 --- a/web/app/(shareLayout)/components/authenticated-layout.tsx +++ b/web/app/(shareLayout)/components/authenticated-layout.tsx @@ -7,7 +7,7 @@ import AppUnavailable from '@/app/components/base/app-unavailable' import Loading from '@/app/components/base/loading' import { useWebAppStore } from '@/context/web-app-context' import { usePathname, useRouter, useSearchParams } from '@/next/navigation' -import { useGetUserCanAccessApp } from '@/service/access-control' +import { useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { useGetWebAppInfo, useGetWebAppMeta, useGetWebAppParams } from '@/service/use-share' import { webAppLogout } from '@/service/webapp-auth' diff --git a/web/app/components/app/app-access-control/__tests__/access-control.spec.tsx b/web/app/components/app/app-access-control/__tests__/access-control.spec.tsx index 21dd8c5fc2..5daabeea8d 100644 --- a/web/app/components/app/app-access-control/__tests__/access-control.spec.tsx +++ b/web/app/components/app/app-access-control/__tests__/access-control.spec.tsx @@ -37,7 +37,7 @@ vi.mock('@/context/app-context', () => ({ }), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useAppWhiteListSubjects: (...args: unknown[]) => mockUseAppWhiteListSubjects(...args), useSearchForWhiteListCandidates: (...args: unknown[]) => mockUseSearchForWhiteListCandidates(...args), useUpdateAccessMode: () => mockUseUpdateAccessMode(), diff --git a/web/app/components/app/app-access-control/__tests__/add-member-or-group-pop.spec.tsx b/web/app/components/app/app-access-control/__tests__/add-member-or-group-pop.spec.tsx index 725b121d30..d6a0922722 100644 --- a/web/app/components/app/app-access-control/__tests__/add-member-or-group-pop.spec.tsx +++ b/web/app/components/app/app-access-control/__tests__/add-member-or-group-pop.spec.tsx @@ -18,7 +18,7 @@ vi.mock('@/context/app-context', () => ({ }), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useSearchForWhiteListCandidates: (...args: unknown[]) => mockUseSearchForWhiteListCandidates(...args), })) diff --git a/web/app/components/app/app-access-control/__tests__/index.spec.tsx b/web/app/components/app/app-access-control/__tests__/index.spec.tsx index 74e7d7046c..c280127787 100644 --- a/web/app/components/app/app-access-control/__tests__/index.spec.tsx +++ b/web/app/components/app/app-access-control/__tests__/index.spec.tsx @@ -26,7 +26,7 @@ const mockUseUpdateAccessMode = vi.fn(() => ({ const mockUseAppWhiteListSubjects = vi.fn() const mockUseSearchForWhiteListCandidates = vi.fn() -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useAppWhiteListSubjects: (...args: unknown[]) => mockUseAppWhiteListSubjects(...args), useSearchForWhiteListCandidates: (...args: unknown[]) => mockUseSearchForWhiteListCandidates(...args), useUpdateAccessMode: () => mockUseUpdateAccessMode(), diff --git a/web/app/components/app/app-access-control/__tests__/specific-groups-or-members.spec.tsx b/web/app/components/app/app-access-control/__tests__/specific-groups-or-members.spec.tsx index 7b198c4e66..08469881f8 100644 --- a/web/app/components/app/app-access-control/__tests__/specific-groups-or-members.spec.tsx +++ b/web/app/components/app/app-access-control/__tests__/specific-groups-or-members.spec.tsx @@ -6,7 +6,7 @@ import SpecificGroupsOrMembers from '../specific-groups-or-members' const mockUseAppWhiteListSubjects = vi.fn() -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useAppWhiteListSubjects: (...args: unknown[]) => mockUseAppWhiteListSubjects(...args), })) diff --git a/web/app/components/app/app-access-control/add-member-or-group-pop.tsx b/web/app/components/app/app-access-control/add-member-or-group-pop.tsx index 38f9c2ab50..0ed68b2f3c 100644 --- a/web/app/components/app/app-access-control/add-member-or-group-pop.tsx +++ b/web/app/components/app/app-access-control/add-member-or-group-pop.tsx @@ -11,7 +11,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from '@/context/app-context' import { SubjectType } from '@/models/access-control' -import { useSearchForWhiteListCandidates } from '@/service/access-control' +import { useSearchForWhiteListCandidates } from '@/service/access-control/use-app-access-control' import useAccessControlStore from '../../../../context/access-control-store' import Checkbox from '../../base/checkbox' import Input from '../../base/input' diff --git a/web/app/components/app/app-access-control/index.tsx b/web/app/components/app/app-access-control/index.tsx index cff670e10f..b34fa17f7b 100644 --- a/web/app/components/app/app-access-control/index.tsx +++ b/web/app/components/app/app-access-control/index.tsx @@ -9,7 +9,7 @@ import { useSuspenseQuery } from '@tanstack/react-query' import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { AccessMode, SubjectType } from '@/models/access-control' -import { useUpdateAccessMode } from '@/service/access-control' +import { useUpdateAccessMode } from '@/service/access-control/use-app-access-control' import { systemFeaturesQueryOptions } from '@/service/system-features' import useAccessControlStore from '../../../../context/access-control-store' import AccessControlDialog from './access-control-dialog' diff --git a/web/app/components/app/app-access-control/specific-groups-or-members.tsx b/web/app/components/app/app-access-control/specific-groups-or-members.tsx index 1caabb3ff9..41df5c2124 100644 --- a/web/app/components/app/app-access-control/specific-groups-or-members.tsx +++ b/web/app/components/app/app-access-control/specific-groups-or-members.tsx @@ -5,7 +5,7 @@ import { RiAlertFill, RiCloseCircleFill, RiLockLine, RiOrganizationChart } from import { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { AccessMode } from '@/models/access-control' -import { useAppWhiteListSubjects } from '@/service/access-control' +import { useAppWhiteListSubjects } from '@/service/access-control/use-app-access-control' import useAccessControlStore from '../../../../context/access-control-store' import Loading from '../../base/loading' import Tooltip from '../../base/tooltip' diff --git a/web/app/components/app/app-publisher/__tests__/index.spec.tsx b/web/app/components/app/app-publisher/__tests__/index.spec.tsx index 5df331767b..5f2b65c0ba 100644 --- a/web/app/components/app/app-publisher/__tests__/index.spec.tsx +++ b/web/app/components/app/app-publisher/__tests__/index.spec.tsx @@ -64,7 +64,7 @@ vi.mock('@/hooks/use-async-window-open', () => ({ useAsyncWindowOpen: () => mockOpenAsyncWindow, })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: () => ({ data: { result: true }, isLoading: false, diff --git a/web/app/components/app/app-publisher/index.tsx b/web/app/components/app/app-publisher/index.tsx index fe6fe5806f..e265c53020 100644 --- a/web/app/components/app/app-publisher/index.tsx +++ b/web/app/components/app/app-publisher/index.tsx @@ -26,7 +26,7 @@ import { WorkflowContext } from '@/app/components/workflow/context' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import { AccessMode } from '@/models/access-control' -import { useAppWhiteListSubjects, useGetUserCanAccessApp } from '@/service/access-control' +import { useAppWhiteListSubjects, useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { fetchAppDetailDirect, publishToCreatorsPlatform } from '@/service/apps' import { fetchInstalledAppList } from '@/service/explore' import { systemFeaturesQueryOptions } from '@/service/system-features' diff --git a/web/app/components/app/overview/__tests__/app-card.spec.tsx b/web/app/components/app/overview/__tests__/app-card.spec.tsx index 43c0887566..c40535e76d 100644 --- a/web/app/components/app/overview/__tests__/app-card.spec.tsx +++ b/web/app/components/app/overview/__tests__/app-card.spec.tsx @@ -61,7 +61,7 @@ vi.mock('@/service/use-workflow', () => ({ }), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useAppWhiteListSubjects: () => ({ data: mockAccessSubjects, }), diff --git a/web/app/components/app/overview/app-card.tsx b/web/app/components/app/overview/app-card.tsx index f0502ae918..671659a05a 100644 --- a/web/app/components/app/overview/app-card.tsx +++ b/web/app/components/app/overview/app-card.tsx @@ -16,7 +16,7 @@ import { useAppContext } from '@/context/app-context' import { useDocLink } from '@/context/i18n' import { AccessMode } from '@/models/access-control' import { usePathname, useRouter } from '@/next/navigation' -import { useAppWhiteListSubjects } from '@/service/access-control' +import { useAppWhiteListSubjects } from '@/service/access-control/use-app-access-control' import { fetchAppDetailDirect } from '@/service/apps' import { systemFeaturesQueryOptions } from '@/service/system-features' import { useAppWorkflow } from '@/service/use-workflow' diff --git a/web/app/components/apps/__tests__/app-card.spec.tsx b/web/app/components/apps/__tests__/app-card.spec.tsx index 6a71dbac52..de675cd031 100644 --- a/web/app/components/apps/__tests__/app-card.spec.tsx +++ b/web/app/components/apps/__tests__/app-card.spec.tsx @@ -101,7 +101,7 @@ vi.mock('@/service/explore', () => ({ fetchInstalledAppList: vi.fn(() => Promise.resolve({ installed_apps: [{ id: 'installed-1' }] })), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: () => ({ data: { result: true }, isLoading: false, diff --git a/web/app/components/apps/app-card.tsx b/web/app/components/apps/app-card.tsx index 305d7d339d..a69f421189 100644 --- a/web/app/components/apps/app-card.tsx +++ b/web/app/components/apps/app-card.tsx @@ -41,7 +41,7 @@ import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import { AccessMode } from '@/models/access-control' import dynamic from '@/next/dynamic' import { useRouter } from '@/next/navigation' -import { useGetUserCanAccessApp } from '@/service/access-control' +import { useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { copyApp, exportAppConfig, updateAppInfo } from '@/service/apps' import { fetchInstalledAppList } from '@/service/explore' import { systemFeaturesQueryOptions } from '@/service/system-features' diff --git a/web/app/components/explore/installed-app/__tests__/index.spec.tsx b/web/app/components/explore/installed-app/__tests__/index.spec.tsx index d95ae7d863..d96d7dc51e 100644 --- a/web/app/components/explore/installed-app/__tests__/index.spec.tsx +++ b/web/app/components/explore/installed-app/__tests__/index.spec.tsx @@ -4,7 +4,7 @@ import { render, screen, waitFor } from '@testing-library/react' import { useWebAppStore } from '@/context/web-app-context' import { AccessMode } from '@/models/access-control' -import { useGetUserCanAccessApp } from '@/service/access-control' +import { useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { useGetInstalledAppAccessModeByAppId, useGetInstalledAppMeta, useGetInstalledAppParams, useGetInstalledApps } from '@/service/use-explore' import { AppModeEnum } from '@/types/app' import InstalledApp from '../index' @@ -12,7 +12,7 @@ import InstalledApp from '../index' vi.mock('@/context/web-app-context', () => ({ useWebAppStore: vi.fn(), })) -vi.mock('@/service/access-control', () => ({ +vi.mock('@/service/access-control/use-app-access-control', () => ({ useGetUserCanAccessApp: vi.fn(), })) vi.mock('@/service/use-explore', () => ({ diff --git a/web/app/components/explore/installed-app/index.tsx b/web/app/components/explore/installed-app/index.tsx index 78191f2873..e1c7ca791e 100644 --- a/web/app/components/explore/installed-app/index.tsx +++ b/web/app/components/explore/installed-app/index.tsx @@ -7,7 +7,7 @@ import ChatWithHistory from '@/app/components/base/chat/chat-with-history' import Loading from '@/app/components/base/loading' import TextGenerationApp from '@/app/components/share/text-generation' import { useWebAppStore } from '@/context/web-app-context' -import { useGetUserCanAccessApp } from '@/service/access-control' +import { useGetUserCanAccessApp } from '@/service/access-control/use-app-access-control' import { useGetInstalledAppAccessModeByAppId, useGetInstalledAppMeta, useGetInstalledAppParams, useGetInstalledApps } from '@/service/use-explore' import { AppModeEnum } from '@/types/app' import AppUnavailable from '../../base/app-unavailable' diff --git a/web/service/access-control.ts b/web/service/access-control/use-app-access-control.ts similarity index 80% rename from web/service/access-control.ts rename to web/service/access-control/use-app-access-control.ts index fa7cfd7055..bdafa555a4 100644 --- a/web/service/access-control.ts +++ b/web/service/access-control/use-app-access-control.ts @@ -2,8 +2,8 @@ import type { AccessControlAccount, AccessControlGroup, AccessMode, Subject } fr import type { App } from '@/types/app' import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { systemFeaturesQueryOptions } from '@/service/system-features' -import { get, post } from './base' -import { getUserCanAccess } from './share' +import { get, post } from '../base' +import { getUserCanAccess } from '../share' const NAME_SPACE = 'access-control' @@ -24,16 +24,25 @@ type SearchResults = { hasMore: boolean } -export const useSearchForWhiteListCandidates = (query: { keyword?: string, groupId?: AccessControlGroup['id'], resultsPerPage?: number }, enabled: boolean) => { +type SearchForWhiteListCandidatesQuery = { + keyword?: string + groupId?: AccessControlGroup['id'] + resultsPerPage?: number +} + +export const useSearchForWhiteListCandidates = (query: SearchForWhiteListCandidatesQuery, enabled: boolean) => { + const { keyword, groupId, resultsPerPage } = query + return useInfiniteQuery({ - queryKey: [NAME_SPACE, 'app-whitelist-candidates', query], + queryKey: [NAME_SPACE, 'app-whitelist-candidates', keyword, groupId, resultsPerPage], queryFn: ({ pageParam }) => { const params = new URLSearchParams() - Object.keys(query).forEach((key) => { - const typedKey = key as keyof typeof query - if (query[typedKey]) - params.append(key, `${query[typedKey]}`) - }) + if (keyword) + params.append('keyword', keyword) + if (groupId) + params.append('groupId', groupId) + if (resultsPerPage) + params.append('resultsPerPage', `${resultsPerPage}`) params.append('pageNumber', `${pageParam}`) return get(`/enterprise/webapp/app/subject/search?${new URLSearchParams(params).toString()}`) },