Skip to content

feat(openregister): Deprecate Published Metadata — remove object-level published fields#1161

Open
rubenvdlinde wants to merge 128 commits intodevelopmentfrom
feature/910/deprecate-published-metadata
Open

feat(openregister): Deprecate Published Metadata — remove object-level published fields#1161
rubenvdlinde wants to merge 128 commits intodevelopmentfrom
feature/910/deprecate-published-metadata

Conversation

@rubenvdlinde
Copy link
Contributor

OpenSpec Change: deprecate-published-metadata

Closes #910

rubenvdlinde and others added 30 commits March 24, 2026 06:47
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 MailSidebar root component, LinkedObjectsList,
SuggestedObjectsList, ObjectCard, LinkObjectDialog, useMailObserver
and useEmailLinks composables, and emailLinks API wrapper.

Closes #1013
Closes #1014
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
…ivity integration

Implements the backend core for publishing activity events when Objects,
Registers, and Schemas are created, updated, or deleted. Includes
dual-notification for object owners and graceful error handling.

Closes #1096, closes #1097
Implements IProvider::parse() for all 9 OpenRegister activity subjects
with rich text formatting and app icon. ProviderSubjectHandler maps
subjects to human-readable parsed and rich subject strings.

Closes #1100, closes #1102
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
…ications

Implements IFilter for activity sidebar filtering and three ActivitySettings
subclasses (ObjectSetting, RegisterSetting, SchemaSetting) for per-type
notification configuration. Stream enabled by default, mail disabled.

Closes #1104, closes #1105
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
@github-actions
Copy link
Contributor

Quality Report

Repository ConductionNL/openregister
Commit 1f989e9
Branch 1161/merge
Event pull_request
Generated 2026-03-25 08:16 UTC
Workflow Run https://github.com/ConductionNL/openregister/actions/runs/23531281935

Summary

Group Result
PHP Quality FAIL
Vue Quality FAIL
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP
Playwright SKIP

PHP Quality

Tool Result
lint PASS
phpcs FAIL
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint FAIL
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (147 total)

Metric Count
Approved (allowlist) 146
Approved (override) 1
Denied 0

npm dependencies (586 total)

Metric Count
Approved (allowlist) 585
Approved (override) 1
Denied 0

PHPUnit Tests

PHPUnit 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.

Download the full PDF report from the workflow artifacts.

…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
@github-actions
Copy link
Contributor

Quality Report

Repository ConductionNL/openregister
Commit 8bec944
Branch 1161/merge
Event pull_request
Generated 2026-03-25 12:53 UTC
Workflow Run https://github.com/ConductionNL/openregister/actions/runs/23541860015

Summary

Group Result
PHP Quality FAIL
Vue Quality FAIL
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP
Playwright SKIP

PHP Quality

Tool Result
lint PASS
phpcs FAIL
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint FAIL
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (147 total)

Metric Count
Approved (allowlist) 146
Approved (override) 1
Denied 0

npm dependencies (595 total)

Metric Count
Approved (allowlist) 592
Approved (override) 3
Denied 0

PHPUnit Tests

PHPUnit 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.

Download the full PDF report from the workflow artifacts.

- 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/
@github-actions
Copy link
Contributor

Quality Report

Repository ConductionNL/openregister
Commit 48eaa87
Branch 1161/merge
Event pull_request
Generated 2026-03-25 13:53 UTC
Workflow Run https://github.com/ConductionNL/openregister/actions/runs/23544464772

Summary

Group Result
PHP Quality FAIL
Vue Quality FAIL
Security FAIL
License FAIL
PHPUnit FAIL
Newman FAIL
Playwright FAIL

PHP Quality

Tool Result
lint PASS
phpcs PASS
phpmd PASS
psalm PASS
phpstan FAIL
phpmetrics FAIL

Vue Quality

Tool Result
eslint FAIL
stylelint FAIL

Security

Ecosystem Result
composer PASS
npm FAIL

License Compliance

Ecosystem Result
composer PASS
npm FAIL

composer dependencies (147 total)

Metric Count
Approved (allowlist) 146
Approved (override) 1
Denied 0

PHPUnit Tests

PHP Nextcloud Result
Overall FAIL

Integration Tests (Newman)

Result
FAIL

E2E Tests (Playwright)

Result
FAIL

Generated automatically by the Quality workflow.

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Contributor

Quality Report

Repository ConductionNL/openregister
Commit b0da921
Branch 1161/merge
Event pull_request
Generated 2026-03-25 13:58 UTC
Workflow Run https://github.com/ConductionNL/openregister/actions/runs/23544581336

Summary

Group Result
PHP Quality PASS
Vue Quality FAIL
Security FAIL
License FAIL
PHPUnit SKIP
Newman SKIP
Playwright SKIP

PHP Quality

Tool Result
lint PASS
phpcs PASS
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint FAIL
stylelint FAIL

Security

Ecosystem Result
composer PASS
npm FAIL

License Compliance

Ecosystem Result
composer PASS
npm FAIL

composer dependencies (147 total)

Metric Count
Approved (allowlist) 146
Approved (override) 1
Denied 0

PHPUnit Tests

PHPUnit 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.

Download the full PDF report from the workflow artifacts.

@github-actions
Copy link
Contributor

Quality Report

Repository ConductionNL/openregister
Commit 9b523f3
Branch 1161/merge
Event pull_request
Generated 2026-03-25 15:22 UTC
Workflow Run https://github.com/ConductionNL/openregister/actions/runs/23548632818

Summary

Group Result
PHP Quality PASS
Vue Quality PASS
Security PASS
License PASS
PHPUnit SKIP
Newman SKIP
Playwright SKIP

PHP Quality

Tool Result
lint PASS
phpcs PASS
phpmd PASS
psalm PASS
phpstan PASS
phpmetrics PASS

Vue Quality

Tool Result
eslint PASS
stylelint PASS

Security

Ecosystem Result
composer PASS
npm PASS

License Compliance

Ecosystem Result
composer PASS
npm PASS

composer dependencies (147 total)

Metric Count
Approved (allowlist) 146
Approved (override) 1
Denied 0

npm dependencies (595 total)

Metric Count
Approved (allowlist) 592
Approved (override) 3
Denied 0

PHPUnit Tests

PHPUnit 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.

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant