diff --git a/apps/web/src/api/asset_interfaces/users/index.ts b/apps/web/src/api/asset_interfaces/users/index.ts index d5970ff52..99c74de12 100644 --- a/apps/web/src/api/asset_interfaces/users/index.ts +++ b/apps/web/src/api/asset_interfaces/users/index.ts @@ -1,2 +1 @@ -export * from './interfaces'; export * from './permissionInterfaces'; diff --git a/apps/web/src/api/asset_interfaces/users/interfaces.ts b/apps/web/src/api/asset_interfaces/users/interfaces.ts deleted file mode 100644 index 8dd63f35b..000000000 --- a/apps/web/src/api/asset_interfaces/users/interfaces.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { OrganizationRole } from '@buster/server-shared/organization'; - -export interface OrganizationUser { - id: string; - email: string; - name: string; - avatar_url: string | null; - status: 'active' | 'inactive'; - role: OrganizationRole; - datasets: OrganizationUserDataset[]; -} - -export interface OrganizationUserDataset { - can_query: boolean; - id: string; - name: string; - lineage: { - name: string; - id: string; - type: 'user' | 'datasets' | 'permissionGroups'; - }[][]; -} diff --git a/apps/web/src/api/buster_rest/organizations/requests.ts b/apps/web/src/api/buster_rest/organizations/requests.ts index 3ce8eada2..7ab1d54d9 100644 --- a/apps/web/src/api/buster_rest/organizations/requests.ts +++ b/apps/web/src/api/buster_rest/organizations/requests.ts @@ -1,7 +1,6 @@ -import type { OrganizationUser } from '@/api/asset_interfaces/users'; import { serverFetch } from '../../createServerInstance'; import { mainApi } from '../instances'; -import type { Organization } from '@buster/server-shared/organization'; +import type { Organization, OrganizationUser } from '@buster/server-shared/organization'; export const getOrganizationUsers = async ({ organizationId diff --git a/apps/web/src/api/buster_rest/users/requests.ts b/apps/web/src/api/buster_rest/users/requests.ts index 89e0517a8..bceb891c2 100644 --- a/apps/web/src/api/buster_rest/users/requests.ts +++ b/apps/web/src/api/buster_rest/users/requests.ts @@ -1,5 +1,5 @@ import type { ShareAssetType } from '@buster/server-shared/share'; -import type { OrganizationUser } from '@/api/asset_interfaces/users'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import { BASE_URL } from '../config'; import { serverFetch } from '../../createServerInstance'; import { mainApi } from '../instances'; diff --git a/apps/web/src/api/query_keys/organization.ts b/apps/web/src/api/query_keys/organization.ts index 32ee48792..5639b5940 100644 --- a/apps/web/src/api/query_keys/organization.ts +++ b/apps/web/src/api/query_keys/organization.ts @@ -1,5 +1,5 @@ import { queryOptions } from '@tanstack/react-query'; -import type { OrganizationUser } from '@/api/asset_interfaces/users'; +import type { OrganizationUser } from '@buster/server-shared/organization'; const organizationUsers = (organizationId: string) => queryOptions({ diff --git a/apps/web/src/api/query_keys/users.ts b/apps/web/src/api/query_keys/users.ts index 3797d8eb0..f8bf14f03 100644 --- a/apps/web/src/api/query_keys/users.ts +++ b/apps/web/src/api/query_keys/users.ts @@ -4,9 +4,9 @@ import type { BusterUserDataset, BusterUserDatasetGroup, BusterUserPermissionGroup, - BusterUserTeamListItem, - OrganizationUser + BusterUserTeamListItem } from '@/api/asset_interfaces/users'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import type { UserFavoriteResponse, UserResponse, diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/ListUsersComponent.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/ListUsersComponent.tsx index 1dd0d0522..bf1b372e0 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/ListUsersComponent.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/ListUsersComponent.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useMemo } from 'react'; -import type { OrganizationUser } from '@/api/asset_interfaces/users'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import { ListUserItem } from '@/components/features/list/ListUserItem'; import { type BusterListColumn, diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_LayoutHeaderAndSegment/UserHeader.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_LayoutHeaderAndSegment/UserHeader.tsx index 888fdbb81..36ab0fa17 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_LayoutHeaderAndSegment/UserHeader.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_LayoutHeaderAndSegment/UserHeader.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { OrganizationUser } from '@/api/asset_interfaces'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import { Avatar } from '@/components/ui/avatar'; import { Text, Title } from '@/components/ui/typography'; diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetListContainer.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetListContainer.tsx index 02406c185..6655ef24b 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetListContainer.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetListContainer.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from 'react'; -import type { OrganizationUserDataset } from '@/api/asset_interfaces'; +import type { OrganizationUserDataset } from '@buster/server-shared/organization'; import { PermissionLineageBreadcrumb } from '@/components/features/PermissionComponents'; import { type BusterListColumn, @@ -102,7 +102,12 @@ export const UserDatasetListContainer = React.memo( rows={rows} showHeader={false} showSelectAll={false} - emptyState={useMemo(() => , [])} + emptyState={useMemo( + () => ( + + ), + [] + )} /> ); diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetSearch.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetSearch.tsx index 52eeda400..c62bc1307 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetSearch.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDatasetSearch.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { OrganizationUser } from '@/api/asset_interfaces'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import { PermissionSearchAndListWrapper } from '@/components/features/PermissionComponents'; import { useDebounceSearch } from '@/hooks'; import { UserDatasetListContainer } from './UserDatasetListContainer'; diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDefaultAccess.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDefaultAccess.tsx index cea124149..6acb5084f 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDefaultAccess.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserDefaultAccess.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { BusterOrganizationRoleLabels, type OrganizationUser } from '@/api/asset_interfaces'; +import { BusterOrganizationRoleLabels } from '@/api/asset_interfaces'; import { useUpdateUser } from '@/api/buster_rest/users'; import { Card, @@ -13,6 +13,7 @@ import { AppTooltip } from '@/components/ui/tooltip'; import { Text } from '@/components/ui/typography'; import { useMemoizedFn } from '@/hooks'; import { User } from '@buster/server-shared/user'; +import type { OrganizationUser } from '@buster/server-shared/organization'; export const UserDefaultAccess: React.FC<{ user: OrganizationUser; diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserLineageHeader.tsx b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserLineageHeader.tsx index 96cbb776e..4aa691fe5 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserLineageHeader.tsx +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/[userId]/_overview/UserLineageHeader.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { OrganizationUser } from '@/api/asset_interfaces/users'; +import type { OrganizationUser } from '@buster/server-shared/organization'; import { HeaderExplanation } from '@/components/features/PermissionComponents'; export const UserLineageHeader = React.memo( diff --git a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/config.ts b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/config.ts index 753e2c8fe..021e6f0a4 100644 --- a/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/config.ts +++ b/apps/web/src/app/app/(settings_layout)/settings/(permissions)/users/config.ts @@ -1,4 +1,4 @@ -import type { OrganizationUser } from '@/api/asset_interfaces'; +import type { OrganizationUser } from '@buster/server-shared/organization'; export const OrganizationUserStatusText: Record = { active: 'Active', diff --git a/packages/server-shared/src/organization/index.ts b/packages/server-shared/src/organization/index.ts index 2951e9c61..480844020 100644 --- a/packages/server-shared/src/organization/index.ts +++ b/packages/server-shared/src/organization/index.ts @@ -1,2 +1,3 @@ export * from './organization.types'; export * from './roles.types'; +export * from './user.types'; diff --git a/packages/server-shared/src/organization/user.types.ts b/packages/server-shared/src/organization/user.types.ts new file mode 100644 index 000000000..106ae1335 --- /dev/null +++ b/packages/server-shared/src/organization/user.types.ts @@ -0,0 +1,36 @@ +import { z } from 'zod/v4'; +import { OrganizationRoleSchema } from './roles.types'; + +export const LineageUserItemTypeSchema = z.enum(['user', 'datasets', 'permissionGroups']); + +// Zod schema for lineage item +const LineageItemSchema = z.object({ + name: z.string(), + id: z.string(), + type: LineageUserItemTypeSchema, +}); + +// Zod schema for OrganizationUserDataset +export const OrganizationUserDatasetSchema = z.object({ + can_query: z.boolean(), + id: z.string(), + name: z.string(), + lineage: z.array(z.array(LineageItemSchema)), +}); + +// Zod schema for OrganizationUser +export const OrganizationUserSchema = z.object({ + id: z.string(), + email: z.string(), + name: z.string(), + avatar_url: z.string().nullable(), + status: z.enum(['active', 'inactive']), + role: OrganizationRoleSchema, + datasets: z.array(OrganizationUserDatasetSchema), +}); + +// Export inferred types +export type OrganizationUser = z.infer; +export type OrganizationUserDataset = z.infer; +export type LinageUserItemType = z.infer; +export type LinageUserItem = z.infer;