| | 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; |
| | } |
| |
|