You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

access-control.ts 2.8KB

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