import smbClient from "@/lib/smbClient"; import { NextResponse } from "next/server"; import { verifyToken } from "@/lib/auth"; import PDFParser from "pdf2json"; // Funktion, um kodierte Texte zu decodieren function decodePDFText(texts) { return texts .map((text) => text.R.map((item) => decodeURIComponent(item.T)).join("")) .join(" "); } // Rekursive Funktion, um alle PDF-Dateien in einem Verzeichnis und seinen Unterverzeichnissen zu durchsuchen async function searchPDFsInDirectory(directoryPath, searchTerm) { return new Promise((resolve) => { smbClient.readdir(directoryPath, async (err, files) => { if (err) { console.error("Fehler beim Lesen des Verzeichnisses:", err); resolve([]); return; } let foundInFiles = []; console.log(`Durchsuche Verzeichnis: ${directoryPath}`); console.log(`Gefundene Dateien und Ordner:`, files); for (const file of files) { if (typeof file === "string") { const filePath = `${directoryPath}\\${file}`; // Überprüfe, ob es sich um eine PDF-Datei handelt if (file.toLowerCase().endsWith(".pdf")) { console.log(`Überprüfe Datei: ${filePath}`); const found = await searchInPDF(filePath, searchTerm); if (found) { console.log(`Begriff "${searchTerm}" gefunden in: ${filePath}`); foundInFiles.push(filePath); } else { console.log( `Begriff "${searchTerm}" NICHT gefunden in: ${filePath}` ); } } else { // Wenn es sich nicht um eine PDF handelt, rekursiv durchsuchen (als Ordner annehmen) const nestedResults = await searchPDFsInDirectory( filePath, searchTerm ); foundInFiles = foundInFiles.concat(nestedResults); } } } resolve(foundInFiles); }); }); } // Funktion, um einen bestimmten Suchbegriff in einer PDF-Datei zu suchen async function searchInPDF(filePath, searchTerm) { return new Promise((resolve) => { smbClient.readFile(filePath, (err, data) => { if (err) { console.error("Fehler beim Lesen der Datei:", err); resolve(false); return; } const pdfParser = new PDFParser(); pdfParser.on("pdfParser_dataReady", (pdfData) => { const textContent = pdfData.Pages.map((page) => decodePDFText(page.Texts) ).join(" "); const containsTerm = textContent .toLowerCase() .includes(searchTerm.toLowerCase()); resolve(containsTerm); }); pdfParser.on("pdfParser_dataError", (parseErr) => { console.error("Fehler beim Verarbeiten der PDF:", parseErr); resolve(false); }); pdfParser.parseBuffer(data); }); }); } export async function GET(request) { const { searchParams } = new URL(request.url); const searchTerm = searchParams.get("query"); const niederlassung = searchParams.get("niederlassung"); // z.B. NL04 // JWT-Token verifizieren const decoded = verifyToken(request); if (decoded.error) { return NextResponse.json( { error: decoded.error }, { status: 401, headers: { "Cache-Control": "no-store" } } ); } // Admin hat Zugriff auf alle Ordner, aber Niederlassungen nur auf ihren eigenen Ordner if (decoded.role !== "admin" && decoded.niederlassungId !== niederlassung) { console.log(`Keine Berechtigung für diese Niederlassung ${niederlassung}`); return NextResponse.json( { error: "Keine Berechtigung" }, { status: 403, headers: { "Cache-Control": "no-store" } } ); } const directoryPath = `${niederlassung}`; // Der Stammordner der Niederlassung if (!searchTerm) { return NextResponse.json( { error: "Bitte einen Suchbegriff angeben." }, { status: 400, headers: { "Cache-Control": "no-store" } } ); } // Suche alle PDF-Dateien in der Niederlassung und überprüfe, ob der Suchbegriff vorkommt const resultFiles = await searchPDFsInDirectory(directoryPath, searchTerm); return NextResponse.json( { success: true, foundInFiles: resultFiles, data: resultFiles.length > 0 ? `Begriff "${searchTerm}" gefunden in: ${resultFiles.join(", ")}` : `Begriff "${searchTerm}" in keiner Datei gefunden.`, }, { status: 200, headers: { "Cache-Control": "no-store" }, } ); }