TenantAtlas/specs/230-findings-notification-convergence/contracts/findings-notification-convergence.logical.openapi.yaml
ahmido 742d65f0d9
Some checks failed
Main Confidence / confidence (push) Failing after 51s
feat: converge findings notification presentation (#265)
## Summary
- converge finding, queued, and completed database notifications on one shared `OperationUxPresenter` presentation contract
- preserve existing finding and operation deep-link authorities while standardizing title, body, status/icon treatment, and single primary action
- add focused notification, findings, and guard coverage plus the full feature 230 spec artifacts

## Validation
- `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent`
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Notifications/SharedDatabaseNotificationContractTest.php tests/Feature/Notifications/OperationRunNotificationTest.php tests/Feature/Notifications/FindingNotificationLinkTest.php`
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Findings/FindingsNotificationEventTest.php tests/Feature/Findings/FindingsNotificationRoutingTest.php tests/Feature/OpsUx/Constitution/LegacyNotificationGuardTest.php`

## Filament / Platform Notes
- Livewire v4.0+ compliance preserved on Filament v5 primitives
- provider registration remains unchanged in `apps/platform/bootstrap/providers.php`
- no globally searchable resource behavior changed in this feature
- no destructive actions were introduced
- asset strategy is unchanged; the existing `cd apps/platform && php artisan filament:assets` deploy step remains sufficient

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #265
2026-04-22 20:26:18 +00:00

235 lines
8.0 KiB
YAML

openapi: 3.1.0
info:
title: Operator Database Notification Presentation Contract
version: 1.0.0
summary: Logical internal contract for Spec 230 shared database notification presentation and preserved destination routes.
description: |
This contract documents the shared primary payload structure that Spec 230 must enforce
across the current operator-facing database notification consumers. It is intentionally
logical rather than a public HTTP API because the feature reuses existing Filament database
notifications, existing destination routes, and existing helper seams instead of introducing
a new controller namespace.
servers:
- url: https://logical.internal
description: Non-routable placeholder used to describe internal repository contracts.
paths:
/internal/operator-database-notifications/presentation:
post:
summary: Build one shared operator-facing database notification payload for an in-scope consumer.
description: |
Logical internal contract implemented by the shared presentation seam on top of the
existing presenter and helper paths. It standardizes title, body, status with the
corresponding existing Filament icon treatment, one primary action, and optional
supporting context while preserving consumer-specific metadata.
operationId: presentOperatorDatabaseNotification
x-not-public-http: true
requestBody:
required: true
content:
application/vnd.tenantpilot.operator-database-notification-input+json:
schema:
$ref: '#/components/schemas/OperatorDatabaseNotificationInput'
responses:
'200':
description: Shared primary notification structure returned for storage in the existing notifications table.
content:
application/vnd.tenantpilot.operator-database-notification-message+json:
schema:
$ref: '#/components/schemas/OperatorDatabaseNotificationMessage'
/admin/notifications:
get:
summary: Existing Filament drawer renders converged finding and operation notifications.
operationId: viewOperatorDatabaseNotifications
responses:
'200':
description: Existing shell renders the shared card grammar for the current in-scope consumers.
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.operator-notification-drawer+json:
schema:
$ref: '#/components/schemas/NotificationDrawerSurface'
/admin/t/{tenant}/findings/{finding}:
get:
summary: Finding notification action opens the existing tenant finding detail route.
operationId: openFindingNotificationTarget
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
- name: finding
in: path
required: true
schema:
type: integer
responses:
'200':
description: Existing finding detail route renders for an entitled tenant operator.
content:
text/html:
schema:
type: string
'403':
description: Recipient remains in scope but lacks current capability to inspect the finding.
'404':
description: Recipient no longer has tenant or record visibility.
/admin/operations/{run}:
get:
summary: Admin or tenantless operation notification action opens the existing run detail route.
operationId: openAdminOperationNotificationTarget
parameters:
- name: run
in: path
required: true
schema:
type: integer
responses:
'200':
description: Existing admin-plane or tenantless operation detail route renders for an entitled operator.
content:
text/html:
schema:
type: string
'403':
description: Recipient is in scope but lacks current operation-view capability.
'404':
description: Recipient no longer has access to the route scope or the run.
/system/ops/runs/{run}:
get:
summary: Platform-user operation notification action opens the existing system-panel run detail route.
operationId: openSystemOperationNotificationTarget
parameters:
- name: run
in: path
required: true
schema:
type: integer
responses:
'200':
description: Existing system-panel run detail renders for an entitled platform user.
content:
text/html:
schema:
type: string
'403':
description: Platform user lacks the required operations capability.
'404':
description: Platform user cannot access the run in the current plane.
components:
schemas:
NotificationConsumer:
type: string
enum:
- finding_event
- operation_run_queued
- operation_run_completed
NotificationStatus:
type: string
description: Shared status emphasis that also drives the existing Filament icon treatment for the card.
enum:
- info
- success
- warning
- danger
NotificationTarget:
type: string
enum:
- finding_detail
- admin_operation_run
- tenantless_operation_run
- system_operation_run
NotificationPrimaryAction:
type: object
required:
- label
- url
- target
properties:
label:
type: string
url:
type: string
target:
$ref: '#/components/schemas/NotificationTarget'
OperatorDatabaseNotificationInput:
type: object
required:
- consumer
- title
- body
- status
- primaryAction
properties:
consumer:
$ref: '#/components/schemas/NotificationConsumer'
title:
type: string
body:
type: string
status:
$ref: '#/components/schemas/NotificationStatus'
primaryAction:
$ref: '#/components/schemas/NotificationPrimaryAction'
supportingLines:
type: array
items:
type: string
metadata:
type: object
additionalProperties: true
description: |
Shared input model for the bounded presentation seam. Metadata remains consumer-specific,
but the primary title, body, status with the existing Filament icon treatment, and action structure must stay consistent.
OperatorDatabaseNotificationMessage:
type: object
required:
- title
- body
- status
- actions
properties:
title:
type: string
body:
type: string
status:
$ref: '#/components/schemas/NotificationStatus'
actions:
type: array
minItems: 1
maxItems: 1
items:
$ref: '#/components/schemas/NotificationPrimaryAction'
supportingLines:
type: array
items:
type: string
metadata:
type: object
additionalProperties: true
description: |
Shared persisted message shape stored in the existing notifications table and rendered by
the current Filament database-notification drawer.
NotificationDrawerSurface:
type: object
required:
- consumers
- structureGuarantees
properties:
consumers:
type: array
items:
$ref: '#/components/schemas/NotificationConsumer'
structureGuarantees:
type: array
items:
type: string
example:
- one primary title
- one primary body summarizing the change
- one status emphasis with the existing Filament icon treatment
- exactly one primary action
- optional supporting lines remain secondary