feat: Phase 1 MVP � offline-first beer check-in PWA #1

Open
jan wants to merge 1 commit from claude/eager-meninsky into main
Owner

Summary

  • Complete Phase 1 DoD: offline check-in, PWA installable, search mit Brewery-Namen, vollst�ndiger Screen 3 Flow
  • Fix Beer-Suche Enrichment (Brewery-Namen), CouchDB Type-Discriminator, Check-in Success Screen
  • CouchDB Replikations-Wiring f�r Phase 2 Sync-Readiness

Was ist in diesem PR

  • Backend: Brewery-Name Enrichment in der Suche, brewery_id Discriminator auf Mango-Selektoren, Docker-Port Remap auf 5990
  • Frontend Screen 3: Detail ? Check-in ? Success Modal Flow vollst�ndig; Dashboard zeigt Brewery-Name wenn Style fehlt
  • Offline: Validiert via Fetch-Block Simulation; RxDB/Dexie persistiert lokal ohne Netzwerk
  • PWA: Alle Icons + Manifest + Service Worker im Production Build
  • Sync: replicateCouchDB in db.ts via /db Vite Proxy; non-fatal offline
  • Refactor: useDatabase.tsx aufgeteilt in DatabaseContext.ts + DatabaseProvider.tsx + useDatabase.ts (Fix f�r Fast Refresh)
  • Tests: 62 Backend + 7 Frontend � alle gr�n; vi.hoisted() Mocking, kein Docker erforderlich

Test Plan

  • npx vitest run � 62 Backend Tests bestehen
  • cd frontend && npx vitest run � 7 Frontend Tests bestehen
  • cd frontend && npm run build � Production Build erzeugt sw.js + manifest
  • Docker CouchDB + Backend + Frontend starten, "IPA" suchen ? Brewery-Namen sichtbar
  • Bier einchecken ? Success Screen ? Dashboard zeigt Eintrag
  • Netzwerk blockieren ? Bier manuell hinzuf�gen ? einchecken ? Netzwerk wiederherstellen ? Eintrag bleibt erhalten

?? Generated with Claude Code

## Summary - Complete Phase 1 DoD: offline check-in, PWA installable, search mit Brewery-Namen, vollst�ndiger Screen 3 Flow - Fix Beer-Suche Enrichment (Brewery-Namen), CouchDB Type-Discriminator, Check-in Success Screen - CouchDB Replikations-Wiring f�r Phase 2 Sync-Readiness ## Was ist in diesem PR - **Backend**: Brewery-Name Enrichment in der Suche, `brewery_id` Discriminator auf Mango-Selektoren, Docker-Port Remap auf 5990 - **Frontend Screen 3**: Detail ? Check-in ? Success Modal Flow vollst�ndig; Dashboard zeigt Brewery-Name wenn Style fehlt - **Offline**: Validiert via Fetch-Block Simulation; RxDB/Dexie persistiert lokal ohne Netzwerk - **PWA**: Alle Icons + Manifest + Service Worker im Production Build - **Sync**: `replicateCouchDB` in `db.ts` via `/db` Vite Proxy; non-fatal offline - **Refactor**: `useDatabase.tsx` aufgeteilt in `DatabaseContext.ts` + `DatabaseProvider.tsx` + `useDatabase.ts` (Fix f�r Fast Refresh) - **Tests**: 62 Backend + 7 Frontend � alle gr�n; vi.hoisted() Mocking, kein Docker erforderlich ## Test Plan - [ ] `npx vitest run` � 62 Backend Tests bestehen - [ ] `cd frontend && npx vitest run` � 7 Frontend Tests bestehen - [ ] `cd frontend && npm run build` � Production Build erzeugt sw.js + manifest - [ ] Docker CouchDB + Backend + Frontend starten, "IPA" suchen ? Brewery-Namen sichtbar - [ ] Bier einchecken ? Success Screen ? Dashboard zeigt Eintrag - [ ] Netzwerk blockieren ? Bier manuell hinzuf�gen ? einchecken ? Netzwerk wiederherstellen ? Eintrag bleibt erhalten ?? Generated with [Claude Code](https://claude.com/claude-code)
## Backend
- Fix beer search: enrich results with brewery names via id-field lookup
  (couchdbService.create always overwrites _id with UUID, so enrichment
  strips the "brewery-" prefix and queries by the `id` field instead)
- Add brewery_id discriminator to beer/brewery Mango selectors so they
  don't bleed across the shared CouchDB collection
- Fix combined search: brewery results no longer include beer documents
- Add /db Vite proxy route → CouchDB Docker (port 5990) for RxDB replication
- Remap Docker CouchDB port to 5990 (5984 blocked by Hyper-V on Windows)

## Frontend
- Screen 3 (Detail → Check-in → Success): full flow working end-to-end;
  success screen now shows before modal closes
- Dashboard: show brewery_name as subtitle fallback when style is absent
- SearchView: pass brewery_name_cached as fallback for persistBeerToLocal
- Offline check-in validated: fetch-blocked sim confirmed RxDB/Dexie
  persists locally; manual beer creation also works offline
- CouchDB sync wiring: replicateCouchDB in db.ts via /db proxy; errors
  are non-fatal (offline-first stays intact)
- Split useDatabase.tsx into DatabaseContext.ts + DatabaseProvider.tsx +
  useDatabase.ts — fixes Vite Fast Refresh "incompatible export" warning
- vite.config.ts: add /db CouchDB proxy; load VITE_COUCHDB_URL from .env

## PWA
- Add pwa-192x192.png, pwa-512x512.png, apple-touch-icon.png,
  mask-icon.svg, favicon.ico (generated via scripts/generate-icons.mjs)
- Production build emits sw.js + workbox bundle; manifest.webmanifest complete

## Tests & Tooling
- Rewrite integration tests with vi.hoisted() mocking — no Docker needed
- Add vitest exclude: ["frontend/**"] to root config (node env, not browser)
- Add .claude/launch.json dev server configurations
- All 62 backend + 7 frontend tests passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This pull request has changes conflicting with the target branch.
  • frontend/src/services/db.ts
  • frontend/vite.config.ts
  • tests/integration/api/breweryController.test.ts
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin claude/eager-meninsky:claude/eager-meninsky
git switch claude/eager-meninsky

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff claude/eager-meninsky
git switch claude/eager-meninsky
git rebase main
git switch main
git merge --ff-only claude/eager-meninsky
git switch claude/eager-meninsky
git rebase main
git switch main
git merge --no-ff claude/eager-meninsky
git switch main
git merge --squash claude/eager-meninsky
git switch main
git merge --ff-only claude/eager-meninsky
git switch main
git merge claude/eager-meninsky
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jan/BrewLog!1
No description provided.