677e5c439b
feat(settings): frontend — api.js helpers for profile, tokens, and instance settings
2026-06-26 17:17:40 +02:00
dabe014e7e
feat(settings): routes — PATCH /api/auth/me, GET|PATCH /api/admin/instance-settings
2026-06-26 17:17:37 +02:00
69af2d2060
feat(settings): db — display_name column, InstanceSettings struct, profile and instance-settings helpers
2026-06-26 17:17:34 +02:00
4d0daf2dc0
chore: update Cargo.lock after collections feature
2026-06-26 17:07:48 +02:00
915878ff10
feat(collections): Track 6 permissions & visibility — collection model, role-bitmask visibility, collection UI
2026-06-26 17:06:18 +02:00
1b91e7ef5e
docs(collections): mark Track 6 done in NEXT.md
2026-06-26 17:05:57 +02:00
cb390dfaab
build(frontend): bundle assets for collections UI
2026-06-26 17:05:22 +02:00
763cb8e17f
feat(collections): frontend — CollectionsView, nav, visibility in ContextRail
2026-06-26 17:04:49 +02:00
dd56fc8c70
test(collections): update tag-search test to send auth (private entries require auth)
2026-06-26 17:01:43 +02:00
24c5321f6e
feat(collections): collection CRUD + entry-visibility routes
2026-06-26 17:00:19 +02:00
02cab149fa
feat(collections): visibility-filtered entry queries + collection helpers
2026-06-26 16:51:48 +02:00
ab054f6256
feat(collections): schema — collections + collection_entries tables
2026-06-26 16:48:22 +02:00
2c3d3eb86e
feat(users): Track 5 user management — admin panel, custom roles, banning
...
Adds admin-only user management API and UI:
- DB: UserSummary, RoleRecord structs; 10 new auth-DB helpers (list_users, create_user,
get_user_by_uid, set_user_status, assign_role, remove_role, list_roles, create_custom_role,
invalidate_user_sessions, get_user_id_by_uid) with 4 tests
- Server: 5 admin routes (/api/admin/users, /api/admin/users/:uid/status,
/api/admin/users/:uid/roles, /api/admin/roles) with 7 handlers + 2 tests
- Frontend: 7 admin API helpers in api.js; AdminView two-tab panel (Users/Roles)
with ban/unban, create user, create custom role forms
- Role bitmask: guest=1, user=2, admin=4, owner=8; custom roles bit>=4
- Ban invalidates all active sessions; only-owner guard prevents last owner removal
169 tests green, frontend builds clean.
2026-06-26 16:24:15 +02:00
b3b0c8ec8d
docs(users): mark Track 5 done in NEXT.md
2026-06-26 16:24:04 +02:00
dcbced3590
Merge branch 'task/user-mgmt-backend'
2026-06-26 16:22:56 +02:00
2335776347
feat(users): admin routes — list/create users, roles, set status
2026-06-26 16:22:08 +02:00
6357cc518e
Merge branch 'task/user-mgmt-frontend'
2026-06-26 16:18:40 +02:00
ffecb72230
Merge branch 'task/user-mgmt-db'
2026-06-26 16:16:50 +02:00
48da356eee
feat(users): user management DB helpers (list_users, create_user, assign_role, custom roles)
2026-06-26 15:03:40 +02:00
2042752177
feat(users): admin user management UI + api helpers
2026-06-26 15:02:50 +02:00
ff3d20ae04
feat(capture): Track 3 async capture jobs — spawn_blocking job queue
...
POST /api/archives/:id/captures now returns 202 Accepted immediately with
{ job_uid, status: "pending" }. The capture runs in a tokio::task::spawn_blocking
thread and updates the job status to running → completed/failed in the archive DB.
Core DB (database.rs):
- capture_jobs table: id, job_uid, archive_id, run_uid, status, error_text, created_at, updated_at
- create_capture_job, update_capture_job_status, get_capture_job, fail_stalled_capture_jobs
Core archive (archive.rs):
- CaptureJobSummary type + get_capture_job query
Server (routes.rs):
- capture_handler: creates job, spawns background capture, returns 202 immediately
- GET /api/archives/:id/capture_jobs/:job_uid: poll job status
- main.rs: on startup, marks any 'running' jobs from previous session as 'failed'
Frontend:
- api.js: submitCapture returns job object; pollCaptureJob added
- CaptureDialog.jsx: polls every 500ms after submit, shows 'Running…' state,
handles completed (close + refresh) and failed (show error), cleans up interval
163 tests green. Frontend builds cleanly.
2026-06-26 12:59:00 +02:00
9f7b3c912a
build(frontend): update bundled assets for async capture polling
2026-06-26 12:59:00 +02:00
116b30e0e9
Merge branch 'task/async-capture-frontend'
2026-06-26 12:58:31 +02:00
5e31a4188c
Merge branch 'task/async-capture-backend'
2026-06-26 12:58:31 +02:00
da2b58ef96
feat(capture): mark stalled running jobs failed on server startup
2026-06-26 12:57:59 +02:00
cfd51778b1
feat(capture): async capture_handler (spawn_blocking) + job poll endpoint
2026-06-26 12:57:44 +02:00
27b37c3b6d
feat(capture): CaptureJobSummary type and archive::get_capture_job
2026-06-26 12:56:38 +02:00
d86a4d92a8
feat(capture): capture_jobs schema and DB helpers
2026-06-26 12:56:10 +02:00
9ac28459ed
feat(capture): async polling in CaptureDialog + pollCaptureJob api helper
2026-06-26 12:54:31 +02:00
f76f5438f2
feat(auth): Track 4 auth foundation — sessions, roles, login, setup wizard
...
Implements the full auth foundation layer across 13 atomic task commits:
Core DB (archivr-core/database.rs):
- initialize_auth_schema: roles, user_roles, sessions, api_tokens, instance_settings
- open_auth_db: dedicated server-level auth SQLite (separate from archive DBs)
- create_owner, compute_role_bits: cumulative role assignment (guest=1 user=2 admin=4 owner=8)
- create_session, get_session, delete_session, touch_session, delete_expired_sessions
- create_api_token, get_user_for_token, list_user_tokens, delete_api_token
Server (archivr-server):
- auth.rs: AuthUser Axum extractor (cookie→session or Bearer→token), Argon2id
password hashing, random token generation, role bit constants
- AppState gains auth_db_path; ServerRegistry gains optional auth_db_path field
- main.rs: auth DB path computed from config dir, session cleanup background task (24h)
- setup_guard middleware: 503 SERVICE_UNAVAILABLE for all non-/api/auth/ routes until
first owner account is created via POST /api/auth/setup
- Auth endpoints: GET|POST /api/auth/setup, POST /api/auth/login, POST /api/auth/logout,
GET /api/auth/me, GET|POST|DELETE /api/auth/tokens
- WRITE routes guarded with ROLE_USER: captures, tag create/assign/remove
Frontend:
- LoginPage.jsx, SetupPage.jsx (new)
- App.jsx: AuthContext, auth state machine (loading→setup→login→authenticated),
setup check on mount, auth:expired event listener
- api.js: checkSetup, doSetup, login, logout, fetchMe, 401 interceptor
- Topbar.jsx: user menu with username and logout button
Docs:
- NEXT.md: Track 4 marked done, Tracks 5-8 stubs added, old tracks renumbered
159 tests green. Frontend builds cleanly.
2026-06-26 12:04:08 +02:00
7cebf06124
chore: update Cargo.lock after frontend build
2026-06-26 12:03:30 +02:00
37fd057c1f
fix(auth): use rfc3339 for session expires_at; update tag tests for auth guards
2026-06-26 12:03:13 +02:00
7671049f55
Merge branch 'task/auth-docs'
2026-06-26 11:59:31 +02:00
8edd17d694
Merge branch 'task/auth-topbar'
2026-06-26 11:59:31 +02:00
a983b6090a
Merge branch 'task/auth-frontend'
2026-06-26 11:59:31 +02:00
59a37a2ce3
Merge branch 'task/auth-session-cleanup'
2026-06-26 11:59:24 +02:00
059196252b
Merge branch 'task/auth-route-protection'
2026-06-26 11:59:24 +02:00
64706cb976
Merge branch 'task/auth-tokens'
2026-06-26 11:59:24 +02:00
6fd5e8881e
Merge branch 'task/auth-endpoints'
2026-06-26 11:59:24 +02:00
c806b0bbaf
Merge branch 'task/auth-extractor'
2026-06-26 11:59:24 +02:00
0a3cde9005
Merge branch 'task/auth-appstate'
2026-06-26 11:59:24 +02:00
98bb5f03b0
Merge branch 'task/auth-session-helpers'
2026-06-26 11:59:18 +02:00
2e2ce4b6ac
Merge branch 'task/auth-user-helpers'
2026-06-26 11:59:18 +02:00
8ed79192eb
Merge branch 'task/auth-schema'
2026-06-26 11:59:18 +02:00
1bbc0a108c
Merge branch 'task/auth-deps'
2026-06-26 11:59:18 +02:00
f9d2ac80e7
feat(auth): session cleanup background task (24h interval)
2026-06-26 11:57:14 +02:00
cb376aa986
feat(auth): apply ROLE_USER guard to WRITE routes (captures, tags)
2026-06-26 11:56:38 +02:00
36c7d575e2
feat(auth): API token endpoints (create, list, delete)
2026-06-26 11:55:05 +02:00
affb8aadc0
feat(auth): login, logout, /me, setup endpoints + setup_guard middleware
2026-06-26 11:53:58 +02:00
db28d038d9
feat(auth): AuthUser extractor, password helpers, token generation
2026-06-26 11:50:29 +02:00