feat(openregister): Deprecate Published Metadata — remove object-level published fields#1161
feat(openregister): Deprecate Published Metadata — remove object-level published fields#1161rubenvdlinde wants to merge 128 commits intodevelopmentfrom
Conversation
Proposals for centralized integration between OpenRegister and Nextcloud surfaces (Files, Mail, Contacts, Calendar, Activity, Workflow, Profile). Changes: - action-registry: Core event-based action registration with APCu caching - files-sidebar-tabs: Entities/Objects/Actions tabs in Files sidebar - file-actions: Right-click context menu actions from consuming apps - mail-sidebar: Entities/Objects/Actions in Mail message detail - mail-smart-picker: Smart Picker reference provider for Mail/Text/Talk - contacts-actions: ContactsMenu integration with entity matching - activity-provider: Centralized activity stream for all consuming apps - calendar-provider: Object dates as calendar events - workflow-operations: Nextcloud Flow automation operations - profile-actions: User profile link actions with entity mapping Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hanges Design docs, detailed specs (GIVEN/WHEN/THEN), and task breakdowns for: - action-registry: 444-line spec, 46 scenarios, 14 tasks - files-sidebar-tabs: 251-line spec, 30+ scenarios, 11 tasks - file-actions: 435-line spec, 50+ scenarios, 88 tasks - mail-sidebar: 442-line spec, 30+ scenarios, 55 tasks - mail-smart-picker: 236-line spec, 24 scenarios, 22 tasks - contacts-actions: 261-line spec, 25+ scenarios, 30 tasks - activity-provider: 265-line spec, 26 scenarios, 42 tasks - calendar-provider: 382-line spec, 35+ scenarios, 15 task groups - workflow-operations: 267-line spec, 33 scenarios, 23 tasks - profile-actions: 343-line spec, 38 scenarios, 29 tasks Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Search result subtitles previously showed raw numeric IDs like "Schema: 498 • Register: 228". Now resolves to human-readable titles like "Client • Pipelinq" using SchemaMapper and RegisterMapper with a per-request name cache to avoid repeated lookups. Closes #975
- tmlo-metadata: TMLO metadata standard support for archival compliance - nextcloud-entity-relations: Nextcloud entity relations integration
Create the openregister_email_links table with EmailLink entity and EmailLinkMapper for linking Nextcloud Mail messages to OpenRegister objects. Includes indexes on message, sender, and object UUID. Closes #1007
Implements findByMessageId, findObjectsBySender, quickLink, and deleteLink methods with register/schema title resolution. Closes #1008
Implements byMessage, bySender, quickLink, and deleteLink endpoints with input validation and proper HTTP status codes. Closes #1009
Adds routes for byMessage, bySender, quickLink, and deleteLink endpoints to support the Mail app sidebar integration. Closes #1010
Creates listener that injects the mail sidebar script when the Mail app renders, with checks for Mail app enabled status and user register access. Closes #1011
Adds separate webpack entry point for the mail sidebar bundle that mounts a Vue component into the Mail app DOM. Closes #1012
Creates mail-sidebar.css using Nextcloud CSS variables for dark theme support and WCAG AA accessible focus indicators. Responsive layout with 320px panel on desktop, overlay on narrow viewports. Closes #1015
…, MailAppScriptListener EmailServiceTest: 7 tests covering findByMessageId, findObjectsBySender, quickLink (success + duplicate), deleteLink, and empty results. EmailsControllerTest: 11 tests covering byMessage, bySender, quickLink, deleteLink with all validation and error paths. MailAppScriptListenerTest: 4 tests covering non-mail events, no user, mail app disabled, and no register access scenarios. Closes #1016
Archives mail-sidebar change artifacts, syncs spec to main specs directory with status=implemented, and creates feature documentation.
…u cache Implements shared service for matching Nextcloud contact metadata (email, name, organization) to OpenRegister entities. Features: - matchByEmail() with confidence 1.0 and APCu caching (TTL 60s) - matchByName() with 0.7 full / 0.4 partial confidence scoring - matchByOrganization() filtered to org-type schemas, confidence 0.5 - matchContact() combining all three with UUID-based deduplication - getRelatedObjectCounts() grouping matches by schema title - Cache invalidation per email and per object Closes #1023, closes #1024
Implements OCP\Contacts\ContactsMenu\IProvider that bridges Nextcloud Contacts with OpenRegister entities. Features: - Extracts email/name/org from contact entries - Matches against OpenRegister entities via ContactMatchingService - Injects count badge (e.g., "3 Zaken, 1 Lead") with highest priority - Adds per-entity "View in OpenRegister" actions with deep link support - Graceful degradation when action registry unavailable - All exceptions caught and logged at warning level Closes #1025
Create migration Version1Date20260325120000 with three new tables: - openregister_email_links (Mail message to object links) - openregister_contact_links (CardDAV contact to object links) - openregister_deck_links (Deck card to object links) Add Entity and Mapper classes for each link type with findByObjectUuid(), deleteByObjectUuid(), and type-specific query methods. Closes #1071
- Register contacts menu provider in appinfo/info.xml via <contactsmenu> element so Nextcloud auto-discovers the provider - Add cache invalidation in ObjectService::saveObject() that calls ContactMatchingService::invalidateCacheForObject() after persistence to bust stale APCu cache entries for email-matched contacts Closes #1026
Implements API endpoint for matching contact metadata against OpenRegister
entities, reusable by mail-sidebar and other consumers. Features:
- GET /api/contacts/match?email={email}&name={name}&organization={org}
- Validates at least email or name is provided (400 otherwise)
- Returns matches enriched with url/icon from deep link registry
- Includes total count and cache hit indicator
- Route added before wildcard routes in routes.php
Closes #1027
…ruction-workflow Creates migration Version1Date20260325120000 with two new tables: - openregister_selection_lists: stores retention rules per category - openregister_destruction_lists: tracks destruction workflow lists Also creates openspec change artifacts (proposal, design, specs, tasks, plan). Closes #1113
Adds the <activity> section declaring Provider, ObjectSetting, RegisterSetting, SchemaSetting, and Filter for Nextcloud auto-discovery. Closes #1107
EmailService manages email-to-object links via openregister_email_links table. Features: link/unlink emails, search by sender, duplicate detection (409), Mail app availability check (501), cached metadata from Mail DB. EmailsController exposes REST endpoints: GET/POST/DELETE /emails, GET /emails/search. Closes #1079
Add optional contactContext parameter to resolveUrl() for contact-specific
placeholder resolution:
- {contactId} - URL-encoded contact vCard UID
- {contactEmail} - URL-encoded contact email
- {contactName} - URL-encoded contact display name
- {entityId} - alias for the matched object UUID
Contact placeholders are resolved after object-level placeholders, allowing
both to coexist in the same URL template. Fully backward compatible.
Closes #1028
SelectionList maps classification categories to retention periods and archival actions (vernietigen/bewaren) per Dutch selectielijst standards. Mapper includes findByCategory(), findByUuid(), and findAll() methods. Closes #1114
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (147 total)
npm dependencies (586 total)
PHPUnit TestsPHPUnit tests were not enabled for this run. Integration Tests (Newman)Newman integration tests were not enabled for this run. E2E Tests (Playwright)Playwright E2E tests were not enabled for this run. Generated automatically by the Quality workflow.
|
…metadata' into spec
…to spec # Conflicts: # appinfo/info.xml # l10n/en.json # l10n/nl.json # lib/Service/ObjectService.php
…spec # Conflicts: # lib/AppInfo/Application.php # webpack.config.js
…lations' into spec # Conflicts: # lib/Controller/ContactsController.php # lib/Controller/EmailsController.php # lib/Db/EmailLink.php # lib/Db/EmailLinkMapper.php # lib/Migration/Version1Date20260325120000.php # lib/Service/EmailService.php # tests/Unit/Service/EmailServiceTest.php
…-workflow' into spec # Conflicts: # appinfo/routes.php # lib/Migration/Version1Date20260325120000.php # openspec/changes/archival-destruction-workflow/.openspec.yaml
# Conflicts: # lib/Migration/Version1Date20260325120000.php
… into spec # Conflicts: # appinfo/routes.php # l10n/en.js # l10n/en.json # l10n/nl.js # l10n/nl.json # lib/AppInfo/Application.php # webpack.config.js
…spec # Conflicts: # lib/Migration/Version1Date20260325000000.php
The audit trail endpoint was returning entries for wrong objects because: 1. LogService filtered by numeric `object` ID which could mismatch across magic tables 2. AuditTrailMapper's filter whitelist didn't include `object_uuid` Changed to filter by `object_uuid` (the UUID column on AuditTrail entity) and added `object_uuid` to the mapper's allowed filter/sort columns.
…acts-actions, entity-relations - Add email routes (by-message, by-sender, quick-link, deleteLink) lost in merge - Add match() + enrichMatches() to ContactsController (from contacts-actions branch) - Add byMessage/bySender/quickLink/deleteLink to EmailsController (from mail-sidebar) - Add ContactMatchingService, DeepLinkRegistryService, IL10N, Logger deps to ContactsController - Add IUserSession, Logger deps to EmailsController - Fix EmailLink entity: rename 'date' property to 'mailDate' to match DB column 'mail_date' - Fix EmailLinkMapper: use 'mail_date' column in ORDER BY clauses - Fix FileSidebarService: use getInner()->createSchemaManager() for NC32 compatibility All 14 new API endpoints now return 200 with valid JSON.
Cherry-pick from feat/sidebar-backend-apis: - Object-level tag API (GET/POST/DELETE) - Note update endpoint + setVerb fix - Task calendar auto-creation - Audit trail sort bracket notation support
…utes from remediation Feature documentation (13 new docs in docs/features/): - action-registry, activity-provider, archival-destruction, calendar-provider - contacts-integration, deprecate-published-metadata, entity-relations - file-actions, files-sidebar, mail-integration, profile-actions - tmlo-metadata, workflow-operations Screenshots (6): Calendar, Activity, Mail, Contacts, OpenRegister dashboard, Action registry Route fixes (merge conflict recovery): - Add 10 file-action routes (rename, copy, move, versions, lock, batch, preview, labels) - Add 15 entity-relation routes (calendar events, contacts CRUD, deck, unified relations) - Add 12 workflow-operation routes (executions, scheduled workflows, approval chains/steps) - Total routes: 443 + 9 resources Known issues documented: - Calendar Provider: registerCalendarProvider() missing in Application.php - Activity Provider: <activity> section missing in info.xml - TmloController: slug-to-int cast bug (uses find((int)) instead of slug resolver) - Profile endpoints: blocked by OpenConnector autoload issue (external dep)
…ranch 1. Calendar Provider: register CalendarProvider in Application.php 2. Activity Provider: add <activity> section to info.xml (provider, 3 settings, filter) + register ActivityEventListener for 9 entity events in Application.php 3. Reference Provider: register ObjectReferenceProvider in Application.php 4. TmloController: remove (int) cast on register/schema params — mappers already accept string|int for slug/UUID/ID resolution 5. UserService DI: add avatarManager, auditTrailMapper, secureRandom (profile-actions constructor params missing from Application.php) 6. Routes: add Actions resource + 4 custom routes, contacts/match, 12 archival routes (selection-lists CRUD, retention, destruction-lists) All 18 new API endpoints verified returning 200.
…precate-published-metadata # Conflicts: # package.json
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (147 total)
npm dependencies (595 total)
PHPUnit TestsPHPUnit tests were not enabled for this run. Integration Tests (Newman)Newman integration tests were not enabled for this run. E2E Tests (Playwright)Playwright E2E tests were not enabled for this run. Generated automatically by the Quality workflow.
|
- Auto-fix 1207 PHPCS violations via PHPCBF (formatting, spacing, etc.) - Add named parameters to all internal method calls (custom sniff) - Add missing short descriptions to @var and @method docblocks - Fix implicit true comparisons (use explicit === true/false) - Fix line length violations by extracting helpers and breaking strings - Fix ESLint: reserved component name Circle→CircleIcon, unused params - Add @nextcloud/vue-richtext dependency for reference widget - Add .gitignore entry for docs/node_modules/
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (147 total)
PHPUnit Tests
Integration Tests (Newman)
E2E Tests (Playwright)
Generated automatically by the Quality workflow.
|
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (147 total)
PHPUnit TestsPHPUnit tests were not enabled for this run. Integration Tests (Newman)Newman integration tests were not enabled for this run. E2E Tests (Playwright)Playwright E2E tests were not enabled for this run. Generated automatically by the Quality workflow.
|
Quality Report
Summary
PHP Quality
Vue Quality
Security
License Compliance
composer dependencies (147 total)
npm dependencies (595 total)
PHPUnit TestsPHPUnit tests were not enabled for this run. Integration Tests (Newman)Newman integration tests were not enabled for this run. E2E Tests (Playwright)Playwright E2E tests were not enabled for this run. Generated automatically by the Quality workflow.
|
OpenSpec Change: deprecate-published-metadata
Closes #910