perf(access): TTL-кэш getAccessibleTaskIds с точечной инвалидацией

Шаг 0.12 плана production-готовности:
- accessibleTasksCache (45с) per userId:orgId внутри storage-метода
- инвалидация в storage-слое: роли, делегирования, form access,
  assignees, createTask/updateTask, appRole пользователя
- 9 новых юнит-тестов (65/65 зелёные)
This commit is contained in:
2026-09-07 22:27:33 +03:00
parent 82d577c797
commit 23c49adcd1
9 changed files with 231 additions and 2 deletions

View File

@@ -3,6 +3,7 @@ import { db } from "../db";
import { eq, and, desc, asc, sql, ilike, or, gte, lte, inArray, isNull } from "drizzle-orm";
import crypto from "crypto";
import { userStatusesStorage } from "./user-statuses.storage";
import { invalidateAccessibleTasksForUser } from "../utils/cache";
export interface ListUsersOptions {
search?: string;
@@ -270,6 +271,10 @@ export class UsersStorage {
.set({ ...updates, updatedAt: new Date() })
.where(eq(users.id, id))
.returning();
// Смена appRole (например, получение tasks.view_all) меняет набор доступных задач
if ('appRole' in updates && user?.organizationId) {
invalidateAccessibleTasksForUser(id, user.organizationId);
}
return user;
}