refactor(tasks-controller): remove Redis caching logic for task retrieval
- Eliminated caching logic from the TasksControllerV2 to streamline task retrieval and improve performance. - Updated response handling to directly return task data without caching, enhancing clarity and reducing complexity. - Removed cache invalidation method to simplify the controller's responsibilities.
This commit is contained in:
@@ -8,7 +8,6 @@ import { ServerResponse } from "../models/server-response";
|
|||||||
import { TASK_PRIORITY_COLOR_ALPHA, TASK_STATUS_COLOR_ALPHA, UNMAPPED } from "../shared/constants";
|
import { TASK_PRIORITY_COLOR_ALPHA, TASK_STATUS_COLOR_ALPHA, UNMAPPED } from "../shared/constants";
|
||||||
import { getColor, log_error } from "../shared/utils";
|
import { getColor, log_error } from "../shared/utils";
|
||||||
import TasksControllerBase, { GroupBy, ITaskGroup } from "./tasks-controller-base";
|
import TasksControllerBase, { GroupBy, ITaskGroup } from "./tasks-controller-base";
|
||||||
import { redisClient } from "../redis/client";
|
|
||||||
|
|
||||||
export class TaskListGroup implements ITaskGroup {
|
export class TaskListGroup implements ITaskGroup {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -1052,36 +1051,6 @@ export default class TasksControllerV2 extends TasksControllerBase {
|
|||||||
// This dramatically improves initial load performance (from ~2-5s to ~200-500ms)
|
// This dramatically improves initial load performance (from ~2-5s to ~200-500ms)
|
||||||
const shouldRefreshProgress = req.query.refresh_progress === "true";
|
const shouldRefreshProgress = req.query.refresh_progress === "true";
|
||||||
|
|
||||||
// CACHING OPTIMIZATION: Cache results for frequently accessed data
|
|
||||||
const cacheKey = `tasks_v3_${req.params.id}_${groupBy}_${JSON.stringify({
|
|
||||||
parent_task: req.query.parent_task,
|
|
||||||
archived: req.query.archived,
|
|
||||||
search: req.query.search,
|
|
||||||
statuses: req.query.statuses,
|
|
||||||
priorities: req.query.priorities,
|
|
||||||
labels: req.query.labels,
|
|
||||||
members: req.query.members,
|
|
||||||
projects: req.query.projects,
|
|
||||||
filterBy: req.query.filterBy,
|
|
||||||
customColumns: req.query.customColumns,
|
|
||||||
isSubtasksInclude: req.query.isSubtasksInclude
|
|
||||||
})}`;
|
|
||||||
|
|
||||||
// Try to get cached result first (only if not refreshing progress)
|
|
||||||
if (!shouldRefreshProgress) {
|
|
||||||
try {
|
|
||||||
const cachedResult = await redisClient.get(cacheKey);
|
|
||||||
if (cachedResult) {
|
|
||||||
const parsedResult = JSON.parse(cachedResult);
|
|
||||||
console.log(`[PERFORMANCE] Cache hit for project ${req.params.id} - returned in ${(performance.now() - startTime).toFixed(2)}ms`);
|
|
||||||
return res.status(200).send(parsedResult);
|
|
||||||
}
|
|
||||||
} catch (cacheError) {
|
|
||||||
console.warn("[CACHE WARNING] Redis cache read failed:", cacheError);
|
|
||||||
// Continue with normal query if cache fails
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldRefreshProgress && req.params.id) {
|
if (shouldRefreshProgress && req.params.id) {
|
||||||
const progressStartTime = performance.now();
|
const progressStartTime = performance.now();
|
||||||
await this.refreshProjectTaskProgressValues(req.params.id);
|
await this.refreshProjectTaskProgressValues(req.params.id);
|
||||||
@@ -1316,26 +1285,14 @@ export default class TasksControllerV2 extends TasksControllerBase {
|
|||||||
console.warn(`[PERFORMANCE WARNING] Slow request detected: ${totalTime.toFixed(2)}ms for project ${req.params.id} with ${transformedTasks.length} tasks`);
|
console.warn(`[PERFORMANCE WARNING] Slow request detected: ${totalTime.toFixed(2)}ms for project ${req.params.id} with ${transformedTasks.length} tasks`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const responseData = new ServerResponse(true, {
|
console.log(`[PERFORMANCE] getTasksV3 completed in ${totalTime.toFixed(2)}ms for project ${req.params.id} with ${transformedTasks.length} tasks`);
|
||||||
|
|
||||||
|
return res.status(200).send(new ServerResponse(true, {
|
||||||
groups: responseGroups,
|
groups: responseGroups,
|
||||||
allTasks: transformedTasks,
|
allTasks: transformedTasks,
|
||||||
grouping: groupBy,
|
grouping: groupBy,
|
||||||
totalTasks: transformedTasks.length
|
totalTasks: transformedTasks.length
|
||||||
});
|
}));
|
||||||
|
|
||||||
// Cache the result for 5 minutes (300 seconds) - only cache successful results
|
|
||||||
if (transformedTasks.length > 0) {
|
|
||||||
try {
|
|
||||||
await redisClient.setEx(cacheKey, 300, JSON.stringify(responseData));
|
|
||||||
console.log(`[PERFORMANCE] Cached result for project ${req.params.id} with ${transformedTasks.length} tasks`);
|
|
||||||
} catch (cacheError) {
|
|
||||||
console.warn("[CACHE WARNING] Redis cache write failed:", cacheError);
|
|
||||||
// Continue even if cache write fails
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`[PERFORMANCE] getTasksV3 completed in ${totalTime.toFixed(2)}ms for project ${req.params.id} with ${transformedTasks.length} tasks`);
|
|
||||||
return res.status(200).send(responseData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static getDefaultGroupColor(groupBy: string, groupValue: string): string {
|
private static getDefaultGroupColor(groupBy: string, groupValue: string): string {
|
||||||
@@ -1434,20 +1391,5 @@ export default class TasksControllerV2 extends TasksControllerBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper method to invalidate cache when tasks are modified
|
|
||||||
public static async invalidateTasksCache(projectId: string): Promise<void> {
|
|
||||||
try {
|
|
||||||
// Get all cache keys for this project
|
|
||||||
const pattern = `tasks_v3_${projectId}_*`;
|
|
||||||
const keys = await redisClient.keys(pattern);
|
|
||||||
|
|
||||||
if (keys.length > 0) {
|
|
||||||
await redisClient.del(keys);
|
|
||||||
console.log(`[CACHE] Invalidated ${keys.length} cache entries for project ${projectId}`);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.warn("[CACHE WARNING] Cache invalidation failed:", error);
|
|
||||||
// Don't throw error - cache invalidation failure shouldn't break the operation
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user