From 0a92d38ccfea6f4dc2a0ebf1f1a95fd0c62678b5 Mon Sep 17 00:00:00 2001 From: shancds Date: Tue, 1 Jul 2025 16:57:07 +0530 Subject: [PATCH] refactor(task-sort-order): optimize access check and clean up code - Improved the access check logic by incorporating team member validation in the SQL query, enhancing security and accuracy. - Removed unnecessary whitespace for cleaner code formatting. - Updated socket event emission for consistency in response structure. --- .../commands/on-task-sort-order-change.ts | 24 +++++++++---------- .../enhanced-kanban/EnhancedKanbanBoard.tsx | 8 +++---- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/worklenz-backend/src/socket.io/commands/on-task-sort-order-change.ts b/worklenz-backend/src/socket.io/commands/on-task-sort-order-change.ts index 450551fb..83b4a70e 100644 --- a/worklenz-backend/src/socket.io/commands/on-task-sort-order-change.ts +++ b/worklenz-backend/src/socket.io/commands/on-task-sort-order-change.ts @@ -73,7 +73,7 @@ const onTaskSortOrderChange = async (io: Server, socket: Socket, data: ChangeReq // PERFORMANCE OPTIMIZATION: Use cached dependency check if available const cacheKey = `${project_id}-${userId}-${team_id}`; const cachedDependency = dependencyCache.get(cacheKey); - + let hasAccess = false; if (cachedDependency && (Date.now() - cachedDependency.timestamp) < CACHE_TTL) { hasAccess = cachedDependency.result; @@ -82,16 +82,16 @@ const onTaskSortOrderChange = async (io: Server, socket: Socket, data: ChangeReq const dependencyResult = await dbPool.query(` SELECT EXISTS( SELECT 1 FROM project_members pm - INNER JOIN projects p ON p.id = pm.project_id - WHERE pm.project_id = $1 - AND pm.user_id = $2 - AND p.team_id = $3 - AND pm.is_active = true + INNER JOIN projects p ON p.id = pm.project_id + INNER JOIN team_members tm ON pm.team_member_id = tm.id +WHERE pm.project_id = $1 + AND tm.user_id = $2 + AND p.team_id = $3 ) as has_access `, [project_id, userId, team_id]); - + hasAccess = dependencyResult.rows[0]?.has_access || false; - + // Cache the result dependencyCache.set(cacheKey, { result: hasAccess, timestamp: Date.now() }); } @@ -152,8 +152,8 @@ const onTaskSortOrderChange = async (io: Server, socket: Socket, data: ChangeReq }); // Send success response - socket.emit(SocketEvents.TASK_SORT_ORDER_CHANGE.toString(), { - success: true, + socket.emit(SocketEvents.TASK_SORT_ORDER_CHANGE.toString(), { + success: true, task_id: task.id, from_group, to_group, @@ -162,8 +162,8 @@ const onTaskSortOrderChange = async (io: Server, socket: Socket, data: ChangeReq } catch (error) { log_error(error); - socket.emit(SocketEvents.TASK_SORT_ORDER_CHANGE.toString(), { - error: "Internal server error" + socket.emit(SocketEvents.TASK_SORT_ORDER_CHANGE.toString(), { + error: "Internal server error" }); } }; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx index 1226cbad..5c275cb9 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx @@ -7,7 +7,6 @@ import { DragStartEvent, DragEndEvent, DragOverEvent, - closestCorners, KeyboardSensor, PointerSensor, useSensor, @@ -20,7 +19,6 @@ import { import { SortableContext, horizontalListSortingStrategy, - verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { RootState } from '@/app/store'; import { @@ -34,8 +32,6 @@ import { fetchEnhancedKanbanLabels, } from '@/features/enhanced-kanban/enhanced-kanban.slice'; import EnhancedKanbanGroup from './EnhancedKanbanGroup'; -import EnhancedKanbanTaskCard from './EnhancedKanbanTaskCard'; -import PerformanceMonitor from './PerformanceMonitor'; import './EnhancedKanbanBoard.css'; import { useSocket } from '@/socket/socketContext'; import { useAppSelector } from '@/hooks/useAppSelector'; @@ -50,6 +46,7 @@ import ImprovedTaskFilters from '../task-management/improved-task-filters'; import { fetchStatusesCategories } from '@/features/taskAttributes/taskStatusSlice'; import { useFilterDataLoader } from '@/hooks/useFilterDataLoader'; import { useTaskSocketHandlers } from '@/hooks/useTaskSocketHandlers'; +import { useAuthService } from '@/hooks/useAuth'; // Import the TaskListFilters component const TaskListFilters = React.lazy(() => import('@/pages/projects/projectView/taskList/task-list-filters/task-list-filters')); @@ -68,7 +65,8 @@ const EnhancedKanbanBoard: React.FC = ({ projectId, cl performanceMetrics } = useSelector((state: RootState) => state.enhancedKanbanReducer); const { socket } = useSocket(); - const { teamId } = useAppSelector((state: RootState) => state.auth); + const authService = useAuthService(); + const teamId = authService.getCurrentSession()?.team_id; const groupBy = useSelector((state: RootState) => state.enhancedKanbanReducer.groupBy); const project = useAppSelector((state: RootState) => state.projectReducer.project); const { statusCategories, status: existingStatuses } = useAppSelector((state) => state.taskStatusReducer);