@betterportal/config-manager 10.4.0 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +1 -1
  2. package/lib/.bsb/clients/service-betterportal-config-manager.js +1 -1
  3. package/lib/bp-contracts/org.betterportal.config-manager.json +2169 -2
  4. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +1426 -0
  5. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -1
  6. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js +35 -0
  7. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js.map +1 -1
  8. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -1
  9. package/lib/plugins/service-betterportal-config-manager/adminApi.js +15 -2
  10. package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -1
  11. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.d.ts +8 -0
  12. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.d.ts.map +1 -0
  13. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js +10 -0
  14. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/DELETE.js.map +1 -0
  15. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts +18 -0
  16. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.d.ts.map +1 -0
  17. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.js +15 -0
  18. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/GET.js.map +1 -0
  19. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts +8 -0
  20. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.d.ts.map +1 -0
  21. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js +10 -0
  22. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/POST.js.map +1 -0
  23. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts +8 -0
  24. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.d.ts.map +1 -0
  25. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.js +10 -0
  26. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/PUT.js.map +1 -0
  27. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.d.ts +2 -0
  28. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.d.ts.map +1 -0
  29. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.js +2 -0
  30. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/DELETE.js.map +1 -0
  31. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.d.ts +4 -0
  32. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.d.ts.map +1 -0
  33. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js +172 -0
  34. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js.map +1 -0
  35. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.d.ts +2 -0
  36. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.d.ts.map +1 -0
  37. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.js +2 -0
  38. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/POST.js.map +1 -0
  39. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.d.ts +2 -0
  40. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.d.ts.map +1 -0
  41. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.js +2 -0
  42. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/PUT.js.map +1 -0
  43. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.d.ts +2 -0
  44. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.d.ts.map +1 -0
  45. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.js +2 -0
  46. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/index.js.map +1 -0
  47. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/GET.d.ts +4 -0
  48. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/GET.d.ts.map +1 -1
  49. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/GET.js +3 -1
  50. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/GET.js.map +1 -1
  51. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_renderer.bootstrap5/GET.js +1 -1
  52. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_renderer.bootstrap5/GET.js.map +1 -1
  53. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts.map +1 -1
  54. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js +12 -15
  55. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js.map +1 -1
  56. package/lib/plugins/service-betterportal-config-manager/index.d.ts +3 -0
  57. package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -1
  58. package/lib/plugins/service-betterportal-config-manager/index.js +67 -18
  59. package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -1
  60. package/lib/plugins/service-betterportal-config-manager/previewApi.d.ts +7 -0
  61. package/lib/plugins/service-betterportal-config-manager/previewApi.d.ts.map +1 -0
  62. package/lib/plugins/service-betterportal-config-manager/previewApi.js +112 -0
  63. package/lib/plugins/service-betterportal-config-manager/previewApi.js.map +1 -0
  64. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts +419 -0
  65. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts.map +1 -0
  66. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js +398 -0
  67. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js.map +1 -0
  68. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts +62 -0
  69. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts.map +1 -0
  70. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js +763 -0
  71. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js.map +1 -0
  72. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +6 -2
  73. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -1
  74. package/lib/plugins/service-betterportal-config-manager/storage/core.js +12 -2
  75. package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -1
  76. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts +3 -1
  77. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts.map +1 -1
  78. package/lib/plugins/service-betterportal-config-manager/storage/file.js +3 -2
  79. package/lib/plugins/service-betterportal-config-manager/storage/file.js.map +1 -1
  80. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +3 -1
  81. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -1
  82. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +3 -2
  83. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -1
  84. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +4 -1
  85. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -1
  86. package/lib/plugins/service-betterportal-config-manager/syncApi.js +58 -4
  87. package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -1
  88. package/lib/plugins/service-betterportal-config-manager/tenantManagement.d.ts.map +1 -1
  89. package/lib/plugins/service-betterportal-config-manager/tenantManagement.js +12 -1
  90. package/lib/plugins/service-betterportal-config-manager/tenantManagement.js.map +1 -1
  91. package/lib/schemas/service-betterportal-config-manager.json +1 -1
  92. package/lib/schemas/service-betterportal-config-manager.plugin.json +1 -1
  93. package/package.json +6 -6
@@ -4,7 +4,7 @@
4
4
  "pluginId": "org.betterportal.config-manager",
5
5
  "title": "BetterPortal Config Manager",
6
6
  "description": "Admin-facing BetterPortal service for discovering and managing service config surfaces.",
7
- "version": "10.4.0",
7
+ "version": "10.6.0",
8
8
  "category": "service",
9
9
  "deploymentModes": [
10
10
  "self-hosted"
@@ -1306,6 +1306,2125 @@
1306
1306
  }
1307
1307
  ]
1308
1308
  },
1309
+ {
1310
+ "viewId": "preview-environments.index",
1311
+ "title": "Preview Environments",
1312
+ "description": "Manage isolated, disposable application clones for development deployments.",
1313
+ "path": "/preview-environments",
1314
+ "pathVariants": [],
1315
+ "paramsSchema": {},
1316
+ "operations": [
1317
+ {
1318
+ "operationId": "admin.preview-environments.delete",
1319
+ "method": "DELETE",
1320
+ "title": "Delete preview resources",
1321
+ "description": "Delete a preview deployment or group.",
1322
+ "querySchema": {},
1323
+ "headersSchema": {},
1324
+ "bodySchema": {},
1325
+ "jsonResponseSchema": {
1326
+ "anyvaliVersion": "1.0",
1327
+ "schemaVersion": "1.1",
1328
+ "root": {
1329
+ "kind": "object",
1330
+ "properties": {
1331
+ "title": {
1332
+ "kind": "string",
1333
+ "minLength": 1
1334
+ },
1335
+ "previewPath": {
1336
+ "kind": "string",
1337
+ "minLength": 1
1338
+ },
1339
+ "deploymentApiBase": {
1340
+ "kind": "string",
1341
+ "minLength": 1
1342
+ },
1343
+ "sourceTenants": {
1344
+ "kind": "array",
1345
+ "items": {
1346
+ "kind": "object",
1347
+ "properties": {
1348
+ "id": {
1349
+ "kind": "string",
1350
+ "minLength": 1
1351
+ },
1352
+ "title": {
1353
+ "kind": "string",
1354
+ "minLength": 1
1355
+ }
1356
+ },
1357
+ "required": [
1358
+ "id",
1359
+ "title"
1360
+ ],
1361
+ "unknownKeys": "strip"
1362
+ }
1363
+ },
1364
+ "sourceApps": {
1365
+ "kind": "array",
1366
+ "items": {
1367
+ "kind": "object",
1368
+ "properties": {
1369
+ "id": {
1370
+ "kind": "string",
1371
+ "minLength": 1
1372
+ },
1373
+ "tenantId": {
1374
+ "kind": "string",
1375
+ "minLength": 1
1376
+ },
1377
+ "tenantTitle": {
1378
+ "kind": "string",
1379
+ "minLength": 1
1380
+ },
1381
+ "title": {
1382
+ "kind": "string",
1383
+ "minLength": 1
1384
+ },
1385
+ "serviceIds": {
1386
+ "kind": "array",
1387
+ "items": {
1388
+ "kind": "string"
1389
+ },
1390
+ "default": []
1391
+ },
1392
+ "requiredServiceIds": {
1393
+ "kind": "array",
1394
+ "items": {
1395
+ "kind": "string"
1396
+ },
1397
+ "default": []
1398
+ }
1399
+ },
1400
+ "required": [
1401
+ "id",
1402
+ "tenantId",
1403
+ "tenantTitle",
1404
+ "title",
1405
+ "serviceIds",
1406
+ "requiredServiceIds"
1407
+ ],
1408
+ "unknownKeys": "strip"
1409
+ }
1410
+ },
1411
+ "groups": {
1412
+ "kind": "array",
1413
+ "items": {
1414
+ "kind": "object",
1415
+ "properties": {
1416
+ "id": {
1417
+ "kind": "string",
1418
+ "minLength": 1
1419
+ },
1420
+ "name": {
1421
+ "kind": "string",
1422
+ "minLength": 1
1423
+ },
1424
+ "sourceTenantId": {
1425
+ "kind": "string",
1426
+ "minLength": 1
1427
+ },
1428
+ "sourceAppId": {
1429
+ "kind": "string",
1430
+ "minLength": 1
1431
+ },
1432
+ "sourceLabel": {
1433
+ "kind": "string",
1434
+ "minLength": 1
1435
+ },
1436
+ "expiresInDays": {
1437
+ "kind": "optional",
1438
+ "inner": {
1439
+ "kind": "int",
1440
+ "min": 1
1441
+ }
1442
+ },
1443
+ "oidc": {
1444
+ "kind": "optional",
1445
+ "inner": {
1446
+ "kind": "object",
1447
+ "properties": {
1448
+ "issuer": {
1449
+ "kind": "string",
1450
+ "minLength": 1
1451
+ },
1452
+ "audience": {
1453
+ "kind": "string",
1454
+ "minLength": 1
1455
+ },
1456
+ "jwksUri": {
1457
+ "kind": "string",
1458
+ "minLength": 1
1459
+ },
1460
+ "subjectPrefix": {
1461
+ "kind": "optional",
1462
+ "inner": {
1463
+ "kind": "string"
1464
+ }
1465
+ },
1466
+ "requiredClaimsJson": {
1467
+ "kind": "string"
1468
+ }
1469
+ },
1470
+ "required": [
1471
+ "issuer",
1472
+ "audience",
1473
+ "jwksUri",
1474
+ "requiredClaimsJson"
1475
+ ],
1476
+ "unknownKeys": "strip"
1477
+ }
1478
+ },
1479
+ "services": {
1480
+ "kind": "array",
1481
+ "items": {
1482
+ "kind": "object",
1483
+ "properties": {
1484
+ "serviceId": {
1485
+ "kind": "string",
1486
+ "minLength": 1
1487
+ },
1488
+ "title": {
1489
+ "kind": "string",
1490
+ "minLength": 1
1491
+ },
1492
+ "fields": {
1493
+ "kind": "array",
1494
+ "items": {
1495
+ "kind": "object",
1496
+ "properties": {
1497
+ "key": {
1498
+ "kind": "string",
1499
+ "minLength": 1
1500
+ },
1501
+ "title": {
1502
+ "kind": "string",
1503
+ "minLength": 1
1504
+ },
1505
+ "description": {
1506
+ "kind": "string"
1507
+ },
1508
+ "scope": {
1509
+ "kind": "enum",
1510
+ "values": [
1511
+ "tenant",
1512
+ "app"
1513
+ ]
1514
+ },
1515
+ "secret": {
1516
+ "kind": "bool"
1517
+ },
1518
+ "required": {
1519
+ "kind": "bool"
1520
+ },
1521
+ "control": {
1522
+ "kind": "optional",
1523
+ "inner": {
1524
+ "kind": "string"
1525
+ }
1526
+ },
1527
+ "options": {
1528
+ "kind": "array",
1529
+ "items": {
1530
+ "kind": "object",
1531
+ "properties": {
1532
+ "value": {
1533
+ "kind": "string"
1534
+ },
1535
+ "label": {
1536
+ "kind": "string"
1537
+ }
1538
+ },
1539
+ "required": [
1540
+ "value",
1541
+ "label"
1542
+ ],
1543
+ "unknownKeys": "strip"
1544
+ },
1545
+ "default": []
1546
+ }
1547
+ },
1548
+ "required": [
1549
+ "key",
1550
+ "title",
1551
+ "description",
1552
+ "scope",
1553
+ "secret",
1554
+ "required",
1555
+ "options"
1556
+ ],
1557
+ "unknownKeys": "strip"
1558
+ },
1559
+ "default": []
1560
+ },
1561
+ "encryptedTenantConfig": {
1562
+ "kind": "string"
1563
+ },
1564
+ "encryptedAppConfig": {
1565
+ "kind": "string"
1566
+ }
1567
+ },
1568
+ "required": [
1569
+ "serviceId",
1570
+ "title",
1571
+ "fields",
1572
+ "encryptedTenantConfig",
1573
+ "encryptedAppConfig"
1574
+ ],
1575
+ "unknownKeys": "strip"
1576
+ }
1577
+ },
1578
+ "deployments": {
1579
+ "kind": "array",
1580
+ "items": {
1581
+ "kind": "object",
1582
+ "properties": {
1583
+ "id": {
1584
+ "kind": "string",
1585
+ "minLength": 1
1586
+ },
1587
+ "groupId": {
1588
+ "kind": "string",
1589
+ "minLength": 1
1590
+ },
1591
+ "key": {
1592
+ "kind": "string",
1593
+ "minLength": 1
1594
+ },
1595
+ "name": {
1596
+ "kind": "string",
1597
+ "minLength": 1
1598
+ },
1599
+ "hostname": {
1600
+ "kind": "string",
1601
+ "minLength": 1
1602
+ },
1603
+ "expiresInDays": {
1604
+ "kind": "optional",
1605
+ "inner": {
1606
+ "kind": "int",
1607
+ "min": 1
1608
+ }
1609
+ },
1610
+ "expiresAt": {
1611
+ "kind": "optional",
1612
+ "inner": {
1613
+ "kind": "string"
1614
+ }
1615
+ },
1616
+ "createdAt": {
1617
+ "kind": "string",
1618
+ "minLength": 1
1619
+ },
1620
+ "updatedAt": {
1621
+ "kind": "string",
1622
+ "minLength": 1
1623
+ },
1624
+ "ready": {
1625
+ "kind": "bool"
1626
+ },
1627
+ "services": {
1628
+ "kind": "array",
1629
+ "items": {
1630
+ "kind": "object",
1631
+ "properties": {
1632
+ "serviceId": {
1633
+ "kind": "string",
1634
+ "minLength": 1
1635
+ },
1636
+ "instanceId": {
1637
+ "kind": "string",
1638
+ "minLength": 1
1639
+ },
1640
+ "url": {
1641
+ "kind": "string",
1642
+ "minLength": 1
1643
+ },
1644
+ "lastSyncAt": {
1645
+ "kind": "optional",
1646
+ "inner": {
1647
+ "kind": "string"
1648
+ }
1649
+ },
1650
+ "ready": {
1651
+ "kind": "bool"
1652
+ }
1653
+ },
1654
+ "required": [
1655
+ "serviceId",
1656
+ "instanceId",
1657
+ "url",
1658
+ "ready"
1659
+ ],
1660
+ "unknownKeys": "strip"
1661
+ }
1662
+ }
1663
+ },
1664
+ "required": [
1665
+ "id",
1666
+ "groupId",
1667
+ "key",
1668
+ "name",
1669
+ "hostname",
1670
+ "createdAt",
1671
+ "updatedAt",
1672
+ "ready",
1673
+ "services"
1674
+ ],
1675
+ "unknownKeys": "strip"
1676
+ }
1677
+ },
1678
+ "createdAt": {
1679
+ "kind": "string",
1680
+ "minLength": 1
1681
+ },
1682
+ "updatedAt": {
1683
+ "kind": "string",
1684
+ "minLength": 1
1685
+ }
1686
+ },
1687
+ "required": [
1688
+ "id",
1689
+ "name",
1690
+ "sourceTenantId",
1691
+ "sourceAppId",
1692
+ "sourceLabel",
1693
+ "services",
1694
+ "deployments",
1695
+ "createdAt",
1696
+ "updatedAt"
1697
+ ],
1698
+ "unknownKeys": "strip"
1699
+ }
1700
+ },
1701
+ "notice": {
1702
+ "kind": "optional",
1703
+ "inner": {
1704
+ "kind": "string"
1705
+ }
1706
+ },
1707
+ "error": {
1708
+ "kind": "optional",
1709
+ "inner": {
1710
+ "kind": "string"
1711
+ }
1712
+ },
1713
+ "issuedApiKey": {
1714
+ "kind": "optional",
1715
+ "inner": {
1716
+ "kind": "string"
1717
+ }
1718
+ },
1719
+ "issuedCredentials": {
1720
+ "kind": "array",
1721
+ "items": {
1722
+ "kind": "object",
1723
+ "properties": {
1724
+ "serviceId": {
1725
+ "kind": "string",
1726
+ "minLength": 1
1727
+ },
1728
+ "instanceId": {
1729
+ "kind": "string",
1730
+ "minLength": 1
1731
+ },
1732
+ "url": {
1733
+ "kind": "string",
1734
+ "minLength": 1
1735
+ },
1736
+ "controlPlaneUrl": {
1737
+ "kind": "string",
1738
+ "minLength": 1
1739
+ },
1740
+ "apiKey": {
1741
+ "kind": "string",
1742
+ "minLength": 1
1743
+ }
1744
+ },
1745
+ "required": [
1746
+ "serviceId",
1747
+ "instanceId",
1748
+ "url",
1749
+ "controlPlaneUrl",
1750
+ "apiKey"
1751
+ ],
1752
+ "unknownKeys": "strip"
1753
+ },
1754
+ "default": []
1755
+ }
1756
+ },
1757
+ "required": [
1758
+ "title",
1759
+ "previewPath",
1760
+ "deploymentApiBase",
1761
+ "sourceTenants",
1762
+ "sourceApps",
1763
+ "groups",
1764
+ "issuedCredentials"
1765
+ ],
1766
+ "unknownKeys": "strip"
1767
+ },
1768
+ "definitions": {},
1769
+ "extensions": {}
1770
+ },
1771
+ "metadataResponseSchema": {},
1772
+ "renderable": true,
1773
+ "html": {
1774
+ "renderers": {
1775
+ "bootstrap5": {
1776
+ "defaultRenderer": "default",
1777
+ "renderModes": [
1778
+ "page"
1779
+ ],
1780
+ "slots": [
1781
+ "main"
1782
+ ],
1783
+ "renderers": [
1784
+ {
1785
+ "id": "default",
1786
+ "title": "Default Content",
1787
+ "slotId": "main",
1788
+ "renderModes": [
1789
+ "page",
1790
+ "fragment"
1791
+ ]
1792
+ }
1793
+ ]
1794
+ }
1795
+ }
1796
+ },
1797
+ "auth": {
1798
+ "required": true,
1799
+ "callers": [
1800
+ "user"
1801
+ ],
1802
+ "permissions": [
1803
+ {
1804
+ "serviceId": "org.betterportal.config-manager",
1805
+ "viewId": "preview-environments.index",
1806
+ "permissions": [
1807
+ "delete"
1808
+ ]
1809
+ }
1810
+ ]
1811
+ },
1812
+ "sitemap": {
1813
+ "kind": "default"
1814
+ },
1815
+ "robots": [],
1816
+ "dependencies": [],
1817
+ "apiContracts": [],
1818
+ "demoScenarios": [
1819
+ {
1820
+ "id": "default",
1821
+ "title": "Default",
1822
+ "response": {
1823
+ "title": "Preview Environments",
1824
+ "previewPath": "/preview-environments",
1825
+ "deploymentApiBase": "/api/preview-groups",
1826
+ "sourceTenants": [],
1827
+ "sourceApps": [],
1828
+ "groups": [],
1829
+ "issuedCredentials": []
1830
+ }
1831
+ }
1832
+ ],
1833
+ "cacheHints": {
1834
+ "ttlSeconds": 0,
1835
+ "varyBy": [
1836
+ "accept",
1837
+ "origin"
1838
+ ]
1839
+ }
1840
+ },
1841
+ {
1842
+ "operationId": "admin.preview-environments.view",
1843
+ "method": "GET",
1844
+ "title": "View preview environments",
1845
+ "description": "List preview groups and their disposable deployments.",
1846
+ "querySchema": {},
1847
+ "headersSchema": {},
1848
+ "bodySchema": {},
1849
+ "jsonResponseSchema": {
1850
+ "anyvaliVersion": "1.0",
1851
+ "schemaVersion": "1.1",
1852
+ "root": {
1853
+ "kind": "object",
1854
+ "properties": {
1855
+ "title": {
1856
+ "kind": "string",
1857
+ "minLength": 1
1858
+ },
1859
+ "previewPath": {
1860
+ "kind": "string",
1861
+ "minLength": 1
1862
+ },
1863
+ "deploymentApiBase": {
1864
+ "kind": "string",
1865
+ "minLength": 1
1866
+ },
1867
+ "sourceTenants": {
1868
+ "kind": "array",
1869
+ "items": {
1870
+ "kind": "object",
1871
+ "properties": {
1872
+ "id": {
1873
+ "kind": "string",
1874
+ "minLength": 1
1875
+ },
1876
+ "title": {
1877
+ "kind": "string",
1878
+ "minLength": 1
1879
+ }
1880
+ },
1881
+ "required": [
1882
+ "id",
1883
+ "title"
1884
+ ],
1885
+ "unknownKeys": "strip"
1886
+ }
1887
+ },
1888
+ "sourceApps": {
1889
+ "kind": "array",
1890
+ "items": {
1891
+ "kind": "object",
1892
+ "properties": {
1893
+ "id": {
1894
+ "kind": "string",
1895
+ "minLength": 1
1896
+ },
1897
+ "tenantId": {
1898
+ "kind": "string",
1899
+ "minLength": 1
1900
+ },
1901
+ "tenantTitle": {
1902
+ "kind": "string",
1903
+ "minLength": 1
1904
+ },
1905
+ "title": {
1906
+ "kind": "string",
1907
+ "minLength": 1
1908
+ },
1909
+ "serviceIds": {
1910
+ "kind": "array",
1911
+ "items": {
1912
+ "kind": "string"
1913
+ },
1914
+ "default": []
1915
+ },
1916
+ "requiredServiceIds": {
1917
+ "kind": "array",
1918
+ "items": {
1919
+ "kind": "string"
1920
+ },
1921
+ "default": []
1922
+ }
1923
+ },
1924
+ "required": [
1925
+ "id",
1926
+ "tenantId",
1927
+ "tenantTitle",
1928
+ "title",
1929
+ "serviceIds",
1930
+ "requiredServiceIds"
1931
+ ],
1932
+ "unknownKeys": "strip"
1933
+ }
1934
+ },
1935
+ "groups": {
1936
+ "kind": "array",
1937
+ "items": {
1938
+ "kind": "object",
1939
+ "properties": {
1940
+ "id": {
1941
+ "kind": "string",
1942
+ "minLength": 1
1943
+ },
1944
+ "name": {
1945
+ "kind": "string",
1946
+ "minLength": 1
1947
+ },
1948
+ "sourceTenantId": {
1949
+ "kind": "string",
1950
+ "minLength": 1
1951
+ },
1952
+ "sourceAppId": {
1953
+ "kind": "string",
1954
+ "minLength": 1
1955
+ },
1956
+ "sourceLabel": {
1957
+ "kind": "string",
1958
+ "minLength": 1
1959
+ },
1960
+ "expiresInDays": {
1961
+ "kind": "optional",
1962
+ "inner": {
1963
+ "kind": "int",
1964
+ "min": 1
1965
+ }
1966
+ },
1967
+ "oidc": {
1968
+ "kind": "optional",
1969
+ "inner": {
1970
+ "kind": "object",
1971
+ "properties": {
1972
+ "issuer": {
1973
+ "kind": "string",
1974
+ "minLength": 1
1975
+ },
1976
+ "audience": {
1977
+ "kind": "string",
1978
+ "minLength": 1
1979
+ },
1980
+ "jwksUri": {
1981
+ "kind": "string",
1982
+ "minLength": 1
1983
+ },
1984
+ "subjectPrefix": {
1985
+ "kind": "optional",
1986
+ "inner": {
1987
+ "kind": "string"
1988
+ }
1989
+ },
1990
+ "requiredClaimsJson": {
1991
+ "kind": "string"
1992
+ }
1993
+ },
1994
+ "required": [
1995
+ "issuer",
1996
+ "audience",
1997
+ "jwksUri",
1998
+ "requiredClaimsJson"
1999
+ ],
2000
+ "unknownKeys": "strip"
2001
+ }
2002
+ },
2003
+ "services": {
2004
+ "kind": "array",
2005
+ "items": {
2006
+ "kind": "object",
2007
+ "properties": {
2008
+ "serviceId": {
2009
+ "kind": "string",
2010
+ "minLength": 1
2011
+ },
2012
+ "title": {
2013
+ "kind": "string",
2014
+ "minLength": 1
2015
+ },
2016
+ "fields": {
2017
+ "kind": "array",
2018
+ "items": {
2019
+ "kind": "object",
2020
+ "properties": {
2021
+ "key": {
2022
+ "kind": "string",
2023
+ "minLength": 1
2024
+ },
2025
+ "title": {
2026
+ "kind": "string",
2027
+ "minLength": 1
2028
+ },
2029
+ "description": {
2030
+ "kind": "string"
2031
+ },
2032
+ "scope": {
2033
+ "kind": "enum",
2034
+ "values": [
2035
+ "tenant",
2036
+ "app"
2037
+ ]
2038
+ },
2039
+ "secret": {
2040
+ "kind": "bool"
2041
+ },
2042
+ "required": {
2043
+ "kind": "bool"
2044
+ },
2045
+ "control": {
2046
+ "kind": "optional",
2047
+ "inner": {
2048
+ "kind": "string"
2049
+ }
2050
+ },
2051
+ "options": {
2052
+ "kind": "array",
2053
+ "items": {
2054
+ "kind": "object",
2055
+ "properties": {
2056
+ "value": {
2057
+ "kind": "string"
2058
+ },
2059
+ "label": {
2060
+ "kind": "string"
2061
+ }
2062
+ },
2063
+ "required": [
2064
+ "value",
2065
+ "label"
2066
+ ],
2067
+ "unknownKeys": "strip"
2068
+ },
2069
+ "default": []
2070
+ }
2071
+ },
2072
+ "required": [
2073
+ "key",
2074
+ "title",
2075
+ "description",
2076
+ "scope",
2077
+ "secret",
2078
+ "required",
2079
+ "options"
2080
+ ],
2081
+ "unknownKeys": "strip"
2082
+ },
2083
+ "default": []
2084
+ },
2085
+ "encryptedTenantConfig": {
2086
+ "kind": "string"
2087
+ },
2088
+ "encryptedAppConfig": {
2089
+ "kind": "string"
2090
+ }
2091
+ },
2092
+ "required": [
2093
+ "serviceId",
2094
+ "title",
2095
+ "fields",
2096
+ "encryptedTenantConfig",
2097
+ "encryptedAppConfig"
2098
+ ],
2099
+ "unknownKeys": "strip"
2100
+ }
2101
+ },
2102
+ "deployments": {
2103
+ "kind": "array",
2104
+ "items": {
2105
+ "kind": "object",
2106
+ "properties": {
2107
+ "id": {
2108
+ "kind": "string",
2109
+ "minLength": 1
2110
+ },
2111
+ "groupId": {
2112
+ "kind": "string",
2113
+ "minLength": 1
2114
+ },
2115
+ "key": {
2116
+ "kind": "string",
2117
+ "minLength": 1
2118
+ },
2119
+ "name": {
2120
+ "kind": "string",
2121
+ "minLength": 1
2122
+ },
2123
+ "hostname": {
2124
+ "kind": "string",
2125
+ "minLength": 1
2126
+ },
2127
+ "expiresInDays": {
2128
+ "kind": "optional",
2129
+ "inner": {
2130
+ "kind": "int",
2131
+ "min": 1
2132
+ }
2133
+ },
2134
+ "expiresAt": {
2135
+ "kind": "optional",
2136
+ "inner": {
2137
+ "kind": "string"
2138
+ }
2139
+ },
2140
+ "createdAt": {
2141
+ "kind": "string",
2142
+ "minLength": 1
2143
+ },
2144
+ "updatedAt": {
2145
+ "kind": "string",
2146
+ "minLength": 1
2147
+ },
2148
+ "ready": {
2149
+ "kind": "bool"
2150
+ },
2151
+ "services": {
2152
+ "kind": "array",
2153
+ "items": {
2154
+ "kind": "object",
2155
+ "properties": {
2156
+ "serviceId": {
2157
+ "kind": "string",
2158
+ "minLength": 1
2159
+ },
2160
+ "instanceId": {
2161
+ "kind": "string",
2162
+ "minLength": 1
2163
+ },
2164
+ "url": {
2165
+ "kind": "string",
2166
+ "minLength": 1
2167
+ },
2168
+ "lastSyncAt": {
2169
+ "kind": "optional",
2170
+ "inner": {
2171
+ "kind": "string"
2172
+ }
2173
+ },
2174
+ "ready": {
2175
+ "kind": "bool"
2176
+ }
2177
+ },
2178
+ "required": [
2179
+ "serviceId",
2180
+ "instanceId",
2181
+ "url",
2182
+ "ready"
2183
+ ],
2184
+ "unknownKeys": "strip"
2185
+ }
2186
+ }
2187
+ },
2188
+ "required": [
2189
+ "id",
2190
+ "groupId",
2191
+ "key",
2192
+ "name",
2193
+ "hostname",
2194
+ "createdAt",
2195
+ "updatedAt",
2196
+ "ready",
2197
+ "services"
2198
+ ],
2199
+ "unknownKeys": "strip"
2200
+ }
2201
+ },
2202
+ "createdAt": {
2203
+ "kind": "string",
2204
+ "minLength": 1
2205
+ },
2206
+ "updatedAt": {
2207
+ "kind": "string",
2208
+ "minLength": 1
2209
+ }
2210
+ },
2211
+ "required": [
2212
+ "id",
2213
+ "name",
2214
+ "sourceTenantId",
2215
+ "sourceAppId",
2216
+ "sourceLabel",
2217
+ "services",
2218
+ "deployments",
2219
+ "createdAt",
2220
+ "updatedAt"
2221
+ ],
2222
+ "unknownKeys": "strip"
2223
+ }
2224
+ },
2225
+ "notice": {
2226
+ "kind": "optional",
2227
+ "inner": {
2228
+ "kind": "string"
2229
+ }
2230
+ },
2231
+ "error": {
2232
+ "kind": "optional",
2233
+ "inner": {
2234
+ "kind": "string"
2235
+ }
2236
+ },
2237
+ "issuedApiKey": {
2238
+ "kind": "optional",
2239
+ "inner": {
2240
+ "kind": "string"
2241
+ }
2242
+ },
2243
+ "issuedCredentials": {
2244
+ "kind": "array",
2245
+ "items": {
2246
+ "kind": "object",
2247
+ "properties": {
2248
+ "serviceId": {
2249
+ "kind": "string",
2250
+ "minLength": 1
2251
+ },
2252
+ "instanceId": {
2253
+ "kind": "string",
2254
+ "minLength": 1
2255
+ },
2256
+ "url": {
2257
+ "kind": "string",
2258
+ "minLength": 1
2259
+ },
2260
+ "controlPlaneUrl": {
2261
+ "kind": "string",
2262
+ "minLength": 1
2263
+ },
2264
+ "apiKey": {
2265
+ "kind": "string",
2266
+ "minLength": 1
2267
+ }
2268
+ },
2269
+ "required": [
2270
+ "serviceId",
2271
+ "instanceId",
2272
+ "url",
2273
+ "controlPlaneUrl",
2274
+ "apiKey"
2275
+ ],
2276
+ "unknownKeys": "strip"
2277
+ },
2278
+ "default": []
2279
+ }
2280
+ },
2281
+ "required": [
2282
+ "title",
2283
+ "previewPath",
2284
+ "deploymentApiBase",
2285
+ "sourceTenants",
2286
+ "sourceApps",
2287
+ "groups",
2288
+ "issuedCredentials"
2289
+ ],
2290
+ "unknownKeys": "strip"
2291
+ },
2292
+ "definitions": {},
2293
+ "extensions": {}
2294
+ },
2295
+ "metadataResponseSchema": {},
2296
+ "renderable": true,
2297
+ "html": {
2298
+ "renderers": {
2299
+ "bootstrap5": {
2300
+ "defaultRenderer": "default",
2301
+ "renderModes": [
2302
+ "page"
2303
+ ],
2304
+ "slots": [
2305
+ "main"
2306
+ ],
2307
+ "renderers": [
2308
+ {
2309
+ "id": "default",
2310
+ "title": "Default Content",
2311
+ "slotId": "main",
2312
+ "renderModes": [
2313
+ "page",
2314
+ "fragment"
2315
+ ]
2316
+ }
2317
+ ]
2318
+ }
2319
+ }
2320
+ },
2321
+ "auth": {
2322
+ "required": true,
2323
+ "callers": [
2324
+ "user"
2325
+ ],
2326
+ "permissions": [
2327
+ {
2328
+ "serviceId": "org.betterportal.config-manager",
2329
+ "viewId": "preview-environments.index",
2330
+ "permissions": [
2331
+ "read"
2332
+ ]
2333
+ }
2334
+ ]
2335
+ },
2336
+ "sitemap": {
2337
+ "kind": "default"
2338
+ },
2339
+ "robots": [],
2340
+ "dependencies": [
2341
+ {
2342
+ "operationId": "admin.preview-environments.create",
2343
+ "method": "POST"
2344
+ },
2345
+ {
2346
+ "operationId": "admin.preview-environments.update",
2347
+ "method": "PUT"
2348
+ },
2349
+ {
2350
+ "operationId": "admin.preview-environments.delete",
2351
+ "method": "DELETE"
2352
+ }
2353
+ ],
2354
+ "apiContracts": [],
2355
+ "demoScenarios": [
2356
+ {
2357
+ "id": "default",
2358
+ "title": "Default",
2359
+ "response": {
2360
+ "title": "Preview Environments",
2361
+ "previewPath": "/preview-environments",
2362
+ "deploymentApiBase": "/api/preview-groups",
2363
+ "sourceTenants": [],
2364
+ "sourceApps": [],
2365
+ "groups": [],
2366
+ "issuedCredentials": []
2367
+ }
2368
+ }
2369
+ ],
2370
+ "cacheHints": {
2371
+ "ttlSeconds": 0,
2372
+ "varyBy": [
2373
+ "accept",
2374
+ "origin"
2375
+ ]
2376
+ }
2377
+ },
2378
+ {
2379
+ "operationId": "admin.preview-environments.create",
2380
+ "method": "POST",
2381
+ "title": "Create preview resources",
2382
+ "description": "Create preview groups, rotate group credentials, or create a preview deployment.",
2383
+ "querySchema": {},
2384
+ "headersSchema": {},
2385
+ "bodySchema": {},
2386
+ "jsonResponseSchema": {
2387
+ "anyvaliVersion": "1.0",
2388
+ "schemaVersion": "1.1",
2389
+ "root": {
2390
+ "kind": "object",
2391
+ "properties": {
2392
+ "title": {
2393
+ "kind": "string",
2394
+ "minLength": 1
2395
+ },
2396
+ "previewPath": {
2397
+ "kind": "string",
2398
+ "minLength": 1
2399
+ },
2400
+ "deploymentApiBase": {
2401
+ "kind": "string",
2402
+ "minLength": 1
2403
+ },
2404
+ "sourceTenants": {
2405
+ "kind": "array",
2406
+ "items": {
2407
+ "kind": "object",
2408
+ "properties": {
2409
+ "id": {
2410
+ "kind": "string",
2411
+ "minLength": 1
2412
+ },
2413
+ "title": {
2414
+ "kind": "string",
2415
+ "minLength": 1
2416
+ }
2417
+ },
2418
+ "required": [
2419
+ "id",
2420
+ "title"
2421
+ ],
2422
+ "unknownKeys": "strip"
2423
+ }
2424
+ },
2425
+ "sourceApps": {
2426
+ "kind": "array",
2427
+ "items": {
2428
+ "kind": "object",
2429
+ "properties": {
2430
+ "id": {
2431
+ "kind": "string",
2432
+ "minLength": 1
2433
+ },
2434
+ "tenantId": {
2435
+ "kind": "string",
2436
+ "minLength": 1
2437
+ },
2438
+ "tenantTitle": {
2439
+ "kind": "string",
2440
+ "minLength": 1
2441
+ },
2442
+ "title": {
2443
+ "kind": "string",
2444
+ "minLength": 1
2445
+ },
2446
+ "serviceIds": {
2447
+ "kind": "array",
2448
+ "items": {
2449
+ "kind": "string"
2450
+ },
2451
+ "default": []
2452
+ },
2453
+ "requiredServiceIds": {
2454
+ "kind": "array",
2455
+ "items": {
2456
+ "kind": "string"
2457
+ },
2458
+ "default": []
2459
+ }
2460
+ },
2461
+ "required": [
2462
+ "id",
2463
+ "tenantId",
2464
+ "tenantTitle",
2465
+ "title",
2466
+ "serviceIds",
2467
+ "requiredServiceIds"
2468
+ ],
2469
+ "unknownKeys": "strip"
2470
+ }
2471
+ },
2472
+ "groups": {
2473
+ "kind": "array",
2474
+ "items": {
2475
+ "kind": "object",
2476
+ "properties": {
2477
+ "id": {
2478
+ "kind": "string",
2479
+ "minLength": 1
2480
+ },
2481
+ "name": {
2482
+ "kind": "string",
2483
+ "minLength": 1
2484
+ },
2485
+ "sourceTenantId": {
2486
+ "kind": "string",
2487
+ "minLength": 1
2488
+ },
2489
+ "sourceAppId": {
2490
+ "kind": "string",
2491
+ "minLength": 1
2492
+ },
2493
+ "sourceLabel": {
2494
+ "kind": "string",
2495
+ "minLength": 1
2496
+ },
2497
+ "expiresInDays": {
2498
+ "kind": "optional",
2499
+ "inner": {
2500
+ "kind": "int",
2501
+ "min": 1
2502
+ }
2503
+ },
2504
+ "oidc": {
2505
+ "kind": "optional",
2506
+ "inner": {
2507
+ "kind": "object",
2508
+ "properties": {
2509
+ "issuer": {
2510
+ "kind": "string",
2511
+ "minLength": 1
2512
+ },
2513
+ "audience": {
2514
+ "kind": "string",
2515
+ "minLength": 1
2516
+ },
2517
+ "jwksUri": {
2518
+ "kind": "string",
2519
+ "minLength": 1
2520
+ },
2521
+ "subjectPrefix": {
2522
+ "kind": "optional",
2523
+ "inner": {
2524
+ "kind": "string"
2525
+ }
2526
+ },
2527
+ "requiredClaimsJson": {
2528
+ "kind": "string"
2529
+ }
2530
+ },
2531
+ "required": [
2532
+ "issuer",
2533
+ "audience",
2534
+ "jwksUri",
2535
+ "requiredClaimsJson"
2536
+ ],
2537
+ "unknownKeys": "strip"
2538
+ }
2539
+ },
2540
+ "services": {
2541
+ "kind": "array",
2542
+ "items": {
2543
+ "kind": "object",
2544
+ "properties": {
2545
+ "serviceId": {
2546
+ "kind": "string",
2547
+ "minLength": 1
2548
+ },
2549
+ "title": {
2550
+ "kind": "string",
2551
+ "minLength": 1
2552
+ },
2553
+ "fields": {
2554
+ "kind": "array",
2555
+ "items": {
2556
+ "kind": "object",
2557
+ "properties": {
2558
+ "key": {
2559
+ "kind": "string",
2560
+ "minLength": 1
2561
+ },
2562
+ "title": {
2563
+ "kind": "string",
2564
+ "minLength": 1
2565
+ },
2566
+ "description": {
2567
+ "kind": "string"
2568
+ },
2569
+ "scope": {
2570
+ "kind": "enum",
2571
+ "values": [
2572
+ "tenant",
2573
+ "app"
2574
+ ]
2575
+ },
2576
+ "secret": {
2577
+ "kind": "bool"
2578
+ },
2579
+ "required": {
2580
+ "kind": "bool"
2581
+ },
2582
+ "control": {
2583
+ "kind": "optional",
2584
+ "inner": {
2585
+ "kind": "string"
2586
+ }
2587
+ },
2588
+ "options": {
2589
+ "kind": "array",
2590
+ "items": {
2591
+ "kind": "object",
2592
+ "properties": {
2593
+ "value": {
2594
+ "kind": "string"
2595
+ },
2596
+ "label": {
2597
+ "kind": "string"
2598
+ }
2599
+ },
2600
+ "required": [
2601
+ "value",
2602
+ "label"
2603
+ ],
2604
+ "unknownKeys": "strip"
2605
+ },
2606
+ "default": []
2607
+ }
2608
+ },
2609
+ "required": [
2610
+ "key",
2611
+ "title",
2612
+ "description",
2613
+ "scope",
2614
+ "secret",
2615
+ "required",
2616
+ "options"
2617
+ ],
2618
+ "unknownKeys": "strip"
2619
+ },
2620
+ "default": []
2621
+ },
2622
+ "encryptedTenantConfig": {
2623
+ "kind": "string"
2624
+ },
2625
+ "encryptedAppConfig": {
2626
+ "kind": "string"
2627
+ }
2628
+ },
2629
+ "required": [
2630
+ "serviceId",
2631
+ "title",
2632
+ "fields",
2633
+ "encryptedTenantConfig",
2634
+ "encryptedAppConfig"
2635
+ ],
2636
+ "unknownKeys": "strip"
2637
+ }
2638
+ },
2639
+ "deployments": {
2640
+ "kind": "array",
2641
+ "items": {
2642
+ "kind": "object",
2643
+ "properties": {
2644
+ "id": {
2645
+ "kind": "string",
2646
+ "minLength": 1
2647
+ },
2648
+ "groupId": {
2649
+ "kind": "string",
2650
+ "minLength": 1
2651
+ },
2652
+ "key": {
2653
+ "kind": "string",
2654
+ "minLength": 1
2655
+ },
2656
+ "name": {
2657
+ "kind": "string",
2658
+ "minLength": 1
2659
+ },
2660
+ "hostname": {
2661
+ "kind": "string",
2662
+ "minLength": 1
2663
+ },
2664
+ "expiresInDays": {
2665
+ "kind": "optional",
2666
+ "inner": {
2667
+ "kind": "int",
2668
+ "min": 1
2669
+ }
2670
+ },
2671
+ "expiresAt": {
2672
+ "kind": "optional",
2673
+ "inner": {
2674
+ "kind": "string"
2675
+ }
2676
+ },
2677
+ "createdAt": {
2678
+ "kind": "string",
2679
+ "minLength": 1
2680
+ },
2681
+ "updatedAt": {
2682
+ "kind": "string",
2683
+ "minLength": 1
2684
+ },
2685
+ "ready": {
2686
+ "kind": "bool"
2687
+ },
2688
+ "services": {
2689
+ "kind": "array",
2690
+ "items": {
2691
+ "kind": "object",
2692
+ "properties": {
2693
+ "serviceId": {
2694
+ "kind": "string",
2695
+ "minLength": 1
2696
+ },
2697
+ "instanceId": {
2698
+ "kind": "string",
2699
+ "minLength": 1
2700
+ },
2701
+ "url": {
2702
+ "kind": "string",
2703
+ "minLength": 1
2704
+ },
2705
+ "lastSyncAt": {
2706
+ "kind": "optional",
2707
+ "inner": {
2708
+ "kind": "string"
2709
+ }
2710
+ },
2711
+ "ready": {
2712
+ "kind": "bool"
2713
+ }
2714
+ },
2715
+ "required": [
2716
+ "serviceId",
2717
+ "instanceId",
2718
+ "url",
2719
+ "ready"
2720
+ ],
2721
+ "unknownKeys": "strip"
2722
+ }
2723
+ }
2724
+ },
2725
+ "required": [
2726
+ "id",
2727
+ "groupId",
2728
+ "key",
2729
+ "name",
2730
+ "hostname",
2731
+ "createdAt",
2732
+ "updatedAt",
2733
+ "ready",
2734
+ "services"
2735
+ ],
2736
+ "unknownKeys": "strip"
2737
+ }
2738
+ },
2739
+ "createdAt": {
2740
+ "kind": "string",
2741
+ "minLength": 1
2742
+ },
2743
+ "updatedAt": {
2744
+ "kind": "string",
2745
+ "minLength": 1
2746
+ }
2747
+ },
2748
+ "required": [
2749
+ "id",
2750
+ "name",
2751
+ "sourceTenantId",
2752
+ "sourceAppId",
2753
+ "sourceLabel",
2754
+ "services",
2755
+ "deployments",
2756
+ "createdAt",
2757
+ "updatedAt"
2758
+ ],
2759
+ "unknownKeys": "strip"
2760
+ }
2761
+ },
2762
+ "notice": {
2763
+ "kind": "optional",
2764
+ "inner": {
2765
+ "kind": "string"
2766
+ }
2767
+ },
2768
+ "error": {
2769
+ "kind": "optional",
2770
+ "inner": {
2771
+ "kind": "string"
2772
+ }
2773
+ },
2774
+ "issuedApiKey": {
2775
+ "kind": "optional",
2776
+ "inner": {
2777
+ "kind": "string"
2778
+ }
2779
+ },
2780
+ "issuedCredentials": {
2781
+ "kind": "array",
2782
+ "items": {
2783
+ "kind": "object",
2784
+ "properties": {
2785
+ "serviceId": {
2786
+ "kind": "string",
2787
+ "minLength": 1
2788
+ },
2789
+ "instanceId": {
2790
+ "kind": "string",
2791
+ "minLength": 1
2792
+ },
2793
+ "url": {
2794
+ "kind": "string",
2795
+ "minLength": 1
2796
+ },
2797
+ "controlPlaneUrl": {
2798
+ "kind": "string",
2799
+ "minLength": 1
2800
+ },
2801
+ "apiKey": {
2802
+ "kind": "string",
2803
+ "minLength": 1
2804
+ }
2805
+ },
2806
+ "required": [
2807
+ "serviceId",
2808
+ "instanceId",
2809
+ "url",
2810
+ "controlPlaneUrl",
2811
+ "apiKey"
2812
+ ],
2813
+ "unknownKeys": "strip"
2814
+ },
2815
+ "default": []
2816
+ }
2817
+ },
2818
+ "required": [
2819
+ "title",
2820
+ "previewPath",
2821
+ "deploymentApiBase",
2822
+ "sourceTenants",
2823
+ "sourceApps",
2824
+ "groups",
2825
+ "issuedCredentials"
2826
+ ],
2827
+ "unknownKeys": "strip"
2828
+ },
2829
+ "definitions": {},
2830
+ "extensions": {}
2831
+ },
2832
+ "metadataResponseSchema": {},
2833
+ "renderable": true,
2834
+ "html": {
2835
+ "renderers": {
2836
+ "bootstrap5": {
2837
+ "defaultRenderer": "default",
2838
+ "renderModes": [
2839
+ "page"
2840
+ ],
2841
+ "slots": [
2842
+ "main"
2843
+ ],
2844
+ "renderers": [
2845
+ {
2846
+ "id": "default",
2847
+ "title": "Default Content",
2848
+ "slotId": "main",
2849
+ "renderModes": [
2850
+ "page",
2851
+ "fragment"
2852
+ ]
2853
+ }
2854
+ ]
2855
+ }
2856
+ }
2857
+ },
2858
+ "auth": {
2859
+ "required": true,
2860
+ "callers": [
2861
+ "user"
2862
+ ],
2863
+ "permissions": [
2864
+ {
2865
+ "serviceId": "org.betterportal.config-manager",
2866
+ "viewId": "preview-environments.index",
2867
+ "permissions": [
2868
+ "create"
2869
+ ]
2870
+ }
2871
+ ]
2872
+ },
2873
+ "sitemap": {
2874
+ "kind": "default"
2875
+ },
2876
+ "robots": [],
2877
+ "dependencies": [],
2878
+ "apiContracts": [],
2879
+ "demoScenarios": [
2880
+ {
2881
+ "id": "default",
2882
+ "title": "Default",
2883
+ "response": {
2884
+ "title": "Preview Environments",
2885
+ "previewPath": "/preview-environments",
2886
+ "deploymentApiBase": "/api/preview-groups",
2887
+ "sourceTenants": [],
2888
+ "sourceApps": [],
2889
+ "groups": [],
2890
+ "issuedCredentials": []
2891
+ }
2892
+ }
2893
+ ],
2894
+ "cacheHints": {
2895
+ "ttlSeconds": 0,
2896
+ "varyBy": [
2897
+ "accept",
2898
+ "origin"
2899
+ ]
2900
+ }
2901
+ },
2902
+ {
2903
+ "operationId": "admin.preview-environments.update",
2904
+ "method": "PUT",
2905
+ "title": "Update preview resources",
2906
+ "description": "Update a preview group or deployment expiry.",
2907
+ "querySchema": {},
2908
+ "headersSchema": {},
2909
+ "bodySchema": {},
2910
+ "jsonResponseSchema": {
2911
+ "anyvaliVersion": "1.0",
2912
+ "schemaVersion": "1.1",
2913
+ "root": {
2914
+ "kind": "object",
2915
+ "properties": {
2916
+ "title": {
2917
+ "kind": "string",
2918
+ "minLength": 1
2919
+ },
2920
+ "previewPath": {
2921
+ "kind": "string",
2922
+ "minLength": 1
2923
+ },
2924
+ "deploymentApiBase": {
2925
+ "kind": "string",
2926
+ "minLength": 1
2927
+ },
2928
+ "sourceTenants": {
2929
+ "kind": "array",
2930
+ "items": {
2931
+ "kind": "object",
2932
+ "properties": {
2933
+ "id": {
2934
+ "kind": "string",
2935
+ "minLength": 1
2936
+ },
2937
+ "title": {
2938
+ "kind": "string",
2939
+ "minLength": 1
2940
+ }
2941
+ },
2942
+ "required": [
2943
+ "id",
2944
+ "title"
2945
+ ],
2946
+ "unknownKeys": "strip"
2947
+ }
2948
+ },
2949
+ "sourceApps": {
2950
+ "kind": "array",
2951
+ "items": {
2952
+ "kind": "object",
2953
+ "properties": {
2954
+ "id": {
2955
+ "kind": "string",
2956
+ "minLength": 1
2957
+ },
2958
+ "tenantId": {
2959
+ "kind": "string",
2960
+ "minLength": 1
2961
+ },
2962
+ "tenantTitle": {
2963
+ "kind": "string",
2964
+ "minLength": 1
2965
+ },
2966
+ "title": {
2967
+ "kind": "string",
2968
+ "minLength": 1
2969
+ },
2970
+ "serviceIds": {
2971
+ "kind": "array",
2972
+ "items": {
2973
+ "kind": "string"
2974
+ },
2975
+ "default": []
2976
+ },
2977
+ "requiredServiceIds": {
2978
+ "kind": "array",
2979
+ "items": {
2980
+ "kind": "string"
2981
+ },
2982
+ "default": []
2983
+ }
2984
+ },
2985
+ "required": [
2986
+ "id",
2987
+ "tenantId",
2988
+ "tenantTitle",
2989
+ "title",
2990
+ "serviceIds",
2991
+ "requiredServiceIds"
2992
+ ],
2993
+ "unknownKeys": "strip"
2994
+ }
2995
+ },
2996
+ "groups": {
2997
+ "kind": "array",
2998
+ "items": {
2999
+ "kind": "object",
3000
+ "properties": {
3001
+ "id": {
3002
+ "kind": "string",
3003
+ "minLength": 1
3004
+ },
3005
+ "name": {
3006
+ "kind": "string",
3007
+ "minLength": 1
3008
+ },
3009
+ "sourceTenantId": {
3010
+ "kind": "string",
3011
+ "minLength": 1
3012
+ },
3013
+ "sourceAppId": {
3014
+ "kind": "string",
3015
+ "minLength": 1
3016
+ },
3017
+ "sourceLabel": {
3018
+ "kind": "string",
3019
+ "minLength": 1
3020
+ },
3021
+ "expiresInDays": {
3022
+ "kind": "optional",
3023
+ "inner": {
3024
+ "kind": "int",
3025
+ "min": 1
3026
+ }
3027
+ },
3028
+ "oidc": {
3029
+ "kind": "optional",
3030
+ "inner": {
3031
+ "kind": "object",
3032
+ "properties": {
3033
+ "issuer": {
3034
+ "kind": "string",
3035
+ "minLength": 1
3036
+ },
3037
+ "audience": {
3038
+ "kind": "string",
3039
+ "minLength": 1
3040
+ },
3041
+ "jwksUri": {
3042
+ "kind": "string",
3043
+ "minLength": 1
3044
+ },
3045
+ "subjectPrefix": {
3046
+ "kind": "optional",
3047
+ "inner": {
3048
+ "kind": "string"
3049
+ }
3050
+ },
3051
+ "requiredClaimsJson": {
3052
+ "kind": "string"
3053
+ }
3054
+ },
3055
+ "required": [
3056
+ "issuer",
3057
+ "audience",
3058
+ "jwksUri",
3059
+ "requiredClaimsJson"
3060
+ ],
3061
+ "unknownKeys": "strip"
3062
+ }
3063
+ },
3064
+ "services": {
3065
+ "kind": "array",
3066
+ "items": {
3067
+ "kind": "object",
3068
+ "properties": {
3069
+ "serviceId": {
3070
+ "kind": "string",
3071
+ "minLength": 1
3072
+ },
3073
+ "title": {
3074
+ "kind": "string",
3075
+ "minLength": 1
3076
+ },
3077
+ "fields": {
3078
+ "kind": "array",
3079
+ "items": {
3080
+ "kind": "object",
3081
+ "properties": {
3082
+ "key": {
3083
+ "kind": "string",
3084
+ "minLength": 1
3085
+ },
3086
+ "title": {
3087
+ "kind": "string",
3088
+ "minLength": 1
3089
+ },
3090
+ "description": {
3091
+ "kind": "string"
3092
+ },
3093
+ "scope": {
3094
+ "kind": "enum",
3095
+ "values": [
3096
+ "tenant",
3097
+ "app"
3098
+ ]
3099
+ },
3100
+ "secret": {
3101
+ "kind": "bool"
3102
+ },
3103
+ "required": {
3104
+ "kind": "bool"
3105
+ },
3106
+ "control": {
3107
+ "kind": "optional",
3108
+ "inner": {
3109
+ "kind": "string"
3110
+ }
3111
+ },
3112
+ "options": {
3113
+ "kind": "array",
3114
+ "items": {
3115
+ "kind": "object",
3116
+ "properties": {
3117
+ "value": {
3118
+ "kind": "string"
3119
+ },
3120
+ "label": {
3121
+ "kind": "string"
3122
+ }
3123
+ },
3124
+ "required": [
3125
+ "value",
3126
+ "label"
3127
+ ],
3128
+ "unknownKeys": "strip"
3129
+ },
3130
+ "default": []
3131
+ }
3132
+ },
3133
+ "required": [
3134
+ "key",
3135
+ "title",
3136
+ "description",
3137
+ "scope",
3138
+ "secret",
3139
+ "required",
3140
+ "options"
3141
+ ],
3142
+ "unknownKeys": "strip"
3143
+ },
3144
+ "default": []
3145
+ },
3146
+ "encryptedTenantConfig": {
3147
+ "kind": "string"
3148
+ },
3149
+ "encryptedAppConfig": {
3150
+ "kind": "string"
3151
+ }
3152
+ },
3153
+ "required": [
3154
+ "serviceId",
3155
+ "title",
3156
+ "fields",
3157
+ "encryptedTenantConfig",
3158
+ "encryptedAppConfig"
3159
+ ],
3160
+ "unknownKeys": "strip"
3161
+ }
3162
+ },
3163
+ "deployments": {
3164
+ "kind": "array",
3165
+ "items": {
3166
+ "kind": "object",
3167
+ "properties": {
3168
+ "id": {
3169
+ "kind": "string",
3170
+ "minLength": 1
3171
+ },
3172
+ "groupId": {
3173
+ "kind": "string",
3174
+ "minLength": 1
3175
+ },
3176
+ "key": {
3177
+ "kind": "string",
3178
+ "minLength": 1
3179
+ },
3180
+ "name": {
3181
+ "kind": "string",
3182
+ "minLength": 1
3183
+ },
3184
+ "hostname": {
3185
+ "kind": "string",
3186
+ "minLength": 1
3187
+ },
3188
+ "expiresInDays": {
3189
+ "kind": "optional",
3190
+ "inner": {
3191
+ "kind": "int",
3192
+ "min": 1
3193
+ }
3194
+ },
3195
+ "expiresAt": {
3196
+ "kind": "optional",
3197
+ "inner": {
3198
+ "kind": "string"
3199
+ }
3200
+ },
3201
+ "createdAt": {
3202
+ "kind": "string",
3203
+ "minLength": 1
3204
+ },
3205
+ "updatedAt": {
3206
+ "kind": "string",
3207
+ "minLength": 1
3208
+ },
3209
+ "ready": {
3210
+ "kind": "bool"
3211
+ },
3212
+ "services": {
3213
+ "kind": "array",
3214
+ "items": {
3215
+ "kind": "object",
3216
+ "properties": {
3217
+ "serviceId": {
3218
+ "kind": "string",
3219
+ "minLength": 1
3220
+ },
3221
+ "instanceId": {
3222
+ "kind": "string",
3223
+ "minLength": 1
3224
+ },
3225
+ "url": {
3226
+ "kind": "string",
3227
+ "minLength": 1
3228
+ },
3229
+ "lastSyncAt": {
3230
+ "kind": "optional",
3231
+ "inner": {
3232
+ "kind": "string"
3233
+ }
3234
+ },
3235
+ "ready": {
3236
+ "kind": "bool"
3237
+ }
3238
+ },
3239
+ "required": [
3240
+ "serviceId",
3241
+ "instanceId",
3242
+ "url",
3243
+ "ready"
3244
+ ],
3245
+ "unknownKeys": "strip"
3246
+ }
3247
+ }
3248
+ },
3249
+ "required": [
3250
+ "id",
3251
+ "groupId",
3252
+ "key",
3253
+ "name",
3254
+ "hostname",
3255
+ "createdAt",
3256
+ "updatedAt",
3257
+ "ready",
3258
+ "services"
3259
+ ],
3260
+ "unknownKeys": "strip"
3261
+ }
3262
+ },
3263
+ "createdAt": {
3264
+ "kind": "string",
3265
+ "minLength": 1
3266
+ },
3267
+ "updatedAt": {
3268
+ "kind": "string",
3269
+ "minLength": 1
3270
+ }
3271
+ },
3272
+ "required": [
3273
+ "id",
3274
+ "name",
3275
+ "sourceTenantId",
3276
+ "sourceAppId",
3277
+ "sourceLabel",
3278
+ "services",
3279
+ "deployments",
3280
+ "createdAt",
3281
+ "updatedAt"
3282
+ ],
3283
+ "unknownKeys": "strip"
3284
+ }
3285
+ },
3286
+ "notice": {
3287
+ "kind": "optional",
3288
+ "inner": {
3289
+ "kind": "string"
3290
+ }
3291
+ },
3292
+ "error": {
3293
+ "kind": "optional",
3294
+ "inner": {
3295
+ "kind": "string"
3296
+ }
3297
+ },
3298
+ "issuedApiKey": {
3299
+ "kind": "optional",
3300
+ "inner": {
3301
+ "kind": "string"
3302
+ }
3303
+ },
3304
+ "issuedCredentials": {
3305
+ "kind": "array",
3306
+ "items": {
3307
+ "kind": "object",
3308
+ "properties": {
3309
+ "serviceId": {
3310
+ "kind": "string",
3311
+ "minLength": 1
3312
+ },
3313
+ "instanceId": {
3314
+ "kind": "string",
3315
+ "minLength": 1
3316
+ },
3317
+ "url": {
3318
+ "kind": "string",
3319
+ "minLength": 1
3320
+ },
3321
+ "controlPlaneUrl": {
3322
+ "kind": "string",
3323
+ "minLength": 1
3324
+ },
3325
+ "apiKey": {
3326
+ "kind": "string",
3327
+ "minLength": 1
3328
+ }
3329
+ },
3330
+ "required": [
3331
+ "serviceId",
3332
+ "instanceId",
3333
+ "url",
3334
+ "controlPlaneUrl",
3335
+ "apiKey"
3336
+ ],
3337
+ "unknownKeys": "strip"
3338
+ },
3339
+ "default": []
3340
+ }
3341
+ },
3342
+ "required": [
3343
+ "title",
3344
+ "previewPath",
3345
+ "deploymentApiBase",
3346
+ "sourceTenants",
3347
+ "sourceApps",
3348
+ "groups",
3349
+ "issuedCredentials"
3350
+ ],
3351
+ "unknownKeys": "strip"
3352
+ },
3353
+ "definitions": {},
3354
+ "extensions": {}
3355
+ },
3356
+ "metadataResponseSchema": {},
3357
+ "renderable": true,
3358
+ "html": {
3359
+ "renderers": {
3360
+ "bootstrap5": {
3361
+ "defaultRenderer": "default",
3362
+ "renderModes": [
3363
+ "page"
3364
+ ],
3365
+ "slots": [
3366
+ "main"
3367
+ ],
3368
+ "renderers": [
3369
+ {
3370
+ "id": "default",
3371
+ "title": "Default Content",
3372
+ "slotId": "main",
3373
+ "renderModes": [
3374
+ "page",
3375
+ "fragment"
3376
+ ]
3377
+ }
3378
+ ]
3379
+ }
3380
+ }
3381
+ },
3382
+ "auth": {
3383
+ "required": true,
3384
+ "callers": [
3385
+ "user"
3386
+ ],
3387
+ "permissions": [
3388
+ {
3389
+ "serviceId": "org.betterportal.config-manager",
3390
+ "viewId": "preview-environments.index",
3391
+ "permissions": [
3392
+ "update"
3393
+ ]
3394
+ }
3395
+ ]
3396
+ },
3397
+ "sitemap": {
3398
+ "kind": "default"
3399
+ },
3400
+ "robots": [],
3401
+ "dependencies": [],
3402
+ "apiContracts": [],
3403
+ "demoScenarios": [
3404
+ {
3405
+ "id": "default",
3406
+ "title": "Default",
3407
+ "response": {
3408
+ "title": "Preview Environments",
3409
+ "previewPath": "/preview-environments",
3410
+ "deploymentApiBase": "/api/preview-groups",
3411
+ "sourceTenants": [],
3412
+ "sourceApps": [],
3413
+ "groups": [],
3414
+ "issuedCredentials": []
3415
+ }
3416
+ }
3417
+ ],
3418
+ "cacheHints": {
3419
+ "ttlSeconds": 0,
3420
+ "varyBy": [
3421
+ "accept",
3422
+ "origin"
3423
+ ]
3424
+ }
3425
+ }
3426
+ ]
3427
+ },
1309
3428
  {
1310
3429
  "viewId": "routes.index",
1311
3430
  "title": "Route Designer",
@@ -1838,7 +3957,25 @@
1838
3957
  "kind": "string"
1839
3958
  },
1840
3959
  "metadata": {
1841
- "description": "ISO timestamp when the service last checked in or synced."
3960
+ "description": "ISO timestamp when the service last authenticated with config-manager."
3961
+ }
3962
+ },
3963
+ "lastSyncAt": {
3964
+ "kind": "optional",
3965
+ "inner": {
3966
+ "kind": "string"
3967
+ },
3968
+ "metadata": {
3969
+ "description": "ISO timestamp when config-manager last delivered configuration to the service."
3970
+ }
3971
+ },
3972
+ "syncedVersion": {
3973
+ "kind": "optional",
3974
+ "inner": {
3975
+ "kind": "string"
3976
+ },
3977
+ "metadata": {
3978
+ "description": "Latest service manifest version received by config-manager."
1842
3979
  }
1843
3980
  },
1844
3981
  "enabled": {
@@ -4717,6 +6854,36 @@
4717
6854
  "fragments": [],
4718
6855
  "components": []
4719
6856
  },
6857
+ {
6858
+ "viewId": "preview-environments.index",
6859
+ "path": "/preview-environments",
6860
+ "pathVariants": [],
6861
+ "operations": [
6862
+ {
6863
+ "operationId": "admin.preview-environments.delete",
6864
+ "method": "DELETE"
6865
+ },
6866
+ {
6867
+ "operationId": "admin.preview-environments.view",
6868
+ "method": "GET"
6869
+ },
6870
+ {
6871
+ "operationId": "admin.preview-environments.create",
6872
+ "method": "POST"
6873
+ },
6874
+ {
6875
+ "operationId": "admin.preview-environments.update",
6876
+ "method": "PUT"
6877
+ }
6878
+ ],
6879
+ "paramNames": [],
6880
+ "renderers": [
6881
+ "bootstrap5"
6882
+ ],
6883
+ "hasFragments": false,
6884
+ "fragments": [],
6885
+ "components": []
6886
+ },
4720
6887
  {
4721
6888
  "viewId": "routes.index",
4722
6889
  "path": "/routes",