lib/storage)The lib/storage module is the single source of truth for reading delivery note PDFs from the NAS share.
All code that needs to read from the NAS should go through this module instead of using Node.js fs directly. This keeps filesystem logic centralized and makes it easier to change conventions later.
NAS_ROOT_PATH).Provide intention-revealing helpers:
listBranches() → ['NL01', 'NL02', ...]listYears(branch) → ['2023', '2024', ...]listMonths(branch, year) → ['01', '02', ...]listDays(branch, year, month) → ['01', '02', ...]listFiles(branch, year, month, day) → [{ name, relativePath }, ...]Enforce read-only behavior.
Use async filesystem APIs (fs/promises).
NAS_ROOT_PATH (required)The module depends on:
NAS_ROOT_PATH — absolute Unix path where the NAS share is mounted inside the app container.Default/typical value:
NAS_ROOT_PATH=/mnt/niederlassungen
Important:
lib/storage reads process.env.NAS_ROOT_PATH on demand and does not cache it at module load.NAS_ROOT_PATH is missing, lib/storage throws (fail fast).The application code always expects the NAS path inside the container to be:
/mnt/niederlassungenWhich host folder is mounted there is an environment concern:
Server (docker-compose.yml) mounts the real NAS:
volumes:
- /mnt/niederlassungen:/mnt/niederlassungen:ro
Local development (docker-compose.local.yml) mounts a local fixture folder:
volumes:
- ./.local_nas:/mnt/niederlassungen:ro
This separation keeps code identical across environments while allowing safe local testing.
lib/storage assumes the following structure under NAS_ROOT_PATH:
NAS_ROOT_PATH/
@Recently-Snapshot/ # ignored
NL01/
2024/
10/
23/
file1.pdf
file2.pdf
...
Rules:
NL<Number> (e.g. NL01).2024)..pdf files are returned by listFiles().lib/storage does not swallow errors:
fs.promises.readdir throws.