Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import { Injectable } from '@nestjs/common'; import { CacheService } from './cache.service'; import { CacheKeyBuilder } from './cache-key.builder'; import { CacheNamespace } from './cache-namespace.registry'; @Injectable() export class CacheInvalidationService { constructor( private readonly cacheService: CacheService, private readonly keyBuilder: CacheKeyBuilder, ) {} /** * Invalidate all cache entries for a specific tenant across a namespace. */ async invalidateByTenant( namespace: CacheNamespace, tenantId: string, ): Promise<void> { const pattern = this.keyBuilder.tenantPattern(namespace, tenantId); await this.cacheService.invalidatePattern(pattern); } /** * Invalidate all cache entries for a specific user. */ async invalidateByUser( namespace: CacheNamespace, tenantId: string, userId: string, ): Promise<void> { const pattern = this.keyBuilder.userPattern(namespace, tenantId, userId); await this.cacheService.invalidatePattern(pattern); } /** * Invalidate a specific named entity key. */ async invalidateEntity( namespace: CacheNamespace, tenantId: string, entityId: string, ): Promise<void> { const key = this.keyBuilder.build(namespace, tenantId, entityId); await this.cacheService.del(key); } /** * Bulk invalidation across multiple namespaces for a tenant (e.g., after a significant org change). */ async invalidateTenantAllNamespaces( tenantId: string, namespaces: CacheNamespace[], ): Promise<void> { await Promise.all( namespaces.map((ns) => this.invalidateByTenant(ns, tenantId)), ); } } |