- Public feed (/) with infinite scroll via Intersection Observer
- Self-registration (/register)
- Admin area (/admin/entries, /admin/users) with user management
- journal_entries: visibility (public/private) + hashtags fields
- users: is_admin flag
- DB schema updated (recreate DB to apply)
- CI: run go test via docker run (golang:1.25-alpine) — fixes 'go not found'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduce store interfaces (TrackpointStorer, StopStorer, SuggestionStorer)
in internal/db/interfaces.go so handlers can be tested without a real DB.
- Refactor HandleSingleTrackpoint, HandleBatchTrackpoints, HandleListDays,
HandleListTrackpoints, HandleListStops, HandleListSuggestions to accept
the new interfaces instead of concrete *db.*Store pointers (no behaviour
change; concrete types satisfy the interfaces implicitly).
- internal/api/ingest_test.go: 13 handler tests covering happy path,
invalid JSON, invalid timestamp, missing event_id/device_id, out-of-range
lat/lon, empty/oversized batch, store errors, and idempotency (single + batch).
- internal/api/query_test.go: 14 handler tests covering missing query params
(400) and empty-result-is-array guarantees for all four query endpoints.
- internal/auth/auth_test.go: 5 unit tests for HashPassword / VerifyPassword
(correct password, wrong password, empty password, malformed hash, salt
uniqueness).
- internal/db/trackpoints_test.go: 6 unit tests for the validateTrackpoint
helper (happy path, missing fields, coordinate bounds, invalid source).
- .gitea/workflows/deploy.yml: add "Test" step (go test ./...) before
"Build & Deploy" so a failing test aborts the deployment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Secure: true requires HTTPS — cookie was not sent back on HTTP requests,
breaking the session after login.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove submodule tracking; backend is now a plain directory in the repo.
Also update deploy workflow: remove --recurse-submodules.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add root Dockerfile: node build → copy dist into Go embed path → distroless binary
- Update docker-compose: one service (api on :9050), DB renamed ralph→pamietnik
- Remove references to RALPH/reisejournal across all docs and configs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>