route.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import smbClient from "@/lib/smbClient";
  2. import { NextResponse } from "next/server";
  3. import { verifyToken } from "@/lib/auth";
  4. import PDFParser from "pdf2json";
  5. // Funktion, um kodierte Texte zu decodieren
  6. function decodePDFText(texts) {
  7. return texts
  8. .map((text) => text.R.map((item) => decodeURIComponent(item.T)).join(""))
  9. .join(" ");
  10. }
  11. // Rekursive Funktion, um alle PDF-Dateien in einem Verzeichnis und seinen Unterverzeichnissen zu durchsuchen
  12. async function searchPDFsInDirectory(directoryPath, searchTerm) {
  13. return new Promise((resolve) => {
  14. smbClient.readdir(directoryPath, async (err, files) => {
  15. if (err) {
  16. console.error("Fehler beim Lesen des Verzeichnisses:", err);
  17. resolve([]);
  18. return;
  19. }
  20. let foundInFiles = [];
  21. console.log(`Durchsuche Verzeichnis: ${directoryPath}`);
  22. console.log(`Gefundene Dateien und Ordner:`, files);
  23. for (const file of files) {
  24. if (typeof file === "string") {
  25. const filePath = `${directoryPath}\\${file}`;
  26. // Überprüfe, ob es sich um eine PDF-Datei handelt
  27. if (file.toLowerCase().endsWith(".pdf")) {
  28. console.log(`Überprüfe Datei: ${filePath}`);
  29. const found = await searchInPDF(filePath, searchTerm);
  30. if (found) {
  31. console.log(`Begriff "${searchTerm}" gefunden in: ${filePath}`);
  32. foundInFiles.push(filePath);
  33. } else {
  34. console.log(
  35. `Begriff "${searchTerm}" NICHT gefunden in: ${filePath}`
  36. );
  37. }
  38. } else {
  39. // Wenn es sich nicht um eine PDF handelt, rekursiv durchsuchen (als Ordner annehmen)
  40. const nestedResults = await searchPDFsInDirectory(
  41. filePath,
  42. searchTerm
  43. );
  44. foundInFiles = foundInFiles.concat(nestedResults);
  45. }
  46. }
  47. }
  48. resolve(foundInFiles);
  49. });
  50. });
  51. }
  52. // Funktion, um einen bestimmten Suchbegriff in einer PDF-Datei zu suchen
  53. async function searchInPDF(filePath, searchTerm) {
  54. return new Promise((resolve) => {
  55. smbClient.readFile(filePath, (err, data) => {
  56. if (err) {
  57. console.error("Fehler beim Lesen der Datei:", err);
  58. resolve(false);
  59. return;
  60. }
  61. const pdfParser = new PDFParser();
  62. pdfParser.on("pdfParser_dataReady", (pdfData) => {
  63. const textContent = pdfData.Pages.map((page) =>
  64. decodePDFText(page.Texts)
  65. ).join(" ");
  66. const containsTerm = textContent
  67. .toLowerCase()
  68. .includes(searchTerm.toLowerCase());
  69. resolve(containsTerm);
  70. });
  71. pdfParser.on("pdfParser_dataError", (parseErr) => {
  72. console.error("Fehler beim Verarbeiten der PDF:", parseErr);
  73. resolve(false);
  74. });
  75. pdfParser.parseBuffer(data);
  76. });
  77. });
  78. }
  79. export async function GET(request) {
  80. const { searchParams } = new URL(request.url);
  81. const searchTerm = searchParams.get("query");
  82. const niederlassung = searchParams.get("niederlassung"); // z.B. NL04
  83. // JWT-Token verifizieren
  84. const decoded = verifyToken(request);
  85. if (decoded.error) {
  86. return NextResponse.json(
  87. { error: decoded.error },
  88. { status: 401, headers: { "Cache-Control": "no-store" } }
  89. );
  90. }
  91. // Admin hat Zugriff auf alle Ordner, aber Niederlassungen nur auf ihren eigenen Ordner
  92. if (decoded.role !== "admin" && decoded.niederlassungId !== niederlassung) {
  93. console.log(`Keine Berechtigung für diese Niederlassung ${niederlassung}`);
  94. return NextResponse.json(
  95. { error: "Keine Berechtigung" },
  96. { status: 403, headers: { "Cache-Control": "no-store" } }
  97. );
  98. }
  99. const directoryPath = `${niederlassung}`; // Der Stammordner der Niederlassung
  100. if (!searchTerm) {
  101. return NextResponse.json(
  102. { error: "Bitte einen Suchbegriff angeben." },
  103. { status: 400, headers: { "Cache-Control": "no-store" } }
  104. );
  105. }
  106. // Suche alle PDF-Dateien in der Niederlassung und überprüfe, ob der Suchbegriff vorkommt
  107. const resultFiles = await searchPDFsInDirectory(directoryPath, searchTerm);
  108. return NextResponse.json(
  109. {
  110. success: true,
  111. foundInFiles: resultFiles,
  112. data:
  113. resultFiles.length > 0
  114. ? `Begriff "${searchTerm}" gefunden in: ${resultFiles.join(", ")}`
  115. : `Begriff "${searchTerm}" in keiner Datei gefunden.`,
  116. },
  117. {
  118. status: 200,
  119. headers: { "Cache-Control": "no-store" },
  120. }
  121. );
  122. }