| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 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" },
- }
- );
- }
|