@rathnasgala2/schemas 2.20.3 → 2.22.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.
@@ -234,6 +234,24 @@ components:
234
234
  - activationDetectionPlanDigest
235
235
  - activationDetectionObservation
236
236
  type: object
237
+ AppearanceColorMode:
238
+ enum:
239
+ - light
240
+ - dark
241
+ - system
242
+ type: string
243
+ AppearanceThemeId:
244
+ description: |
245
+ The closed catalog of themes the server can select. `default` names
246
+ `@rathnasgala2/theme-default`, `amaze` names
247
+ `@rathnasgala2/theme-amaze`, and so on.
248
+ enum:
249
+ - default
250
+ - amaze
251
+ - flashy
252
+ - minimal
253
+ - zebra
254
+ type: string
237
255
  AuthenticatorState:
238
256
  enum:
239
257
  - ACTIVE
@@ -291,6 +309,20 @@ components:
291
309
  - kind
292
310
  - label
293
311
  type: object
312
+ ContentChangeAppearanceEntry:
313
+ additionalProperties: false
314
+ description: |
315
+ The theme selection inside a batch `content-changes:plan` request.
316
+ Both members are required.
317
+ properties:
318
+ colorModeDefault:
319
+ $ref: "#/components/schemas/AppearanceColorMode"
320
+ themeId:
321
+ $ref: "#/components/schemas/AppearanceThemeId"
322
+ required:
323
+ - themeId
324
+ - colorModeDefault
325
+ type: object
294
326
  ContentChangeAssetEntry:
295
327
  additionalProperties: false
296
328
  allOf:
@@ -1109,6 +1141,40 @@ components:
1109
1141
  - state
1110
1142
  - operationId
1111
1143
  type: object
1144
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdAppearanceResponse:
1145
+ additionalProperties: false
1146
+ properties:
1147
+ built:
1148
+ oneOf:
1149
+ - $ref: "#/components/schemas/PublicationAppearanceBuilt"
1150
+ - type: "null"
1151
+ catalog:
1152
+ items:
1153
+ $ref: "#/components/schemas/PublicationAppearanceCatalogEntry"
1154
+ maxItems: 5
1155
+ type: array
1156
+ consistent:
1157
+ type: boolean
1158
+ head:
1159
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
1160
+ type: string
1161
+ openChange:
1162
+ oneOf:
1163
+ - $ref: "#/components/schemas/PublicationAppearanceOpenChange"
1164
+ - type: "null"
1165
+ selected:
1166
+ $ref: "#/components/schemas/PublicationAppearanceSelected"
1167
+ setUp:
1168
+ type: boolean
1169
+ required:
1170
+ - head
1171
+ - setUp
1172
+ - selected
1173
+ - built
1174
+ - consistent
1175
+ - catalog
1176
+ - openChange
1177
+ type: object
1112
1178
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsResponse:
1113
1179
  additionalProperties: false
1114
1180
  properties:
@@ -1446,6 +1512,48 @@ components:
1446
1512
  - version
1447
1513
  - state
1448
1514
  type: object
1515
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdHistoryResponse:
1516
+ additionalProperties: false
1517
+ allOf:
1518
+ - else:
1519
+ properties:
1520
+ nextCursor:
1521
+ type: "null"
1522
+ if:
1523
+ properties:
1524
+ hasMore:
1525
+ not:
1526
+ enum:
1527
+ - false
1528
+ type: boolean
1529
+ x-gala-const: true
1530
+ required:
1531
+ - hasMore
1532
+ then:
1533
+ properties:
1534
+ nextCursor:
1535
+ type: string
1536
+ required:
1537
+ - nextCursor
1538
+ properties:
1539
+ hasMore:
1540
+ type: boolean
1541
+ items:
1542
+ items:
1543
+ $ref: "#/components/schemas/HistoryEntry"
1544
+ maxItems: 100
1545
+ type: array
1546
+ nextCursor:
1547
+ description: Opaque cursor for the next page. Present and non-null exactly when `hasMore` is true; absent or null when `hasMore` is false. The length bounds constrain the string branch only.
1548
+ maxLength: 2048
1549
+ minLength: 1
1550
+ type:
1551
+ - string
1552
+ - "null"
1553
+ required:
1554
+ - items
1555
+ - hasMore
1556
+ type: object
1449
1557
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdRepositoryBindingsCurrentResponse:
1450
1558
  additionalProperties: false
1451
1559
  properties:
@@ -1578,6 +1686,8 @@ components:
1578
1686
  format: uuid
1579
1687
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1580
1688
  type: string
1689
+ publishingPolicy:
1690
+ $ref: "#/components/schemas/PublishingPolicy"
1581
1691
  slug:
1582
1692
  maxLength: 80
1583
1693
  minLength: 1
@@ -1643,6 +1753,61 @@ components:
1643
1753
  - items
1644
1754
  - hasMore
1645
1755
  type: object
1756
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteResponse:
1757
+ additionalProperties: false
1758
+ allOf:
1759
+ - else:
1760
+ not:
1761
+ required:
1762
+ - publishing
1763
+ if:
1764
+ properties:
1765
+ state:
1766
+ pattern: ^PUBLISHING$
1767
+ type: string
1768
+ x-gala-const: PUBLISHING
1769
+ required:
1770
+ - state
1771
+ then:
1772
+ required:
1773
+ - publishing
1774
+ description: Everything a Home screen needs in one read. `url` is the live site address, `null` when nothing has been published. `lastPublished` is absent when `state` is `NEVER_PUBLISHED`. `publishing` is present exactly while `state` is `PUBLISHING`.
1775
+ properties:
1776
+ attention:
1777
+ items:
1778
+ $ref: "#/components/schemas/SiteAttentionItem"
1779
+ maxItems: 20
1780
+ type: array
1781
+ lastPublished:
1782
+ $ref: "#/components/schemas/SiteLastPublished"
1783
+ pendingChanges:
1784
+ items:
1785
+ $ref: "#/components/schemas/SitePendingChange"
1786
+ maxItems: 200
1787
+ type: array
1788
+ publishing:
1789
+ $ref: "#/components/schemas/SitePublishing"
1790
+ state:
1791
+ enum:
1792
+ - LIVE
1793
+ - PUBLISHING
1794
+ - NEVER_PUBLISHED
1795
+ - FAILED
1796
+ - UNKNOWN
1797
+ type: string
1798
+ url:
1799
+ maxLength: 2048
1800
+ minLength: 1
1801
+ pattern: ^https://
1802
+ type:
1803
+ - string
1804
+ - "null"
1805
+ required:
1806
+ - url
1807
+ - state
1808
+ - pendingChanges
1809
+ - attention
1810
+ type: object
1646
1811
  GetOrganizationsByOrganizationIdPublicationsResponse:
1647
1812
  additionalProperties: false
1648
1813
  allOf:
@@ -2165,6 +2330,149 @@ components:
2165
2330
  - PRIVATE
2166
2331
  - PUBLIC
2167
2332
  type: string
2333
+ HistoryChange:
2334
+ additionalProperties: false
2335
+ allOf:
2336
+ - else:
2337
+ properties:
2338
+ action:
2339
+ enum:
2340
+ - CREATE
2341
+ - EDIT
2342
+ - DELETE
2343
+ if:
2344
+ properties:
2345
+ kind:
2346
+ pattern: ^LOOK$
2347
+ type: string
2348
+ x-gala-const: LOOK
2349
+ required:
2350
+ - kind
2351
+ then:
2352
+ properties:
2353
+ action:
2354
+ pattern: ^CHANGE$
2355
+ type: string
2356
+ x-gala-const: CHANGE
2357
+ properties:
2358
+ action:
2359
+ description: "`CHANGE` is used for `LOOK` and only for `LOOK`; `POST` and `PAGE` use `CREATE`, `EDIT` or `DELETE`."
2360
+ enum:
2361
+ - CREATE
2362
+ - EDIT
2363
+ - DELETE
2364
+ - CHANGE
2365
+ type: string
2366
+ kind:
2367
+ enum:
2368
+ - POST
2369
+ - PAGE
2370
+ - LOOK
2371
+ type: string
2372
+ path:
2373
+ description: Repository path of the post or page; absent for `LOOK`.
2374
+ maxLength: 512
2375
+ minLength: 1
2376
+ type: string
2377
+ theme:
2378
+ $ref: "#/components/schemas/SiteThemeChange"
2379
+ title:
2380
+ maxLength: 200
2381
+ minLength: 1
2382
+ type: string
2383
+ required:
2384
+ - kind
2385
+ - action
2386
+ - title
2387
+ type: object
2388
+ HistoryEntry:
2389
+ additionalProperties: false
2390
+ allOf:
2391
+ - else:
2392
+ not:
2393
+ required:
2394
+ - failure
2395
+ required:
2396
+ - versionId
2397
+ if:
2398
+ properties:
2399
+ outcome:
2400
+ pattern: ^FAILED$
2401
+ type: string
2402
+ x-gala-const: FAILED
2403
+ required:
2404
+ - outcome
2405
+ then:
2406
+ not:
2407
+ required:
2408
+ - versionId
2409
+ required:
2410
+ - failure
2411
+ description: One version that went live, or the trailing failed attempt. `versionId` is the deployment generation id and is accepted by `POST .../deployments:rollback` as `generationId`.
2412
+ properties:
2413
+ actor:
2414
+ $ref: "#/components/schemas/SiteActor"
2415
+ at:
2416
+ $ref: "#/components/schemas/PortableProblemRfc3339"
2417
+ changes:
2418
+ items:
2419
+ $ref: "#/components/schemas/HistoryChange"
2420
+ maxItems: 200
2421
+ type: array
2422
+ failedAttemptsBefore:
2423
+ $ref: "#/components/schemas/HistoryFailedAttempts"
2424
+ failure:
2425
+ $ref: "#/components/schemas/HistoryFailure"
2426
+ outcome:
2427
+ description: "`LIVE`: serving visitors now. `REPLACED`: went live and was superseded. `RESTORED`: went live by restoring an earlier version (`restoredFromVersionId`); once superseded it reads `REPLACED`. `FAILED`: only the trailing entry when the latest attempt failed."
2428
+ enum:
2429
+ - LIVE
2430
+ - REPLACED
2431
+ - RESTORED
2432
+ - FAILED
2433
+ type: string
2434
+ restoredFromVersionId:
2435
+ format: uuid
2436
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2437
+ type: string
2438
+ versionId:
2439
+ format: uuid
2440
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
2441
+ type: string
2442
+ required:
2443
+ - at
2444
+ - actor
2445
+ - outcome
2446
+ - changes
2447
+ - failedAttemptsBefore
2448
+ type: object
2449
+ HistoryFailedAttempts:
2450
+ additionalProperties: false
2451
+ description: Failed publish attempts since the previous entry, folded into this one.
2452
+ properties:
2453
+ count:
2454
+ minimum: 0
2455
+ type: integer
2456
+ lastReason:
2457
+ maxLength: 80
2458
+ minLength: 1
2459
+ type: string
2460
+ required:
2461
+ - count
2462
+ type: object
2463
+ HistoryFailure:
2464
+ additionalProperties: false
2465
+ properties:
2466
+ reasonCode:
2467
+ maxLength: 80
2468
+ minLength: 1
2469
+ type: string
2470
+ retryable:
2471
+ type: boolean
2472
+ required:
2473
+ - reasonCode
2474
+ - retryable
2475
+ type: object
2168
2476
  KernelAttemptSubmission:
2169
2477
  additionalProperties: false
2170
2478
  allOf:
@@ -3454,6 +3762,16 @@ components:
3454
3762
  maxLength: 80
3455
3763
  minLength: 1
3456
3764
  type: string
3765
+ publishingPolicy:
3766
+ additionalProperties: false
3767
+ description: "A partial update of `PublishingPolicy`: an omitted member keeps its current value."
3768
+ minProperties: 1
3769
+ properties:
3770
+ galascribeMerges:
3771
+ type: boolean
3772
+ requireReview:
3773
+ type: boolean
3774
+ type: object
3457
3775
  slug:
3458
3776
  maxLength: 80
3459
3777
  minLength: 1
@@ -3471,6 +3789,8 @@ components:
3471
3789
  format: uuid
3472
3790
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
3473
3791
  type: string
3792
+ publishingPolicy:
3793
+ $ref: "#/components/schemas/PublishingPolicy"
3474
3794
  slug:
3475
3795
  maxLength: 80
3476
3796
  minLength: 1
@@ -9765,6 +10085,26 @@ components:
9765
10085
  PostOrganizationsByOrganizationIdPublicationImportsResponse:
9766
10086
  allOf:
9767
10087
  - $ref: "#/components/schemas/OperationResponse"
10088
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest:
10089
+ additionalProperties: false
10090
+ properties:
10091
+ changeIds:
10092
+ items:
10093
+ format: uuid
10094
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
10095
+ type: string
10096
+ maxItems: 20
10097
+ minItems: 1
10098
+ type: array
10099
+ uniqueItems: true
10100
+ scheduledFor:
10101
+ $ref: "#/components/schemas/PortableProblemRfc3339"
10102
+ required:
10103
+ - changeIds
10104
+ type: object
10105
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse:
10106
+ allOf:
10107
+ - $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdPublishesResponse"
9768
10108
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest:
9769
10109
  oneOf:
9770
10110
  - additionalProperties: false
@@ -9850,12 +10190,20 @@ components:
9850
10190
  Two request shapes, both accepted. The 2.13.0 single-document shape
9851
10191
  (`path`, `contentDigest`, `expectedHead`) plans one document write
9852
10192
  against the exact expected head. The additive batch shape
9853
- (`baseRevision` and at least one of `documents`/`assets`) plans up
9854
- to 20 documents and 40 assets -- each `PUT` with its own text or
9855
- bytes and digest, each `DELETE` naming only its path -- in one
9856
- change, against the exact expected main-branch head asserted as
9857
- `baseRevision`. A request mixing the two shapes, or a batch request
9858
- naming neither `documents` nor `assets`, is `422 VALIDATION_FAILED`.
10193
+ (`baseRevision` and at least one of `documents`/`assets`/`appearance`)
10194
+ plans up to 20 documents and 40 assets -- each `PUT` with its own
10195
+ text or bytes and digest, each `DELETE` naming only its path -- and
10196
+ optionally one theme selection in one change, against the exact
10197
+ expected main-branch head asserted as `baseRevision`. A request
10198
+ mixing the two shapes, or a batch request naming none of
10199
+ `documents`, `assets` and `appearance`, is `422 VALIDATION_FAILED`.
10200
+ `appearance` names a catalog theme and a default colour mode; the
10201
+ server writes `gala/appearance.json` (only `theme` and
10202
+ `colorMode.default` change, every other member is preserved) and the
10203
+ `gala.lock.json` `theme` block from its closed theme catalog, both
10204
+ in the same change. An `appearance` equal to the current selection
10205
+ is `422 VALIDATION_FAILED` pointed at `/appearance`. Document paths
10206
+ under `gala/` and `gala.lock.json` remain forbidden.
9859
10207
  The change's total serialized size must not exceed 100 MiB;
9860
10208
  `assets[].bytesBase64` is base64 over raw bytes, so what counts
9861
10209
  against the per-asset and 100 MiB per-change bounds is the decoded
@@ -9863,6 +10211,8 @@ components:
9863
10211
  category: image 5 MiB, sound 20 MiB, video 50 MiB (documents are
9864
10212
  unchanged since 2.14.0: 20 documents, 1 MiB text each).
9865
10213
  properties:
10214
+ appearance:
10215
+ $ref: "#/components/schemas/ContentChangeAppearanceEntry"
9866
10216
  assets:
9867
10217
  items:
9868
10218
  $ref: "#/components/schemas/ContentChangeAssetEntry"
@@ -10920,37 +11270,119 @@ components:
10920
11270
  type: object
10921
11271
  Problem:
10922
11272
  $ref: "#/components/schemas/PortableProblemDocument"
10923
- PublicationState:
10924
- enum:
10925
- - PROVISIONING
10926
- - ACTIVE
10927
- - PAUSED
10928
- - RETIRING
10929
- - RETIRED
10930
- type: string
10931
- PublicationSummary:
11273
+ PublicationAppearanceBuilt:
10932
11274
  additionalProperties: false
11275
+ description: |
11276
+ From the `theme` block of `gala.lock.json`, the sole authority for the
11277
+ theme a build uses. `themeId` is `null` when the locked package is not
11278
+ in the catalog.
10933
11279
  properties:
10934
- name:
10935
- maxLength: 80
11280
+ themeId:
11281
+ oneOf:
11282
+ - $ref: "#/components/schemas/AppearanceThemeId"
11283
+ - type: "null"
11284
+ themePackage:
11285
+ maxLength: 214
10936
11286
  minLength: 1
10937
11287
  type: string
10938
- publicationId:
10939
- format: uuid
10940
- pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
11288
+ version:
11289
+ maxLength: 256
11290
+ minLength: 1
10941
11291
  type: string
10942
- slug:
11292
+ required:
11293
+ - themeId
11294
+ - themePackage
11295
+ - version
11296
+ type: object
11297
+ PublicationAppearanceCatalogEntry:
11298
+ additionalProperties: false
11299
+ properties:
11300
+ description:
11301
+ maxLength: 280
11302
+ minLength: 1
11303
+ type: string
11304
+ displayName:
10943
11305
  maxLength: 80
10944
11306
  minLength: 1
10945
11307
  type: string
10946
- state:
10947
- $ref: "#/components/schemas/PublicationState"
11308
+ package:
11309
+ maxLength: 214
11310
+ minLength: 1
11311
+ type: string
11312
+ themeId:
11313
+ $ref: "#/components/schemas/AppearanceThemeId"
10948
11314
  version:
10949
- format: int64
10950
- minimum: 0
10951
- type: integer
11315
+ maxLength: 256
11316
+ minLength: 1
11317
+ type: string
10952
11318
  required:
10953
- - publicationId
11319
+ - themeId
11320
+ - package
11321
+ - version
11322
+ - displayName
11323
+ - description
11324
+ type: object
11325
+ PublicationAppearanceOpenChange:
11326
+ additionalProperties: false
11327
+ properties:
11328
+ changeId:
11329
+ format: uuid
11330
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
11331
+ type: string
11332
+ required:
11333
+ - changeId
11334
+ type: object
11335
+ PublicationAppearanceSelected:
11336
+ additionalProperties: false
11337
+ description: |
11338
+ From `gala/appearance.json`. `themeId` is `null` ("Custom theme") when
11339
+ `themePackage` is not in the catalog. `themePackage` is the file's
11340
+ `theme` value, a package with its version range.
11341
+ properties:
11342
+ colorModeDefault:
11343
+ $ref: "#/components/schemas/AppearanceColorMode"
11344
+ themeId:
11345
+ oneOf:
11346
+ - $ref: "#/components/schemas/AppearanceThemeId"
11347
+ - type: "null"
11348
+ themePackage:
11349
+ $ref: "#/components/schemas/PortableAppearancePackageRange"
11350
+ required:
11351
+ - themeId
11352
+ - themePackage
11353
+ - colorModeDefault
11354
+ type: object
11355
+ PublicationState:
11356
+ enum:
11357
+ - PROVISIONING
11358
+ - ACTIVE
11359
+ - PAUSED
11360
+ - RETIRING
11361
+ - RETIRED
11362
+ type: string
11363
+ PublicationSummary:
11364
+ additionalProperties: false
11365
+ properties:
11366
+ name:
11367
+ maxLength: 80
11368
+ minLength: 1
11369
+ type: string
11370
+ publicationId:
11371
+ format: uuid
11372
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
11373
+ type: string
11374
+ slug:
11375
+ maxLength: 80
11376
+ minLength: 1
11377
+ type: string
11378
+ state:
11379
+ $ref: "#/components/schemas/PublicationState"
11380
+ version:
11381
+ format: int64
11382
+ minimum: 0
11383
+ type: integer
11384
+ required:
11385
+ - publicationId
10954
11386
  - version
10955
11387
  - state
10956
11388
  - name
@@ -10963,6 +11395,20 @@ components:
10963
11395
  - CANCELLED
10964
11396
  - FINAL_FAILED
10965
11397
  type: string
11398
+ PublishingPolicy:
11399
+ additionalProperties: false
11400
+ description: "How this publication publishes. Absence of the member on the publication resource means the defaults: `requireReview` false, `galascribeMerges` true."
11401
+ properties:
11402
+ galascribeMerges:
11403
+ description: Default true. When true Galascribe opens and merges the pull request itself through the GitHub App; when false each change must already be merged on GitHub before it can be published.
11404
+ type: boolean
11405
+ requireReview:
11406
+ description: Default false. When true a change needs an approved review before it can be published.
11407
+ type: boolean
11408
+ required:
11409
+ - requireReview
11410
+ - galascribeMerges
11411
+ type: object
10966
11412
  PutOrganizationsByOrganizationIdPublicationsByPublicationIdDestinationRequest:
10967
11413
  additionalProperties: false
10968
11414
  allOf:
@@ -12106,6 +12552,166 @@ components:
12106
12552
  - lastSeenAt
12107
12553
  - current
12108
12554
  type: object
12555
+ SiteActor:
12556
+ additionalProperties: false
12557
+ description: A person named in words. The identity is the display name; no principal id is exposed on this surface.
12558
+ properties:
12559
+ displayName:
12560
+ maxLength: 200
12561
+ minLength: 1
12562
+ type: string
12563
+ required:
12564
+ - displayName
12565
+ type: object
12566
+ SiteAttentionItem:
12567
+ additionalProperties: false
12568
+ description: Something that needs a person to act. The list is empty when nothing does.
12569
+ properties:
12570
+ code:
12571
+ enum:
12572
+ - REPOSITORY_NEEDS_UPDATE
12573
+ - CONTENT_CONFLICT
12574
+ - PUBLISH_FAILED
12575
+ - AUTHORIZATION_LOST
12576
+ - REPOSITORY_NOT_SET_UP
12577
+ - DESTINATION_NOT_CHOSEN
12578
+ type: string
12579
+ relatedChangeId:
12580
+ format: uuid
12581
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12582
+ type: string
12583
+ required:
12584
+ - code
12585
+ type: object
12586
+ SiteLastPublished:
12587
+ additionalProperties: false
12588
+ properties:
12589
+ actor:
12590
+ $ref: "#/components/schemas/SiteActor"
12591
+ at:
12592
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12593
+ required:
12594
+ - at
12595
+ - actor
12596
+ type: object
12597
+ SitePendingChange:
12598
+ additionalProperties: false
12599
+ allOf:
12600
+ - else:
12601
+ properties:
12602
+ action:
12603
+ enum:
12604
+ - CREATE
12605
+ - EDIT
12606
+ - DELETE
12607
+ if:
12608
+ properties:
12609
+ kind:
12610
+ pattern: ^LOOK$
12611
+ type: string
12612
+ x-gala-const: LOOK
12613
+ required:
12614
+ - kind
12615
+ then:
12616
+ properties:
12617
+ action:
12618
+ pattern: ^CHANGE$
12619
+ type: string
12620
+ x-gala-const: CHANGE
12621
+ description: "One unpublished change in words. Exactly one entry exists per path (and one for the look): when several unpublished changes touch the same path only the newest is listed and older ones are superseded and omitted."
12622
+ properties:
12623
+ action:
12624
+ description: "`CHANGE` is used for `LOOK` and only for `LOOK`; `POST` and `PAGE` use `CREATE`, `EDIT` or `DELETE`."
12625
+ enum:
12626
+ - CREATE
12627
+ - EDIT
12628
+ - DELETE
12629
+ - CHANGE
12630
+ type: string
12631
+ author:
12632
+ $ref: "#/components/schemas/SiteActor"
12633
+ changeId:
12634
+ format: uuid
12635
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12636
+ type: string
12637
+ kind:
12638
+ enum:
12639
+ - POST
12640
+ - PAGE
12641
+ - LOOK
12642
+ type: string
12643
+ path:
12644
+ description: Repository path of the post or page; absent for `LOOK`.
12645
+ maxLength: 512
12646
+ minLength: 1
12647
+ type: string
12648
+ review:
12649
+ description: "`NOT_REQUIRED` when the publication does not require review; otherwise `WAITING`, `APPROVED` or `CHANGES_REQUESTED`."
12650
+ enum:
12651
+ - NOT_REQUIRED
12652
+ - WAITING
12653
+ - APPROVED
12654
+ - CHANGES_REQUESTED
12655
+ type: string
12656
+ reviewId:
12657
+ description: The review a reviewer decides through `POST .../reviews/{reviewId}:decide`. Present when a review exists.
12658
+ format: uuid
12659
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12660
+ type: string
12661
+ theme:
12662
+ $ref: "#/components/schemas/SiteThemeChange"
12663
+ title:
12664
+ maxLength: 200
12665
+ minLength: 1
12666
+ type: string
12667
+ updatedAt:
12668
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12669
+ required:
12670
+ - changeId
12671
+ - kind
12672
+ - action
12673
+ - title
12674
+ - review
12675
+ - updatedAt
12676
+ - author
12677
+ type: object
12678
+ SitePublishing:
12679
+ additionalProperties: false
12680
+ properties:
12681
+ operationId:
12682
+ format: uuid
12683
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
12684
+ type: string
12685
+ stage:
12686
+ enum:
12687
+ - PREPARING
12688
+ - BUILDING
12689
+ - GOING_LIVE
12690
+ type: string
12691
+ startedAt:
12692
+ $ref: "#/components/schemas/PortableProblemRfc3339"
12693
+ required:
12694
+ - operationId
12695
+ - stage
12696
+ - startedAt
12697
+ type: object
12698
+ SiteThemeChange:
12699
+ additionalProperties: false
12700
+ properties:
12701
+ from:
12702
+ maxLength: 200
12703
+ minLength: 1
12704
+ type:
12705
+ - string
12706
+ - "null"
12707
+ to:
12708
+ maxLength: 200
12709
+ minLength: 1
12710
+ type: string
12711
+ required:
12712
+ - from
12713
+ - to
12714
+ type: object
12109
12715
  VerificationPlanEntry:
12110
12716
  additionalProperties: false
12111
12717
  properties:
@@ -19530,6 +20136,8 @@ paths:
19530
20136
  x-gala-success-category: query
19531
20137
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
19532
20138
  patch:
20139
+ description: |
20140
+ Updates publication metadata and state. As of schema 2.22.0 the request may also carry `publishingPolicy` (`requireReview`, `galascribeMerges`), a partial update: an omitted member keeps its value. The publication resource (`GET` and this response) returns `publishingPolicy`; its absence means the defaults, `requireReview` false and `galascribeMerges` true. The policy governs `POST .../changes:publish` and the review of changes.
19533
20141
  operationId: patchOrganizationsByOrganizationIdPublicationsByPublicationId
19534
20142
  parameters:
19535
20143
  - $ref: "#/components/parameters/XCorrelationId"
@@ -19834,9 +20442,23 @@ paths:
19834
20442
  - Publication:RETIRING|RETIRED -> PROVISIONING
19835
20443
  x-gala-success-category: update
19836
20444
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
19837
- /v2/organizations/{organizationId}/publications/{publicationId}/configuration-changes:plan:
19838
- post:
19839
- operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlan
20445
+ /v2/organizations/{organizationId}/publications/{publicationId}/appearance:
20446
+ get:
20447
+ description: |
20448
+ Reads this publication's theme selection at the linked repository's
20449
+ current main branch head: `selected` from `gala/appearance.json`
20450
+ (`theme`, `colorMode.default`), `built` from the `theme` block of
20451
+ `gala.lock.json`, and the closed five-theme `catalog` the server can
20452
+ write. `selected.themeId` and `built.themeId` are `null` when that
20453
+ file names a package outside the catalog ("Custom theme").
20454
+ `consistent` is true when `selected` and `built` name the same
20455
+ package. `setUp` matches `GET .../repository/setup`'s `state`.
20456
+ `openChange` names an existing not-yet-published repository change
20457
+ of this publication that touches appearance, or is `null`, so a
20458
+ client links to it instead of planning a second one. The browser
20459
+ never reads or edits `gala/appearance.json` or `gala.lock.json` as
20460
+ text; `GET .../content/documents` still refuses both paths.
20461
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdAppearance
19840
20462
  parameters:
19841
20463
  - $ref: "#/components/parameters/XCorrelationId"
19842
20464
  - example: 018f0000-0000-7000-8000-000000000001
@@ -19855,61 +20477,44 @@ paths:
19855
20477
  format: uuid
19856
20478
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
19857
20479
  type: string
19858
- - $ref: "#/components/parameters/IdempotencyKey"
19859
- - $ref: "#/components/parameters/XCsrfToken"
19860
- requestBody:
19861
- content:
19862
- application/json:
19863
- examples:
19864
- nominal:
19865
- summary: Nominal valid request
19866
- value:
19867
- changeKind: PORTABLE_SETTINGS
19868
- expectedHead: sha1:0000000000000000000000000000000000000000
19869
- inputDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
19870
- schema:
19871
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest"
19872
- required: true
19873
20480
  responses:
19874
- "201":
20481
+ "200":
19875
20482
  content:
19876
20483
  application/json:
19877
20484
  examples:
19878
20485
  nominal:
19879
20486
  summary: Nominal successful response
19880
20487
  value:
19881
- changeId: 018f0000-0000-7000-8000-000000000001
19882
- diffDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
19883
- expectedHead: sha1:0000000000000000000000000000000000000000
19884
- state: REQUESTED
19885
- version: 0
20488
+ built:
20489
+ themeId: default
20490
+ themePackage: "@rathnasgala2/theme-default"
20491
+ version: 2.0.0
20492
+ catalog:
20493
+ - description: The calm default look.
20494
+ displayName: Default
20495
+ package: "@rathnasgala2/theme-default"
20496
+ themeId: default
20497
+ version: 2.0.0
20498
+ consistent: true
20499
+ head: sha1:0000000000000000000000000000000000000000
20500
+ openChange: null
20501
+ selected:
20502
+ colorModeDefault: system
20503
+ themeId: default
20504
+ themePackage: "@rathnasgala2/theme-default@^2.0.0"
20505
+ setUp: true
19886
20506
  schema:
19887
- $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanResponse"
19888
- description: plan typed publication or module configuration diff against exact Git head succeeded
20507
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdAppearanceResponse"
20508
+ description: read this publication's theme selection at the main branch head succeeded
19889
20509
  headers:
19890
20510
  Cache-Control:
19891
20511
  $ref: "#/components/headers/CacheControlNoStore"
19892
- Location:
19893
- $ref: "#/components/headers/Location"
19894
20512
  X-Correlation-Id:
19895
20513
  $ref: "#/components/headers/XCorrelationId"
19896
20514
  "400":
19897
20515
  content:
19898
20516
  application/problem+json:
19899
20517
  examples:
19900
- REQUEST_FIELD_UNKNOWN:
19901
- summary: REQUEST_FIELD_UNKNOWN
19902
- value:
19903
- code: REQUEST_FIELD_UNKNOWN
19904
- correlationId: 018f0000-0000-7000-8000-000000000001
19905
- detail: See the operation contract.
19906
- errors: []
19907
- retryable: false
19908
- schemaId: urn:gala:schema:problem:2.0.0
19909
- schemaVersion: 2.0.0
19910
- status: 400
19911
- title: REQUEST_FIELD_UNKNOWN
19912
- type: urn:gala:problem:request-field-unknown
19913
20518
  VALIDATION_FAILED:
19914
20519
  summary: VALIDATION_FAILED
19915
20520
  value:
@@ -19925,14 +20530,13 @@ paths:
19925
20530
  type: urn:gala:problem:validation-failed
19926
20531
  schema:
19927
20532
  $ref: "#/components/schemas/Problem"
19928
- description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
20533
+ description: VALIDATION_FAILED
19929
20534
  headers:
19930
20535
  Cache-Control:
19931
20536
  $ref: "#/components/headers/CacheControlNoStore"
19932
20537
  X-Correlation-Id:
19933
20538
  $ref: "#/components/headers/XCorrelationId"
19934
20539
  x-gala-problem-codes:
19935
- - REQUEST_FIELD_UNKNOWN
19936
20540
  - VALIDATION_FAILED
19937
20541
  "401":
19938
20542
  content:
@@ -20015,66 +20619,683 @@ paths:
20015
20619
  $ref: "#/components/headers/XCorrelationId"
20016
20620
  x-gala-problem-codes:
20017
20621
  - RESOURCE_NOT_FOUND
20018
- "409":
20622
+ "429":
20019
20623
  content:
20020
20624
  application/problem+json:
20021
20625
  examples:
20022
- COMMAND_REPLAY_CONFLICT:
20023
- summary: COMMAND_REPLAY_CONFLICT
20024
- value:
20025
- code: COMMAND_REPLAY_CONFLICT
20026
- correlationId: 018f0000-0000-7000-8000-000000000001
20027
- detail: See the operation contract.
20028
- errors: []
20029
- retryable: false
20030
- schemaId: urn:gala:schema:problem:2.0.0
20031
- schemaVersion: 2.0.0
20032
- status: 409
20033
- title: COMMAND_REPLAY_CONFLICT
20034
- type: urn:gala:problem:command-replay-conflict
20035
- INVALID_SOURCE_STATE:
20036
- summary: INVALID_SOURCE_STATE
20626
+ RATE_LIMITED:
20627
+ summary: RATE_LIMITED
20037
20628
  value:
20038
- code: INVALID_SOURCE_STATE
20629
+ code: RATE_LIMITED
20039
20630
  correlationId: 018f0000-0000-7000-8000-000000000001
20040
20631
  detail: See the operation contract.
20041
20632
  errors: []
20042
- retryable: false
20633
+ retryable: true
20043
20634
  schemaId: urn:gala:schema:problem:2.0.0
20044
20635
  schemaVersion: 2.0.0
20045
- status: 409
20046
- title: INVALID_SOURCE_STATE
20047
- type: urn:gala:problem:invalid-source-state
20636
+ status: 429
20637
+ title: RATE_LIMITED
20638
+ type: urn:gala:problem:rate-limited
20048
20639
  schema:
20049
20640
  $ref: "#/components/schemas/Problem"
20050
- description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
20641
+ description: RATE_LIMITED
20051
20642
  headers:
20052
20643
  Cache-Control:
20053
20644
  $ref: "#/components/headers/CacheControlNoStore"
20645
+ Retry-After:
20646
+ $ref: "#/components/headers/RetryAfter"
20054
20647
  X-Correlation-Id:
20055
20648
  $ref: "#/components/headers/XCorrelationId"
20056
20649
  x-gala-problem-codes:
20057
- - COMMAND_REPLAY_CONFLICT
20058
- - INVALID_SOURCE_STATE
20059
- "422":
20650
+ - RATE_LIMITED
20651
+ "503":
20060
20652
  content:
20061
20653
  application/problem+json:
20062
20654
  examples:
20063
- VALIDATION_FAILED:
20064
- summary: VALIDATION_FAILED
20655
+ CAPABILITY_UNAVAILABLE:
20656
+ summary: CAPABILITY_UNAVAILABLE
20065
20657
  value:
20066
- code: VALIDATION_FAILED
20658
+ code: CAPABILITY_UNAVAILABLE
20067
20659
  correlationId: 018f0000-0000-7000-8000-000000000001
20068
20660
  detail: See the operation contract.
20069
20661
  errors: []
20070
20662
  retryable: false
20071
20663
  schemaId: urn:gala:schema:problem:2.0.0
20072
20664
  schemaVersion: 2.0.0
20073
- status: 422
20074
- title: VALIDATION_FAILED
20075
- type: urn:gala:problem:validation-failed
20076
- schema:
20077
- $ref: "#/components/schemas/Problem"
20665
+ status: 503
20666
+ title: CAPABILITY_UNAVAILABLE
20667
+ type: urn:gala:problem:capability-unavailable
20668
+ DEPENDENCY_UNAVAILABLE:
20669
+ summary: DEPENDENCY_UNAVAILABLE
20670
+ value:
20671
+ code: DEPENDENCY_UNAVAILABLE
20672
+ correlationId: 018f0000-0000-7000-8000-000000000001
20673
+ detail: See the operation contract.
20674
+ errors: []
20675
+ retryable: true
20676
+ schemaId: urn:gala:schema:problem:2.0.0
20677
+ schemaVersion: 2.0.0
20678
+ status: 503
20679
+ title: DEPENDENCY_UNAVAILABLE
20680
+ type: urn:gala:problem:dependency-unavailable
20681
+ schema:
20682
+ $ref: "#/components/schemas/Problem"
20683
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
20684
+ headers:
20685
+ Cache-Control:
20686
+ $ref: "#/components/headers/CacheControlNoStore"
20687
+ X-Correlation-Id:
20688
+ $ref: "#/components/headers/XCorrelationId"
20689
+ x-gala-problem-codes:
20690
+ - CAPABILITY_UNAVAILABLE
20691
+ - DEPENDENCY_UNAVAILABLE
20692
+ security:
20693
+ - browserSession: []
20694
+ summary: read this publication's theme selection at the main branch head
20695
+ tags:
20696
+ - organizations
20697
+ x-gala-activation-gate: MVP
20698
+ x-gala-activation-guards:
20699
+ - Active repository binding and configured GitHub App identity capability
20700
+ x-gala-capability-key: publication.view
20701
+ x-gala-concurrency: binding-epoch
20702
+ x-gala-conditional-capabilities: []
20703
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
20704
+ x-gala-nullability: required-and-nullable-are-explicit
20705
+ x-gala-purpose: read this publication's theme selection at the main branch head
20706
+ x-gala-reachable-problems:
20707
+ - AUTHENTICATION_REQUIRED
20708
+ - AUTHORIZATION_DENIED
20709
+ - CAPABILITY_UNAVAILABLE
20710
+ - DEPENDENCY_UNAVAILABLE
20711
+ - RATE_LIMITED
20712
+ - RESOURCE_NOT_FOUND
20713
+ - VALIDATION_FAILED
20714
+ x-gala-replay-identity: safe-query
20715
+ x-gala-state-guards:
20716
+ - NONE
20717
+ x-gala-success-category: query
20718
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
20719
+ /v2/organizations/{organizationId}/publications/{publicationId}/changes:publish:
20720
+ post:
20721
+ description: |
20722
+ Publishes the named repository changes together. For each change, in order:
20723
+
20724
+ 1. If the change is behind the main branch head it is brought up to date automatically when that is clean (the same file-level merge as `:bring-up-to-date`). When it is not clean nothing is written for any change and the response is `409 INVALID_SOURCE_STATE` with one error per conflicting path (`code: CONTENT_CONFLICT`, `pointer: /documents/<path>` or `/assets/<path>`) and the live head on `X-Gala-Current-Head`.
20725
+ 2. If the publication's `publishingPolicy.requireReview` is true and the change has no approval, `409 INVALID_SOURCE_STATE` with `errors[].code REVIEW_REQUIRED` pointed at `/changeIds/<index>`.
20726
+ 3. If `publishingPolicy.galascribeMerges` is true (the default) the server opens and merges the pull request itself through the GitHub App. Otherwise each change must already be merged on GitHub; one that is not is `409 INVALID_SOURCE_STATE` with `errors[].code SOURCE_NOT_MERGED` pointed at `/changeIds/<index>`.
20727
+
20728
+ Then ONE deploy of the resulting main head is started. Success is `202` with the accepted operation (kind `publish`; `publishId` names it, and the operation's `subject.generationId` names the generation once it exists). `scheduledFor` schedules the deploy instead of starting it now and additionally needs `publication.schedule`; it is cancelled with `:cancel` on the publish. `Idempotency-Key` replays the same acceptance. Whole-request validation happens before any change is merged: a refused request merges nothing.
20729
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublish
20730
+ parameters:
20731
+ - $ref: "#/components/parameters/XCorrelationId"
20732
+ - example: 018f0000-0000-7000-8000-000000000001
20733
+ in: path
20734
+ name: organizationId
20735
+ required: true
20736
+ schema:
20737
+ format: uuid
20738
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
20739
+ type: string
20740
+ - example: 018f0000-0000-7000-8000-000000000001
20741
+ in: path
20742
+ name: publicationId
20743
+ required: true
20744
+ schema:
20745
+ format: uuid
20746
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
20747
+ type: string
20748
+ - $ref: "#/components/parameters/IdempotencyKey"
20749
+ - $ref: "#/components/parameters/XCsrfToken"
20750
+ requestBody:
20751
+ content:
20752
+ application/json:
20753
+ examples:
20754
+ nominal:
20755
+ summary: Nominal valid request
20756
+ value:
20757
+ changeIds:
20758
+ - 018f0000-0000-7000-8000-000000000001
20759
+ schema:
20760
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishRequest"
20761
+ required: true
20762
+ responses:
20763
+ "202":
20764
+ content:
20765
+ application/json:
20766
+ examples:
20767
+ nominal:
20768
+ summary: Nominal successful response
20769
+ value:
20770
+ commandId: 018f0000-0000-7000-8000-000000000001
20771
+ operationId: 018f0000-0000-7000-8000-000000000001
20772
+ phase: accepted
20773
+ publishId: 018f0000-0000-7000-8000-000000000003
20774
+ resourceVersion: 0
20775
+ statusUrl: /v2/organizations/018f0000-0000-7000-8000-000000000001/operations/018f0000-0000-7000-8000-000000000002
20776
+ schema:
20777
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdChangesPublishResponse"
20778
+ description: publish a batch of changes with one deploy of the resulting main head succeeded
20779
+ headers:
20780
+ Cache-Control:
20781
+ $ref: "#/components/headers/CacheControlNoStore"
20782
+ X-Correlation-Id:
20783
+ $ref: "#/components/headers/XCorrelationId"
20784
+ "400":
20785
+ content:
20786
+ application/problem+json:
20787
+ examples:
20788
+ REQUEST_FIELD_UNKNOWN:
20789
+ summary: REQUEST_FIELD_UNKNOWN
20790
+ value:
20791
+ code: REQUEST_FIELD_UNKNOWN
20792
+ correlationId: 018f0000-0000-7000-8000-000000000001
20793
+ detail: See the operation contract.
20794
+ errors: []
20795
+ retryable: false
20796
+ schemaId: urn:gala:schema:problem:2.0.0
20797
+ schemaVersion: 2.0.0
20798
+ status: 400
20799
+ title: REQUEST_FIELD_UNKNOWN
20800
+ type: urn:gala:problem:request-field-unknown
20801
+ VALIDATION_FAILED:
20802
+ summary: VALIDATION_FAILED
20803
+ value:
20804
+ code: VALIDATION_FAILED
20805
+ correlationId: 018f0000-0000-7000-8000-000000000001
20806
+ detail: See the operation contract.
20807
+ errors: []
20808
+ retryable: false
20809
+ schemaId: urn:gala:schema:problem:2.0.0
20810
+ schemaVersion: 2.0.0
20811
+ status: 400
20812
+ title: VALIDATION_FAILED
20813
+ type: urn:gala:problem:validation-failed
20814
+ schema:
20815
+ $ref: "#/components/schemas/Problem"
20816
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
20817
+ headers:
20818
+ Cache-Control:
20819
+ $ref: "#/components/headers/CacheControlNoStore"
20820
+ X-Correlation-Id:
20821
+ $ref: "#/components/headers/XCorrelationId"
20822
+ x-gala-problem-codes:
20823
+ - REQUEST_FIELD_UNKNOWN
20824
+ - VALIDATION_FAILED
20825
+ "401":
20826
+ content:
20827
+ application/problem+json:
20828
+ examples:
20829
+ AUTHENTICATION_REQUIRED:
20830
+ summary: AUTHENTICATION_REQUIRED
20831
+ value:
20832
+ code: AUTHENTICATION_REQUIRED
20833
+ correlationId: 018f0000-0000-7000-8000-000000000001
20834
+ detail: See the operation contract.
20835
+ errors: []
20836
+ retryable: false
20837
+ schemaId: urn:gala:schema:problem:2.0.0
20838
+ schemaVersion: 2.0.0
20839
+ status: 401
20840
+ title: AUTHENTICATION_REQUIRED
20841
+ type: urn:gala:problem:authentication-required
20842
+ schema:
20843
+ $ref: "#/components/schemas/Problem"
20844
+ description: AUTHENTICATION_REQUIRED
20845
+ headers:
20846
+ Cache-Control:
20847
+ $ref: "#/components/headers/CacheControlNoStore"
20848
+ X-Correlation-Id:
20849
+ $ref: "#/components/headers/XCorrelationId"
20850
+ x-gala-problem-codes:
20851
+ - AUTHENTICATION_REQUIRED
20852
+ "403":
20853
+ content:
20854
+ application/problem+json:
20855
+ examples:
20856
+ AUTHORIZATION_DENIED:
20857
+ summary: AUTHORIZATION_DENIED
20858
+ value:
20859
+ code: AUTHORIZATION_DENIED
20860
+ correlationId: 018f0000-0000-7000-8000-000000000001
20861
+ detail: See the operation contract.
20862
+ errors: []
20863
+ retryable: false
20864
+ schemaId: urn:gala:schema:problem:2.0.0
20865
+ schemaVersion: 2.0.0
20866
+ status: 403
20867
+ title: AUTHORIZATION_DENIED
20868
+ type: urn:gala:problem:authorization-denied
20869
+ schema:
20870
+ $ref: "#/components/schemas/Problem"
20871
+ description: AUTHORIZATION_DENIED
20872
+ headers:
20873
+ Cache-Control:
20874
+ $ref: "#/components/headers/CacheControlNoStore"
20875
+ X-Correlation-Id:
20876
+ $ref: "#/components/headers/XCorrelationId"
20877
+ x-gala-problem-codes:
20878
+ - AUTHORIZATION_DENIED
20879
+ "404":
20880
+ content:
20881
+ application/problem+json:
20882
+ examples:
20883
+ RESOURCE_NOT_FOUND:
20884
+ summary: RESOURCE_NOT_FOUND
20885
+ value:
20886
+ code: RESOURCE_NOT_FOUND
20887
+ correlationId: 018f0000-0000-7000-8000-000000000001
20888
+ detail: See the operation contract.
20889
+ errors: []
20890
+ retryable: false
20891
+ schemaId: urn:gala:schema:problem:2.0.0
20892
+ schemaVersion: 2.0.0
20893
+ status: 404
20894
+ title: RESOURCE_NOT_FOUND
20895
+ type: urn:gala:problem:resource-not-found
20896
+ schema:
20897
+ $ref: "#/components/schemas/Problem"
20898
+ description: RESOURCE_NOT_FOUND
20899
+ headers:
20900
+ Cache-Control:
20901
+ $ref: "#/components/headers/CacheControlNoStore"
20902
+ X-Correlation-Id:
20903
+ $ref: "#/components/headers/XCorrelationId"
20904
+ x-gala-problem-codes:
20905
+ - RESOURCE_NOT_FOUND
20906
+ "409":
20907
+ content:
20908
+ application/problem+json:
20909
+ examples:
20910
+ COMMAND_REPLAY_CONFLICT:
20911
+ summary: COMMAND_REPLAY_CONFLICT
20912
+ value:
20913
+ code: COMMAND_REPLAY_CONFLICT
20914
+ correlationId: 018f0000-0000-7000-8000-000000000001
20915
+ detail: See the operation contract.
20916
+ errors: []
20917
+ retryable: false
20918
+ schemaId: urn:gala:schema:problem:2.0.0
20919
+ schemaVersion: 2.0.0
20920
+ status: 409
20921
+ title: COMMAND_REPLAY_CONFLICT
20922
+ type: urn:gala:problem:command-replay-conflict
20923
+ INVALID_SOURCE_STATE:
20924
+ summary: INVALID_SOURCE_STATE
20925
+ value:
20926
+ code: INVALID_SOURCE_STATE
20927
+ correlationId: 018f0000-0000-7000-8000-000000000001
20928
+ detail: "One or more changes cannot be published yet. Each error points at the change or path: CONTENT_CONFLICT at /documents/<path> or /assets/<path>, REVIEW_REQUIRED or SOURCE_NOT_MERGED at /changeIds/<index>. See the operation contract."
20929
+ errors:
20930
+ - code: CONTENT_CONFLICT
20931
+ pointer: /documents/content~1articles~1example.md
20932
+ - code: REVIEW_REQUIRED
20933
+ pointer: /changeIds/1
20934
+ retryable: false
20935
+ schemaId: urn:gala:schema:problem:2.0.0
20936
+ schemaVersion: 2.0.0
20937
+ status: 409
20938
+ title: INVALID_SOURCE_STATE
20939
+ type: urn:gala:problem:invalid-source-state
20940
+ schema:
20941
+ $ref: "#/components/schemas/Problem"
20942
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
20943
+ headers:
20944
+ Cache-Control:
20945
+ $ref: "#/components/headers/CacheControlNoStore"
20946
+ X-Correlation-Id:
20947
+ $ref: "#/components/headers/XCorrelationId"
20948
+ X-Gala-Current-Head:
20949
+ $ref: "#/components/headers/XGalaCurrentHead"
20950
+ x-gala-problem-codes:
20951
+ - COMMAND_REPLAY_CONFLICT
20952
+ - INVALID_SOURCE_STATE
20953
+ "429":
20954
+ content:
20955
+ application/problem+json:
20956
+ examples:
20957
+ RATE_LIMITED:
20958
+ summary: RATE_LIMITED
20959
+ value:
20960
+ code: RATE_LIMITED
20961
+ correlationId: 018f0000-0000-7000-8000-000000000001
20962
+ detail: See the operation contract.
20963
+ errors: []
20964
+ retryable: true
20965
+ schemaId: urn:gala:schema:problem:2.0.0
20966
+ schemaVersion: 2.0.0
20967
+ status: 429
20968
+ title: RATE_LIMITED
20969
+ type: urn:gala:problem:rate-limited
20970
+ schema:
20971
+ $ref: "#/components/schemas/Problem"
20972
+ description: RATE_LIMITED
20973
+ headers:
20974
+ Cache-Control:
20975
+ $ref: "#/components/headers/CacheControlNoStore"
20976
+ Retry-After:
20977
+ $ref: "#/components/headers/RetryAfter"
20978
+ X-Correlation-Id:
20979
+ $ref: "#/components/headers/XCorrelationId"
20980
+ x-gala-problem-codes:
20981
+ - RATE_LIMITED
20982
+ "503":
20983
+ content:
20984
+ application/problem+json:
20985
+ examples:
20986
+ CAPABILITY_UNAVAILABLE:
20987
+ summary: CAPABILITY_UNAVAILABLE
20988
+ value:
20989
+ code: CAPABILITY_UNAVAILABLE
20990
+ correlationId: 018f0000-0000-7000-8000-000000000001
20991
+ detail: See the operation contract.
20992
+ errors: []
20993
+ retryable: false
20994
+ schemaId: urn:gala:schema:problem:2.0.0
20995
+ schemaVersion: 2.0.0
20996
+ status: 503
20997
+ title: CAPABILITY_UNAVAILABLE
20998
+ type: urn:gala:problem:capability-unavailable
20999
+ DEPENDENCY_UNAVAILABLE:
21000
+ summary: DEPENDENCY_UNAVAILABLE
21001
+ value:
21002
+ code: DEPENDENCY_UNAVAILABLE
21003
+ correlationId: 018f0000-0000-7000-8000-000000000001
21004
+ detail: See the operation contract.
21005
+ errors: []
21006
+ retryable: true
21007
+ schemaId: urn:gala:schema:problem:2.0.0
21008
+ schemaVersion: 2.0.0
21009
+ status: 503
21010
+ title: DEPENDENCY_UNAVAILABLE
21011
+ type: urn:gala:problem:dependency-unavailable
21012
+ schema:
21013
+ $ref: "#/components/schemas/Problem"
21014
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
21015
+ headers:
21016
+ Cache-Control:
21017
+ $ref: "#/components/headers/CacheControlNoStore"
21018
+ X-Correlation-Id:
21019
+ $ref: "#/components/headers/XCorrelationId"
21020
+ x-gala-problem-codes:
21021
+ - CAPABILITY_UNAVAILABLE
21022
+ - DEPENDENCY_UNAVAILABLE
21023
+ security:
21024
+ - browserSession: []
21025
+ summary: publish a batch of changes with one deploy of the resulting main head
21026
+ tags:
21027
+ - organizations
21028
+ x-gala-activation-gate: MVP
21029
+ x-gala-activation-guards:
21030
+ - Active binding epoch, admitted author-source contract, admitted destination, and no transfer or retirement fence
21031
+ x-gala-capability-key: publication.publish
21032
+ x-gala-concurrency: publication-and-destination-epochs
21033
+ x-gala-conditional-capabilities:
21034
+ - capabilityKey: publication.schedule
21035
+ when: scheduledFor is present
21036
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
21037
+ x-gala-nullability: required-and-nullable-are-explicit
21038
+ x-gala-purpose: publish a batch of changes with one deploy of the resulting main head
21039
+ x-gala-reachable-problems:
21040
+ - AUTHENTICATION_REQUIRED
21041
+ - AUTHORIZATION_DENIED
21042
+ - CAPABILITY_UNAVAILABLE
21043
+ - COMMAND_REPLAY_CONFLICT
21044
+ - DEPENDENCY_UNAVAILABLE
21045
+ - INVALID_SOURCE_STATE
21046
+ - RATE_LIMITED
21047
+ - REQUEST_FIELD_UNKNOWN
21048
+ - RESOURCE_NOT_FOUND
21049
+ - VALIDATION_FAILED
21050
+ x-gala-replay-identity: idempotency-key
21051
+ x-gala-state-guards:
21052
+ - Publication:ACTIVE
21053
+ - RepositoryBinding:ACTIVE
21054
+ - PublicationDestination:SET|LOCKED
21055
+ - RepositoryChange:PLANNED|AWAITING_CONFIRMATION|COMMITTED -> merged -> published
21056
+ x-gala-success-category: async
21057
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
21058
+ /v2/organizations/{organizationId}/publications/{publicationId}/configuration-changes:plan:
21059
+ post:
21060
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlan
21061
+ parameters:
21062
+ - $ref: "#/components/parameters/XCorrelationId"
21063
+ - example: 018f0000-0000-7000-8000-000000000001
21064
+ in: path
21065
+ name: organizationId
21066
+ required: true
21067
+ schema:
21068
+ format: uuid
21069
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
21070
+ type: string
21071
+ - example: 018f0000-0000-7000-8000-000000000001
21072
+ in: path
21073
+ name: publicationId
21074
+ required: true
21075
+ schema:
21076
+ format: uuid
21077
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
21078
+ type: string
21079
+ - $ref: "#/components/parameters/IdempotencyKey"
21080
+ - $ref: "#/components/parameters/XCsrfToken"
21081
+ requestBody:
21082
+ content:
21083
+ application/json:
21084
+ examples:
21085
+ nominal:
21086
+ summary: Nominal valid request
21087
+ value:
21088
+ changeKind: PORTABLE_SETTINGS
21089
+ expectedHead: sha1:0000000000000000000000000000000000000000
21090
+ inputDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
21091
+ schema:
21092
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanRequest"
21093
+ required: true
21094
+ responses:
21095
+ "201":
21096
+ content:
21097
+ application/json:
21098
+ examples:
21099
+ nominal:
21100
+ summary: Nominal successful response
21101
+ value:
21102
+ changeId: 018f0000-0000-7000-8000-000000000001
21103
+ diffDigest: sha256:0000000000000000000000000000000000000000000000000000000000000000
21104
+ expectedHead: sha1:0000000000000000000000000000000000000000
21105
+ state: REQUESTED
21106
+ version: 0
21107
+ schema:
21108
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdConfigurationChangesPlanResponse"
21109
+ description: plan typed publication or module configuration diff against exact Git head succeeded
21110
+ headers:
21111
+ Cache-Control:
21112
+ $ref: "#/components/headers/CacheControlNoStore"
21113
+ Location:
21114
+ $ref: "#/components/headers/Location"
21115
+ X-Correlation-Id:
21116
+ $ref: "#/components/headers/XCorrelationId"
21117
+ "400":
21118
+ content:
21119
+ application/problem+json:
21120
+ examples:
21121
+ REQUEST_FIELD_UNKNOWN:
21122
+ summary: REQUEST_FIELD_UNKNOWN
21123
+ value:
21124
+ code: REQUEST_FIELD_UNKNOWN
21125
+ correlationId: 018f0000-0000-7000-8000-000000000001
21126
+ detail: See the operation contract.
21127
+ errors: []
21128
+ retryable: false
21129
+ schemaId: urn:gala:schema:problem:2.0.0
21130
+ schemaVersion: 2.0.0
21131
+ status: 400
21132
+ title: REQUEST_FIELD_UNKNOWN
21133
+ type: urn:gala:problem:request-field-unknown
21134
+ VALIDATION_FAILED:
21135
+ summary: VALIDATION_FAILED
21136
+ value:
21137
+ code: VALIDATION_FAILED
21138
+ correlationId: 018f0000-0000-7000-8000-000000000001
21139
+ detail: See the operation contract.
21140
+ errors: []
21141
+ retryable: false
21142
+ schemaId: urn:gala:schema:problem:2.0.0
21143
+ schemaVersion: 2.0.0
21144
+ status: 400
21145
+ title: VALIDATION_FAILED
21146
+ type: urn:gala:problem:validation-failed
21147
+ schema:
21148
+ $ref: "#/components/schemas/Problem"
21149
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
21150
+ headers:
21151
+ Cache-Control:
21152
+ $ref: "#/components/headers/CacheControlNoStore"
21153
+ X-Correlation-Id:
21154
+ $ref: "#/components/headers/XCorrelationId"
21155
+ x-gala-problem-codes:
21156
+ - REQUEST_FIELD_UNKNOWN
21157
+ - VALIDATION_FAILED
21158
+ "401":
21159
+ content:
21160
+ application/problem+json:
21161
+ examples:
21162
+ AUTHENTICATION_REQUIRED:
21163
+ summary: AUTHENTICATION_REQUIRED
21164
+ value:
21165
+ code: AUTHENTICATION_REQUIRED
21166
+ correlationId: 018f0000-0000-7000-8000-000000000001
21167
+ detail: See the operation contract.
21168
+ errors: []
21169
+ retryable: false
21170
+ schemaId: urn:gala:schema:problem:2.0.0
21171
+ schemaVersion: 2.0.0
21172
+ status: 401
21173
+ title: AUTHENTICATION_REQUIRED
21174
+ type: urn:gala:problem:authentication-required
21175
+ schema:
21176
+ $ref: "#/components/schemas/Problem"
21177
+ description: AUTHENTICATION_REQUIRED
21178
+ headers:
21179
+ Cache-Control:
21180
+ $ref: "#/components/headers/CacheControlNoStore"
21181
+ X-Correlation-Id:
21182
+ $ref: "#/components/headers/XCorrelationId"
21183
+ x-gala-problem-codes:
21184
+ - AUTHENTICATION_REQUIRED
21185
+ "403":
21186
+ content:
21187
+ application/problem+json:
21188
+ examples:
21189
+ AUTHORIZATION_DENIED:
21190
+ summary: AUTHORIZATION_DENIED
21191
+ value:
21192
+ code: AUTHORIZATION_DENIED
21193
+ correlationId: 018f0000-0000-7000-8000-000000000001
21194
+ detail: See the operation contract.
21195
+ errors: []
21196
+ retryable: false
21197
+ schemaId: urn:gala:schema:problem:2.0.0
21198
+ schemaVersion: 2.0.0
21199
+ status: 403
21200
+ title: AUTHORIZATION_DENIED
21201
+ type: urn:gala:problem:authorization-denied
21202
+ schema:
21203
+ $ref: "#/components/schemas/Problem"
21204
+ description: AUTHORIZATION_DENIED
21205
+ headers:
21206
+ Cache-Control:
21207
+ $ref: "#/components/headers/CacheControlNoStore"
21208
+ X-Correlation-Id:
21209
+ $ref: "#/components/headers/XCorrelationId"
21210
+ x-gala-problem-codes:
21211
+ - AUTHORIZATION_DENIED
21212
+ "404":
21213
+ content:
21214
+ application/problem+json:
21215
+ examples:
21216
+ RESOURCE_NOT_FOUND:
21217
+ summary: RESOURCE_NOT_FOUND
21218
+ value:
21219
+ code: RESOURCE_NOT_FOUND
21220
+ correlationId: 018f0000-0000-7000-8000-000000000001
21221
+ detail: See the operation contract.
21222
+ errors: []
21223
+ retryable: false
21224
+ schemaId: urn:gala:schema:problem:2.0.0
21225
+ schemaVersion: 2.0.0
21226
+ status: 404
21227
+ title: RESOURCE_NOT_FOUND
21228
+ type: urn:gala:problem:resource-not-found
21229
+ schema:
21230
+ $ref: "#/components/schemas/Problem"
21231
+ description: RESOURCE_NOT_FOUND
21232
+ headers:
21233
+ Cache-Control:
21234
+ $ref: "#/components/headers/CacheControlNoStore"
21235
+ X-Correlation-Id:
21236
+ $ref: "#/components/headers/XCorrelationId"
21237
+ x-gala-problem-codes:
21238
+ - RESOURCE_NOT_FOUND
21239
+ "409":
21240
+ content:
21241
+ application/problem+json:
21242
+ examples:
21243
+ COMMAND_REPLAY_CONFLICT:
21244
+ summary: COMMAND_REPLAY_CONFLICT
21245
+ value:
21246
+ code: COMMAND_REPLAY_CONFLICT
21247
+ correlationId: 018f0000-0000-7000-8000-000000000001
21248
+ detail: See the operation contract.
21249
+ errors: []
21250
+ retryable: false
21251
+ schemaId: urn:gala:schema:problem:2.0.0
21252
+ schemaVersion: 2.0.0
21253
+ status: 409
21254
+ title: COMMAND_REPLAY_CONFLICT
21255
+ type: urn:gala:problem:command-replay-conflict
21256
+ INVALID_SOURCE_STATE:
21257
+ summary: INVALID_SOURCE_STATE
21258
+ value:
21259
+ code: INVALID_SOURCE_STATE
21260
+ correlationId: 018f0000-0000-7000-8000-000000000001
21261
+ detail: See the operation contract.
21262
+ errors: []
21263
+ retryable: false
21264
+ schemaId: urn:gala:schema:problem:2.0.0
21265
+ schemaVersion: 2.0.0
21266
+ status: 409
21267
+ title: INVALID_SOURCE_STATE
21268
+ type: urn:gala:problem:invalid-source-state
21269
+ schema:
21270
+ $ref: "#/components/schemas/Problem"
21271
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
21272
+ headers:
21273
+ Cache-Control:
21274
+ $ref: "#/components/headers/CacheControlNoStore"
21275
+ X-Correlation-Id:
21276
+ $ref: "#/components/headers/XCorrelationId"
21277
+ x-gala-problem-codes:
21278
+ - COMMAND_REPLAY_CONFLICT
21279
+ - INVALID_SOURCE_STATE
21280
+ "422":
21281
+ content:
21282
+ application/problem+json:
21283
+ examples:
21284
+ VALIDATION_FAILED:
21285
+ summary: VALIDATION_FAILED
21286
+ value:
21287
+ code: VALIDATION_FAILED
21288
+ correlationId: 018f0000-0000-7000-8000-000000000001
21289
+ detail: See the operation contract.
21290
+ errors: []
21291
+ retryable: false
21292
+ schemaId: urn:gala:schema:problem:2.0.0
21293
+ schemaVersion: 2.0.0
21294
+ status: 422
21295
+ title: VALIDATION_FAILED
21296
+ type: urn:gala:problem:validation-failed
21297
+ schema:
21298
+ $ref: "#/components/schemas/Problem"
20078
21299
  description: VALIDATION_FAILED
20079
21300
  headers:
20080
21301
  Cache-Control:
@@ -22162,6 +23383,8 @@ paths:
22162
23383
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
22163
23384
  /v2/organizations/{organizationId}/publications/{publicationId}/deployments:rollback:
22164
23385
  post:
23386
+ description: |
23387
+ Also the restore operation of the history read: `generationId` is a history entry's `versionId`. Only a generation that went live is accepted; any other generation is `409 INVALID_SOURCE_STATE`. A restore is recorded in `GET .../history` as an entry with `outcome: RESTORED`. Clients pass a short `reasonCode` such as `RESTORE_FROM_HISTORY`.
22165
23388
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsRollback
22166
23389
  parameters:
22167
23390
  - $ref: "#/components/parameters/XCorrelationId"
@@ -22917,127 +24140,317 @@ paths:
22917
24140
  type: urn:gala:problem:invalid-source-state
22918
24141
  schema:
22919
24142
  $ref: "#/components/schemas/Problem"
22920
- description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
24143
+ description: COMMAND_REPLAY_CONFLICT, INVALID_SOURCE_STATE
24144
+ headers:
24145
+ Cache-Control:
24146
+ $ref: "#/components/headers/CacheControlNoStore"
24147
+ X-Correlation-Id:
24148
+ $ref: "#/components/headers/XCorrelationId"
24149
+ x-gala-problem-codes:
24150
+ - COMMAND_REPLAY_CONFLICT
24151
+ - INVALID_SOURCE_STATE
24152
+ "412":
24153
+ content:
24154
+ application/problem+json:
24155
+ examples:
24156
+ STALE_AGGREGATE_VERSION:
24157
+ summary: STALE_AGGREGATE_VERSION
24158
+ value:
24159
+ code: STALE_AGGREGATE_VERSION
24160
+ correlationId: 018f0000-0000-7000-8000-000000000001
24161
+ detail: See the operation contract.
24162
+ errors: []
24163
+ retryable: false
24164
+ schemaId: urn:gala:schema:problem:2.0.0
24165
+ schemaVersion: 2.0.0
24166
+ status: 412
24167
+ title: STALE_AGGREGATE_VERSION
24168
+ type: urn:gala:problem:stale-aggregate-version
24169
+ schema:
24170
+ $ref: "#/components/schemas/Problem"
24171
+ description: STALE_AGGREGATE_VERSION
24172
+ headers:
24173
+ Cache-Control:
24174
+ $ref: "#/components/headers/CacheControlNoStore"
24175
+ X-Correlation-Id:
24176
+ $ref: "#/components/headers/XCorrelationId"
24177
+ x-gala-problem-codes:
24178
+ - STALE_AGGREGATE_VERSION
24179
+ "422":
24180
+ content:
24181
+ application/problem+json:
24182
+ examples:
24183
+ VALIDATION_FAILED:
24184
+ summary: VALIDATION_FAILED
24185
+ value:
24186
+ code: VALIDATION_FAILED
24187
+ correlationId: 018f0000-0000-7000-8000-000000000001
24188
+ detail: Region is not one row of the accepted region catalog. See the operation contract for the served/staging-bucket-equal and forbidden-providerBinding variants of this problem.
24189
+ errors:
24190
+ - code: VALIDATION_FAILED
24191
+ pointer: /providerBinding/region
24192
+ retryable: false
24193
+ schemaId: urn:gala:schema:problem:2.0.0
24194
+ schemaVersion: 2.0.0
24195
+ status: 422
24196
+ title: VALIDATION_FAILED
24197
+ type: urn:gala:problem:validation-failed
24198
+ schema:
24199
+ $ref: "#/components/schemas/Problem"
24200
+ description: VALIDATION_FAILED
24201
+ headers:
24202
+ Cache-Control:
24203
+ $ref: "#/components/headers/CacheControlNoStore"
24204
+ X-Correlation-Id:
24205
+ $ref: "#/components/headers/XCorrelationId"
24206
+ x-gala-problem-codes:
24207
+ - VALIDATION_FAILED
24208
+ "503":
24209
+ content:
24210
+ application/problem+json:
24211
+ examples:
24212
+ CAPABILITY_UNAVAILABLE:
24213
+ summary: CAPABILITY_UNAVAILABLE
24214
+ value:
24215
+ code: CAPABILITY_UNAVAILABLE
24216
+ correlationId: 018f0000-0000-7000-8000-000000000001
24217
+ detail: See the operation contract.
24218
+ errors: []
24219
+ retryable: false
24220
+ schemaId: urn:gala:schema:problem:2.0.0
24221
+ schemaVersion: 2.0.0
24222
+ status: 503
24223
+ title: CAPABILITY_UNAVAILABLE
24224
+ type: urn:gala:problem:capability-unavailable
24225
+ schema:
24226
+ $ref: "#/components/schemas/Problem"
24227
+ description: CAPABILITY_UNAVAILABLE
24228
+ headers:
24229
+ Cache-Control:
24230
+ $ref: "#/components/headers/CacheControlNoStore"
24231
+ X-Correlation-Id:
24232
+ $ref: "#/components/headers/XCorrelationId"
24233
+ x-gala-problem-codes:
24234
+ - CAPABILITY_UNAVAILABLE
24235
+ security:
24236
+ - browserSession: []
24237
+ summary: set publication destination
24238
+ tags:
24239
+ - organizations
24240
+ x-gala-activation-gate: MVP
24241
+ x-gala-activation-guards:
24242
+ - Accepted region catalog membership, globally unique Spaces bucket names, and an unlocked destination
24243
+ x-gala-capability-key: publication.settings.manage
24244
+ x-gala-concurrency: if-match
24245
+ x-gala-conditional-capabilities: []
24246
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
24247
+ x-gala-nullability: required-and-nullable-are-explicit
24248
+ x-gala-purpose: set publication destination
24249
+ x-gala-reachable-problems:
24250
+ - AUTHENTICATION_REQUIRED
24251
+ - AUTHORIZATION_DENIED
24252
+ - CAPABILITY_UNAVAILABLE
24253
+ - COMMAND_REPLAY_CONFLICT
24254
+ - INVALID_SOURCE_STATE
24255
+ - REQUEST_FIELD_UNKNOWN
24256
+ - RESOURCE_NOT_FOUND
24257
+ - STALE_AGGREGATE_VERSION
24258
+ - VALIDATION_FAILED
24259
+ x-gala-replay-identity: idempotency-key
24260
+ x-gala-state-guards:
24261
+ - Publication:PROVISIONING|ACTIVE|PAUSED
24262
+ - PublicationDestination:UNSET|SET
24263
+ x-gala-success-category: update
24264
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
24265
+ /v2/organizations/{organizationId}/publications/{publicationId}/history:
24266
+ get:
24267
+ description: |
24268
+ Versions of the site that went live, newest first, on a stable keyset cursor, each described by who published it, when, and what changed in words. A failed attempt is never an entry of its own: failed attempts since the previous entry are folded into the next entry that went live as `failedAttemptsBefore`. Only when the latest attempt failed is there one trailing entry with `outcome: FAILED` (the first entry in the list), carrying `failure.reasonCode` and `failure.retryable` and no `versionId`.
24269
+
24270
+ `versionId` is the deployment generation id. To restore a version call `POST .../deployments:rollback` with `generationId` set to `versionId`; no separate restore operation exists. Only a version that went live is accepted; any other generation is `409 INVALID_SOURCE_STATE`.
24271
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdHistory
24272
+ parameters:
24273
+ - $ref: "#/components/parameters/XCorrelationId"
24274
+ - example: 018f0000-0000-7000-8000-000000000001
24275
+ in: path
24276
+ name: organizationId
24277
+ required: true
24278
+ schema:
24279
+ format: uuid
24280
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
24281
+ type: string
24282
+ - example: 018f0000-0000-7000-8000-000000000001
24283
+ in: path
24284
+ name: publicationId
24285
+ required: true
24286
+ schema:
24287
+ format: uuid
24288
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
24289
+ type: string
24290
+ - $ref: "#/components/parameters/Cursor"
24291
+ - $ref: "#/components/parameters/Limit"
24292
+ responses:
24293
+ "200":
24294
+ content:
24295
+ application/json:
24296
+ examples:
24297
+ nominal:
24298
+ summary: Nominal successful response
24299
+ value:
24300
+ hasMore: false
24301
+ items:
24302
+ - actor:
24303
+ displayName: Asha Rao
24304
+ at: "2026-10-05T09:30:00Z"
24305
+ changes:
24306
+ - action: EDIT
24307
+ kind: POST
24308
+ path: content/articles/hello.md
24309
+ title: Hello, world
24310
+ failedAttemptsBefore:
24311
+ count: 1
24312
+ lastReason: BUILD_FAILED
24313
+ outcome: LIVE
24314
+ versionId: 018f0000-0000-7000-8000-000000000001
24315
+ schema:
24316
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdHistoryResponse"
24317
+ description: list the versions of this publication that went live succeeded
24318
+ headers:
24319
+ Cache-Control:
24320
+ $ref: "#/components/headers/CacheControlNoStore"
24321
+ X-Correlation-Id:
24322
+ $ref: "#/components/headers/XCorrelationId"
24323
+ "400":
24324
+ content:
24325
+ application/problem+json:
24326
+ examples:
24327
+ VALIDATION_FAILED:
24328
+ summary: VALIDATION_FAILED
24329
+ value:
24330
+ code: VALIDATION_FAILED
24331
+ correlationId: 018f0000-0000-7000-8000-000000000001
24332
+ detail: See the operation contract.
24333
+ errors: []
24334
+ retryable: false
24335
+ schemaId: urn:gala:schema:problem:2.0.0
24336
+ schemaVersion: 2.0.0
24337
+ status: 400
24338
+ title: VALIDATION_FAILED
24339
+ type: urn:gala:problem:validation-failed
24340
+ schema:
24341
+ $ref: "#/components/schemas/Problem"
24342
+ description: VALIDATION_FAILED
22921
24343
  headers:
22922
24344
  Cache-Control:
22923
24345
  $ref: "#/components/headers/CacheControlNoStore"
22924
24346
  X-Correlation-Id:
22925
24347
  $ref: "#/components/headers/XCorrelationId"
22926
24348
  x-gala-problem-codes:
22927
- - COMMAND_REPLAY_CONFLICT
22928
- - INVALID_SOURCE_STATE
22929
- "412":
24349
+ - VALIDATION_FAILED
24350
+ "401":
22930
24351
  content:
22931
24352
  application/problem+json:
22932
24353
  examples:
22933
- STALE_AGGREGATE_VERSION:
22934
- summary: STALE_AGGREGATE_VERSION
24354
+ AUTHENTICATION_REQUIRED:
24355
+ summary: AUTHENTICATION_REQUIRED
22935
24356
  value:
22936
- code: STALE_AGGREGATE_VERSION
24357
+ code: AUTHENTICATION_REQUIRED
22937
24358
  correlationId: 018f0000-0000-7000-8000-000000000001
22938
24359
  detail: See the operation contract.
22939
24360
  errors: []
22940
24361
  retryable: false
22941
24362
  schemaId: urn:gala:schema:problem:2.0.0
22942
24363
  schemaVersion: 2.0.0
22943
- status: 412
22944
- title: STALE_AGGREGATE_VERSION
22945
- type: urn:gala:problem:stale-aggregate-version
24364
+ status: 401
24365
+ title: AUTHENTICATION_REQUIRED
24366
+ type: urn:gala:problem:authentication-required
22946
24367
  schema:
22947
24368
  $ref: "#/components/schemas/Problem"
22948
- description: STALE_AGGREGATE_VERSION
24369
+ description: AUTHENTICATION_REQUIRED
22949
24370
  headers:
22950
24371
  Cache-Control:
22951
24372
  $ref: "#/components/headers/CacheControlNoStore"
22952
24373
  X-Correlation-Id:
22953
24374
  $ref: "#/components/headers/XCorrelationId"
22954
24375
  x-gala-problem-codes:
22955
- - STALE_AGGREGATE_VERSION
22956
- "422":
24376
+ - AUTHENTICATION_REQUIRED
24377
+ "403":
22957
24378
  content:
22958
24379
  application/problem+json:
22959
24380
  examples:
22960
- VALIDATION_FAILED:
22961
- summary: VALIDATION_FAILED
24381
+ AUTHORIZATION_DENIED:
24382
+ summary: AUTHORIZATION_DENIED
22962
24383
  value:
22963
- code: VALIDATION_FAILED
24384
+ code: AUTHORIZATION_DENIED
22964
24385
  correlationId: 018f0000-0000-7000-8000-000000000001
22965
- detail: Region is not one row of the accepted region catalog. See the operation contract for the served/staging-bucket-equal and forbidden-providerBinding variants of this problem.
22966
- errors:
22967
- - code: VALIDATION_FAILED
22968
- pointer: /providerBinding/region
24386
+ detail: See the operation contract.
24387
+ errors: []
22969
24388
  retryable: false
22970
24389
  schemaId: urn:gala:schema:problem:2.0.0
22971
24390
  schemaVersion: 2.0.0
22972
- status: 422
22973
- title: VALIDATION_FAILED
22974
- type: urn:gala:problem:validation-failed
24391
+ status: 403
24392
+ title: AUTHORIZATION_DENIED
24393
+ type: urn:gala:problem:authorization-denied
22975
24394
  schema:
22976
24395
  $ref: "#/components/schemas/Problem"
22977
- description: VALIDATION_FAILED
24396
+ description: AUTHORIZATION_DENIED
22978
24397
  headers:
22979
24398
  Cache-Control:
22980
24399
  $ref: "#/components/headers/CacheControlNoStore"
22981
24400
  X-Correlation-Id:
22982
24401
  $ref: "#/components/headers/XCorrelationId"
22983
24402
  x-gala-problem-codes:
22984
- - VALIDATION_FAILED
22985
- "503":
24403
+ - AUTHORIZATION_DENIED
24404
+ "404":
22986
24405
  content:
22987
24406
  application/problem+json:
22988
24407
  examples:
22989
- CAPABILITY_UNAVAILABLE:
22990
- summary: CAPABILITY_UNAVAILABLE
24408
+ RESOURCE_NOT_FOUND:
24409
+ summary: RESOURCE_NOT_FOUND
22991
24410
  value:
22992
- code: CAPABILITY_UNAVAILABLE
24411
+ code: RESOURCE_NOT_FOUND
22993
24412
  correlationId: 018f0000-0000-7000-8000-000000000001
22994
24413
  detail: See the operation contract.
22995
24414
  errors: []
22996
24415
  retryable: false
22997
24416
  schemaId: urn:gala:schema:problem:2.0.0
22998
24417
  schemaVersion: 2.0.0
22999
- status: 503
23000
- title: CAPABILITY_UNAVAILABLE
23001
- type: urn:gala:problem:capability-unavailable
24418
+ status: 404
24419
+ title: RESOURCE_NOT_FOUND
24420
+ type: urn:gala:problem:resource-not-found
23002
24421
  schema:
23003
24422
  $ref: "#/components/schemas/Problem"
23004
- description: CAPABILITY_UNAVAILABLE
24423
+ description: RESOURCE_NOT_FOUND
23005
24424
  headers:
23006
24425
  Cache-Control:
23007
24426
  $ref: "#/components/headers/CacheControlNoStore"
23008
24427
  X-Correlation-Id:
23009
24428
  $ref: "#/components/headers/XCorrelationId"
23010
24429
  x-gala-problem-codes:
23011
- - CAPABILITY_UNAVAILABLE
24430
+ - RESOURCE_NOT_FOUND
23012
24431
  security:
23013
24432
  - browserSession: []
23014
- summary: set publication destination
24433
+ summary: list the versions of this publication that went live
23015
24434
  tags:
23016
24435
  - organizations
23017
24436
  x-gala-activation-gate: MVP
23018
24437
  x-gala-activation-guards:
23019
- - Accepted region catalog membership, globally unique Spaces bucket names, and an unlocked destination
23020
- x-gala-capability-key: publication.settings.manage
23021
- x-gala-concurrency: if-match
24438
+ - NONE
24439
+ x-gala-capability-key: publication.view
24440
+ x-gala-concurrency: publication-and-destination-epochs
23022
24441
  x-gala-conditional-capabilities: []
23023
24442
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
23024
24443
  x-gala-nullability: required-and-nullable-are-explicit
23025
- x-gala-purpose: set publication destination
24444
+ x-gala-purpose: list the versions of this publication that went live
23026
24445
  x-gala-reachable-problems:
23027
24446
  - AUTHENTICATION_REQUIRED
23028
24447
  - AUTHORIZATION_DENIED
23029
- - CAPABILITY_UNAVAILABLE
23030
- - COMMAND_REPLAY_CONFLICT
23031
- - INVALID_SOURCE_STATE
23032
- - REQUEST_FIELD_UNKNOWN
23033
24448
  - RESOURCE_NOT_FOUND
23034
- - STALE_AGGREGATE_VERSION
23035
24449
  - VALIDATION_FAILED
23036
- x-gala-replay-identity: idempotency-key
24450
+ x-gala-replay-identity: safe-query
23037
24451
  x-gala-state-guards:
23038
- - Publication:PROVISIONING|ACTIVE|PAUSED
23039
- - PublicationDestination:UNSET|SET
23040
- x-gala-success-category: update
24452
+ - NONE
24453
+ x-gala-success-category: query
23041
24454
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
23042
24455
  /v2/organizations/{organizationId}/publications/{publicationId}/publishes:
23043
24456
  post:
@@ -27445,6 +28858,8 @@ paths:
27445
28858
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
27446
28859
  /v2/organizations/{organizationId}/publications/{publicationId}/reviews/{reviewId}:decide:
27447
28860
  post:
28861
+ description: |
28862
+ The in-Galascribe approval. `APPROVE` approves; `REJECT` is the request-changes decision shown to people as "changes requested". When the publication's `publishingPolicy.galascribeMerges` is true (the default), approving also triggers the merge of the change's pull request through the GitHub App; the pull request is a mirror of the decision, not a second approval. `reviewId` for a pending change is `pendingChanges[].reviewId` of `GET .../site`.
27448
28863
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdReviewsByReviewIdDecide
27449
28864
  parameters:
27450
28865
  - $ref: "#/components/parameters/XCorrelationId"
@@ -27784,6 +29199,209 @@ paths:
27784
29199
  - Review:REQUESTED -> APPROVED|REJECTED
27785
29200
  x-gala-success-category: update
27786
29201
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
29202
+ /v2/organizations/{organizationId}/publications/{publicationId}/site:
29203
+ get:
29204
+ description: |
29205
+ The one read behind a Home screen: the live address, whether the site is live, publishing or has never been published, who published last, the unpublished changes in words, and what needs attention.
29206
+
29207
+ `pendingChanges` holds exactly one entry per path (and one for the look): the newest unpublished change for a path wins, older ones are superseded and omitted. `review` is `NOT_REQUIRED` unless the publication's `publishingPolicy.requireReview` is true. `attention[].code` is a closed vocabulary; `relatedChangeId` names the change that needs the action. `publishing.stage` follows `PREPARING`, `BUILDING`, `GOING_LIVE`. Read from the platform's own records; nothing is read from the person's repository.
29208
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdSite
29209
+ parameters:
29210
+ - $ref: "#/components/parameters/XCorrelationId"
29211
+ - example: 018f0000-0000-7000-8000-000000000001
29212
+ in: path
29213
+ name: organizationId
29214
+ required: true
29215
+ schema:
29216
+ format: uuid
29217
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
29218
+ type: string
29219
+ - example: 018f0000-0000-7000-8000-000000000001
29220
+ in: path
29221
+ name: publicationId
29222
+ required: true
29223
+ schema:
29224
+ format: uuid
29225
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
29226
+ type: string
29227
+ responses:
29228
+ "200":
29229
+ content:
29230
+ application/json:
29231
+ examples:
29232
+ nominal:
29233
+ summary: Nominal successful response
29234
+ value:
29235
+ attention:
29236
+ - code: REPOSITORY_NEEDS_UPDATE
29237
+ relatedChangeId: 018f0000-0000-7000-8000-000000000002
29238
+ lastPublished:
29239
+ actor:
29240
+ displayName: Asha Rao
29241
+ at: "2026-10-05T09:30:00Z"
29242
+ pendingChanges:
29243
+ - action: EDIT
29244
+ author:
29245
+ displayName: Asha Rao
29246
+ changeId: 018f0000-0000-7000-8000-000000000002
29247
+ kind: POST
29248
+ path: content/articles/hello.md
29249
+ review: NOT_REQUIRED
29250
+ title: Hello, world
29251
+ updatedAt: "2026-10-05T09:30:00Z"
29252
+ - action: CHANGE
29253
+ author:
29254
+ displayName: Asha Rao
29255
+ changeId: 018f0000-0000-7000-8000-000000000003
29256
+ kind: LOOK
29257
+ review: NOT_REQUIRED
29258
+ theme:
29259
+ from: Default
29260
+ to: Journal
29261
+ title: Look
29262
+ updatedAt: "2026-10-05T09:30:00Z"
29263
+ state: LIVE
29264
+ url: https://example.galascribe.com/
29265
+ schema:
29266
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdSiteResponse"
29267
+ description: read the site summary of this publication succeeded
29268
+ headers:
29269
+ Cache-Control:
29270
+ $ref: "#/components/headers/CacheControlNoStore"
29271
+ X-Correlation-Id:
29272
+ $ref: "#/components/headers/XCorrelationId"
29273
+ "400":
29274
+ content:
29275
+ application/problem+json:
29276
+ examples:
29277
+ VALIDATION_FAILED:
29278
+ summary: VALIDATION_FAILED
29279
+ value:
29280
+ code: VALIDATION_FAILED
29281
+ correlationId: 018f0000-0000-7000-8000-000000000001
29282
+ detail: See the operation contract.
29283
+ errors: []
29284
+ retryable: false
29285
+ schemaId: urn:gala:schema:problem:2.0.0
29286
+ schemaVersion: 2.0.0
29287
+ status: 400
29288
+ title: VALIDATION_FAILED
29289
+ type: urn:gala:problem:validation-failed
29290
+ schema:
29291
+ $ref: "#/components/schemas/Problem"
29292
+ description: VALIDATION_FAILED
29293
+ headers:
29294
+ Cache-Control:
29295
+ $ref: "#/components/headers/CacheControlNoStore"
29296
+ X-Correlation-Id:
29297
+ $ref: "#/components/headers/XCorrelationId"
29298
+ x-gala-problem-codes:
29299
+ - VALIDATION_FAILED
29300
+ "401":
29301
+ content:
29302
+ application/problem+json:
29303
+ examples:
29304
+ AUTHENTICATION_REQUIRED:
29305
+ summary: AUTHENTICATION_REQUIRED
29306
+ value:
29307
+ code: AUTHENTICATION_REQUIRED
29308
+ correlationId: 018f0000-0000-7000-8000-000000000001
29309
+ detail: See the operation contract.
29310
+ errors: []
29311
+ retryable: false
29312
+ schemaId: urn:gala:schema:problem:2.0.0
29313
+ schemaVersion: 2.0.0
29314
+ status: 401
29315
+ title: AUTHENTICATION_REQUIRED
29316
+ type: urn:gala:problem:authentication-required
29317
+ schema:
29318
+ $ref: "#/components/schemas/Problem"
29319
+ description: AUTHENTICATION_REQUIRED
29320
+ headers:
29321
+ Cache-Control:
29322
+ $ref: "#/components/headers/CacheControlNoStore"
29323
+ X-Correlation-Id:
29324
+ $ref: "#/components/headers/XCorrelationId"
29325
+ x-gala-problem-codes:
29326
+ - AUTHENTICATION_REQUIRED
29327
+ "403":
29328
+ content:
29329
+ application/problem+json:
29330
+ examples:
29331
+ AUTHORIZATION_DENIED:
29332
+ summary: AUTHORIZATION_DENIED
29333
+ value:
29334
+ code: AUTHORIZATION_DENIED
29335
+ correlationId: 018f0000-0000-7000-8000-000000000001
29336
+ detail: See the operation contract.
29337
+ errors: []
29338
+ retryable: false
29339
+ schemaId: urn:gala:schema:problem:2.0.0
29340
+ schemaVersion: 2.0.0
29341
+ status: 403
29342
+ title: AUTHORIZATION_DENIED
29343
+ type: urn:gala:problem:authorization-denied
29344
+ schema:
29345
+ $ref: "#/components/schemas/Problem"
29346
+ description: AUTHORIZATION_DENIED
29347
+ headers:
29348
+ Cache-Control:
29349
+ $ref: "#/components/headers/CacheControlNoStore"
29350
+ X-Correlation-Id:
29351
+ $ref: "#/components/headers/XCorrelationId"
29352
+ x-gala-problem-codes:
29353
+ - AUTHORIZATION_DENIED
29354
+ "404":
29355
+ content:
29356
+ application/problem+json:
29357
+ examples:
29358
+ RESOURCE_NOT_FOUND:
29359
+ summary: RESOURCE_NOT_FOUND
29360
+ value:
29361
+ code: RESOURCE_NOT_FOUND
29362
+ correlationId: 018f0000-0000-7000-8000-000000000001
29363
+ detail: See the operation contract.
29364
+ errors: []
29365
+ retryable: false
29366
+ schemaId: urn:gala:schema:problem:2.0.0
29367
+ schemaVersion: 2.0.0
29368
+ status: 404
29369
+ title: RESOURCE_NOT_FOUND
29370
+ type: urn:gala:problem:resource-not-found
29371
+ schema:
29372
+ $ref: "#/components/schemas/Problem"
29373
+ description: RESOURCE_NOT_FOUND
29374
+ headers:
29375
+ Cache-Control:
29376
+ $ref: "#/components/headers/CacheControlNoStore"
29377
+ X-Correlation-Id:
29378
+ $ref: "#/components/headers/XCorrelationId"
29379
+ x-gala-problem-codes:
29380
+ - RESOURCE_NOT_FOUND
29381
+ security:
29382
+ - browserSession: []
29383
+ summary: read the site summary of this publication
29384
+ tags:
29385
+ - organizations
29386
+ x-gala-activation-gate: MVP
29387
+ x-gala-activation-guards:
29388
+ - NONE
29389
+ x-gala-capability-key: publication.view
29390
+ x-gala-concurrency: publication-and-destination-epochs
29391
+ x-gala-conditional-capabilities: []
29392
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
29393
+ x-gala-nullability: required-and-nullable-are-explicit
29394
+ x-gala-purpose: read the site summary of this publication
29395
+ x-gala-reachable-problems:
29396
+ - AUTHENTICATION_REQUIRED
29397
+ - AUTHORIZATION_DENIED
29398
+ - RESOURCE_NOT_FOUND
29399
+ - VALIDATION_FAILED
29400
+ x-gala-replay-identity: safe-query
29401
+ x-gala-state-guards:
29402
+ - NONE
29403
+ x-gala-success-category: query
29404
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
27787
29405
  /v2/organizations/{organizationId}/publications/{publicationId}:previewRetirement:
27788
29406
  post:
27789
29407
  description: |