INSIGHT-MVP/packages/crm-service/src/visibility/visibility.service.ts
Thomas Reitz b484f4380f fix: VisibilityLevel als lokalen String-Type statt Prisma-Enum verwenden
Prisma-Enums sind zur Laufzeit nicht als Objekt verfuegbar wenn ts-node
den Import vor der Client-Generierung auflöst. Ersetzt durch eigenen
Type-Export aus build-visibility-filter.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 22:24:18 +01:00

93 lines
2.4 KiB
TypeScript

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<VisibilityLevel> {
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<void> {
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<Record<string, VisibilityLevel>> {
const settings = await this.prisma.crmVisibilitySetting.findMany({
where: { tenantId },
});
const result: Record<string, VisibilityLevel> = {
COMPANY: 'ALL',
CONTACT: 'ALL',
DEAL: 'ALL',
ACTIVITY: 'ALL',
};
for (const s of settings) {
result[s.entity] = s.level as VisibilityLevel;
}
return result;
}
}