fix: apply consistent-type-imports across API codebase (728 lint errors)
- Convert `import type { X }` to `import { type X }` (inline-type-imports style)
- Suppress consistent-type-imports for `typeof import()` in instrument.ts
- Includes uncommitted agent work: metrics module, redis caching, audit logs,
saved searches, circuit breaker, rate limiting, and admin enhancements
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
import { Injectable, type OnModuleInit } from '@nestjs/common';
|
||||
import { InjectMetric } from '@willsoto/nestjs-prometheus';
|
||||
import { type Counter } from 'prom-client';
|
||||
import { type LoggerService } from './logger.service';
|
||||
import { type RedisService } from './redis.service';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { Counter } from 'prom-client';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { LoggerService } from './logger.service';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { RedisService } from './redis.service';
|
||||
|
||||
export const CACHE_HIT_TOTAL = 'cache_hit_total';
|
||||
export const CACHE_MISS_TOTAL = 'cache_miss_total';
|
||||
export const CACHE_DEGRADATION_TOTAL = 'cache_degradation_total';
|
||||
|
||||
export const CacheTTL = {
|
||||
/** Listing detail — moderate TTL, invalidated on mutation */
|
||||
@@ -52,6 +56,7 @@ export class CacheService implements OnModuleInit {
|
||||
private readonly logger: LoggerService,
|
||||
@InjectMetric(CACHE_HIT_TOTAL) private readonly cacheHitCounter: Counter,
|
||||
@InjectMetric(CACHE_MISS_TOTAL) private readonly cacheMissCounter: Counter,
|
||||
@InjectMetric(CACHE_DEGRADATION_TOTAL) private readonly cacheDegradationCounter: Counter,
|
||||
) {}
|
||||
|
||||
onModuleInit(): void {
|
||||
@@ -60,6 +65,9 @@ export class CacheService implements OnModuleInit {
|
||||
|
||||
/**
|
||||
* Cache-aside: get from cache, or execute loader and store result.
|
||||
*
|
||||
* When Redis is down the loader is called directly (graceful degradation).
|
||||
* Degradation events are counted via `cache_degradation_total` for alerting.
|
||||
*/
|
||||
async getOrSet<T>(
|
||||
key: string,
|
||||
@@ -67,6 +75,13 @@ export class CacheService implements OnModuleInit {
|
||||
ttlSeconds: number,
|
||||
resource: string,
|
||||
): Promise<T> {
|
||||
// Fast-path: skip Redis entirely when it is known to be disconnected.
|
||||
if (!this.redis.isAvailable()) {
|
||||
this.cacheDegradationCounter.inc({ resource, operation: 'skip_unavailable' });
|
||||
this.cacheMissCounter.inc({ resource });
|
||||
return loader();
|
||||
}
|
||||
|
||||
try {
|
||||
const cached = await this.redis.get(key);
|
||||
if (cached !== null) {
|
||||
@@ -74,6 +89,7 @@ export class CacheService implements OnModuleInit {
|
||||
return JSON.parse(cached) as T;
|
||||
}
|
||||
} catch (err) {
|
||||
this.cacheDegradationCounter.inc({ resource, operation: 'read_error' });
|
||||
this.logger.warn(`Cache read error for ${key}: ${(err as Error).message}`, 'CacheService');
|
||||
}
|
||||
|
||||
@@ -83,6 +99,7 @@ export class CacheService implements OnModuleInit {
|
||||
try {
|
||||
await this.redis.set(key, JSON.stringify(result), ttlSeconds);
|
||||
} catch (err) {
|
||||
this.cacheDegradationCounter.inc({ resource, operation: 'write_error' });
|
||||
this.logger.warn(`Cache write error for ${key}: ${(err as Error).message}`, 'CacheService');
|
||||
}
|
||||
|
||||
@@ -94,6 +111,7 @@ export class CacheService implements OnModuleInit {
|
||||
try {
|
||||
await this.redis.del(key);
|
||||
} catch (err) {
|
||||
this.cacheDegradationCounter.inc({ resource: 'invalidation', operation: 'invalidate_error' });
|
||||
this.logger.warn(`Cache invalidate error for ${key}: ${(err as Error).message}`, 'CacheService');
|
||||
}
|
||||
}
|
||||
@@ -111,6 +129,7 @@ export class CacheService implements OnModuleInit {
|
||||
}
|
||||
} while (cursor !== '0');
|
||||
} catch (err) {
|
||||
this.cacheDegradationCounter.inc({ resource: 'invalidation', operation: 'prefix_invalidate_error' });
|
||||
this.logger.warn(`Cache prefix invalidate error for ${prefix}: ${(err as Error).message}`, 'CacheService');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user