# Repository Guidelines ## Project Structure & Module Organization - `src/` holds the React client: `App.js` bootstraps the main views (“Slots buchen”, Store-Watch) and composes feature-specific components (z. B. `DashboardView`, `StoreWatchPage`) plus hooks/utilities in neighboring folders. - `public/` contains the static shell served during development; only add files that must be copied verbatim into the build output. - `server.js` is the Express backend that serves the built client, exposes the REST APIs used by the UI (e.g. `/api/stores`, `/api/store-watch/*`, `/api/user/preferences/*`, `/api/location/nearest-store`) und persistiert Daten über die Stores in `config/`. - `config/` stores generated runtime state (`-pickup-config.json`, Admin-Settings, Preferences, Watcher etc.). Keep it writable but untracked so local credentials never leak. - `build/` is created by `npm run build` and shipped by the Express server or Docker image; never edit files here manually. - `docker-compose.yml`, `Dockerfile`, and `rebuildContainer.sh` encapsulate deployment; update them when server ports, env vars, or base images change. ## Build, Test, and Development Commands - `npm install` – restore dependencies in `package.json`. - `npm start` – launch the CRA dev server on port 3000 with live reload. - `npm run build` – emit the production bundle into `build/`; run before `node server.js` or container builds. - `npm test` – run React Testing Library suites in watch mode; append `-- --watch=false` in CI. - `npm run check:foodsharing-api` – verify the Foodsharing endpoints used by the app against `https://foodsharing.de/api/doc`. - `node server.js` – serve the prebuilt UI and REST API using values from `.env` (e.g., `PICKUP_TOPIC`, credentials, ports). - `docker-compose up --build` – rebuild and start the containerized service, syncing the bundled UI and server. ## Required Close-Out Steps - After changes to `server.js`, `services/`, `src/`, `Dockerfile`, `docker-compose.yml`, or the Foodsharing API integration, always run this sequence completely: - `CI=true npm test -- --watch=false` - `npm run build` - `npm run check:foodsharing-api` when Foodsharing endpoints, payloads, or response mappings are affected - `docker compose up -d --build` - `curl http://localhost:3005/api/health` and confirm the response contains `"status":"ok"` ## Git & Deployment Workflow - Before making any code, config, Docker, or documentation change, verify `git status --short` is clean. If it is not clean, stop and reconcile the current worktree first; the running Docker service on port 3005 is the relevant production reference when deciding which state to preserve. - If the running Docker service contains changes that are not committed, compare its `/app` contents against the worktree, commit the Docker-live state, and push it before starting a new feature or fix. - After every completed feature or fix, update `.commitmessage`, stage it with `git add -f .commitmessage`, create a conventional commit, and push `main`. - Features and fixes must go live in Docker after the commit: run `docker compose up -d --build` and verify `curl http://localhost:3005/api/health` returns a JSON response containing `"status":"ok"`. - Keep `config/`, credentials, request logs, HAR captures, and other runtime state out of commits unless explicitly requested. ## Coding Style & Naming Conventions - Use 2-space indentation and Standard/Prettier-compatible formatting; rely on the CRA ESLint config (`react-app`, `react-app/jest`) for feedback. - Favor functional React components with PascalCase filenames (`PickupConfigEditor.js`) and camelCase props/state keys. - Keep config schema fields (e.g., `desiredWeekday`, `onlyNotify`) camelCase across client and API payloads. - Prefer descriptive folder-local CSS files rather than global selectors; co-locate assets next to their component whenever possible. ## Testing Guidelines - React Testing Library + Jest underpin `App.test.js`; add `.test.js` files alongside components to exercise rendering and validation. - Initialize helpers inside `setupTests.js` to keep suites lean. - Aim for meaningful edge cases (blank config, duplicate IDs, toggling `onlyNotify`). Pull requests should demonstrate passing `npm test` output or CI logs. ## Commit & Pull Request Guidelines - Follow conventional commits (e.g., `feat: add notification panel`, `fix: debounce config saves`) and keep subjects ≤72 characters. - After every change, refresh `.commitmessage` with the final commit text and ensure it is staged (e.g., `git add -f .commitmessage`) so tooling can reuse it automatically. - Reference issues or API endpoints impacted inside the body, and describe user-visible changes plus verification steps. - PRs must include: summary of API/UI changes, screenshots or JSON samples when modifying config shape, notes on new env vars, and confirmation that `npm test` and `npm run build` succeed. ## Security & Configuration Tips - Store secrets in `.env`, not in version control; provide `.env.example` updates when new variables (ports, credentials) are introduced. - The server writes to `config/pickup-config.json`; ensure the directory exists and has the correct permissions before deploying or running containers.