Skip to main content
Glama
form-permission-manager.ts7.04 kB
import { WorkspaceManagementTool } from './workspace-tool'; import { FormPermissionService } from '../services/form-permission-service'; import { TallyApiClientConfig } from '../services/TallyApiClient'; import { FormAccessLevel, FormPermission, BulkFormPermission, FormPermissionSettings, UserRole } from '../models'; /** * FormPermissionManager integrates with WorkspaceManagementTool to provide * granular permission management for form access and editing rights */ export class FormPermissionManager { private workspaceTool: WorkspaceManagementTool; private permissionService: FormPermissionService; constructor(apiClientConfig: TallyApiClientConfig = {}) { this.workspaceTool = new WorkspaceManagementTool(apiClientConfig); this.permissionService = new FormPermissionService(apiClientConfig); } /** * Set permission for a user on a specific form */ public async setFormPermission( formId: string, userId: string, accessLevel: FormAccessLevel, inheritFromWorkspace: boolean = true, grantedBy: string ): Promise<FormPermission> { return this.permissionService.setFormPermission( formId, userId, accessLevel, inheritFromWorkspace, grantedBy ); } /** * Update an existing form permission */ public async updateFormPermission( formId: string, userId: string, accessLevel: FormAccessLevel, inheritFromWorkspace: boolean = true ): Promise<FormPermission> { return this.permissionService.updateFormPermission( formId, userId, accessLevel, inheritFromWorkspace ); } /** * Remove permission for a user on a specific form */ public async removeFormPermission(formId: string, userId: string): Promise<{ success: boolean }> { const result = await this.permissionService.removeFormPermission(formId, userId); return { success: result.success || false }; } /** * Get all permissions for a specific form */ public async getFormPermissions(formId: string) { return this.permissionService.getFormPermissions(formId); } /** * Set permissions for multiple forms for a single user (bulk operation) */ public async setBulkFormPermissions( userId: string, formIds: string[], accessLevel: FormAccessLevel, inheritFromWorkspace: boolean = true ) { const bulkPermission: BulkFormPermission = { userId, formIds, accessLevel, inheritFromWorkspace, }; return this.permissionService.setBulkFormPermissions(bulkPermission); } /** * Get effective permission for a user on a form (considering workspace inheritance) */ public async getEffectivePermission( formId: string, userId: string, workspaceId: string ): Promise<{ accessLevel: FormAccessLevel; source: 'form' | 'workspace' | 'default' }> { // First, get the user's workspace role const workspace = await this.workspaceTool.getWorkspaceDetails(workspaceId); const member = workspace.members?.find(m => m.id === userId); const workspaceRole = member?.role; return this.permissionService.getEffectivePermission(formId, userId, workspaceRole); } /** * Validate if a user has the required access level for a form */ public async validateAccess( formId: string, userId: string, requiredAccessLevel: FormAccessLevel ): Promise<{ hasAccess: boolean; currentLevel: FormAccessLevel }> { return this.permissionService.validateAccess(formId, userId, requiredAccessLevel); } /** * Get all forms a user has access to in a workspace */ public async getUserFormAccess( workspaceId: string, userId: string, minAccessLevel: FormAccessLevel = 'view' ): Promise<{ formId: string; accessLevel: FormAccessLevel }[]> { return this.permissionService.getUserFormAccess(workspaceId, userId, minAccessLevel); } /** * Get form permission settings (default access level, inheritance rules, etc.) */ public async getFormPermissionSettings(formId: string) { return this.permissionService.getFormPermissionSettings(formId); } /** * Update form permission settings */ public async updateFormPermissionSettings( formId: string, settings: Partial<FormPermissionSettings> ) { return this.permissionService.updateFormPermissionSettings(formId, settings); } /** * Copy permissions from one form to another */ public async copyFormPermissions( sourceFormId: string, targetFormId: string, includeSettings: boolean = true ) { return this.permissionService.copyFormPermissions(sourceFormId, targetFormId, includeSettings); } /** * Grant workspace-level permissions to all forms in a workspace * This implements permission inheritance from workspace settings */ public async inheritWorkspacePermissions( _workspaceId: string, _userId: string, workspaceRole: UserRole ): Promise<{ success: boolean; formsUpdated: number }> { // This would map workspace roles to form access levels const accessLevelMap: Record<UserRole, FormAccessLevel> = { 'owner': 'admin', 'admin': 'manage', 'member': 'view', }; // Use the mapping to get access level (referenced to avoid unused variable warning) accessLevelMap[workspaceRole]; // Get all forms in the workspace (this would require a forms service) // For now, we'll return a mock response return { success: true, formsUpdated: 0, }; } /** * Override workspace inheritance for specific forms */ public async overrideWorkspaceInheritance( formId: string, userId: string, accessLevel: FormAccessLevel, grantedBy: string ): Promise<FormPermission> { return this.setFormPermission(formId, userId, accessLevel, false, grantedBy); } /** * Check if a user can perform a specific action on a form */ public async canPerformAction( formId: string, userId: string, action: 'view' | 'edit' | 'manage' | 'admin' ): Promise<boolean> { // Access level hierarchy for reference (used for validation logic) ['view', 'edit', 'manage', 'admin']; const requiredLevel = action as FormAccessLevel; const result = await this.validateAccess(formId, userId, requiredLevel); return result.hasAccess; } /** * Get a summary of permissions for all users on a form */ public async getFormPermissionSummary(formId: string) { const permissions = await this.getFormPermissions(formId); const settings = await this.getFormPermissionSettings(formId); return { formId, totalPermissions: permissions.permissions.length, defaultAccessLevel: settings.defaultAccessLevel, allowsInheritance: settings.allowWorkspaceInheritance, permissions: permissions.permissions.map(p => ({ userId: p.userId, accessLevel: p.accessLevel, inheritFromWorkspace: p.inheritFromWorkspace, grantedAt: p.grantedAt, })), }; } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/learnwithcc/tally-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server