TenantAtlas/specs/051-entra-group-directory-cache/contracts/admin-directory-groups.openapi.yaml
2026-01-11 22:02:06 +01:00

136 lines
4.0 KiB
YAML

openapi: 3.0.3
info:
title: TenantPilot Admin - Directory Groups (v1)
version: 0.1.0
description: |
Admin surfaces for tenant-scoped Entra groups cache (metadata only).
Rendering uses cached data only; sync runs read the directory via app-only auth.
paths:
/admin/tenants/{tenantId}/directory/groups:
get:
summary: List cached groups
parameters:
- $ref: '#/components/parameters/TenantId'
- in: query
name: q
schema: { type: string }
description: Search by display name or ID
- in: query
name: stale
schema: { type: boolean }
description: Filter to stale groups only
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EntraGroup'
/admin/tenants/{tenantId}/directory/groups/{entraGroupId}:
get:
summary: Get group details
parameters:
- $ref: '#/components/parameters/TenantId'
- in: path
name: entraGroupId
required: true
schema: { type: string }
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/EntraGroup'
/admin/tenants/{tenantId}/directory/groups/sync:
post:
summary: Start a manual groups sync
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'202':
description: Accepted (run created)
content:
application/json:
schema:
$ref: '#/components/schemas/EntraGroupSyncRun'
/admin/tenants/{tenantId}/directory/groups/runs:
get:
summary: List group sync runs
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EntraGroupSyncRun'
/admin/tenants/{tenantId}/directory/groups/runs/{runId}:
get:
summary: Get group sync run details
parameters:
- $ref: '#/components/parameters/TenantId'
- in: path
name: runId
required: true
schema: { type: integer }
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/EntraGroupSyncRun'
components:
parameters:
TenantId:
in: path
name: tenantId
required: true
schema: { type: integer }
schemas:
EntraGroup:
type: object
required: [tenant_id, entra_group_id, display_name, last_seen_at]
properties:
tenant_id: { type: integer }
entra_group_id: { type: string }
display_name: { type: string }
group_type: { type: string }
security_enabled: { type: boolean, nullable: true }
mail_enabled: { type: boolean, nullable: true }
group_types:
type: array
items: { type: string }
last_seen_at: { type: string, format: date-time }
EntraGroupSyncRun:
type: object
required: [tenant_id, selection_key, status, created_at]
properties:
id: { type: integer }
tenant_id: { type: integer }
initiated_by_user_id: { type: integer, nullable: true }
selection_key: { type: string }
status: { type: string }
started_at: { type: string, format: date-time, nullable: true }
finished_at: { type: string, format: date-time, nullable: true }
observed_count: { type: integer, nullable: true }
upserted_count: { type: integer, nullable: true }
error_count: { type: integer, nullable: true }
error_category: { type: string, nullable: true }
error_summary: { type: string, nullable: true }
created_at: { type: string, format: date-time }