perf(shared): cache derived team task state

This commit is contained in:
777genius 2026-05-31 07:31:27 +03:00
parent a0bdb4648f
commit effe9b522f

View file

@ -7,78 +7,73 @@ export interface TeamTaskStateLike {
export type TeamTaskWorkflowColumn = 'review' | 'approved'; export type TeamTaskWorkflowColumn = 'review' | 'approved';
export function isTeamTaskApproved(task: TeamTaskStateLike): boolean { interface CachedTeamTaskState {
if (isTeamTaskDeleted(task) || task.status === 'pending') { status: TeamTaskStateLike['status'];
return false; reviewState: TeamTaskStateLike['reviewState'];
} kanbanColumn: TeamTaskStateLike['kanbanColumn'];
deletedAt: TeamTaskStateLike['deletedAt'];
if (task.kanbanColumn === 'approved') { deleted: boolean;
return true; approved: boolean;
} workflowColumn: TeamTaskWorkflowColumn | undefined;
needsFixActionable: boolean;
if (task.kanbanColumn === 'review') { finishedForDependency: boolean;
return false; terminalForActionableWork: boolean;
}
return task.reviewState === 'approved';
} }
export function isTeamTaskDeleted(task: TeamTaskStateLike): boolean { const teamTaskStateCache = new WeakMap<TeamTaskStateLike, CachedTeamTaskState>();
return task.status === 'deleted' || Boolean(task.deletedAt);
}
export function isTeamTaskActivelyWorked(task: TeamTaskStateLike): boolean { function getCachedTeamTaskState(task: TeamTaskStateLike): CachedTeamTaskState {
return ( const cached = teamTaskStateCache.get(task);
task.status === 'in_progress' && if (
getTeamTaskWorkflowColumn(task) !== 'review' && cached &&
!isTeamTaskApproved(task) && cached.status === task.status &&
!isTeamTaskDeleted(task) cached.reviewState === task.reviewState &&
); cached.kanbanColumn === task.kanbanColumn &&
} cached.deletedAt === task.deletedAt
) {
export function isTeamTaskNeedsFixActionable(task: TeamTaskStateLike): boolean { return cached;
return (
task.reviewState === 'needsFix' &&
!isTeamTaskDeleted(task) &&
getTeamTaskWorkflowColumn(task) === undefined
);
}
export function isTeamTaskFinishedForDependency(task: TeamTaskStateLike): boolean {
const workflowColumn = getTeamTaskWorkflowColumn(task);
if (workflowColumn === 'approved') {
return true;
}
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
return false;
}
return task.status === 'completed';
}
export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): boolean {
if (isTeamTaskDeleted(task)) {
return true;
} }
const workflowColumn = getTeamTaskWorkflowColumn(task); const deleted = task.status === 'deleted' || Boolean(task.deletedAt);
if (workflowColumn === 'approved') { const workflowColumn = resolveTeamTaskWorkflowColumn(task, deleted);
return true; const approved =
} !deleted &&
task.status !== 'pending' &&
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) { (task.kanbanColumn === 'approved' ||
return false; (task.kanbanColumn !== 'review' && task.reviewState === 'approved'));
} const needsFixActionable =
return task.status === 'completed'; task.reviewState === 'needsFix' && !deleted && workflowColumn === undefined;
const finishedForDependency =
workflowColumn === 'approved'
? true
: workflowColumn === 'review' || needsFixActionable
? false
: task.status === 'completed';
const terminalForActionableWork =
deleted ||
workflowColumn === 'approved' ||
(workflowColumn !== 'review' && !needsFixActionable && task.status === 'completed');
const next: CachedTeamTaskState = {
status: task.status,
reviewState: task.reviewState,
kanbanColumn: task.kanbanColumn,
deletedAt: task.deletedAt,
deleted,
approved,
workflowColumn,
needsFixActionable,
finishedForDependency,
terminalForActionableWork,
};
teamTaskStateCache.set(task, next);
return next;
} }
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean { function resolveTeamTaskWorkflowColumn(
return isTeamTaskTerminalForActionableWork(task); task: TeamTaskStateLike,
} deleted: boolean
export function getTeamTaskWorkflowColumn(
task: TeamTaskStateLike
): TeamTaskWorkflowColumn | undefined { ): TeamTaskWorkflowColumn | undefined {
if (isTeamTaskDeleted(task) || task.status === 'pending') { if (deleted || task.status === 'pending') {
return undefined; return undefined;
} }
@ -100,3 +95,43 @@ export function getTeamTaskWorkflowColumn(
return undefined; return undefined;
} }
export function isTeamTaskApproved(task: TeamTaskStateLike): boolean {
return getCachedTeamTaskState(task).approved;
}
export function isTeamTaskDeleted(task: TeamTaskStateLike): boolean {
return getCachedTeamTaskState(task).deleted;
}
export function isTeamTaskActivelyWorked(task: TeamTaskStateLike): boolean {
const cached = getCachedTeamTaskState(task);
return (
task.status === 'in_progress' &&
cached.workflowColumn !== 'review' &&
!cached.approved &&
!cached.deleted
);
}
export function isTeamTaskNeedsFixActionable(task: TeamTaskStateLike): boolean {
return getCachedTeamTaskState(task).needsFixActionable;
}
export function isTeamTaskFinishedForDependency(task: TeamTaskStateLike): boolean {
return getCachedTeamTaskState(task).finishedForDependency;
}
export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): boolean {
return getCachedTeamTaskState(task).terminalForActionableWork;
}
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean {
return isTeamTaskTerminalForActionableWork(task);
}
export function getTeamTaskWorkflowColumn(
task: TeamTaskStateLike
): TeamTaskWorkflowColumn | undefined {
return getCachedTeamTaskState(task).workflowColumn;
}