9dd283ced6
refactor(acadedoc): rename API routes /api/acadenice -> /api/v1 — R5.1
...
Replace all @Controller('acadenice/...') decorators with 'v1/...' on 16 NestJS controllers. Update all client services, hooks, tests, extension-clipper, and doc comments to match. DB table names (acadenice_*) and folder structure untouched.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 14:52:49 +02:00
5b512e6324
feat(acadedoc): replace EE Settings with open source UI (audit log, API keys, OIDC status) — R4.5
...
Server (NestJS):
- AcadeniceAuditLogModule: GET /api/acadenice/audit-log (admin/owner, Kysely, paginated + filtered)
- AcadeniceApiKeysModule: GET/POST/DELETE /api/acadenice/api-keys (JWT, bcrypt hash, acdk_ prefix)
- AcadeniceSecurityModule: GET /api/acadenice/security/oidc-status (admin, no secrets exposed)
- Migration 20260510T100000: acadenice_api_key table with token_hash + bcrypt
- Permissions catalog: added audit_log:read
Client (React 18 + Mantine v7):
- Audit log page: paginated table with filters (event, userId, date range)
- API keys page: list/create/revoke personal tokens, one-time display modal
- Security/OIDC status page: read-only, env-var config reference
- Sidebar rewired: Security & SSO, API keys, Audit log -> acadenice/* routes (no EE feature gates)
- Prefetch functions for new routes
Tests: 36 server (Jest) + client typecheck clean
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 12:24:00 +02:00
23a85267bf
feat(acadenice): add sync blocks for cross-page content sharing — R4.2
...
Implements Notion-style sync blocks: a Tiptap node whose content is shared
across N pages. Editing via the Hocuspocus overlay propagates to all instances
via Yjs collab + SSE broadcast (EventEmitter2 bus).
Server: DB migration, NestJS module (CRUD + BFS cycle detection + broadcast),
Hocuspocus persistence extension extended for sync-block-* docs, 3 new RBAC
permissions (sync_blocks:create/edit/delete), seeded to Admin/Editor/Member.
Client: SyncBlockExtension (Tiptap node), SyncBlockNodeView (NodeView +
Mantine Modal overlay + SSE hook), /sync-block slash command, service client.
Tests: 32 server Jest + 18 client Vitest, all green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 11:40:12 +02:00
b53ab5043f
feat(acadedoc): add AcadeDoc branding, Brevo SMTP preset, UI customization — R4.4
...
- Rebranding: BRAND_NAME env var (default AcadeDoc) replaces hardcoded "DocAdenice"
in index.html title/meta, PWA manifest, app-header logo text, email footer/body
- lib/config.ts: getAppName() reads BRAND_NAME; new getBrandLogoUrl/PrimaryColor/AccentColor helpers
- vite.config.ts: BRAND_* vars exposed via define block to client
- brand-theme.ts: getBrandTheme() generates 10-shade MantineColorsTuple from hex
(no @mantine/colors-generator dep); merged into MantineProvider at boot
- theme/__tests__/brand-theme.test.ts: 11 vitest tests (generateColorTuple + getBrandTheme)
- Workspace branding: migration adds primary_color/accent_color to workspaces table
WorkspaceBrandingService + WorkspaceBrandingController (POST /workspace/branding,
POST /workspace/branding/update — admin only) + DTO hex validation
- Settings: /settings/branding page (WorkspaceBranding) + sidebar entry (admin-only)
- workspace-branding.spec.ts: 13 vitest tests (service + controller + DTO validation)
- SMTP Brevo: .env.example preset block + transactional/README.md ops guide
(key gen, port 587 STARTTLS, 300/day free limit, swaks/curl test)
- environment.service.ts: getMailFromName() falls back to BRAND_NAME if MAIL_FROM_NAME unset
- vitest.config.ts server: include pattern extended to src/core/workspace/spec/**
- i18n: 11 branding keys added to en-US and fr-FR translations
- 0 TypeScript errors client + server, 11 client + 13 server new tests all green
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 11:36:38 +02:00
4cf04080cf
fix(acadenice): resolve test suite failures across R3 sub-blocks (Patch 017)
...
- Convert 17 server spec files from vitest to Jest (vi -> jest globals)
- Add jest.mock stubs for ESM-only prosemirror/html and collaboration modules
- Fix Zod v4 strict UUID validation failures in test fixtures (version byte [1-8] required)
- Add JwtAuthGuard.overrideGuard in all controller specs that lacked it
- Fix jest.Mock type inference (ReturnType<typeof jest.fn> -> jest.Mock) to prevent 'never' arg errors
- Delete vitest.config.ts (CJS), keep vitest.config.mts (ESM-compatible) on client
- Add global mocks for @excalidraw/excalidraw and @/main.tsx in client test-setup
- Result: client 38/38 suites 313/313 tests, server acadenice 21/21 suites 210/210 tests, 0 TS errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 10:36:19 +02:00
be951a22ac
feat(acadenice): add inline comments threads for R3.8 (30 tests, Patch 016)
...
Page comments: REST resolve/unresolve facade over native comments table
(PageCommentResolveService + CollaborationGateway yjs mark sync).
Row comments: new acadenice_row_comment table + full CRUD + resolve
(RowCommentService, RowCommentsController) + React panel in RowDetailModal.
4 new permissions: comments:read/write/resolve/moderate (30 total).
i18n FR+EN. R3 ENTIEREMENT TERMINE.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 02:47:15 +02:00
614533f228
feat(acadenice): add page templates system for R3.6 (65 tests, Patch 014)
...
- DB migration: acadenice_template table (JSONB content, is_built_in, is_workspace_default, usage_count)
- 3 new permissions: templates:read|create|manage — catalogue goes to 26
- NestJS AcadeniceTemplatesModule: TemplateService (CRUD + instantiate + setDefault), TemplateSeedService (5 built-ins), TemplatesController (7 endpoints)
- Built-in seed: Meeting Note, Project Brief, Daily Standup, Weekly Review, Empty Page — clone-then-edit pattern
- Frontend: templates-admin gallery (TemplatesPage /settings/templates, TemplateGallery, TemplateCard, TemplateForm)
- Frontend: TemplatePickerModal — opened via "New page from template" sidebar dropdown + /template slash command (custom DOM event)
- i18n: 39 keys FR + EN
- Tests: 40 backend (22 service + 18 controller) + 25 frontend (9 client + 9 page + 7 card) = 65 tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 02:12:58 +02:00
4e2af88144
feat(acadenice): add custom slash commands system for R3.3
...
Workspace admins can declare dynamic /keyword commands via settings UI
without recompile. Five action types: insert-template, insert-table,
embed-url, run-webhook, insert-snippet. Webhook security: HTTPS-only,
ACADENICE_WEBHOOK_ALLOWLIST allowlist, 10s timeout, no redirects, 1MB cap.
New permission slash_commands:manage added to catalogue (23 perms) and
seeded to Owner + Admin roles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 01:06:11 +02:00
2fc310a2f2
feat(acadenice): add bidirectional backlinks + wikilinks for R3.2
...
- Migration: acadenice_backlink table (source/target/link_type/excerpt/workspace)
with 3 indexes and UNIQUE(source,target,type) constraint. Up+down.
- Backend module AcadeniceBacklinksModule:
BacklinkParserService: walks Tiptap JSON, extracts wikilinks/mentions/databaseView.
BacklinkIndexerService: idempotent delete-then-insert per page save.
BacklinkService: permission-aware query (space_members / public visibility).
BacklinksController: GET /api/acadenice/pages/:pageId/backlinks (JWT auth).
PageContentUpdatedListener: OnEvent handler for collab saves -> async reindex.
Tests: 16 Vitest specs (parser/indexer/service/controller).
- PersistenceExtension patch: emits ACADENICE_PAGE_CONTENT_UPDATED_EVENT after
each collab onStoreDocument (fire-and-forget, no impact on save path).
- CoreModule patch: imports AcadeniceBacklinksModule.
- Frontend WikilinkExtension: Tiptap inline atom node, [[Title]] / [[Title|alias]],
Suggestion popup (reuses mention pattern + floating-ui), ReactNodeView with
broken-link state, insertWikilink command.
Tests: 9 Vitest specs (schema/attrs/commands/HTML parse+render).
- LinkedReferencesPanel: React Query useBacklinks(pageId, staleTime=30s),
accordion grouped by link_type, excerpt preview, navigate to source page.
Tests: 7 Vitest specs (loading/error/empty/render/navigate/groups).
- extensions.ts patch: + WikilinkExtension in mainExtensions[].
- full-editor.tsx patch: + LinkedReferencesPanel below editor (Divider + panel).
- i18n: 11 keys added in en-US and fr-FR (backlinks.* + wikilink.*).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 00:51:02 +02:00
bcd861126f
feat(rbac): R2.1 backend RBAC dynamique multi-roles avec catalogue + 5 roles seed + JWT enrichi
2026-05-07 22:26:21 +02:00
Philip Okugbe
641ce142df
feat(ee): SCIM ( #1347 )
...
* SCIM - init (EE)
* accept db transaction
* sync
* Content parser support for scim+json
* patch scimmy
* sync
* return early if userIds is empty
* sync
* SCIM db table
* fixes
* scim tokens
* backfill
* feat(audit): add scim token events
* rename scim migration
* fix
* fix translation
* cleanup
2026-05-01 14:53:30 +01:00
Philip Okugbe
a6a7e4370a
feat(ee): PDF export api ( #2112 )
...
* feat(ee): server side PDF export
* feat: pdf export queue
* sync
* sync
2026-04-14 16:26:54 +01:00
Philip Okugbe
cc00e77dfb
fix: space overview favorites ( #2110 )
2026-04-14 02:58:24 +01:00
Philip Okugbe
4056bd0104
feat: enhancements ( #2107 )
...
* refactor
* fix
* update packages
2026-04-13 23:34:40 +01:00
Philip Okugbe
bd68e47e03
feat(ee): page verification workflow ( #2102 )
...
* feat: page verification workflow
* feat: refactor page-verification
* sync
* fix type
* fix
* fix
* notification icon
* use full word
* accept .license file
* - update templates
- update migration and notification
* fix copy
* update audit labels
* sync
* add space name
2026-04-13 20:20:34 +01:00
Philip Okugbe
d42091ccb1
feat: favorites ( #2103 )
...
* feat: favorites and templates(ee)
* rename migrations
* fix sidebar
* cleanup tabs
* fix
* turn off templates
* cleanup
* uuid validation
2026-04-12 22:06:25 +01:00
Philip Okugbe
57efb91bd3
feat(ee): ai chat ( #2098 )
...
* feat: ai chat
* feat: ai chat
* sync
* cleanup
* view space button
2026-04-10 19:23:47 +01:00
Philip Okugbe
da9b43681e
feat: watch space ( #2096 )
2026-04-09 00:37:51 +01:00
Philip Okugbe
879aa2c3d8
feat: page update notifications ( #2074 )
...
* feat: watchers notification and email preferences
* fix: email copy
* digests
* clean up
* fix
* clean up
* move backlinks queue-up to history processor
* fix
* fix keys
* feat: group notifications
* filter
* adjust email digest window
2026-03-31 16:03:59 +01:00
Philip Okugbe
cbd0dd4a0b
feat: indexes ( #2071 )
2026-03-29 20:29:12 +01:00
Philip Okugbe
3829b6cbef
feat(ee): viewer comments ( #2060 )
2026-03-28 19:32:52 +00:00
Philip Okugbe
803f1f0b81
feat: user session management ( #2056 )
...
* user session management
* WIP
* cleanup
* license
* cleanup
* don't cache index
* rename current device property
* fix
2026-03-26 20:00:04 +00:00
Philipinho
90c190df78
fix: space members view enhancement
2026-03-02 21:33:15 +00:00
Philipinho
17ec2f4ac5
lists sorting
2026-03-02 21:07:47 +00:00
Philipinho
616d9297eb
sync
2026-03-02 04:08:59 +00:00
Philip Okugbe
2309d1434b
feat: support cross-space page mentions ( #1979 )
2026-03-01 17:14:10 +00:00
Philip Okugbe
69d7532c6c
feat(ee): audit logs ( #1977 )
...
feat: clickhouse driver
* sync
* updates
2026-03-01 01:29:03 +00:00
Philip Okugbe
59e945562d
feat(ee): page-level access/permissions ( #1971 )
...
* Add page_hierarchy table
* feat(ee): page-level permissions
* pagination
* rename migration
fixes
* fix
* tabs
* fix theme
* cleanup
* sync
* page permissions notification
* other fixes
* sharing disbled
* fix column nodes
* toggle error handling
2026-02-26 19:49:10 +00:00
Philipinho
873c963043
fix db types duplication
2026-02-19 22:34:07 +00:00
Philip Okugbe
05b3c65b0f
feat: notifications ( #1947 )
...
* feat: notifications
* feat: watchers
* improvements
* handle page move for watchers
* make watchers non-blocking
* more
2026-02-14 20:00:38 -08:00
Philipinho
ab7999a946
v0.25.3
2026-02-09 18:27:55 -08:00
Philip Okugbe
0f02261ee6
feat: page version history improvements ( #1925 )
...
* Refactor: use queue for page history
* feat: save multiple version contributors
* display contributor avatars in history list
* fix interval
2026-02-09 18:25:35 -08:00
Philip Okugbe
1ad53c2581
feat(ee): public sharing controls ( #1910 )
...
* feat(ee): public sharing controls
* lint
2026-02-06 10:35:36 -08:00
Philip Okugbe
5506eb194b
feat: page history diff ( #1891 )
...
* Show actual history changes
* V2 - WIP
* feat: page history diff
* fix: exclude content from history listing
---------
Co-authored-by: Jason Norwood-Young <jason@10layer.com>
2026-02-03 11:55:20 -08:00
Philip Okugbe
78b1c1a453
feat: switch to cursor pagination ( #1884 )
...
* add cursor pagination function
* support custom order modifier
* refactor returned object
* feat(db): migrate paginated endpoints to cursor-based pagination
* sync
* support hasPrevPage boolean
* feat(client): migrate pagination from offset to cursor-based
* support beforeCursor/prevCursor
* wrap search results in items array for API consistency
2026-01-30 19:28:54 +00:00
Philipinho
3523600f40
add timestamps
2026-01-27 16:49:22 +00:00
Philip Okugbe
aa143ad79c
refactor(db): migrate from node-postgres to postgres.js ( #1846 )
...
* refactor(db): migrate from node-postgres to postgres.js
* ignore schema param
2026-01-21 18:12:16 +00:00
Philip Okugbe
47097969a0
fix: use subquery ( #1833 )
...
- enhance file tasks list endpoint
2026-01-13 15:58:26 +00:00
Philip Okugbe
9fb16bc842
feat(EE): AI vector search ( #1691 )
...
* WIP
* AI module - init
* WIP
* sync
* WIP
* refactor naming
* new columns
* sync
* sync
* fix search bug
* stream response
* WIP
* feat embeddings sync
* refine
* Add workspaceId to page events
* refine
* WIP
* add translation string
* sync
* reset ai answer on query change
* hide AI search in cloud
* capture streaming error
* sync
2025-12-01 11:50:25 +00:00
Philip Okugbe
3164b6981c
feat: api keys management (EE) ( #1665 )
...
* feat: api keys (EE)
* improvements
* fix table
* fix route
* remove token suffix
* api settings
* Fix
* fix
* fix
* fix
2025-10-07 21:05:13 +01:00
Philip Okugbe
bf8cf6254f
feat: Typesense search driver (EE) ( #1664 )
...
* feat: typesense driver (EE) - WIP
* feat: typesense driver (EE) - WIP
* feat: typesense
* sync
* fix
2025-10-07 17:34:32 +01:00
Philip Okugbe
f12866cf42
feat(EE): full-text search in attachments ( #1502 )
...
* feat(EE): fulltext search in attachments
* feat: global search
- search filters
- attachments search ui
- and more
* fix import
* fix import
* rename migration
* add GIN index
* fix table name
* sanitize
2025-09-02 05:27:01 +01:00
Philip Okugbe
dcbb65d799
feat(EE): LDAP integration ( #1515 )
...
* LDAP - WIP
* WIP
* add hasGeneratedPassword
* fix jotai atom
* - don't require password confirmation for MFA is user has auto generated password (LDAP)
- cleanups
* fix
* reorder
* update migration
* update default
* fix type error
2025-09-02 04:59:01 +01:00
Philip Okugbe
74cd890bdd
feat(EE): implement SSO group sync for SAML and OIDC ( #1452 )
...
* feat: implement SSO group synchronization for SAML and OIDC
- Add group_sync column to auth_providers table
- Extract groups from SAML attributes (memberOf, groups, roles)
- Extract groups from OIDC claims (groups, roles)
- Implement case-insensitive group matching with auto-creation
- Sync user groups on each SSO login
- Ensure only one provider can have group sync enabled at a time
- Add group sync toggle to SAML and OIDC configuration forms
* rename column
2025-08-31 20:33:37 +01:00
Philipinho
509622af54
ignore type error
2025-08-31 12:20:40 -07:00
Philip Okugbe
aa58e272d6
fix: exclude deleted pages ( #1494 )
2025-08-31 09:11:33 +01:00
Philip Okugbe
1cb2535de3
fix trash in search ( #1439 )
...
- delete share if page is trashed
2025-08-02 00:14:00 +01:00
Philipinho
ec0ed5c630
fix import
2025-07-29 14:50:59 -07:00
Philipinho
77b334ea37
reorder migration
2025-07-29 14:49:19 -07:00
Philip Okugbe
5da92a538a
feat: add unaccent support for accent-insensitive search ( #1402 )
...
- Add PostgreSQL unaccent and pg_trgm extensions
- Create immutable f_unaccent wrapper function for performance
- Update all search queries to use f_unaccent for accent-insensitive matching
- Add 1MB limit to tsvector content to prevent errors on large documents
- Update full-text search trigger to use f_unaccent
- Fix MultiSelect client-side filtering to show server results properly
2025-07-29 22:47:13 +01:00