storage.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // lib/storage.js
  2. import fs from "fs/promises";
  3. import path from "path";
  4. const ROOT = process.env.NAS_ROOT_PATH;
  5. function fullPath(...segments) {
  6. if (!ROOT) {
  7. throw new Error("NAS_ROOT_PATH ist nicht gesetzt");
  8. }
  9. return path.join(ROOT, ...segments.map(String));
  10. }
  11. function sortNumericStrings(a, b) {
  12. const na = parseInt(a, 10);
  13. const nb = parseInt(b, 10);
  14. if (!Number.isNaN(na) && !Number.isNaN(nb)) {
  15. return na - nb;
  16. }
  17. return a.localeCompare(b, "de");
  18. }
  19. export async function listBranches() {
  20. const entries = await fs.readdir(fullPath(), { withFileTypes: true });
  21. return entries
  22. .filter(
  23. (e) =>
  24. e.isDirectory() &&
  25. e.name !== "@Recently-Snapshot" &&
  26. /^NL\d+$/i.test(e.name)
  27. )
  28. .map((e) => e.name)
  29. .sort((a, b) =>
  30. sortNumericStrings(a.replace("NL", ""), b.replace("NL", ""))
  31. );
  32. }
  33. export async function listYears(branch) {
  34. const dir = fullPath(branch);
  35. const entries = await fs.readdir(dir, { withFileTypes: true });
  36. return entries
  37. .filter((e) => e.isDirectory() && /^\d{4}$/.test(e.name))
  38. .map((e) => e.name)
  39. .sort(sortNumericStrings);
  40. }
  41. export async function listMonths(branch, year) {
  42. const dir = fullPath(branch, year);
  43. const entries = await fs.readdir(dir, { withFileTypes: true });
  44. return entries
  45. .filter((e) => e.isDirectory() && /^\d{1,2}$/.test(e.name))
  46. .map((e) => e.name.padStart(2, "0"))
  47. .sort(sortNumericStrings);
  48. }
  49. export async function listDays(branch, year, month) {
  50. const dir = fullPath(branch, year, month);
  51. const entries = await fs.readdir(dir, { withFileTypes: true });
  52. return entries
  53. .filter((e) => e.isDirectory() && /^\d{1,2}$/.test(e.name))
  54. .map((e) => e.name.padStart(2, "0"))
  55. .sort(sortNumericStrings);
  56. }
  57. export async function listFiles(branch, year, month, day) {
  58. const dir = fullPath(branch, year, month, day);
  59. const entries = await fs.readdir(dir);
  60. return entries
  61. .filter((name) => name.toLowerCase().endsWith(".pdf"))
  62. .sort((a, b) => a.localeCompare(b, "de"))
  63. .map((name) => ({
  64. name,
  65. relativePath: `${branch}/${year}/${month}/${day}/${name}`,
  66. }));
  67. }