0e4bc7b444
PocketID OIDC already auto-provisioned users keyed by pocketid_sub, and the data layer was already fully user-scoped. This adds the missing pieces for running real multi-user: - auth.py callback: link by email to an existing un-linked account (so the admin keeps their data when first signing in by passkey), collision-safe username generation, and request the `groups` scope. - Group gating: optional pocketid_allowed_group (admin-config or POCKETID_ALLOWED_GROUP env); users lacking the group are rejected at the callback and redirected to /login?auth_error=not_authorized. - New admin users API (app/api/users.py): list users, promote/demote admin (guards against demoting/locking out the last admin or yourself), and delete a user with ordered bulk deletes of all their data + on-disk files. - ProfilePage: allowed-group field; LoginPage: rejected-login message; Layout: admin-only Users nav; new UsersPage. Resync milevault_export to current source (it had drifted many features behind — missing garmin_sync, npm-ci Dockerfile and @polyline-codec that broke its own CI) and add POCKETID_ALLOWED_GROUP to .env.example. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 lines
729 B
JSON
32 lines
729 B
JSON
{
|
|
"name": "milevault-frontend",
|
|
"version": "1.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "vite build",
|
|
"preview": "vite preview"
|
|
},
|
|
"dependencies": {
|
|
"react": "^18.3.1",
|
|
"react-dom": "^18.3.1",
|
|
"react-router-dom": "^6.23.1",
|
|
"leaflet": "^1.9.4",
|
|
"react-leaflet": "^4.2.1",
|
|
"recharts": "^2.12.7",
|
|
"date-fns": "^3.6.0",
|
|
"clsx": "^2.1.1",
|
|
"zustand": "^4.5.2",
|
|
"@tanstack/react-query": "^5.40.0",
|
|
"axios": "^1.7.2",
|
|
"react-dropzone": "^14.2.3"
|
|
},
|
|
"devDependencies": {
|
|
"@vitejs/plugin-react": "^4.3.1",
|
|
"vite": "^5.2.13",
|
|
"autoprefixer": "^10.4.19",
|
|
"postcss": "^8.4.38",
|
|
"tailwindcss": "^3.4.4"
|
|
}
|
|
} |