mirror of
http://172.20.10.11:3000/gitadmin/INSIGHT-MVP.git
synced 2026-06-25 09:06:40 +02:00
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>
93 lines
2.4 KiB
TypeScript
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;
|
|
}
|
|
}
|