您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

access-control.ts 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
  2. import { get, post } from './base'
  3. import { getAppAccessMode, getUserCanAccess } from './share'
  4. import type { AccessControlAccount, AccessControlGroup, AccessMode, Subject } from '@/models/access-control'
  5. import type { App } from '@/types/app'
  6. const NAME_SPACE = 'access-control'
  7. export const useAppWhiteListSubjects = (appId: string | undefined, enabled: boolean) => {
  8. return useQuery({
  9. queryKey: [NAME_SPACE, 'app-whitelist-subjects', appId],
  10. queryFn: () => get<{ groups: AccessControlGroup[]; members: AccessControlAccount[] }>(`/enterprise/webapp/app/subjects?appId=${appId}`),
  11. enabled: !!appId && enabled,
  12. staleTime: 0,
  13. gcTime: 0,
  14. })
  15. }
  16. type SearchResults = {
  17. currPage: number
  18. totalPages: number
  19. subjects: Subject[]
  20. hasMore: boolean
  21. }
  22. export const useSearchForWhiteListCandidates = (query: { keyword?: string; groupId?: AccessControlGroup['id']; resultsPerPage?: number }, enabled: boolean) => {
  23. return useInfiniteQuery({
  24. queryKey: [NAME_SPACE, 'app-whitelist-candidates', query],
  25. queryFn: ({ pageParam }) => {
  26. const params = new URLSearchParams()
  27. Object.keys(query).forEach((key) => {
  28. const typedKey = key as keyof typeof query
  29. if (query[typedKey])
  30. params.append(key, `${query[typedKey]}`)
  31. })
  32. params.append('pageNumber', `${pageParam}`)
  33. return get<SearchResults>(`/enterprise/webapp/app/subject/search?${new URLSearchParams(params).toString()}`)
  34. },
  35. initialPageParam: 1,
  36. getNextPageParam: (lastPage) => {
  37. if (lastPage.hasMore)
  38. return lastPage.currPage + 1
  39. return undefined
  40. },
  41. gcTime: 0,
  42. staleTime: 0,
  43. enabled,
  44. })
  45. }
  46. type UpdateAccessModeParams = {
  47. appId: App['id']
  48. subjects?: Pick<Subject, 'subjectId' | 'subjectType'>[]
  49. accessMode: AccessMode
  50. }
  51. export const useUpdateAccessMode = () => {
  52. const queryClient = useQueryClient()
  53. return useMutation({
  54. mutationKey: [NAME_SPACE, 'update-access-mode'],
  55. mutationFn: (params: UpdateAccessModeParams) => {
  56. return post('/enterprise/webapp/app/access-mode', { body: params })
  57. },
  58. onSuccess: () => {
  59. queryClient.invalidateQueries({
  60. queryKey: [NAME_SPACE, 'app-whitelist-subjects'],
  61. })
  62. },
  63. })
  64. }
  65. export const useGetAppAccessMode = ({ appId, isInstalledApp = true, enabled }: { appId?: string; isInstalledApp?: boolean; enabled: boolean }) => {
  66. return useQuery({
  67. queryKey: [NAME_SPACE, 'app-access-mode', appId],
  68. queryFn: () => getAppAccessMode(appId!, isInstalledApp),
  69. enabled: !!appId && enabled,
  70. staleTime: 0,
  71. gcTime: 0,
  72. })
  73. }
  74. export const useGetUserCanAccessApp = ({ appId, isInstalledApp = true, enabled }: { appId?: string; isInstalledApp?: boolean; enabled: boolean }) => {
  75. return useQuery({
  76. queryKey: [NAME_SPACE, 'user-can-access-app', appId],
  77. queryFn: () => getUserCanAccess(appId!, isInstalledApp),
  78. enabled: !!appId && enabled,
  79. staleTime: 0,
  80. gcTime: 0,
  81. initialData: {
  82. result: !enabled,
  83. },
  84. })
  85. }