All files / src/platform/cache cache-invalidation.service.ts

0% Statements 0/16
0% Branches 0/8
0% Functions 0/6
0% Lines 0/14

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)),
    );
  }
}