| import { z } from 'zod'; |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| |
|
|
| |
| |
| |
| export enum PrincipalType { |
| USER = 'user', |
| GROUP = 'group', |
| PUBLIC = 'public', |
| ROLE = 'role', |
| } |
|
|
| |
| |
| |
| export enum PrincipalModel { |
| USER = 'User', |
| GROUP = 'Group', |
| ROLE = 'Role', |
| } |
|
|
| |
| |
| |
| export type TPrincipalSource = 'local' | 'entra'; |
|
|
| |
| |
| |
| export type TAccessLevel = 'none' | 'viewer' | 'editor' | 'owner'; |
|
|
| |
| |
| |
| export enum ResourceType { |
| AGENT = 'agent', |
| PROMPTGROUP = 'promptGroup', |
| } |
|
|
| |
| |
| |
| export enum PermissionBits { |
| |
| VIEW = 1, |
| |
| EDIT = 2, |
| |
| DELETE = 4, |
| |
| SHARE = 8, |
| } |
|
|
| |
| |
| |
| export enum AccessRoleIds { |
| AGENT_VIEWER = 'agent_viewer', |
| AGENT_EDITOR = 'agent_editor', |
| AGENT_OWNER = 'agent_owner', |
| PROMPTGROUP_VIEWER = 'promptGroup_viewer', |
| PROMPTGROUP_EDITOR = 'promptGroup_editor', |
| PROMPTGROUP_OWNER = 'promptGroup_owner', |
| } |
|
|
| |
|
|
| |
| |
| |
| export const principalSchema = z.object({ |
| type: z.nativeEnum(PrincipalType), |
| id: z.string().optional(), |
| name: z.string().optional(), |
| email: z.string().optional(), |
| source: z.enum(['local', 'entra']).optional(), |
| avatar: z.string().optional(), |
| description: z.string().optional(), |
| idOnTheSource: z.string().optional(), |
| accessRoleId: z.nativeEnum(AccessRoleIds).optional(), |
| memberCount: z.number().optional(), |
| }); |
|
|
| |
| |
| |
| export const accessRoleSchema = z.object({ |
| accessRoleId: z.nativeEnum(AccessRoleIds), |
| name: z.string(), |
| description: z.string().optional(), |
| resourceType: z.nativeEnum(ResourceType).default(ResourceType.AGENT), |
| permBits: z.number(), |
| }); |
|
|
| |
| |
| |
| export const permissionEntrySchema = z.object({ |
| id: z.string(), |
| principalType: z.nativeEnum(PrincipalType), |
| principalId: z.string().optional(), |
| principalName: z.string().optional(), |
| role: accessRoleSchema, |
| grantedBy: z.string(), |
| grantedAt: z.string(), |
| inheritedFrom: z.string().optional(), |
| source: z.enum(['local', 'entra']).optional(), |
| }); |
|
|
| |
| |
| |
| export const resourcePermissionsResponseSchema = z.object({ |
| resourceType: z.nativeEnum(ResourceType), |
| resourceId: z.string(), |
| permissions: z.array(permissionEntrySchema), |
| }); |
|
|
| |
| |
| |
| |
| export const updateResourcePermissionsRequestSchema = z.object({ |
| updated: principalSchema.array(), |
| removed: principalSchema.array(), |
| public: z.boolean(), |
| publicAccessRoleId: z.string().optional(), |
| }); |
|
|
| |
| |
| |
| |
| export const updateResourcePermissionsResponseSchema = z.object({ |
| message: z.string(), |
| results: z.object({ |
| principals: principalSchema.array(), |
| public: z.boolean(), |
| publicAccessRoleId: z.string().optional(), |
| }), |
| }); |
|
|
| |
|
|
| |
| |
| |
| export type TPrincipal = z.infer<typeof principalSchema>; |
|
|
| |
| |
| |
| export type TAccessRole = z.infer<typeof accessRoleSchema>; |
|
|
| |
| |
| |
| export type TPermissionEntry = z.infer<typeof permissionEntrySchema>; |
|
|
| |
| |
| |
| export type TResourcePermissionsResponse = z.infer<typeof resourcePermissionsResponseSchema>; |
|
|
| |
| |
| |
| |
| export type TUpdateResourcePermissionsRequest = z.infer< |
| typeof updateResourcePermissionsRequestSchema |
| >; |
|
|
| |
| |
| |
| |
| export type TUpdateResourcePermissionsResponse = z.infer< |
| typeof updateResourcePermissionsResponseSchema |
| >; |
|
|
| |
| |
| |
| export type TPrincipalSearchParams = { |
| q: string; |
| limit?: number; |
| type?: PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE; |
| }; |
|
|
| |
| |
| |
| export type TPrincipalSearchResult = { |
| id?: string | null; |
| type: PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE; |
| name: string; |
| email?: string; |
| username?: string; |
| avatar?: string; |
| provider?: string; |
| source: 'local' | 'entra'; |
| memberCount?: number; |
| description?: string; |
| idOnTheSource?: string; |
| }; |
|
|
| |
| |
| |
| export type TPrincipalSearchResponse = { |
| query: string; |
| limit: number; |
| type?: PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE; |
| results: TPrincipalSearchResult[]; |
| count: number; |
| sources: { |
| local: number; |
| entra: number; |
| }; |
| }; |
|
|
| |
| |
| |
| export type TAvailableRolesResponse = { |
| resourceType: ResourceType; |
| roles: TAccessRole[]; |
| }; |
|
|
| |
| |
| |
| |
| export const getResourcePermissionsResponseSchema = z.object({ |
| resourceType: z.nativeEnum(ResourceType), |
| resourceId: z.nativeEnum(AccessRoleIds), |
| principals: z.array(principalSchema), |
| public: z.boolean(), |
| publicAccessRoleId: z.nativeEnum(AccessRoleIds).optional(), |
| }); |
|
|
| |
| |
| |
| |
| export type TGetResourcePermissionsResponse = z.infer<typeof getResourcePermissionsResponseSchema>; |
|
|
| |
| |
| |
| |
| export const effectivePermissionsResponseSchema = z.object({ |
| permissionBits: z.number(), |
| }); |
|
|
| |
| |
| |
| |
| export type TEffectivePermissionsResponse = z.infer<typeof effectivePermissionsResponseSchema>; |
|
|
| |
|
|
| |
| |
| |
| export interface TPermissionCheck { |
| canView: boolean; |
| canEdit: boolean; |
| canDelete: boolean; |
| canShare: boolean; |
| accessLevel: TAccessLevel; |
| } |
|
|
| |
|
|
| |
| |
| |
| export function permBitsToAccessLevel(permBits: number): TAccessLevel { |
| if ((permBits & PermissionBits.DELETE) > 0) return 'owner'; |
| if ((permBits & PermissionBits.EDIT) > 0) return 'editor'; |
| if ((permBits & PermissionBits.VIEW) > 0) return 'viewer'; |
| return 'none'; |
| } |
|
|
| |
| |
| |
| export function accessRoleToPermBits(accessRoleId: string): number { |
| switch (accessRoleId) { |
| case AccessRoleIds.AGENT_VIEWER: |
| return PermissionBits.VIEW; |
| case AccessRoleIds.AGENT_EDITOR: |
| return PermissionBits.VIEW | PermissionBits.EDIT; |
| case AccessRoleIds.AGENT_OWNER: |
| return PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE; |
| default: |
| return PermissionBits.VIEW; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export function hasPermissions(permissions: number, requiredPermission: number): boolean { |
| return (permissions & requiredPermission) === requiredPermission; |
| } |
|
|