import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; import { UpsertHelpTextDto } from './dto/upsert-help-text.dto'; type HelpTextScope = 'default' | 'user' | 'admin'; @Injectable() export class HelpTextsService { private readonly allowedScopes: HelpTextScope[] = ['default', 'user', 'admin']; constructor(private readonly prisma: PrismaService) {} async getResolvedByKey(keyRaw: string, roleRaw?: string) { const key = this.normalizeKey(keyRaw); const role = (roleRaw ?? 'user').toLowerCase(); const scopePriority: HelpTextScope[] = role === 'admin' ? ['admin', 'user', 'default'] : ['user', 'default']; const rows = await this.prisma.helpText.findMany({ where: { key, isActive: true, scope: { in: scopePriority }, }, select: { key: true, scope: true, title: true, content: true, updatedAt: true, }, }); for (const scope of scopePriority) { const hit = rows.find((row) => row.scope === scope); if (hit) { return { 'key': hit.key, 'scope': hit.scope, 'title': hit.title, 'content': hit.content, 'updatedAt': hit.updatedAt, }; } } throw new NotFoundException(`Ingen aktiv hjälptext hittades för key '${key}'.`); } async upsert(keyRaw: string, scopeRaw: string, dto: UpsertHelpTextDto) { const key = this.normalizeKey(keyRaw); const scope = this.normalizeScope(scopeRaw); return this.prisma.helpText.upsert({ where: { key_scope: { key, scope }, }, update: { title: dto.title.trim(), content: dto.content.trim(), isActive: dto.isActive ?? true, }, create: { key, scope, title: dto.title.trim(), content: dto.content.trim(), isActive: dto.isActive ?? true, }, select: { key: true, scope: true, title: true, content: true, isActive: true, updatedAt: true, }, }); } private normalizeKey(value: string): string { const normalized = value.trim().toLowerCase(); if (!normalized) { throw new BadRequestException('Hjälptext-nyckel måste anges.'); } return normalized; } private normalizeScope(value: string): HelpTextScope { const normalized = value.trim().toLowerCase() as HelpTextScope; if (!this.allowedScopes.includes(normalized)) { throw new BadRequestException( `Ogiltig scope '${value}'. Tillåtna scopes: ${this.allowedScopes.join(', ')}`, ); } return normalized; } }