Commit graph

23 commits

Author SHA1 Message Date
6e5009b57f Expand cashup caps: history, cash_summary, safe_count
Splits the old 'reports' cap into reports + cash_summary,
'floats' into floats + safe_count, and adds a new 'history' cap.
Existing installs get the three new caps added to the Staff role
via an additive per-cap seed so admin-managed configs are unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 14:36:06 +00:00
b5d494a691 Seed hk-planner capabilities: planner + settings
Staff role gets planner by default; settings is admin/explicit-grant only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 14:29:58 +00:00
c7f7079b99 Add per-app granular capabilities (RBAC beyond app access)
Schema:
- app_capabilities: capabilities each app exposes (<app>:<slug>)
- role_capabilities / user_capabilities: grants via roles and direct
- Seed cashup caps (count, finalise, reports, floats, settings)
- Non-breaking migration: default Staff role gets all cashup caps
  except settings (previously only is_admin reached settings)

Resolution:
- getUserCapabilities(): admins get all; others get union of
  role + direct grants, as "<app>:<cap>" strings
- caps[] added to JWT payload (login + register)
- /verify returns live capabilities for the requested app (bare slugs)

Admin API:
- GET /admin/capabilities catalogue
- grant/revoke capability on roles and users
- roles/users GET responses now include their capabilities

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:19:08 +00:00
fdbc4df29c Seed hk-planner app (10.10.10.118)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 13:59:02 +00:00
1ae1019ea5 Workforce OAuth: try platform scope for full access
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 01:11:27 +00:00
1c16f0ae9b Workforce OAuth: remove scope restriction to get all permitted scopes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 01:08:31 +00:00
31213a3523 Fix Workforce pagination: use page_size param (not per_page)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 01:05:11 +00:00
1bab3d273f Workforce OAuth: use department scope for departments endpoint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 01:03:12 +00:00
875835bb7c Use me+department scopes and improve OAuth error messages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:57:01 +00:00
f3dcfa37c6 Request department and staff scopes for Workforce OAuth token
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:55:17 +00:00
da657ab6c7 Log Workforce departments error to aid debugging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:53:53 +00:00
6742204546 Remove OAuth scope restriction and improve API error messages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:41:37 +00:00
1eba56345f Fix Workforce OAuth: use form-encoded body and correct scope
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:35:55 +00:00
42be29b2ce Add SETTINGS_URL/SECRET to compose, fix sync email-change and rate-limit bugs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:23:59 +00:00
f08d53d702 Add internal registry endpoint, self-registration, and workforce sync
- Register internalRoutes at /api/auth/internal (used by management)
- Add registerRoutes for staff self-registration flow
- Add workforce sync job (runs on schedule, fails gracefully if unconfigured)
- Add email.js for registration/invite emails

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 20:35:44 +00:00
2d89fd9227 Fix cashup app seed: correct host to 10.10.10.117 and port to 3083
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 20:23:06 +00:00
7fd1ed8381 Add app category grouping support
Add category column to apps table with migration, update seed with category
values for existing apps, and include category in auth queries ordered by
category then name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 18:26:01 +00:00
a0edbec92b Switch app icons to Lucide names, update existing rows on conflict
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 18:09:55 +00:00
cd21697af3 Admins implicitly see all active apps (fixes empty portal for admin)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 14:59:51 +00:00
b7589b702a Cookie: Secure only over HTTPS (works on LAN HTTP); healthcheck 127.0.0.1 2026-07-01 14:42:28 +00:00
e194e736d0 Docker-in-LXC: security_opt apparmor=unconfined 2026-07-01 13:28:50 +00:00
4dfdb7c3e7 ip-check: add 'auto' self public-IP mode + matcher list 2026-07-01 12:57:57 +00:00
372e71c8f5 Initial commit: auth 2026-07-01 12:09:54 +00:00