Commit Graph

10 Commits

Author SHA1 Message Date
marc 2db050cc09 feat(search): global spotlight search across all records, pages and actions
Postgres-native global search (tsvector + pg_trgm, no external service) with a
config-driven index so any table self-registers. Per-row visibility via morbac
RLS. New reusable @crudy/search package for the spotlight UI; core wires it into
the bar (Ctrl/Cmd K) with no hardcoded command list.

Backend
- 0008_search.sql: app.search_index + GIN indexes, app.searchable_sources
  registry, generic trigger, app.search_register/reindex_source helpers, the
  app.search(q,limit) RPC (websearch_to_tsquery, word_similarity, RLS), grants.
- BackendModule.searchables: modules declare searchable tables; registered at
  boot in syncModules with identifier validation.
- /search data route; org/role reindex via new RoleEventSink + search-reindex.
- Core entities registered: users, orgs, roles, service connectors, emails.

Frontend
- @crudy/search: presentational Spotlight (dialog, hotkey, grouped results,
  real anchor links, in-modal shortcut hints).
- command-registry is pure logic; pages/actions derive from core-routes,
  the settings tab registry, and module navItems/settingsTabs/crudModels/commands.
- CrudModelDef yields page + create action; generic FrontendModule.commands for
  any developer action. Floating-sidebar top-right items render separately.

Modules: dashboard, license-admin (customers, plans), email-templates,
service-connectors register their searchables and CRUD models.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 20:49:50 +02:00
marc 3bdb396ba2 feat(api-keys): reusable key-creation modal for profile and service accounts
- Extract the profile API-key UI into a shared ApiKeysManager component
  (modal create form, full/readonly toggle, and detailed permission-scope
  picker). Profile and the service-account detail page both use it, so the
  two interfaces stay consistent and the code isn't duplicated.
- Add GET /users/:id/permission-options (service accounts), mirroring
  GET /me/permissions, so the scope picker shows exactly the pairs the
  account holds; the same query caps the key server-side.
- Service and system accounts never receive notifications: recipient
  resolution now targets account_type='user' across explicit, org-wide,
  and org-scoped paths (also fixes a stale 'human' literal that matched
  nothing).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 01:51:23 +02:00
marc 851dd389d7 feat(accounts): service-account management, generated passwords, perms-view fixes
Permissions view
- Restore the System Accounts listing path and audit related tabs.
- Lock the framework system_users deny rules (is_system_managed) and
  system-principal global rules; show them read-only.

System vs service accounts
- Only account_type='system' is immutable. service-bot is no longer a
  system principal; ensureInternalAccounts repairs existing rows.
- GET /users now surfaces system/service accounts (gated by
  read/system_users, read/service_users) and Type is the first column.

Service accounts
- UI to create/edit/delete service accounts (API-only, no login).
- Admin API-key management: GET/POST/DELETE /users/:id/keys, restricted
  to service accounts, scope-capped to the account's own permissions,
  with a key-management card on the user detail page.

Password policy
- Admins never set passwords. Creating a user account auto-generates a
  strong password (shown once) and forces a change on first login;
  admin "Reset password" does the same.
- Forced change flow: login returns password_change_required +
  challenge token; POST /auth/change-password validates strength,
  clears the flag, issues the session. Enforced after password and MFA.
- Strength: length 12-128, reject common passwords and email/name.

UI
- Lock indicators in action columns use a shared LockBtn (tooltip,
  aligned with other action buttons).
- Account-type selection in create is a segmented button selector.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 08:52:39 +02:00
marc 8200c4650f refacto: cleanup 2026-06-06 16:00:42 +02:00
marc 8ff6bf2d0e refacto: cleanup 2026-06-06 10:35:40 +02:00
marc dfe8c8c322 feat(mappings): rework interface 2026-06-03 19:54:20 +02:00
marc 2b389ac66b feat(modules): add service connectors and cleanup settings 2026-05-17 18:35:41 +02:00
marc 4607fd1e0a feat(tests): ensure all tests pass 2026-05-07 21:49:25 +02:00
marc 941093b2cf feat(core): add webhooks 2026-05-03 18:19:39 +02:00
marc 9c87cff4a2 feat(packages): add pgmorbac package 2026-04-29 07:49:11 +02:00