import { Injectable, Logger } from '@nestjs/common'; import { CrmPrismaService } from '../prisma/crm-prisma.service'; import { RedisService } from '../redis/redis.service'; import { VisibilityLevel } from '../common/utils/build-visibility-filter'; const CACHE_PREFIX = 'crm_visibility'; const CACHE_TTL = 300; // 5 Minuten @Injectable() export class VisibilityService { private readonly logger = new Logger(VisibilityService.name); constructor( private readonly prisma: CrmPrismaService, private readonly redis: RedisService, ) {} /** * Sichtbarkeitslevel fuer eine Entity abrufen (mit Redis-Cache). * Default: ALL (bestehendes Verhalten bleibt erhalten). */ async getLevel( tenantId: string, entity: string, ): Promise { const cacheKey = `${CACHE_PREFIX}:${tenantId}:${entity}`; // Cache pruefen const cached = await this.redis.get(cacheKey); if (cached) { return cached as VisibilityLevel; } // Aus DB laden const setting = await this.prisma.crmVisibilitySetting.findUnique({ where: { tenantId_entity: { tenantId, entity } }, }); const level = (setting?.level as VisibilityLevel) ?? 'ALL'; // In Cache schreiben await this.redis.set(cacheKey, level, CACHE_TTL); return level; } /** * Sichtbarkeitslevel fuer eine Entity setzen. */ async setLevel( tenantId: string, entity: string, level: VisibilityLevel, ): Promise { await this.prisma.crmVisibilitySetting.upsert({ where: { tenantId_entity: { tenantId, entity } }, update: { level }, create: { tenantId, entity, level }, }); // Cache invalidieren const cacheKey = `${CACHE_PREFIX}:${tenantId}:${entity}`; await this.redis.del(cacheKey); this.logger.log( `Visibility fuer ${entity} auf ${level} gesetzt (Tenant: ${tenantId})`, ); } /** * Alle Sichtbarkeitslevels fuer einen Tenant abrufen. */ async getAllLevels( tenantId: string, ): Promise> { const settings = await this.prisma.crmVisibilitySetting.findMany({ where: { tenantId }, }); const result: Record = { COMPANY: 'ALL', CONTACT: 'ALL', DEAL: 'ALL', ACTIVITY: 'ALL', }; for (const s of settings) { result[s.entity] = s.level as VisibilityLevel; } return result; } }