TenantAtlas/specs/261-provider-missing-policy-visibility/contracts/provider-missing-policy-visibility.openapi.yaml
Ahmed Darrazi 91f327a7c2
Some checks failed
PR Fast Feedback / fast-feedback (pull_request) Failing after 1m40s
feat(specs/261): add provider missing policy visibility
2026-05-01 22:17:29 +02:00

300 lines
8.5 KiB
YAML

openapi: 3.0.3
info:
title: TenantPilot Provider-Missing Policy Visibility & Restore Continuity v1 (Conceptual)
version: 0.1.0
description: |
Conceptual contract for the Provider-Missing Policy Visibility & Restore
Continuity v1 planning package.
These paths describe existing Filament admin and tenant-scoped routes reused by
implementation. The schemas document the derived policy-presence, current
backup-eligibility, and historical restore-continuity contract expected over
existing policy, backup, and restore truth; they do not define a new public
REST API.
servers:
- url: /
paths:
/admin/t/{tenant}/policies:
get:
summary: View tenant policies with distinct local-ignore and provider-missing states
parameters:
- in: path
name: tenant
required: true
schema:
type: integer
- in: query
name: visibility
required: false
description: |
`ignored` includes both `ignored_locally` and
`ignored_locally_provider_missing`. `provider_missing` includes both
`provider_missing` and `ignored_locally_provider_missing`.
schema:
type: string
enum:
- active
- ignored
- provider_missing
- all
responses:
'200':
description: Policy list rendered
content:
text/html:
schema:
type: string
application/json:
schema:
$ref: '#/components/schemas/PolicyIndexPageModel'
'403':
description: Forbidden for an in-scope actor missing the existing policy capability
'404':
description: Not found for non-members, tenant mismatches, or out-of-scope targets
/admin/t/{tenant}/policies/{policy}:
get:
summary: View one tenant policy with provider-presence continuity context
parameters:
- in: path
name: tenant
required: true
schema:
type: integer
- in: path
name: policy
required: true
schema:
type: integer
responses:
'200':
description: Policy detail rendered
content:
text/html:
schema:
type: string
application/json:
schema:
$ref: '#/components/schemas/PolicyDetailModel'
'403':
description: Forbidden for an in-scope actor missing the existing policy capability
'404':
description: Not found for non-members, tenant mismatches, or inaccessible policy targets
/admin/t/{tenant}/backup-sets/create:
get:
summary: Open current backup selection with provider-missing eligibility rules
parameters:
- in: path
name: tenant
required: true
schema:
type: integer
responses:
'200':
description: Backup-set creation surface rendered
content:
text/html:
schema:
type: string
application/json:
schema:
$ref: '#/components/schemas/BackupSelectionModel'
'403':
description: Forbidden for an in-scope actor missing the existing backup capability
'404':
description: Not found for non-members, tenant mismatches, or out-of-scope targets
/admin/t/{tenant}/restore-runs/create:
get:
summary: Open restore item selection with historical continuity for provider-missing policies
parameters:
- in: path
name: tenant
required: true
schema:
type: integer
- in: query
name: backup_set_id
required: false
schema:
type: integer
responses:
'200':
description: Restore-run creation surface rendered
content:
text/html:
schema:
type: string
application/json:
schema:
$ref: '#/components/schemas/RestoreSelectionModel'
'403':
description: Forbidden for an in-scope actor missing the existing restore capability
'404':
description: Not found for non-members, tenant mismatches, or inaccessible backup targets
components:
schemas:
PolicyVisibilityState:
type: string
description: |
Combined state remains explicit as `ignored_locally_provider_missing`.
List filters continue to expose it through both the `ignored` and
`provider_missing` filter tokens.
enum:
- active
- ignored_locally
- provider_missing
- ignored_locally_provider_missing
PolicyActionEligibility:
type: object
required:
- can_sync
- can_export_current
- can_restore_history
properties:
can_sync:
type: boolean
can_export_current:
type: boolean
can_restore_history:
type: boolean
blocked_reason:
type: string
nullable: true
description: |
Primary current-state action blocker. When both `ignored_at` and
`missing_from_provider_at` are present, this resolves to
`provider_missing` because fresh provider-backed capture is not
possible; local ignore remains secondary context.
enum:
- ignored_locally
- provider_missing
PolicyListRow:
type: object
required:
- id
- display_name
- policy_type
- visibility_state
- action_eligibility
properties:
id:
type: integer
display_name:
type: string
policy_type:
type: string
visibility_state:
$ref: '#/components/schemas/PolicyVisibilityState'
ignored_at:
type: string
format: date-time
nullable: true
missing_from_provider_at:
type: string
format: date-time
nullable: true
last_synced_at:
type: string
format: date-time
nullable: true
action_eligibility:
$ref: '#/components/schemas/PolicyActionEligibility'
PolicyIndexPageModel:
type: object
required:
- rows
properties:
rows:
type: array
items:
$ref: '#/components/schemas/PolicyListRow'
PolicyDetailModel:
type: object
required:
- policy
- historical_restore_available
properties:
policy:
$ref: '#/components/schemas/PolicyListRow'
historical_restore_available:
type: boolean
continuity_message:
type: string
nullable: true
BackupSelectionRow:
type: object
required:
- policy_id
- label
- eligible
properties:
policy_id:
type: integer
label:
type: string
eligible:
type: boolean
blocked_reason:
type: string
nullable: true
description: |
Primary current backup blocker. When a policy is both locally ignored
and provider-missing, this remains `provider_missing` because current
capture cannot proceed.
enum:
- ignored_locally
- provider_missing
secondary_local_ignore:
type: boolean
description: |
True when the row is also locally ignored. This remains secondary
context when `blocked_reason` resolves to `provider_missing`.
historical_continuity_available:
type: boolean
BackupSelectionModel:
type: object
required:
- rows
properties:
rows:
type: array
items:
$ref: '#/components/schemas/BackupSelectionRow'
RestoreSelectionRow:
type: object
required:
- backup_item_id
- label
- selectable
properties:
backup_item_id:
type: integer
label:
type: string
selectable:
type: boolean
provider_missing_notice:
type: boolean
continuity_message:
type: string
nullable: true
RestoreSelectionModel:
type: object
required:
- rows
properties:
rows:
type: array
items:
$ref: '#/components/schemas/RestoreSelectionRow'