@rathnasgala2/schemas 3.31.0 → 3.32.1

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 (45) hide show
  1. package/THIRD_PARTY_LICENSES.json +1 -1
  2. package/diagnostics/diagnostic-map.json +119 -0
  3. package/docs/catalogs/schema-inventory.json +7 -7
  4. package/examples/valid/build-input/rules.json +126 -0
  5. package/examples/valid/interactions-config/rules.json +10 -0
  6. package/examples/valid/publication/rules.json +86 -0
  7. package/fixtures/boundary/build-input/rules.json +176 -0
  8. package/fixtures/boundary/interactions-config/rules.json +10 -0
  9. package/fixtures/boundary/publication/rules.json +132 -0
  10. package/fixtures/invalid/build-input/GRAPHEME_LENGTH_INVALID/cases.json +33 -0
  11. package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +30 -0
  12. package/fixtures/invalid/build-input/SCHEMA_ARRAY_DUPLICATE/cases.json +11 -0
  13. package/fixtures/invalid/build-input/SCHEMA_ARRAY_TOO_LONG/cases.json +15 -0
  14. package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +11 -0
  15. package/fixtures/invalid/build-input/SCHEMA_NUMBER_TOO_LARGE/cases.json +11 -0
  16. package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +22 -0
  17. package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +51 -0
  18. package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +53 -0
  19. package/fixtures/invalid/interactions-config/SCHEMA_TYPE_INVALID/cases.json +11 -0
  20. package/fixtures/invalid/publication/GRAPHEME_LENGTH_INVALID/cases.json +33 -0
  21. package/fixtures/invalid/publication/REQUEST_FIELD_UNKNOWN/cases.json +30 -0
  22. package/fixtures/invalid/publication/SCHEMA_ARRAY_DUPLICATE/cases.json +9 -0
  23. package/fixtures/invalid/publication/SCHEMA_ARRAY_TOO_LONG/cases.json +13 -0
  24. package/fixtures/invalid/publication/SCHEMA_PATTERN_INVALID/cases.json +22 -0
  25. package/fixtures/invalid/publication/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +40 -0
  26. package/fixtures/invalid/publication/SCHEMA_TYPE_INVALID/cases.json +40 -0
  27. package/fixtures/manifest.json +943 -8
  28. package/fixtures/unknown-field/build-input/rules.json +50 -0
  29. package/fixtures/unknown-field/interactions-config/rules.json +1 -0
  30. package/fixtures/unknown-field/publication/rules.json +46 -0
  31. package/generated/browser/validator-core.mjs +3 -3
  32. package/generated/typescript/contracts/artifact-manifest.d.ts +4 -2
  33. package/generated/typescript/contracts/build-input.d.ts +16 -1
  34. package/generated/typescript/contracts/build-provenance.d.ts +4 -2
  35. package/generated/typescript/contracts/interactions-config.d.ts +1 -0
  36. package/generated/typescript/contracts/publication.d.ts +13 -0
  37. package/openapi/http-catalog.json +80 -2
  38. package/openapi/openapi.yaml +1753 -250
  39. package/package.json +1 -1
  40. package/sbom.cdx.json +23 -23
  41. package/schemas/artifact-manifest.schema.json +4 -2
  42. package/schemas/build-input.schema.json +64 -3
  43. package/schemas/build-provenance.schema.json +4 -2
  44. package/schemas/interactions-config.schema.json +6 -1
  45. package/schemas/publication.schema.json +48 -0
@@ -927,6 +927,14 @@ components:
927
927
  format: uuid
928
928
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
929
929
  type: string
930
+ likeCount:
931
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
932
+ format: int64
933
+ minimum: 0
934
+ type: integer
935
+ likedByMe:
936
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
937
+ type: boolean
930
938
  moreReplies:
931
939
  type: boolean
932
940
  own:
@@ -937,6 +945,9 @@ components:
937
945
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
938
946
  type: string
939
947
  - type: "null"
948
+ pinned:
949
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
950
+ type: boolean
940
951
  replies:
941
952
  items:
942
953
  $ref: "#/components/schemas/CommentViewLevel1"
@@ -990,6 +1001,14 @@ components:
990
1001
  format: uuid
991
1002
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
992
1003
  type: string
1004
+ likeCount:
1005
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1006
+ format: int64
1007
+ minimum: 0
1008
+ type: integer
1009
+ likedByMe:
1010
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1011
+ type: boolean
993
1012
  moreReplies:
994
1013
  type: boolean
995
1014
  own:
@@ -1000,6 +1019,9 @@ components:
1000
1019
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1001
1020
  type: string
1002
1021
  - type: "null"
1022
+ pinned:
1023
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1024
+ type: boolean
1003
1025
  replies:
1004
1026
  items:
1005
1027
  $ref: "#/components/schemas/CommentViewLevel2"
@@ -1053,6 +1075,14 @@ components:
1053
1075
  format: uuid
1054
1076
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1055
1077
  type: string
1078
+ likeCount:
1079
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1080
+ format: int64
1081
+ minimum: 0
1082
+ type: integer
1083
+ likedByMe:
1084
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1085
+ type: boolean
1056
1086
  moreReplies:
1057
1087
  type: boolean
1058
1088
  own:
@@ -1063,6 +1093,9 @@ components:
1063
1093
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1064
1094
  type: string
1065
1095
  - type: "null"
1096
+ pinned:
1097
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1098
+ type: boolean
1066
1099
  replies:
1067
1100
  items:
1068
1101
  $ref: "#/components/schemas/CommentViewLevel3"
@@ -1116,6 +1149,14 @@ components:
1116
1149
  format: uuid
1117
1150
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1118
1151
  type: string
1152
+ likeCount:
1153
+ description: "SCHEMA-3.32.0: how many readers like the comment; absent counts as 0."
1154
+ format: int64
1155
+ minimum: 0
1156
+ type: integer
1157
+ likedByMe:
1158
+ description: "SCHEMA-3.32.0: true when the signed-in reader likes the comment; absent counts as false."
1159
+ type: boolean
1119
1160
  moreReplies:
1120
1161
  type: boolean
1121
1162
  own:
@@ -1126,6 +1167,9 @@ components:
1126
1167
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
1127
1168
  type: string
1128
1169
  - type: "null"
1170
+ pinned:
1171
+ description: "SCHEMA-3.32.0: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
1172
+ type: boolean
1129
1173
  replies:
1130
1174
  maxItems: 0
1131
1175
  type: array
@@ -1494,7 +1538,10 @@ components:
1494
1538
  keeps the stored value, an object replaces it whole, `null` clears it.
1495
1539
  `title`, `defaultLanguage` and `socialLinks` cannot be cleared.
1496
1540
  `socialLinks` (max 32, the publication file's own limit) replaces
1497
- the whole list. `canonicalBase` is never client-settable: it changes
1541
+ the whole list. SCHEMA-3.32.0: `recommendations` (the sites the author
1542
+ recommends, max 24, `url` unique within the list) follows `crawlers`
1543
+ and not `socialLinks`: absent keeps the stored list, an array replaces
1544
+ the whole list, `null` clears it. `canonicalBase` is never client-settable: it changes
1498
1545
  only through domain attach and detach. A profile that changes nothing is
1499
1546
  `422 VALIDATION_FAILED` pointed at `/publicationProfile`; member
1500
1547
  failures point at `/publicationProfile/<member>`.
@@ -1530,6 +1577,13 @@ components:
1530
1577
  oneOf:
1531
1578
  - $ref: "#/components/schemas/PortablePublicationPerformance"
1532
1579
  - type: "null"
1580
+ recommendations:
1581
+ oneOf:
1582
+ - items:
1583
+ $ref: "#/components/schemas/Recommendation"
1584
+ maxItems: 24
1585
+ type: array
1586
+ - type: "null"
1533
1587
  socialLinks:
1534
1588
  items:
1535
1589
  $ref: "#/components/schemas/PortablePublicationSocialLink"
@@ -1541,6 +1595,35 @@ components:
1541
1595
  maximum: 120
1542
1596
  minimum: 1
1543
1597
  type: object
1598
+ ContentDocumentHistoryEntry:
1599
+ additionalProperties: false
1600
+ description: "SCHEMA-3.32.0: one commit that changed a content document. `source` is `draft` (saved from the editor), `publish` (a publish of the site), `import` (an import) or `unknown` (a commit Galascribe did not make). `authorLogin` is present only when GitHub names the committer."
1601
+ properties:
1602
+ authorLogin:
1603
+ maxLength: 39
1604
+ minLength: 1
1605
+ type: string
1606
+ committedAt:
1607
+ "": ../schemas/problem.schema.json#/$defs/rfc3339
1608
+ message:
1609
+ maxLength: 200
1610
+ type: string
1611
+ revision:
1612
+ pattern: ^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$
1613
+ type: string
1614
+ source:
1615
+ enum:
1616
+ - draft
1617
+ - publish
1618
+ - import
1619
+ - unknown
1620
+ type: string
1621
+ required:
1622
+ - revision
1623
+ - committedAt
1624
+ - message
1625
+ - source
1626
+ type: object
1544
1627
  ContentFrontmatter:
1545
1628
  $ref: "#/components/schemas/PortableContentFrontmatterDocument"
1546
1629
  ContentInventoryItem:
@@ -1745,7 +1828,9 @@ components:
1745
1828
  page it opened. Carries no personal data beyond what each author
1746
1829
  file itself already publishes. `listing`, `aiRights` and `performance`
1747
1830
  (SCHEMA-3.25.1, optional) are the publication file's 3.25.0 members,
1748
- absent when the file carries none.
1831
+ absent when the file carries none. `recommendations` (SCHEMA-3.32.0,
1832
+ optional) is the publication file's list of recommended sites, absent
1833
+ when the file carries none.
1749
1834
  properties:
1750
1835
  aiRights:
1751
1836
  $ref: "#/components/schemas/PortablePublicationAiRights"
@@ -1769,6 +1854,11 @@ components:
1769
1854
  $ref: "#/components/schemas/PortablePublicationListing"
1770
1855
  performance:
1771
1856
  $ref: "#/components/schemas/PortablePublicationPerformance"
1857
+ recommendations:
1858
+ items:
1859
+ $ref: "#/components/schemas/Recommendation"
1860
+ maxItems: 24
1861
+ type: array
1772
1862
  socialLinks:
1773
1863
  items:
1774
1864
  $ref: "#/components/schemas/PortablePublicationSocialLink"
@@ -3595,6 +3685,18 @@ components:
3595
3685
  - items
3596
3686
  - nextCursor
3597
3687
  type: object
3688
+ GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistoryResponse:
3689
+ additionalProperties: false
3690
+ description: "SCHEMA-3.32.0: the commits on the linked repository's main branch that changed one path, newest first, at most 50."
3691
+ properties:
3692
+ entries:
3693
+ items:
3694
+ "": "#/components/schemas/ContentDocumentHistoryEntry"
3695
+ maxItems: 50
3696
+ type: array
3697
+ required:
3698
+ - entries
3699
+ type: object
3598
3700
  GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsResponse:
3599
3701
  additionalProperties: false
3600
3702
  properties:
@@ -4454,6 +4556,13 @@ components:
4454
4556
  maxItems: 200
4455
4557
  type: array
4456
4558
  uniqueItems: true
4559
+ createdAt:
4560
+ description: |-
4561
+ SCHEMA-3.32.1: when the publication was created. Optional so a server that has not recorded it, and every 3.32.0 response, still validates; a client treats absent as unknown.
4562
+
4563
+ Canonical Gala instant: the UTC millisecond subset of RFC 3339, exactly `YYYY-MM-DDThh:mm:ss.sssZ`. Stated here rather than as a `pattern` because a generated `OffsetDateTime` cannot carry one (LOCAL-56).
4564
+ format: date-time
4565
+ type: string
4457
4566
  name:
4458
4567
  maxLength: 80
4459
4568
  minLength: 1
@@ -7396,12 +7505,15 @@ components:
7396
7505
  - state
7397
7506
  type: object
7398
7507
  ModerationDecision:
7508
+ description: "SCHEMA-3.32.0: `PIN` and `UNPIN` pin a visible root comment to the top of its article's comments, or release it. They apply to a visible root comment only, and change nothing else about it."
7399
7509
  enum:
7400
7510
  - HOLD
7401
7511
  - RESTORE
7402
7512
  - REMOVE
7403
7513
  - DISMISS_REPORTS
7404
7514
  - DENY_APPEAL
7515
+ - PIN
7516
+ - UNPIN
7405
7517
  type: string
7406
7518
  ModerationQueueItem:
7407
7519
  additionalProperties: false
@@ -7461,12 +7573,20 @@ components:
7461
7573
  format: uuid
7462
7574
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
7463
7575
  type: string
7576
+ likeCount:
7577
+ description: "SCHEMA-3.32.1: how many readers like the comment; absent counts as 0."
7578
+ format: int64
7579
+ minimum: 0
7580
+ type: integer
7464
7581
  parentId:
7465
7582
  oneOf:
7466
7583
  - format: uuid
7467
7584
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
7468
7585
  type: string
7469
7586
  - type: "null"
7587
+ pinned:
7588
+ description: "SCHEMA-3.32.1: true for the one root comment the site owner pinned to the top of the article; absent counts as false."
7589
+ type: boolean
7470
7590
  state:
7471
7591
  $ref: "#/components/schemas/CommentInternalState"
7472
7592
  required:
@@ -7551,10 +7671,17 @@ components:
7551
7671
  type: object
7552
7672
  NewsletterConfirmation:
7553
7673
  additionalProperties: false
7554
- description: "SCHEMA-3.23.0: what the confirmation page shows for one confirmation token."
7674
+ description: "SCHEMA-3.23.0: what the confirmation page shows for one confirmation token. SCHEMA-3.32.0: `afterSignupUrl` (the site's own after-signup address, when set) and `recommendations` (the sites the author recommends, when any) are present only when the site has them."
7555
7675
  properties:
7676
+ afterSignupUrl:
7677
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
7556
7678
  publication:
7557
7679
  $ref: "#/components/schemas/AudiencePublication"
7680
+ recommendations:
7681
+ items:
7682
+ $ref: "#/components/schemas/Recommendation"
7683
+ maxItems: 24
7684
+ type: array
7558
7685
  state:
7559
7686
  $ref: "#/components/schemas/NewsletterConfirmationState"
7560
7687
  required:
@@ -7578,6 +7705,13 @@ components:
7578
7705
  additionalProperties: false
7579
7706
  description: "SCHEMA-3.23.0: the send log of one post: when it went out and how many addresses it reached. `recipients` is the confirmed subscribers at send time; `sent`, `failed` and `deferred` (held back by a daily ceiling, retried later) account for them."
7580
7707
  properties:
7708
+ clicked:
7709
+ description: "SCHEMA-3.32.0: addresses that clicked a link in the issue, from the mail provider; null when not yet known."
7710
+ format: int64
7711
+ minimum: 0
7712
+ type:
7713
+ - integer
7714
+ - "null"
7581
7715
  contentId:
7582
7716
  format: uuid
7583
7717
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
@@ -7586,6 +7720,13 @@ components:
7586
7720
  format: int64
7587
7721
  minimum: 0
7588
7722
  type: integer
7723
+ delivered:
7724
+ description: "SCHEMA-3.32.0: addresses the receiving server accepted the issue for, from the mail provider; null when not yet known."
7725
+ format: int64
7726
+ minimum: 0
7727
+ type:
7728
+ - integer
7729
+ - "null"
7589
7730
  failed:
7590
7731
  format: int64
7591
7732
  minimum: 0
@@ -7594,6 +7735,13 @@ components:
7594
7735
  format: uuid
7595
7736
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
7596
7737
  type: string
7738
+ opened:
7739
+ description: "SCHEMA-3.32.0: addresses that opened the issue, from the mail provider; an estimate, because open tracking is pixel-based and mail clients can load or block the pixel for the reader. Null when not yet known."
7740
+ format: int64
7741
+ minimum: 0
7742
+ type:
7743
+ - integer
7744
+ - "null"
7597
7745
  recipients:
7598
7746
  format: int64
7599
7747
  minimum: 0
@@ -7627,8 +7775,12 @@ components:
7627
7775
  type: string
7628
7776
  NewsletterSettings:
7629
7777
  additionalProperties: false
7630
- description: "SCHEMA-3.23.0: the newsletter configuration of a site at the linked repository's main branch head, as `gala/publication.json` carries it, plus read-only status. `url` is set in `link` mode only; `emailContent` and `replyToOwner` in `galascribe` mode only; `title` and `text` in both modes; every one is null otherwise. `ownerPostalAddressSet` says whether the site owner has saved a postal address (`GET /v2/self/postal-address`); the Galascribe newsletter cannot be turned on without one. `paused` is true while sends are stopped for the site: the platform newsletter kill switch is on, or the owner has no postal address. `capacity` is the organization's subscriber allowance. `openChange` names an existing not-yet-published change of this publication that touches the file, or is null. `setUp` matches `GET .../repository/setup` `state`."
7778
+ description: "SCHEMA-3.23.0: the newsletter configuration of a site at the linked repository's main branch head, as `gala/publication.json` carries it, plus read-only status. `url` is set in `link` mode only; `emailContent` and `replyToOwner` in `galascribe` mode only; `title` and `text` in both modes; every one is null otherwise. `ownerPostalAddressSet` says whether the site owner has saved a postal address (`GET /v2/self/postal-address`); the Galascribe newsletter cannot be turned on without one. `paused` is true while sends are stopped for the site: the platform newsletter kill switch is on, or the owner has no postal address. `capacity` is the organization's subscriber allowance. `openChange` names an existing not-yet-published change of this publication that touches the file, or is null. `setUp` matches `GET .../repository/setup` `state`. SCHEMA-3.32.0: `welcome` and `afterSignupUrl` (`galascribe` mode only; null when unset or in another mode) are optional members, so a 3.31 reader ignores them."
7631
7779
  properties:
7780
+ afterSignupUrl:
7781
+ oneOf:
7782
+ - $ref: "#/components/schemas/PortablePublicationUrlHttps"
7783
+ - type: "null"
7632
7784
  capacity:
7633
7785
  $ref: "#/components/schemas/NewsletterCapacity"
7634
7786
  emailContent:
@@ -7666,6 +7818,10 @@ components:
7666
7818
  oneOf:
7667
7819
  - $ref: "#/components/schemas/PortablePublicationUrlHttps"
7668
7820
  - type: "null"
7821
+ welcome:
7822
+ oneOf:
7823
+ - $ref: "#/components/schemas/NewsletterWelcome"
7824
+ - type: "null"
7669
7825
  required:
7670
7826
  - mode
7671
7827
  - url
@@ -7729,11 +7885,12 @@ components:
7729
7885
  - confirmedAt
7730
7886
  type: object
7731
7887
  NewsletterSubscriberState:
7732
- description: "SCHEMA-3.23.0: `pending` (asked, not yet confirmed), `confirmed`, or `unsubscribed` (the address is kept only as a suppression digest, so its row has no `email`)."
7888
+ description: "SCHEMA-3.23.0: `pending` (asked, not yet confirmed), `confirmed`, or `unsubscribed` (the address is kept only as a suppression digest, so its row has no `email`). SCHEMA-3.32.0: `suppressed` is an address mail to which bounced or drew a spam complaint; it receives nothing further and cannot be re-imported or re-subscribed by the owner."
7733
7889
  enum:
7734
7890
  - pending
7735
7891
  - confirmed
7736
7892
  - unsubscribed
7893
+ - suppressed
7737
7894
  type: string
7738
7895
  NewsletterSubscription:
7739
7896
  additionalProperties: false
@@ -7758,6 +7915,25 @@ components:
7758
7915
  - subscribed
7759
7916
  - unsubscribed
7760
7917
  type: string
7918
+ NewsletterWelcome:
7919
+ additionalProperties: false
7920
+ description: "SCHEMA-3.32.0: the welcome email mailed once to a new subscriber after they confirm: a one-line subject of 1 to 120 graphemes and a plain-text body of 1 to 2000 graphemes."
7921
+ properties:
7922
+ body:
7923
+ $ref: "#/components/schemas/PortablePublicationPlainText"
7924
+ x-gala-graphemeLength:
7925
+ maximum: 2000
7926
+ minimum: 1
7927
+ subject:
7928
+ $ref: "#/components/schemas/PortablePublicationPlainText"
7929
+ pattern: ^[^\r\n\u2028\u2029]+$
7930
+ x-gala-graphemeLength:
7931
+ maximum: 120
7932
+ minimum: 1
7933
+ required:
7934
+ - subject
7935
+ - body
7936
+ type: object
7761
7937
  NotificationCadence:
7762
7938
  description: "SCHEMA-3.23.0: how often a category is emailed. `instant` sends one email per notification, `daily` one digest per day, `off` none. The inbox row exists whatever the cadence."
7763
7939
  enum:
@@ -15689,6 +15865,10 @@ components:
15689
15865
  type: boolean
15690
15866
  enabled:
15691
15867
  type: boolean
15868
+ likes:
15869
+ default: false
15870
+ description: "SCHEMA-3.32.0: when true, signed-in readers can like a comment. An absent member means false, so every 3.31 configuration still validates."
15871
+ type: boolean
15692
15872
  maxDepth:
15693
15873
  maximum: 4
15694
15874
  minimum: 1
@@ -16280,6 +16460,14 @@ components:
16280
16460
  $ref: "#/components/schemas/PortablePublicationPublicationPolicies"
16281
16461
  profile:
16282
16462
  $ref: "#/components/schemas/PortablePublicationPublicationProfile"
16463
+ recommendations:
16464
+ description: "SCHEMA-3.32.0: the sites the author recommends, shown to readers after they subscribe and published as `/.well-known/recommendations.json`. At most 24; `url` is unique within the array. JSON Schema cannot express uniqueness by one member, so consumers enforce it. An absent member means no recommendations."
16465
+ items:
16466
+ $ref: "#/components/schemas/PortablePublicationRecommendation"
16467
+ maxItems: 24
16468
+ minItems: 0
16469
+ type: array
16470
+ uniqueItems: true
16283
16471
  schemaId:
16284
16472
  pattern: ^urn:gala:schema:publication:2\.0\.0$
16285
16473
  type: string
@@ -16399,6 +16587,9 @@ components:
16399
16587
  - additionalProperties: false
16400
16588
  description: "Galascribe mode: the panel is an email field and a Subscribe button. `title` and `text` are the panel heading and sentence; there is no `url`. The API refuses to turn this mode on until the site owner has a postal address in their Account."
16401
16589
  properties:
16590
+ afterSignupUrl:
16591
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16592
+ description: "SCHEMA-3.32.0: where the subscriber is sent after they confirm. It must be an https URL; the API applies its own open-redirect rules. An absent member shows the Galascribe confirmation page."
16402
16593
  emailContent:
16403
16594
  description: "`card` mails the post title, description, image and a Read the post button; the template renders no email fragment. `full` mails the whole post: for each published post the template renders an email-safe HTML fragment at `/_gala/email/<content id>.html` (`<content id>` is the post's front-matter `id`; absolute URLs and inline-safe markup only; `noindex`; absent from the sitemap, the feeds, the search index and the llms files), which the API fetches after the generation is certified live."
16404
16595
  enum:
@@ -16418,6 +16609,25 @@ components:
16418
16609
  minimum: 1
16419
16610
  title:
16420
16611
  $ref: "#/components/schemas/PortablePublicationPlainLabel"
16612
+ welcome:
16613
+ additionalProperties: false
16614
+ description: "SCHEMA-3.32.0: the welcome email mailed once to a new subscriber after they confirm. `subject` is one line (no line break) of 1 to 120 graphemes; `body` is plain text of 1 to 2000 graphemes. An absent `welcome` member means no welcome email."
16615
+ properties:
16616
+ body:
16617
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16618
+ x-gala-graphemeLength:
16619
+ maximum: 2000
16620
+ minimum: 1
16621
+ subject:
16622
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16623
+ pattern: ^[^\r\n\u2028\u2029]+$
16624
+ x-gala-graphemeLength:
16625
+ maximum: 120
16626
+ minimum: 1
16627
+ required:
16628
+ - subject
16629
+ - body
16630
+ type: object
16421
16631
  required:
16422
16632
  - mode
16423
16633
  - title
@@ -16493,6 +16703,26 @@ components:
16493
16703
  - route
16494
16704
  - body
16495
16705
  type: object
16706
+ PortablePublicationRecommendation:
16707
+ additionalProperties: false
16708
+ description: "SCHEMA-3.32.0: one site the author recommends to readers."
16709
+ properties:
16710
+ addedOn:
16711
+ description: The day the recommendation was added, YYYY-MM-DD (UTC). It feeds the `created_at` and `updated_at` members of the site's `/.well-known/recommendations.json` entry.
16712
+ pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$
16713
+ type: string
16714
+ description:
16715
+ $ref: "#/components/schemas/PortablePublicationPlainText"
16716
+ x-gala-graphemeLength:
16717
+ maximum: 300
16718
+ title:
16719
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
16720
+ url:
16721
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
16722
+ required:
16723
+ - url
16724
+ - title
16725
+ type: object
16496
16726
  PortablePublicationRepoRelativePath:
16497
16727
  description: NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal.
16498
16728
  format: gala-repository-relative-path
@@ -16849,6 +17079,28 @@ components:
16849
17079
  - organizations
16850
17080
  - capabilities
16851
17081
  type: object
17082
+ PostCallbacksBrevoRequest:
17083
+ description: Raw Brevo webhook JSON authenticated by the X-Gala-Webhook-Token header. Brevo posts one event per call; an object or an array of objects is accepted and every member is opaque to the contract.
17084
+ oneOf:
17085
+ - additionalProperties: true
17086
+ type: object
17087
+ - items:
17088
+ additionalProperties: true
17089
+ type: object
17090
+ maxItems: 1000
17091
+ type: array
17092
+ PostCallbacksBrevoResponse:
17093
+ additionalProperties: false
17094
+ properties:
17095
+ accepted:
17096
+ not:
17097
+ enum:
17098
+ - false
17099
+ type: boolean
17100
+ x-gala-const: true
17101
+ required:
17102
+ - accepted
17103
+ type: object
16852
17104
  PostCallbacksGithubAppRequest:
16853
17105
  additionalProperties: true
16854
17106
  description: Raw GitHub webhook JSON authenticated over the exact received bytes; event and delivery identities are carried in required GitHub headers.
@@ -17537,6 +17789,31 @@ components:
17537
17789
  - expectedHead
17538
17790
  - diffDigest
17539
17791
  type: object
17792
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewRequest:
17793
+ additionalProperties: false
17794
+ description: "SCHEMA-3.32.0: the page to preview. Only https addresses are fetched."
17795
+ properties:
17796
+ url:
17797
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
17798
+ required:
17799
+ - url
17800
+ type: object
17801
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewResponse:
17802
+ additionalProperties: false
17803
+ description: "SCHEMA-3.32.0: what the page says about itself. Every member is omitted when the page does not give one; there is no image."
17804
+ properties:
17805
+ canonicalUrl:
17806
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
17807
+ description:
17808
+ maxLength: 500
17809
+ type: string
17810
+ siteName:
17811
+ maxLength: 200
17812
+ type: string
17813
+ title:
17814
+ maxLength: 300
17815
+ type: string
17816
+ type: object
17540
17817
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdDeploymentsByGenerationIdReconcileRequest:
17541
17818
  additionalProperties: false
17542
17819
  properties:
@@ -17726,6 +18003,55 @@ components:
17726
18003
  type: object
17727
18004
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecideResponse:
17728
18005
  $ref: "#/components/schemas/ModerationQueueItem"
18006
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportRequest:
18007
+ additionalProperties: false
18008
+ description: "SCHEMA-3.32.0: the addresses to invite, already parsed from the owner's file. `attestation` must be true: the owner states that every address agreed to hear from them. Each new address becomes a `pending` subscriber and is sent the confirmation email; nobody is subscribed without confirming."
18009
+ properties:
18010
+ addresses:
18011
+ items:
18012
+ format: email
18013
+ maxLength: 320
18014
+ minLength: 3
18015
+ type: string
18016
+ maxItems: 5000
18017
+ minItems: 1
18018
+ type: array
18019
+ attestation:
18020
+ not:
18021
+ enum:
18022
+ - false
18023
+ type: boolean
18024
+ x-gala-const: true
18025
+ required:
18026
+ - addresses
18027
+ - attestation
18028
+ type: object
18029
+ PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportResponse:
18030
+ additionalProperties: false
18031
+ description: "SCHEMA-3.32.0: what the import did. `queued` addresses were new and had a confirmation email queued; `skippedKnown` were already pending, confirmed, unsubscribed or suppressed; `invalid` were not usable addresses; `overCapacity` were left out because the organization's subscriber allowance was reached."
18032
+ properties:
18033
+ invalid:
18034
+ format: int64
18035
+ minimum: 0
18036
+ type: integer
18037
+ overCapacity:
18038
+ format: int64
18039
+ minimum: 0
18040
+ type: integer
18041
+ queued:
18042
+ format: int64
18043
+ minimum: 0
18044
+ type: integer
18045
+ skippedKnown:
18046
+ format: int64
18047
+ minimum: 0
18048
+ type: integer
18049
+ required:
18050
+ - queued
18051
+ - skippedKnown
18052
+ - invalid
18053
+ - overCapacity
18054
+ type: object
17729
18055
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdOverviewRefreshResponse:
17730
18056
  $ref: "#/components/schemas/PublicationOverview"
17731
18057
  PostOrganizationsByOrganizationIdPublicationsByPublicationIdPreviewRetirementResponse:
@@ -20853,8 +21179,12 @@ components:
20853
21179
  - text
20854
21180
  - emailContent
20855
21181
  - replyToOwner
20856
- description: "Members by mode: `off` takes none besides `mode`; `link` takes `url`, `title` and `text` (all required); `galascribe` takes `title`, `text`, `emailContent` and `replyToOwner` (all required). A member that does not belong to the chosen mode is `422 VALIDATION_FAILED` pointed at that member."
21182
+ description: "Members by mode: `off` takes none besides `mode`; `link` takes `url`, `title` and `text` (all required); `galascribe` takes `title`, `text`, `emailContent` and `replyToOwner` (all required). A member that does not belong to the chosen mode is `422 VALIDATION_FAILED` pointed at that member. SCHEMA-3.32.0: `welcome` and `afterSignupUrl` are optional in `galascribe` mode (an absent member leaves the stored value as it is and null removes it)."
20857
21183
  properties:
21184
+ afterSignupUrl:
21185
+ oneOf:
21186
+ - $ref: "#/components/schemas/PortablePublicationUrlHttps"
21187
+ - type: "null"
20858
21188
  emailContent:
20859
21189
  $ref: "#/components/schemas/NewsletterEmailContent"
20860
21190
  mode:
@@ -20870,6 +21200,10 @@ components:
20870
21200
  $ref: "#/components/schemas/PortablePublicationPlainLabel"
20871
21201
  url:
20872
21202
  $ref: "#/components/schemas/PortablePublicationUrlHttps"
21203
+ welcome:
21204
+ oneOf:
21205
+ - $ref: "#/components/schemas/NewsletterWelcome"
21206
+ - type: "null"
20873
21207
  required:
20874
21208
  - mode
20875
21209
  type: object
@@ -21792,6 +22126,25 @@ components:
21792
22126
  required:
21793
22127
  - origin
21794
22128
  type: object
22129
+ Recommendation:
22130
+ additionalProperties: false
22131
+ description: "SCHEMA-3.32.0: one site the author recommends to readers. `addedOn` is the day it was added (YYYY-MM-DD, UTC) and feeds the `created_at` and `updated_at` of the site's `/.well-known/recommendations.json` entry."
22132
+ properties:
22133
+ addedOn:
22134
+ pattern: ^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$
22135
+ type: string
22136
+ description:
22137
+ $ref: "#/components/schemas/PortablePublicationPlainText"
22138
+ x-gala-graphemeLength:
22139
+ maximum: 300
22140
+ title:
22141
+ $ref: "#/components/schemas/PortablePublicationPlainLabel"
22142
+ url:
22143
+ $ref: "#/components/schemas/PortablePublicationUrlHttps"
22144
+ required:
22145
+ - url
22146
+ - title
22147
+ type: object
21795
22148
  RecoveryCodeStatus:
21796
22149
  additionalProperties: false
21797
22150
  description: How many codes of the current recovery code set are still unused.
@@ -22816,6 +23169,10 @@ components:
22816
23169
  description: Scoped credential an operator creates; acts as that operator within its scopes. Refused for every operation without `x-gala-api-key-scope`.
22817
23170
  scheme: bearer
22818
23171
  type: http
23172
+ brevoWebhookToken:
23173
+ in: header
23174
+ name: X-Gala-Webhook-Token
23175
+ type: apiKey
22819
23176
  browserSession:
22820
23177
  in: cookie
22821
23178
  name: __Host-gala-session
@@ -23490,6 +23847,103 @@ paths:
23490
23847
  - NONE
23491
23848
  x-gala-success-category: protocol
23492
23849
  x-gala-tenant-scope: NONE
23850
+ /v2/callbacks/brevo:
23851
+ post:
23852
+ description: |
23853
+ Brevo transactional-email event webhook (delivered, opened, clicked, bounced, complaint and similar). Brevo posts one event per call; the body is an opaque JSON object or an array of such objects and the contract does not describe Brevo's own fields. The call is authenticated by the shared token in the `X-Gala-Webhook-Token` header, which the deployment configures in Brevo's webhook headers. `202` means the body was admitted for asynchronous processing, including an event the API ignores or has already seen. `400` is a malformed body, `401` is a missing or wrong token.
23854
+ operationId: postCallbacksBrevo
23855
+ parameters:
23856
+ - $ref: "#/components/parameters/XCorrelationId"
23857
+ - example: wh_0000000000000000000000000000000000000000
23858
+ in: header
23859
+ name: X-Gala-Webhook-Token
23860
+ required: true
23861
+ schema:
23862
+ maxLength: 1024
23863
+ minLength: 1
23864
+ type: string
23865
+ requestBody:
23866
+ content:
23867
+ application/json:
23868
+ examples:
23869
+ nominal:
23870
+ summary: Nominal valid request
23871
+ value: {}
23872
+ schema:
23873
+ $ref: "#/components/schemas/PostCallbacksBrevoRequest"
23874
+ required: true
23875
+ responses:
23876
+ "202":
23877
+ content:
23878
+ application/json:
23879
+ examples:
23880
+ nominal:
23881
+ summary: Nominal successful response
23882
+ value:
23883
+ accepted: true
23884
+ schema:
23885
+ $ref: "#/components/schemas/PostCallbacksBrevoResponse"
23886
+ description: admit an authenticated Brevo email event succeeded
23887
+ headers:
23888
+ Cache-Control:
23889
+ $ref: "#/components/headers/CacheControlNoStore"
23890
+ X-Correlation-Id:
23891
+ $ref: "#/components/headers/XCorrelationId"
23892
+ "400":
23893
+ $ref: "#/components/responses/ValidationFailed"
23894
+ "401":
23895
+ content:
23896
+ application/problem+json:
23897
+ examples:
23898
+ AUTHENTICATION_REQUIRED:
23899
+ summary: AUTHENTICATION_REQUIRED
23900
+ value:
23901
+ code: AUTHENTICATION_REQUIRED
23902
+ correlationId: 018f0000-0000-7000-8000-000000000001
23903
+ detail: See the operation contract.
23904
+ errors: []
23905
+ retryable: false
23906
+ schemaId: urn:gala:schema:problem:2.0.0
23907
+ schemaVersion: 2.0.0
23908
+ status: 401
23909
+ title: AUTHENTICATION_REQUIRED
23910
+ type: urn:gala:problem:authentication-required
23911
+ schema:
23912
+ $ref: "#/components/schemas/Problem"
23913
+ description: AUTHENTICATION_REQUIRED
23914
+ headers:
23915
+ Cache-Control:
23916
+ $ref: "#/components/headers/CacheControlNoStore"
23917
+ X-Correlation-Id:
23918
+ $ref: "#/components/headers/XCorrelationId"
23919
+ x-gala-problem-codes:
23920
+ - AUTHENTICATION_REQUIRED
23921
+ "413":
23922
+ $ref: "#/components/responses/RequestTooLarge"
23923
+ "415":
23924
+ $ref: "#/components/responses/UnsupportedMediaType"
23925
+ security:
23926
+ - brevoWebhookToken: []
23927
+ summary: admit an authenticated Brevo email event
23928
+ tags:
23929
+ - callbacks
23930
+ x-gala-activation-gate: MVP
23931
+ x-gala-activation-guards:
23932
+ - NONE
23933
+ x-gala-capability-key: null
23934
+ x-gala-concurrency: provider-event-idempotency-and-event-time-ordering
23935
+ x-gala-conditional-capabilities: []
23936
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
23937
+ x-gala-nullability: required-and-nullable-are-explicit
23938
+ x-gala-purpose: admit an authenticated Brevo email event
23939
+ x-gala-reachable-problems:
23940
+ - AUTHENTICATION_REQUIRED
23941
+ - VALIDATION_FAILED
23942
+ x-gala-replay-identity: brevo-message-id-and-event-time
23943
+ x-gala-state-guards:
23944
+ - NONE
23945
+ x-gala-success-category: provider-callback
23946
+ x-gala-tenant-scope: NONE
23493
23947
  /v2/callbacks/cloudflare/oauth:
23494
23948
  get:
23495
23949
  description: |
@@ -40058,6 +40512,534 @@ paths:
40058
40512
  - NONE
40059
40513
  x-gala-success-category: query
40060
40514
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40515
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/documents/history:
40516
+ get:
40517
+ description: |
40518
+ Needs `publication.view`. Lists the commits on the linked repository's
40519
+ main branch that changed `path`, newest first, at most 50. Each entry
40520
+ carries the `revision` (the commit to pass as `revision` to `GET
40521
+ .../content/documents`), when it was committed, the committer's GitHub
40522
+ login when GitHub names one, the first line of the commit message and
40523
+ `source`: `draft` (saved from the editor), `publish` (a publish of the
40524
+ site), `import` (an import) or `unknown` (a commit Galascribe did not
40525
+ make). A path with no commit on main, or an unknown path, is `404
40526
+ RESOURCE_NOT_FOUND`.
40527
+ operationId: getOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistory
40528
+ parameters:
40529
+ - $ref: "#/components/parameters/XCorrelationId"
40530
+ - example: 018f0000-0000-7000-8000-000000000001
40531
+ in: path
40532
+ name: organizationId
40533
+ required: true
40534
+ schema:
40535
+ format: uuid
40536
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40537
+ type: string
40538
+ - example: 018f0000-0000-7000-8000-000000000001
40539
+ in: path
40540
+ name: publicationId
40541
+ required: true
40542
+ schema:
40543
+ format: uuid
40544
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40545
+ type: string
40546
+ - example: content/articles/example.md
40547
+ in: query
40548
+ name: path
40549
+ required: true
40550
+ schema:
40551
+ maxLength: 512
40552
+ minLength: 1
40553
+ pattern: ^(?!/)(?!.*(?:^|/)\.)(?!gala\.lock\.json$)(?:gala/theme-pages/[^\x00-\x1f\x7f\\/]+|(?!gala(?:/|$))[^\x00-\x1f\x7f\\]+)$
40554
+ type: string
40555
+ responses:
40556
+ "200":
40557
+ content:
40558
+ application/json:
40559
+ examples:
40560
+ nominal:
40561
+ summary: Nominal successful response
40562
+ value:
40563
+ entries:
40564
+ - authorLogin: octocat
40565
+ committedAt: "2026-11-03T09:30:00.000Z"
40566
+ message: Update example
40567
+ revision: sha1:0000000000000000000000000000000000000000
40568
+ source: draft
40569
+ schema:
40570
+ $ref: "#/components/schemas/GetOrganizationsByOrganizationIdPublicationsByPublicationIdContentDocumentsHistoryResponse"
40571
+ description: list the history of one content document succeeded
40572
+ headers:
40573
+ Cache-Control:
40574
+ $ref: "#/components/headers/CacheControlNoStore"
40575
+ X-Correlation-Id:
40576
+ $ref: "#/components/headers/XCorrelationId"
40577
+ "400":
40578
+ content:
40579
+ application/problem+json:
40580
+ examples:
40581
+ VALIDATION_FAILED:
40582
+ summary: VALIDATION_FAILED
40583
+ value:
40584
+ code: VALIDATION_FAILED
40585
+ correlationId: 018f0000-0000-7000-8000-000000000001
40586
+ detail: See the operation contract.
40587
+ errors: []
40588
+ retryable: false
40589
+ schemaId: urn:gala:schema:problem:2.0.0
40590
+ schemaVersion: 2.0.0
40591
+ status: 400
40592
+ title: VALIDATION_FAILED
40593
+ type: urn:gala:problem:validation-failed
40594
+ schema:
40595
+ $ref: "#/components/schemas/Problem"
40596
+ description: VALIDATION_FAILED
40597
+ headers:
40598
+ Cache-Control:
40599
+ $ref: "#/components/headers/CacheControlNoStore"
40600
+ X-Correlation-Id:
40601
+ $ref: "#/components/headers/XCorrelationId"
40602
+ x-gala-problem-codes:
40603
+ - VALIDATION_FAILED
40604
+ "401":
40605
+ content:
40606
+ application/problem+json:
40607
+ examples:
40608
+ AUTHENTICATION_REQUIRED:
40609
+ summary: AUTHENTICATION_REQUIRED
40610
+ value:
40611
+ code: AUTHENTICATION_REQUIRED
40612
+ correlationId: 018f0000-0000-7000-8000-000000000001
40613
+ detail: See the operation contract.
40614
+ errors: []
40615
+ retryable: false
40616
+ schemaId: urn:gala:schema:problem:2.0.0
40617
+ schemaVersion: 2.0.0
40618
+ status: 401
40619
+ title: AUTHENTICATION_REQUIRED
40620
+ type: urn:gala:problem:authentication-required
40621
+ schema:
40622
+ $ref: "#/components/schemas/Problem"
40623
+ description: AUTHENTICATION_REQUIRED
40624
+ headers:
40625
+ Cache-Control:
40626
+ $ref: "#/components/headers/CacheControlNoStore"
40627
+ X-Correlation-Id:
40628
+ $ref: "#/components/headers/XCorrelationId"
40629
+ x-gala-problem-codes:
40630
+ - AUTHENTICATION_REQUIRED
40631
+ "403":
40632
+ content:
40633
+ application/problem+json:
40634
+ examples:
40635
+ AUTHORIZATION_DENIED:
40636
+ summary: AUTHORIZATION_DENIED
40637
+ value:
40638
+ code: AUTHORIZATION_DENIED
40639
+ correlationId: 018f0000-0000-7000-8000-000000000001
40640
+ detail: See the operation contract.
40641
+ errors: []
40642
+ retryable: false
40643
+ schemaId: urn:gala:schema:problem:2.0.0
40644
+ schemaVersion: 2.0.0
40645
+ status: 403
40646
+ title: AUTHORIZATION_DENIED
40647
+ type: urn:gala:problem:authorization-denied
40648
+ schema:
40649
+ $ref: "#/components/schemas/Problem"
40650
+ description: AUTHORIZATION_DENIED
40651
+ headers:
40652
+ Cache-Control:
40653
+ $ref: "#/components/headers/CacheControlNoStore"
40654
+ X-Correlation-Id:
40655
+ $ref: "#/components/headers/XCorrelationId"
40656
+ x-gala-problem-codes:
40657
+ - AUTHORIZATION_DENIED
40658
+ "404":
40659
+ content:
40660
+ application/problem+json:
40661
+ examples:
40662
+ RESOURCE_NOT_FOUND:
40663
+ summary: RESOURCE_NOT_FOUND
40664
+ value:
40665
+ code: RESOURCE_NOT_FOUND
40666
+ correlationId: 018f0000-0000-7000-8000-000000000001
40667
+ detail: See the operation contract.
40668
+ errors: []
40669
+ retryable: false
40670
+ schemaId: urn:gala:schema:problem:2.0.0
40671
+ schemaVersion: 2.0.0
40672
+ status: 404
40673
+ title: RESOURCE_NOT_FOUND
40674
+ type: urn:gala:problem:resource-not-found
40675
+ schema:
40676
+ $ref: "#/components/schemas/Problem"
40677
+ description: RESOURCE_NOT_FOUND
40678
+ headers:
40679
+ Cache-Control:
40680
+ $ref: "#/components/headers/CacheControlNoStore"
40681
+ X-Correlation-Id:
40682
+ $ref: "#/components/headers/XCorrelationId"
40683
+ x-gala-problem-codes:
40684
+ - RESOURCE_NOT_FOUND
40685
+ "429":
40686
+ content:
40687
+ application/problem+json:
40688
+ examples:
40689
+ RATE_LIMITED:
40690
+ summary: RATE_LIMITED
40691
+ value:
40692
+ code: RATE_LIMITED
40693
+ correlationId: 018f0000-0000-7000-8000-000000000001
40694
+ detail: See the operation contract.
40695
+ errors: []
40696
+ retryable: true
40697
+ schemaId: urn:gala:schema:problem:2.0.0
40698
+ schemaVersion: 2.0.0
40699
+ status: 429
40700
+ title: RATE_LIMITED
40701
+ type: urn:gala:problem:rate-limited
40702
+ schema:
40703
+ $ref: "#/components/schemas/Problem"
40704
+ description: RATE_LIMITED
40705
+ headers:
40706
+ Cache-Control:
40707
+ $ref: "#/components/headers/CacheControlNoStore"
40708
+ Retry-After:
40709
+ $ref: "#/components/headers/RetryAfter"
40710
+ X-Correlation-Id:
40711
+ $ref: "#/components/headers/XCorrelationId"
40712
+ x-gala-problem-codes:
40713
+ - RATE_LIMITED
40714
+ "503":
40715
+ content:
40716
+ application/problem+json:
40717
+ examples:
40718
+ CAPABILITY_UNAVAILABLE:
40719
+ summary: CAPABILITY_UNAVAILABLE
40720
+ value:
40721
+ code: CAPABILITY_UNAVAILABLE
40722
+ correlationId: 018f0000-0000-7000-8000-000000000001
40723
+ detail: See the operation contract.
40724
+ errors: []
40725
+ retryable: false
40726
+ schemaId: urn:gala:schema:problem:2.0.0
40727
+ schemaVersion: 2.0.0
40728
+ status: 503
40729
+ title: CAPABILITY_UNAVAILABLE
40730
+ type: urn:gala:problem:capability-unavailable
40731
+ DEPENDENCY_UNAVAILABLE:
40732
+ summary: DEPENDENCY_UNAVAILABLE
40733
+ value:
40734
+ code: DEPENDENCY_UNAVAILABLE
40735
+ correlationId: 018f0000-0000-7000-8000-000000000001
40736
+ detail: See the operation contract.
40737
+ errors: []
40738
+ retryable: true
40739
+ schemaId: urn:gala:schema:problem:2.0.0
40740
+ schemaVersion: 2.0.0
40741
+ status: 503
40742
+ title: DEPENDENCY_UNAVAILABLE
40743
+ type: urn:gala:problem:dependency-unavailable
40744
+ schema:
40745
+ $ref: "#/components/schemas/Problem"
40746
+ description: CAPABILITY_UNAVAILABLE, DEPENDENCY_UNAVAILABLE
40747
+ headers:
40748
+ Cache-Control:
40749
+ $ref: "#/components/headers/CacheControlNoStore"
40750
+ X-Correlation-Id:
40751
+ $ref: "#/components/headers/XCorrelationId"
40752
+ x-gala-problem-codes:
40753
+ - CAPABILITY_UNAVAILABLE
40754
+ - DEPENDENCY_UNAVAILABLE
40755
+ security:
40756
+ - browserSession: []
40757
+ summary: list the history of one content document
40758
+ tags:
40759
+ - organizations
40760
+ x-gala-activation-gate: MVP
40761
+ x-gala-activation-guards:
40762
+ - Active repository binding and configured GitHub App identity capability
40763
+ x-gala-capability-key: publication.view
40764
+ x-gala-concurrency: binding-epoch
40765
+ x-gala-conditional-capabilities: []
40766
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
40767
+ x-gala-nullability: required-and-nullable-are-explicit
40768
+ x-gala-purpose: list the history of one content document
40769
+ x-gala-reachable-problems:
40770
+ - AUTHENTICATION_REQUIRED
40771
+ - AUTHORIZATION_DENIED
40772
+ - CAPABILITY_UNAVAILABLE
40773
+ - DEPENDENCY_UNAVAILABLE
40774
+ - RATE_LIMITED
40775
+ - RESOURCE_NOT_FOUND
40776
+ - VALIDATION_FAILED
40777
+ x-gala-replay-identity: safe-query
40778
+ x-gala-state-guards:
40779
+ - NONE
40780
+ x-gala-success-category: query
40781
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40782
+ /v2/organizations/{organizationId}/publications/{publicationId}/content/link-preview:
40783
+ post:
40784
+ description: |
40785
+ Needs `publication.source.write`. The server fetches `url` (https only; never an address on a private or internal network, and at most a few redirects, each re-checked) and returns what the page says about itself, for the editor's bookmark card: `title`, `description`, `siteName` and `canonicalUrl`, from Open Graph or standard metadata. Each member is omitted when the page does not give one. No image is returned or fetched. A page that cannot be reached, is not HTML or is too large is `422 VALIDATION_FAILED` pointed at `/url`. Calls are rate-limited per caller (`429 RATE_LIMITED`).
40786
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreview
40787
+ parameters:
40788
+ - $ref: "#/components/parameters/XCorrelationId"
40789
+ - example: 018f0000-0000-7000-8000-000000000001
40790
+ in: path
40791
+ name: organizationId
40792
+ required: true
40793
+ schema:
40794
+ format: uuid
40795
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40796
+ type: string
40797
+ - example: 018f0000-0000-7000-8000-000000000001
40798
+ in: path
40799
+ name: publicationId
40800
+ required: true
40801
+ schema:
40802
+ format: uuid
40803
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
40804
+ type: string
40805
+ - $ref: "#/components/parameters/XCsrfToken"
40806
+ requestBody:
40807
+ content:
40808
+ application/json:
40809
+ examples:
40810
+ nominal:
40811
+ summary: Nominal valid request
40812
+ value:
40813
+ url: https://example.com/article
40814
+ schema:
40815
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewRequest"
40816
+ required: true
40817
+ responses:
40818
+ "200":
40819
+ content:
40820
+ application/json:
40821
+ examples:
40822
+ nominal:
40823
+ summary: Nominal successful response
40824
+ value:
40825
+ canonicalUrl: https://example.com/article
40826
+ description: A short description of the page.
40827
+ siteName: Example
40828
+ title: Example article
40829
+ schema:
40830
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdContentLinkPreviewResponse"
40831
+ description: preview one linked page succeeded
40832
+ headers:
40833
+ Cache-Control:
40834
+ $ref: "#/components/headers/CacheControlNoStore"
40835
+ X-Correlation-Id:
40836
+ $ref: "#/components/headers/XCorrelationId"
40837
+ "400":
40838
+ content:
40839
+ application/problem+json:
40840
+ examples:
40841
+ REQUEST_FIELD_UNKNOWN:
40842
+ summary: REQUEST_FIELD_UNKNOWN
40843
+ value:
40844
+ code: REQUEST_FIELD_UNKNOWN
40845
+ correlationId: 018f0000-0000-7000-8000-000000000001
40846
+ detail: See the operation contract.
40847
+ errors: []
40848
+ retryable: false
40849
+ schemaId: urn:gala:schema:problem:2.0.0
40850
+ schemaVersion: 2.0.0
40851
+ status: 400
40852
+ title: REQUEST_FIELD_UNKNOWN
40853
+ type: urn:gala:problem:request-field-unknown
40854
+ VALIDATION_FAILED:
40855
+ summary: VALIDATION_FAILED
40856
+ value:
40857
+ code: VALIDATION_FAILED
40858
+ correlationId: 018f0000-0000-7000-8000-000000000001
40859
+ detail: See the operation contract.
40860
+ errors: []
40861
+ retryable: false
40862
+ schemaId: urn:gala:schema:problem:2.0.0
40863
+ schemaVersion: 2.0.0
40864
+ status: 400
40865
+ title: VALIDATION_FAILED
40866
+ type: urn:gala:problem:validation-failed
40867
+ schema:
40868
+ $ref: "#/components/schemas/Problem"
40869
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
40870
+ headers:
40871
+ Cache-Control:
40872
+ $ref: "#/components/headers/CacheControlNoStore"
40873
+ X-Correlation-Id:
40874
+ $ref: "#/components/headers/XCorrelationId"
40875
+ x-gala-problem-codes:
40876
+ - REQUEST_FIELD_UNKNOWN
40877
+ - VALIDATION_FAILED
40878
+ "401":
40879
+ content:
40880
+ application/problem+json:
40881
+ examples:
40882
+ AUTHENTICATION_REQUIRED:
40883
+ summary: AUTHENTICATION_REQUIRED
40884
+ value:
40885
+ code: AUTHENTICATION_REQUIRED
40886
+ correlationId: 018f0000-0000-7000-8000-000000000001
40887
+ detail: See the operation contract.
40888
+ errors: []
40889
+ retryable: false
40890
+ schemaId: urn:gala:schema:problem:2.0.0
40891
+ schemaVersion: 2.0.0
40892
+ status: 401
40893
+ title: AUTHENTICATION_REQUIRED
40894
+ type: urn:gala:problem:authentication-required
40895
+ schema:
40896
+ $ref: "#/components/schemas/Problem"
40897
+ description: AUTHENTICATION_REQUIRED
40898
+ headers:
40899
+ Cache-Control:
40900
+ $ref: "#/components/headers/CacheControlNoStore"
40901
+ X-Correlation-Id:
40902
+ $ref: "#/components/headers/XCorrelationId"
40903
+ x-gala-problem-codes:
40904
+ - AUTHENTICATION_REQUIRED
40905
+ "403":
40906
+ content:
40907
+ application/problem+json:
40908
+ examples:
40909
+ AUTHORIZATION_DENIED:
40910
+ summary: AUTHORIZATION_DENIED
40911
+ value:
40912
+ code: AUTHORIZATION_DENIED
40913
+ correlationId: 018f0000-0000-7000-8000-000000000001
40914
+ detail: See the operation contract.
40915
+ errors: []
40916
+ retryable: false
40917
+ schemaId: urn:gala:schema:problem:2.0.0
40918
+ schemaVersion: 2.0.0
40919
+ status: 403
40920
+ title: AUTHORIZATION_DENIED
40921
+ type: urn:gala:problem:authorization-denied
40922
+ schema:
40923
+ $ref: "#/components/schemas/Problem"
40924
+ description: AUTHORIZATION_DENIED
40925
+ headers:
40926
+ Cache-Control:
40927
+ $ref: "#/components/headers/CacheControlNoStore"
40928
+ X-Correlation-Id:
40929
+ $ref: "#/components/headers/XCorrelationId"
40930
+ x-gala-problem-codes:
40931
+ - AUTHORIZATION_DENIED
40932
+ "404":
40933
+ content:
40934
+ application/problem+json:
40935
+ examples:
40936
+ RESOURCE_NOT_FOUND:
40937
+ summary: RESOURCE_NOT_FOUND
40938
+ value:
40939
+ code: RESOURCE_NOT_FOUND
40940
+ correlationId: 018f0000-0000-7000-8000-000000000001
40941
+ detail: See the operation contract.
40942
+ errors: []
40943
+ retryable: false
40944
+ schemaId: urn:gala:schema:problem:2.0.0
40945
+ schemaVersion: 2.0.0
40946
+ status: 404
40947
+ title: RESOURCE_NOT_FOUND
40948
+ type: urn:gala:problem:resource-not-found
40949
+ schema:
40950
+ $ref: "#/components/schemas/Problem"
40951
+ description: RESOURCE_NOT_FOUND
40952
+ headers:
40953
+ Cache-Control:
40954
+ $ref: "#/components/headers/CacheControlNoStore"
40955
+ X-Correlation-Id:
40956
+ $ref: "#/components/headers/XCorrelationId"
40957
+ x-gala-problem-codes:
40958
+ - RESOURCE_NOT_FOUND
40959
+ "422":
40960
+ content:
40961
+ application/problem+json:
40962
+ examples:
40963
+ VALIDATION_FAILED:
40964
+ summary: VALIDATION_FAILED
40965
+ value:
40966
+ code: VALIDATION_FAILED
40967
+ correlationId: 018f0000-0000-7000-8000-000000000001
40968
+ detail: The page could not be reached, is not an HTML page or is too large. See the operation contract.
40969
+ errors:
40970
+ - code: VALIDATION_FAILED
40971
+ pointer: /url
40972
+ retryable: false
40973
+ schemaId: urn:gala:schema:problem:2.0.0
40974
+ schemaVersion: 2.0.0
40975
+ status: 422
40976
+ title: VALIDATION_FAILED
40977
+ type: urn:gala:problem:validation-failed
40978
+ schema:
40979
+ $ref: "#/components/schemas/Problem"
40980
+ description: VALIDATION_FAILED
40981
+ headers:
40982
+ Cache-Control:
40983
+ $ref: "#/components/headers/CacheControlNoStore"
40984
+ X-Correlation-Id:
40985
+ $ref: "#/components/headers/XCorrelationId"
40986
+ x-gala-problem-codes:
40987
+ - VALIDATION_FAILED
40988
+ "429":
40989
+ content:
40990
+ application/problem+json:
40991
+ examples:
40992
+ RATE_LIMITED:
40993
+ summary: RATE_LIMITED
40994
+ value:
40995
+ code: RATE_LIMITED
40996
+ correlationId: 018f0000-0000-7000-8000-000000000001
40997
+ detail: See the operation contract.
40998
+ errors: []
40999
+ retryable: true
41000
+ schemaId: urn:gala:schema:problem:2.0.0
41001
+ schemaVersion: 2.0.0
41002
+ status: 429
41003
+ title: RATE_LIMITED
41004
+ type: urn:gala:problem:rate-limited
41005
+ schema:
41006
+ $ref: "#/components/schemas/Problem"
41007
+ description: RATE_LIMITED
41008
+ headers:
41009
+ Cache-Control:
41010
+ $ref: "#/components/headers/CacheControlNoStore"
41011
+ Retry-After:
41012
+ $ref: "#/components/headers/RetryAfter"
41013
+ X-Correlation-Id:
41014
+ $ref: "#/components/headers/XCorrelationId"
41015
+ x-gala-problem-codes:
41016
+ - RATE_LIMITED
41017
+ security:
41018
+ - browserSession: []
41019
+ summary: preview one linked page
41020
+ tags:
41021
+ - organizations
41022
+ x-gala-activation-gate: MVP
41023
+ x-gala-activation-guards:
41024
+ - NONE
41025
+ x-gala-capability-key: publication.source.write
41026
+ x-gala-concurrency: authorization-and-publication-epochs
41027
+ x-gala-conditional-capabilities: []
41028
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
41029
+ x-gala-nullability: required-and-nullable-are-explicit
41030
+ x-gala-purpose: preview one linked page
41031
+ x-gala-reachable-problems:
41032
+ - AUTHENTICATION_REQUIRED
41033
+ - AUTHORIZATION_DENIED
41034
+ - RATE_LIMITED
41035
+ - REQUEST_FIELD_UNKNOWN
41036
+ - RESOURCE_NOT_FOUND
41037
+ - VALIDATION_FAILED
41038
+ x-gala-replay-identity: natural-idempotent-state
41039
+ x-gala-state-guards:
41040
+ - NONE
41041
+ x-gala-success-category: query
41042
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
40061
41043
  /v2/organizations/{organizationId}/publications/{publicationId}/content/preview-context:
40062
41044
  get:
40063
41045
  description: |
@@ -48728,6 +49710,11 @@ paths:
48728
49710
  removed and settles the appeal `DENIED` (`note` optional, at most 1000
48729
49711
  characters). `DENY_APPEAL` without a pending appeal is `409
48730
49712
  INVALID_DECISION`. Only a person decides an appeal.
49713
+ SCHEMA-3.32.0: `PIN` pins a visible root comment to the top of its
49714
+ article's comments (at most one pinned comment per article; pinning
49715
+ another moves the pin) and `UNPIN` releases it; on any other comment, or
49716
+ when the comment is already in the asked state, they are `409
49717
+ INVALID_DECISION`.
48731
49718
  operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdModerationCommentsByCommentIdDecide
48732
49719
  parameters:
48733
49720
  - $ref: "#/components/parameters/XCorrelationId"
@@ -50061,6 +51048,192 @@ paths:
50061
51048
  - NONE
50062
51049
  x-gala-success-category: protocol
50063
51050
  x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
51051
+ /v2/organizations/{organizationId}/publications/{publicationId}/newsletter-subscribers:import:
51052
+ post:
51053
+ description: |
51054
+ Needs `publication.audience.manage`. The body is the addresses the owner's file held, already parsed by the App (at most 5000 per call), with `attestation: true`: the owner states that every address agreed to hear from them. Each address that is new becomes a `pending` subscriber and is sent the same confirmation email a reader who signs up receives; nobody is subscribed until they confirm. An address that is already known (`pending`, `confirmed`, `unsubscribed` or `suppressed`) is skipped and counted in `skippedKnown`, so repeating a call is harmless. `invalid` counts entries that are not usable addresses and `overCapacity` those left out because the organization's subscriber allowance was reached. A call without `attestation: true` is `400 VALIDATION_FAILED`. `409 NEWSLETTER_UNAVAILABLE` when the site takes no subscribers (it is not in Galascribe newsletter mode).
51055
+ operationId: postOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImport
51056
+ parameters:
51057
+ - $ref: "#/components/parameters/XCorrelationId"
51058
+ - example: 018f0000-0000-7000-8000-000000000001
51059
+ in: path
51060
+ name: organizationId
51061
+ required: true
51062
+ schema:
51063
+ format: uuid
51064
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
51065
+ type: string
51066
+ - example: 018f0000-0000-7000-8000-000000000001
51067
+ in: path
51068
+ name: publicationId
51069
+ required: true
51070
+ schema:
51071
+ format: uuid
51072
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
51073
+ type: string
51074
+ - $ref: "#/components/parameters/XCsrfToken"
51075
+ requestBody:
51076
+ content:
51077
+ application/json:
51078
+ examples:
51079
+ nominal:
51080
+ summary: Nominal valid request
51081
+ value:
51082
+ addresses:
51083
+ - reader@example.com
51084
+ attestation: true
51085
+ schema:
51086
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportRequest"
51087
+ required: true
51088
+ responses:
51089
+ "202":
51090
+ content:
51091
+ application/json:
51092
+ examples:
51093
+ nominal:
51094
+ summary: Nominal successful response
51095
+ value:
51096
+ invalid: 0
51097
+ overCapacity: 0
51098
+ queued: 1
51099
+ skippedKnown: 0
51100
+ schema:
51101
+ $ref: "#/components/schemas/PostOrganizationsByOrganizationIdPublicationsByPublicationIdNewsletterSubscribersImportResponse"
51102
+ description: import a site's newsletter subscribers succeeded
51103
+ headers:
51104
+ Cache-Control:
51105
+ $ref: "#/components/headers/CacheControlNoStore"
51106
+ X-Correlation-Id:
51107
+ $ref: "#/components/headers/XCorrelationId"
51108
+ "400":
51109
+ content:
51110
+ application/problem+json:
51111
+ examples:
51112
+ REQUEST_FIELD_UNKNOWN:
51113
+ summary: REQUEST_FIELD_UNKNOWN
51114
+ value:
51115
+ code: REQUEST_FIELD_UNKNOWN
51116
+ correlationId: 018f0000-0000-7000-8000-000000000001
51117
+ detail: See the operation contract.
51118
+ errors: []
51119
+ retryable: false
51120
+ schemaId: urn:gala:schema:problem:2.0.0
51121
+ schemaVersion: 2.0.0
51122
+ status: 400
51123
+ title: REQUEST_FIELD_UNKNOWN
51124
+ type: urn:gala:problem:request-field-unknown
51125
+ VALIDATION_FAILED:
51126
+ summary: VALIDATION_FAILED
51127
+ value:
51128
+ code: VALIDATION_FAILED
51129
+ correlationId: 018f0000-0000-7000-8000-000000000001
51130
+ detail: See the operation contract.
51131
+ errors: []
51132
+ retryable: false
51133
+ schemaId: urn:gala:schema:problem:2.0.0
51134
+ schemaVersion: 2.0.0
51135
+ status: 400
51136
+ title: VALIDATION_FAILED
51137
+ type: urn:gala:problem:validation-failed
51138
+ schema:
51139
+ $ref: "#/components/schemas/Problem"
51140
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
51141
+ headers:
51142
+ Cache-Control:
51143
+ $ref: "#/components/headers/CacheControlNoStore"
51144
+ X-Correlation-Id:
51145
+ $ref: "#/components/headers/XCorrelationId"
51146
+ x-gala-problem-codes:
51147
+ - REQUEST_FIELD_UNKNOWN
51148
+ - VALIDATION_FAILED
51149
+ "401":
51150
+ content:
51151
+ application/problem+json:
51152
+ examples:
51153
+ AUTHENTICATION_REQUIRED:
51154
+ summary: AUTHENTICATION_REQUIRED
51155
+ value:
51156
+ code: AUTHENTICATION_REQUIRED
51157
+ correlationId: 018f0000-0000-7000-8000-000000000001
51158
+ detail: See the operation contract.
51159
+ errors: []
51160
+ retryable: false
51161
+ schemaId: urn:gala:schema:problem:2.0.0
51162
+ schemaVersion: 2.0.0
51163
+ status: 401
51164
+ title: AUTHENTICATION_REQUIRED
51165
+ type: urn:gala:problem:authentication-required
51166
+ schema:
51167
+ $ref: "#/components/schemas/Problem"
51168
+ description: AUTHENTICATION_REQUIRED
51169
+ headers:
51170
+ Cache-Control:
51171
+ $ref: "#/components/headers/CacheControlNoStore"
51172
+ X-Correlation-Id:
51173
+ $ref: "#/components/headers/XCorrelationId"
51174
+ x-gala-problem-codes:
51175
+ - AUTHENTICATION_REQUIRED
51176
+ "403":
51177
+ $ref: "#/components/responses/AuthorizationDenied"
51178
+ "404":
51179
+ $ref: "#/components/responses/ResourceNotFound"
51180
+ "409":
51181
+ content:
51182
+ application/problem+json:
51183
+ examples:
51184
+ NEWSLETTER_UNAVAILABLE:
51185
+ summary: NEWSLETTER_UNAVAILABLE
51186
+ value:
51187
+ code: NEWSLETTER_UNAVAILABLE
51188
+ correlationId: 018f0000-0000-7000-8000-000000000001
51189
+ detail: See the operation contract.
51190
+ errors: []
51191
+ retryable: false
51192
+ schemaId: urn:gala:schema:problem:2.0.0
51193
+ schemaVersion: 2.0.0
51194
+ status: 409
51195
+ title: NEWSLETTER_UNAVAILABLE
51196
+ type: urn:gala:problem:newsletter-unavailable
51197
+ schema:
51198
+ $ref: "#/components/schemas/Problem"
51199
+ description: NEWSLETTER_UNAVAILABLE
51200
+ headers:
51201
+ Cache-Control:
51202
+ $ref: "#/components/headers/CacheControlNoStore"
51203
+ X-Correlation-Id:
51204
+ $ref: "#/components/headers/XCorrelationId"
51205
+ x-gala-problem-codes:
51206
+ - NEWSLETTER_UNAVAILABLE
51207
+ "413":
51208
+ $ref: "#/components/responses/RequestTooLarge"
51209
+ "415":
51210
+ $ref: "#/components/responses/UnsupportedMediaType"
51211
+ security:
51212
+ - browserSession: []
51213
+ summary: import a site's newsletter subscribers
51214
+ tags:
51215
+ - audience
51216
+ x-gala-activation-gate: MVP
51217
+ x-gala-activation-guards:
51218
+ - NONE
51219
+ x-gala-capability-key: publication.audience.manage
51220
+ x-gala-concurrency: authorization-and-publication-epochs
51221
+ x-gala-conditional-capabilities: []
51222
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
51223
+ x-gala-nullability: required-and-nullable-are-explicit
51224
+ x-gala-purpose: import a site's newsletter subscribers
51225
+ x-gala-reachable-problems:
51226
+ - AUTHENTICATION_REQUIRED
51227
+ - AUTHORIZATION_DENIED
51228
+ - NEWSLETTER_UNAVAILABLE
51229
+ - REQUEST_FIELD_UNKNOWN
51230
+ - RESOURCE_NOT_FOUND
51231
+ - VALIDATION_FAILED
51232
+ x-gala-replay-identity: natural-idempotent-state
51233
+ x-gala-state-guards:
51234
+ - NONE
51235
+ x-gala-success-category: async
51236
+ x-gala-tenant-scope: ORGANIZATION_AND_PUBLICATION_PATH
50064
51237
  /v2/organizations/{organizationId}/publications/{publicationId}/overview:
50065
51238
  get:
50066
51239
  description: |
@@ -66400,10 +67573,550 @@ paths:
66400
67573
  content:
66401
67574
  application/problem+json:
66402
67575
  examples:
66403
- NOT_COMMENT_AUTHOR:
66404
- summary: NOT_COMMENT_AUTHOR
67576
+ NOT_COMMENT_AUTHOR:
67577
+ summary: NOT_COMMENT_AUTHOR
67578
+ value:
67579
+ code: NOT_COMMENT_AUTHOR
67580
+ correlationId: 018f0000-0000-7000-8000-000000000001
67581
+ detail: See the operation contract.
67582
+ errors: []
67583
+ retryable: false
67584
+ schemaId: urn:gala:schema:problem:2.0.0
67585
+ schemaVersion: 2.0.0
67586
+ status: 403
67587
+ title: NOT_COMMENT_AUTHOR
67588
+ type: urn:gala:problem:not-comment-author
67589
+ READER_TOKEN_SCOPE:
67590
+ summary: READER_TOKEN_SCOPE
67591
+ value:
67592
+ code: READER_TOKEN_SCOPE
67593
+ correlationId: 018f0000-0000-7000-8000-000000000001
67594
+ detail: See the operation contract.
67595
+ errors: []
67596
+ retryable: false
67597
+ schemaId: urn:gala:schema:problem:2.0.0
67598
+ schemaVersion: 2.0.0
67599
+ status: 403
67600
+ title: READER_TOKEN_SCOPE
67601
+ type: urn:gala:problem:reader-token-scope
67602
+ schema:
67603
+ $ref: "#/components/schemas/Problem"
67604
+ description: NOT_COMMENT_AUTHOR, READER_TOKEN_SCOPE
67605
+ headers:
67606
+ Cache-Control:
67607
+ $ref: "#/components/headers/CacheControlNoStore"
67608
+ X-Correlation-Id:
67609
+ $ref: "#/components/headers/XCorrelationId"
67610
+ x-gala-problem-codes:
67611
+ - NOT_COMMENT_AUTHOR
67612
+ - READER_TOKEN_SCOPE
67613
+ "404":
67614
+ content:
67615
+ application/problem+json:
67616
+ examples:
67617
+ COMMENT_NOT_FOUND:
67618
+ summary: COMMENT_NOT_FOUND
67619
+ value:
67620
+ code: COMMENT_NOT_FOUND
67621
+ correlationId: 018f0000-0000-7000-8000-000000000001
67622
+ detail: See the operation contract.
67623
+ errors: []
67624
+ retryable: false
67625
+ schemaId: urn:gala:schema:problem:2.0.0
67626
+ schemaVersion: 2.0.0
67627
+ status: 404
67628
+ title: COMMENT_NOT_FOUND
67629
+ type: urn:gala:problem:comment-not-found
67630
+ schema:
67631
+ $ref: "#/components/schemas/Problem"
67632
+ description: COMMENT_NOT_FOUND
67633
+ headers:
67634
+ Cache-Control:
67635
+ $ref: "#/components/headers/CacheControlNoStore"
67636
+ X-Correlation-Id:
67637
+ $ref: "#/components/headers/XCorrelationId"
67638
+ x-gala-problem-codes:
67639
+ - COMMENT_NOT_FOUND
67640
+ security:
67641
+ - readerBearer: []
67642
+ summary: delete the reader's own comment
67643
+ tags:
67644
+ - public-interactions
67645
+ x-gala-activation-gate: MVP
67646
+ x-gala-activation-guards:
67647
+ - NONE
67648
+ x-gala-capability-key: null
67649
+ x-gala-concurrency: none
67650
+ x-gala-conditional-capabilities: []
67651
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
67652
+ x-gala-nullability: required-and-nullable-are-explicit
67653
+ x-gala-purpose: delete the reader's own comment
67654
+ x-gala-reachable-problems:
67655
+ - COMMENT_NOT_FOUND
67656
+ - NOT_COMMENT_AUTHOR
67657
+ - READER_AUTHENTICATION_REQUIRED
67658
+ - READER_TOKEN_SCOPE
67659
+ - VALIDATION_FAILED
67660
+ x-gala-replay-identity: natural-idempotent-state
67661
+ x-gala-state-guards:
67662
+ - NONE
67663
+ x-gala-success-category: delete
67664
+ x-gala-tenant-scope: NONE
67665
+ /v2/public/comments/{commentId}/appeals:
67666
+ post:
67667
+ description: |
67668
+ The comment's author asks the moderators to look again at a removal or
67669
+ hold. One appeal per removal: `409 APPEAL_EXISTS` when one was already
67670
+ made against the current removal; `409 APPEAL_NOT_ALLOWED` when the
67671
+ comment is not removed or held, or the reader is not its author. At most
67672
+ 5 appeals a day per reader (`429 RATE_LIMITED`). A human decides; the
67673
+ answer shows under the comment.
67674
+ operationId: postPublicCommentsByCommentIdAppeals
67675
+ parameters:
67676
+ - $ref: "#/components/parameters/XCorrelationId"
67677
+ - example: 018f0000-0000-7000-8000-000000000001
67678
+ in: path
67679
+ name: commentId
67680
+ required: true
67681
+ schema:
67682
+ format: uuid
67683
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
67684
+ type: string
67685
+ requestBody:
67686
+ content:
67687
+ application/json:
67688
+ examples:
67689
+ nominal:
67690
+ summary: Nominal valid request
67691
+ value:
67692
+ note: The link was to my own project page, not spam.
67693
+ schema:
67694
+ $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsRequest"
67695
+ required: true
67696
+ responses:
67697
+ "202":
67698
+ content:
67699
+ application/json:
67700
+ examples:
67701
+ nominal:
67702
+ summary: Nominal successful response
67703
+ value:
67704
+ status: RECEIVED
67705
+ schema:
67706
+ $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsResponse"
67707
+ description: appeal the removal of my comment succeeded
67708
+ headers:
67709
+ Cache-Control:
67710
+ $ref: "#/components/headers/CacheControlNoStore"
67711
+ X-Correlation-Id:
67712
+ $ref: "#/components/headers/XCorrelationId"
67713
+ "400":
67714
+ content:
67715
+ application/problem+json:
67716
+ examples:
67717
+ REQUEST_FIELD_UNKNOWN:
67718
+ summary: REQUEST_FIELD_UNKNOWN
67719
+ value:
67720
+ code: REQUEST_FIELD_UNKNOWN
67721
+ correlationId: 018f0000-0000-7000-8000-000000000001
67722
+ detail: See the operation contract.
67723
+ errors: []
67724
+ retryable: false
67725
+ schemaId: urn:gala:schema:problem:2.0.0
67726
+ schemaVersion: 2.0.0
67727
+ status: 400
67728
+ title: REQUEST_FIELD_UNKNOWN
67729
+ type: urn:gala:problem:request-field-unknown
67730
+ VALIDATION_FAILED:
67731
+ summary: VALIDATION_FAILED
67732
+ value:
67733
+ code: VALIDATION_FAILED
67734
+ correlationId: 018f0000-0000-7000-8000-000000000001
67735
+ detail: See the operation contract.
67736
+ errors: []
67737
+ retryable: false
67738
+ schemaId: urn:gala:schema:problem:2.0.0
67739
+ schemaVersion: 2.0.0
67740
+ status: 400
67741
+ title: VALIDATION_FAILED
67742
+ type: urn:gala:problem:validation-failed
67743
+ schema:
67744
+ $ref: "#/components/schemas/Problem"
67745
+ description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
67746
+ headers:
67747
+ Cache-Control:
67748
+ $ref: "#/components/headers/CacheControlNoStore"
67749
+ X-Correlation-Id:
67750
+ $ref: "#/components/headers/XCorrelationId"
67751
+ x-gala-problem-codes:
67752
+ - REQUEST_FIELD_UNKNOWN
67753
+ - VALIDATION_FAILED
67754
+ "401":
67755
+ content:
67756
+ application/problem+json:
67757
+ examples:
67758
+ READER_AUTHENTICATION_REQUIRED:
67759
+ summary: READER_AUTHENTICATION_REQUIRED
67760
+ value:
67761
+ code: READER_AUTHENTICATION_REQUIRED
67762
+ correlationId: 018f0000-0000-7000-8000-000000000001
67763
+ detail: See the operation contract.
67764
+ errors: []
67765
+ retryable: false
67766
+ schemaId: urn:gala:schema:problem:2.0.0
67767
+ schemaVersion: 2.0.0
67768
+ status: 401
67769
+ title: READER_AUTHENTICATION_REQUIRED
67770
+ type: urn:gala:problem:reader-authentication-required
67771
+ schema:
67772
+ $ref: "#/components/schemas/Problem"
67773
+ description: READER_AUTHENTICATION_REQUIRED
67774
+ headers:
67775
+ Cache-Control:
67776
+ $ref: "#/components/headers/CacheControlNoStore"
67777
+ X-Correlation-Id:
67778
+ $ref: "#/components/headers/XCorrelationId"
67779
+ x-gala-problem-codes:
67780
+ - READER_AUTHENTICATION_REQUIRED
67781
+ "403":
67782
+ content:
67783
+ application/problem+json:
67784
+ examples:
67785
+ READER_TOKEN_SCOPE:
67786
+ summary: READER_TOKEN_SCOPE
67787
+ value:
67788
+ code: READER_TOKEN_SCOPE
67789
+ correlationId: 018f0000-0000-7000-8000-000000000001
67790
+ detail: See the operation contract.
67791
+ errors: []
67792
+ retryable: false
67793
+ schemaId: urn:gala:schema:problem:2.0.0
67794
+ schemaVersion: 2.0.0
67795
+ status: 403
67796
+ title: READER_TOKEN_SCOPE
67797
+ type: urn:gala:problem:reader-token-scope
67798
+ schema:
67799
+ $ref: "#/components/schemas/Problem"
67800
+ description: READER_TOKEN_SCOPE
67801
+ headers:
67802
+ Cache-Control:
67803
+ $ref: "#/components/headers/CacheControlNoStore"
67804
+ X-Correlation-Id:
67805
+ $ref: "#/components/headers/XCorrelationId"
67806
+ x-gala-problem-codes:
67807
+ - READER_TOKEN_SCOPE
67808
+ "404":
67809
+ content:
67810
+ application/problem+json:
67811
+ examples:
67812
+ COMMENT_NOT_FOUND:
67813
+ summary: COMMENT_NOT_FOUND
67814
+ value:
67815
+ code: COMMENT_NOT_FOUND
67816
+ correlationId: 018f0000-0000-7000-8000-000000000001
67817
+ detail: See the operation contract.
67818
+ errors: []
67819
+ retryable: false
67820
+ schemaId: urn:gala:schema:problem:2.0.0
67821
+ schemaVersion: 2.0.0
67822
+ status: 404
67823
+ title: COMMENT_NOT_FOUND
67824
+ type: urn:gala:problem:comment-not-found
67825
+ schema:
67826
+ $ref: "#/components/schemas/Problem"
67827
+ description: COMMENT_NOT_FOUND
67828
+ headers:
67829
+ Cache-Control:
67830
+ $ref: "#/components/headers/CacheControlNoStore"
67831
+ X-Correlation-Id:
67832
+ $ref: "#/components/headers/XCorrelationId"
67833
+ x-gala-problem-codes:
67834
+ - COMMENT_NOT_FOUND
67835
+ "409":
67836
+ content:
67837
+ application/problem+json:
67838
+ examples:
67839
+ APPEAL_EXISTS:
67840
+ summary: APPEAL_EXISTS
67841
+ value:
67842
+ code: APPEAL_EXISTS
67843
+ correlationId: 018f0000-0000-7000-8000-000000000001
67844
+ detail: See the operation contract.
67845
+ errors: []
67846
+ retryable: false
67847
+ schemaId: urn:gala:schema:problem:2.0.0
67848
+ schemaVersion: 2.0.0
67849
+ status: 409
67850
+ title: APPEAL_EXISTS
67851
+ type: urn:gala:problem:appeal-exists
67852
+ APPEAL_NOT_ALLOWED:
67853
+ summary: APPEAL_NOT_ALLOWED
67854
+ value:
67855
+ code: APPEAL_NOT_ALLOWED
67856
+ correlationId: 018f0000-0000-7000-8000-000000000001
67857
+ detail: See the operation contract.
67858
+ errors: []
67859
+ retryable: false
67860
+ schemaId: urn:gala:schema:problem:2.0.0
67861
+ schemaVersion: 2.0.0
67862
+ status: 409
67863
+ title: APPEAL_NOT_ALLOWED
67864
+ type: urn:gala:problem:appeal-not-allowed
67865
+ schema:
67866
+ $ref: "#/components/schemas/Problem"
67867
+ description: APPEAL_EXISTS, APPEAL_NOT_ALLOWED
67868
+ headers:
67869
+ Cache-Control:
67870
+ $ref: "#/components/headers/CacheControlNoStore"
67871
+ X-Correlation-Id:
67872
+ $ref: "#/components/headers/XCorrelationId"
67873
+ x-gala-problem-codes:
67874
+ - APPEAL_EXISTS
67875
+ - APPEAL_NOT_ALLOWED
67876
+ "429":
67877
+ content:
67878
+ application/problem+json:
67879
+ examples:
67880
+ RATE_LIMITED:
67881
+ summary: RATE_LIMITED
67882
+ value:
67883
+ code: RATE_LIMITED
67884
+ correlationId: 018f0000-0000-7000-8000-000000000001
67885
+ detail: See the operation contract.
67886
+ errors: []
67887
+ retryable: true
67888
+ schemaId: urn:gala:schema:problem:2.0.0
67889
+ schemaVersion: 2.0.0
67890
+ status: 429
67891
+ title: RATE_LIMITED
67892
+ type: urn:gala:problem:rate-limited
67893
+ schema:
67894
+ $ref: "#/components/schemas/Problem"
67895
+ description: RATE_LIMITED
67896
+ headers:
67897
+ Cache-Control:
67898
+ $ref: "#/components/headers/CacheControlNoStore"
67899
+ Retry-After:
67900
+ $ref: "#/components/headers/RetryAfter"
67901
+ X-Correlation-Id:
67902
+ $ref: "#/components/headers/XCorrelationId"
67903
+ x-gala-problem-codes:
67904
+ - RATE_LIMITED
67905
+ security:
67906
+ - readerBearer: []
67907
+ summary: appeal the removal of my comment
67908
+ tags:
67909
+ - public-interactions
67910
+ x-gala-activation-gate: MVP
67911
+ x-gala-activation-guards:
67912
+ - NONE
67913
+ x-gala-capability-key: null
67914
+ x-gala-concurrency: none
67915
+ x-gala-conditional-capabilities: []
67916
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
67917
+ x-gala-nullability: required-and-nullable-are-explicit
67918
+ x-gala-purpose: appeal the removal of my comment
67919
+ x-gala-reachable-problems:
67920
+ - APPEAL_EXISTS
67921
+ - APPEAL_NOT_ALLOWED
67922
+ - COMMENT_NOT_FOUND
67923
+ - RATE_LIMITED
67924
+ - READER_AUTHENTICATION_REQUIRED
67925
+ - READER_TOKEN_SCOPE
67926
+ - REQUEST_FIELD_UNKNOWN
67927
+ - VALIDATION_FAILED
67928
+ x-gala-replay-identity: one-appeal-per-removal
67929
+ x-gala-state-guards:
67930
+ - NONE
67931
+ x-gala-success-category: async
67932
+ x-gala-tenant-scope: NONE
67933
+ /v2/public/comments/{commentId}/like:
67934
+ delete:
67935
+ description: "SCHEMA-3.32.0: the signed-in reader withdraws their like. Always allowed, even when likes have since been turned off, and harmless when there is no like (`204` both times)."
67936
+ operationId: deletePublicCommentsByCommentIdLike
67937
+ parameters:
67938
+ - $ref: "#/components/parameters/XCorrelationId"
67939
+ - example: 018f0000-0000-7000-8000-000000000001
67940
+ in: path
67941
+ name: commentId
67942
+ required: true
67943
+ schema:
67944
+ format: uuid
67945
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
67946
+ type: string
67947
+ responses:
67948
+ "204":
67949
+ description: withdraw the signed-in reader's like on one comment succeeded
67950
+ headers:
67951
+ Cache-Control:
67952
+ $ref: "#/components/headers/CacheControlNoStore"
67953
+ X-Correlation-Id:
67954
+ $ref: "#/components/headers/XCorrelationId"
67955
+ "400":
67956
+ $ref: "#/components/responses/ValidationFailed"
67957
+ "401":
67958
+ content:
67959
+ application/problem+json:
67960
+ examples:
67961
+ READER_AUTHENTICATION_REQUIRED:
67962
+ summary: READER_AUTHENTICATION_REQUIRED
67963
+ value:
67964
+ code: READER_AUTHENTICATION_REQUIRED
67965
+ correlationId: 018f0000-0000-7000-8000-000000000001
67966
+ detail: See the operation contract.
67967
+ errors: []
67968
+ retryable: false
67969
+ schemaId: urn:gala:schema:problem:2.0.0
67970
+ schemaVersion: 2.0.0
67971
+ status: 401
67972
+ title: READER_AUTHENTICATION_REQUIRED
67973
+ type: urn:gala:problem:reader-authentication-required
67974
+ schema:
67975
+ $ref: "#/components/schemas/Problem"
67976
+ description: READER_AUTHENTICATION_REQUIRED
67977
+ headers:
67978
+ Cache-Control:
67979
+ $ref: "#/components/headers/CacheControlNoStore"
67980
+ X-Correlation-Id:
67981
+ $ref: "#/components/headers/XCorrelationId"
67982
+ x-gala-problem-codes:
67983
+ - READER_AUTHENTICATION_REQUIRED
67984
+ "403":
67985
+ content:
67986
+ application/problem+json:
67987
+ examples:
67988
+ READER_TOKEN_SCOPE:
67989
+ summary: READER_TOKEN_SCOPE
67990
+ value:
67991
+ code: READER_TOKEN_SCOPE
67992
+ correlationId: 018f0000-0000-7000-8000-000000000001
67993
+ detail: See the operation contract.
67994
+ errors: []
67995
+ retryable: false
67996
+ schemaId: urn:gala:schema:problem:2.0.0
67997
+ schemaVersion: 2.0.0
67998
+ status: 403
67999
+ title: READER_TOKEN_SCOPE
68000
+ type: urn:gala:problem:reader-token-scope
68001
+ schema:
68002
+ $ref: "#/components/schemas/Problem"
68003
+ description: READER_TOKEN_SCOPE
68004
+ headers:
68005
+ Cache-Control:
68006
+ $ref: "#/components/headers/CacheControlNoStore"
68007
+ X-Correlation-Id:
68008
+ $ref: "#/components/headers/XCorrelationId"
68009
+ x-gala-problem-codes:
68010
+ - READER_TOKEN_SCOPE
68011
+ "404":
68012
+ content:
68013
+ application/problem+json:
68014
+ examples:
68015
+ COMMENT_NOT_FOUND:
68016
+ summary: COMMENT_NOT_FOUND
68017
+ value:
68018
+ code: COMMENT_NOT_FOUND
68019
+ correlationId: 018f0000-0000-7000-8000-000000000001
68020
+ detail: See the operation contract.
68021
+ errors: []
68022
+ retryable: false
68023
+ schemaId: urn:gala:schema:problem:2.0.0
68024
+ schemaVersion: 2.0.0
68025
+ status: 404
68026
+ title: COMMENT_NOT_FOUND
68027
+ type: urn:gala:problem:comment-not-found
68028
+ schema:
68029
+ $ref: "#/components/schemas/Problem"
68030
+ description: COMMENT_NOT_FOUND
68031
+ headers:
68032
+ Cache-Control:
68033
+ $ref: "#/components/headers/CacheControlNoStore"
68034
+ X-Correlation-Id:
68035
+ $ref: "#/components/headers/XCorrelationId"
68036
+ x-gala-problem-codes:
68037
+ - COMMENT_NOT_FOUND
68038
+ security:
68039
+ - readerBearer: []
68040
+ summary: withdraw the signed-in reader's like on one comment
68041
+ tags:
68042
+ - public-interactions
68043
+ x-gala-activation-gate: MVP
68044
+ x-gala-activation-guards:
68045
+ - NONE
68046
+ x-gala-capability-key: null
68047
+ x-gala-concurrency: none
68048
+ x-gala-conditional-capabilities: []
68049
+ x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
68050
+ x-gala-nullability: required-and-nullable-are-explicit
68051
+ x-gala-purpose: withdraw the signed-in reader's like on one comment
68052
+ x-gala-reachable-problems:
68053
+ - COMMENT_NOT_FOUND
68054
+ - READER_AUTHENTICATION_REQUIRED
68055
+ - READER_TOKEN_SCOPE
68056
+ - VALIDATION_FAILED
68057
+ x-gala-replay-identity: natural-idempotent-state
68058
+ x-gala-state-guards:
68059
+ - NONE
68060
+ x-gala-success-category: delete
68061
+ x-gala-tenant-scope: NONE
68062
+ put:
68063
+ description: "SCHEMA-3.32.0: the signed-in reader likes the comment. Liking again is harmless (`204` both times). Needs `comments.likes` on in the site's interactions configuration, otherwise `404 INTERACTIONS_DISABLED`. A removed, held or deleted comment cannot be liked (`404 COMMENT_NOT_FOUND`)."
68064
+ operationId: putPublicCommentsByCommentIdLike
68065
+ parameters:
68066
+ - $ref: "#/components/parameters/XCorrelationId"
68067
+ - example: 018f0000-0000-7000-8000-000000000001
68068
+ in: path
68069
+ name: commentId
68070
+ required: true
68071
+ schema:
68072
+ format: uuid
68073
+ pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
68074
+ type: string
68075
+ responses:
68076
+ "204":
68077
+ description: like one comment as the signed-in reader succeeded
68078
+ headers:
68079
+ Cache-Control:
68080
+ $ref: "#/components/headers/CacheControlNoStore"
68081
+ X-Correlation-Id:
68082
+ $ref: "#/components/headers/XCorrelationId"
68083
+ "400":
68084
+ $ref: "#/components/responses/ValidationFailed"
68085
+ "401":
68086
+ content:
68087
+ application/problem+json:
68088
+ examples:
68089
+ READER_AUTHENTICATION_REQUIRED:
68090
+ summary: READER_AUTHENTICATION_REQUIRED
68091
+ value:
68092
+ code: READER_AUTHENTICATION_REQUIRED
68093
+ correlationId: 018f0000-0000-7000-8000-000000000001
68094
+ detail: See the operation contract.
68095
+ errors: []
68096
+ retryable: false
68097
+ schemaId: urn:gala:schema:problem:2.0.0
68098
+ schemaVersion: 2.0.0
68099
+ status: 401
68100
+ title: READER_AUTHENTICATION_REQUIRED
68101
+ type: urn:gala:problem:reader-authentication-required
68102
+ schema:
68103
+ $ref: "#/components/schemas/Problem"
68104
+ description: READER_AUTHENTICATION_REQUIRED
68105
+ headers:
68106
+ Cache-Control:
68107
+ $ref: "#/components/headers/CacheControlNoStore"
68108
+ X-Correlation-Id:
68109
+ $ref: "#/components/headers/XCorrelationId"
68110
+ x-gala-problem-codes:
68111
+ - READER_AUTHENTICATION_REQUIRED
68112
+ "403":
68113
+ content:
68114
+ application/problem+json:
68115
+ examples:
68116
+ READER_RESTRICTED:
68117
+ summary: READER_RESTRICTED
66405
68118
  value:
66406
- code: NOT_COMMENT_AUTHOR
68119
+ code: READER_RESTRICTED
66407
68120
  correlationId: 018f0000-0000-7000-8000-000000000001
66408
68121
  detail: See the operation contract.
66409
68122
  errors: []
@@ -66411,8 +68124,8 @@ paths:
66411
68124
  schemaId: urn:gala:schema:problem:2.0.0
66412
68125
  schemaVersion: 2.0.0
66413
68126
  status: 403
66414
- title: NOT_COMMENT_AUTHOR
66415
- type: urn:gala:problem:not-comment-author
68127
+ title: READER_RESTRICTED
68128
+ type: urn:gala:problem:reader-restricted
66416
68129
  READER_TOKEN_SCOPE:
66417
68130
  summary: READER_TOKEN_SCOPE
66418
68131
  value:
@@ -66428,14 +68141,14 @@ paths:
66428
68141
  type: urn:gala:problem:reader-token-scope
66429
68142
  schema:
66430
68143
  $ref: "#/components/schemas/Problem"
66431
- description: NOT_COMMENT_AUTHOR, READER_TOKEN_SCOPE
68144
+ description: READER_RESTRICTED, READER_TOKEN_SCOPE
66432
68145
  headers:
66433
68146
  Cache-Control:
66434
68147
  $ref: "#/components/headers/CacheControlNoStore"
66435
68148
  X-Correlation-Id:
66436
68149
  $ref: "#/components/headers/XCorrelationId"
66437
68150
  x-gala-problem-codes:
66438
- - NOT_COMMENT_AUTHOR
68151
+ - READER_RESTRICTED
66439
68152
  - READER_TOKEN_SCOPE
66440
68153
  "404":
66441
68154
  content:
@@ -66454,192 +68167,10 @@ paths:
66454
68167
  status: 404
66455
68168
  title: COMMENT_NOT_FOUND
66456
68169
  type: urn:gala:problem:comment-not-found
66457
- schema:
66458
- $ref: "#/components/schemas/Problem"
66459
- description: COMMENT_NOT_FOUND
66460
- headers:
66461
- Cache-Control:
66462
- $ref: "#/components/headers/CacheControlNoStore"
66463
- X-Correlation-Id:
66464
- $ref: "#/components/headers/XCorrelationId"
66465
- x-gala-problem-codes:
66466
- - COMMENT_NOT_FOUND
66467
- security:
66468
- - readerBearer: []
66469
- summary: delete the reader's own comment
66470
- tags:
66471
- - public-interactions
66472
- x-gala-activation-gate: MVP
66473
- x-gala-activation-guards:
66474
- - NONE
66475
- x-gala-capability-key: null
66476
- x-gala-concurrency: none
66477
- x-gala-conditional-capabilities: []
66478
- x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
66479
- x-gala-nullability: required-and-nullable-are-explicit
66480
- x-gala-purpose: delete the reader's own comment
66481
- x-gala-reachable-problems:
66482
- - COMMENT_NOT_FOUND
66483
- - NOT_COMMENT_AUTHOR
66484
- - READER_AUTHENTICATION_REQUIRED
66485
- - READER_TOKEN_SCOPE
66486
- - VALIDATION_FAILED
66487
- x-gala-replay-identity: natural-idempotent-state
66488
- x-gala-state-guards:
66489
- - NONE
66490
- x-gala-success-category: delete
66491
- x-gala-tenant-scope: NONE
66492
- /v2/public/comments/{commentId}/appeals:
66493
- post:
66494
- description: |
66495
- The comment's author asks the moderators to look again at a removal or
66496
- hold. One appeal per removal: `409 APPEAL_EXISTS` when one was already
66497
- made against the current removal; `409 APPEAL_NOT_ALLOWED` when the
66498
- comment is not removed or held, or the reader is not its author. At most
66499
- 5 appeals a day per reader (`429 RATE_LIMITED`). A human decides; the
66500
- answer shows under the comment.
66501
- operationId: postPublicCommentsByCommentIdAppeals
66502
- parameters:
66503
- - $ref: "#/components/parameters/XCorrelationId"
66504
- - example: 018f0000-0000-7000-8000-000000000001
66505
- in: path
66506
- name: commentId
66507
- required: true
66508
- schema:
66509
- format: uuid
66510
- pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
66511
- type: string
66512
- requestBody:
66513
- content:
66514
- application/json:
66515
- examples:
66516
- nominal:
66517
- summary: Nominal valid request
66518
- value:
66519
- note: The link was to my own project page, not spam.
66520
- schema:
66521
- $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsRequest"
66522
- required: true
66523
- responses:
66524
- "202":
66525
- content:
66526
- application/json:
66527
- examples:
66528
- nominal:
66529
- summary: Nominal successful response
66530
- value:
66531
- status: RECEIVED
66532
- schema:
66533
- $ref: "#/components/schemas/PostPublicCommentsByCommentIdAppealsResponse"
66534
- description: appeal the removal of my comment succeeded
66535
- headers:
66536
- Cache-Control:
66537
- $ref: "#/components/headers/CacheControlNoStore"
66538
- X-Correlation-Id:
66539
- $ref: "#/components/headers/XCorrelationId"
66540
- "400":
66541
- content:
66542
- application/problem+json:
66543
- examples:
66544
- REQUEST_FIELD_UNKNOWN:
66545
- summary: REQUEST_FIELD_UNKNOWN
66546
- value:
66547
- code: REQUEST_FIELD_UNKNOWN
66548
- correlationId: 018f0000-0000-7000-8000-000000000001
66549
- detail: See the operation contract.
66550
- errors: []
66551
- retryable: false
66552
- schemaId: urn:gala:schema:problem:2.0.0
66553
- schemaVersion: 2.0.0
66554
- status: 400
66555
- title: REQUEST_FIELD_UNKNOWN
66556
- type: urn:gala:problem:request-field-unknown
66557
- VALIDATION_FAILED:
66558
- summary: VALIDATION_FAILED
66559
- value:
66560
- code: VALIDATION_FAILED
66561
- correlationId: 018f0000-0000-7000-8000-000000000001
66562
- detail: See the operation contract.
66563
- errors: []
66564
- retryable: false
66565
- schemaId: urn:gala:schema:problem:2.0.0
66566
- schemaVersion: 2.0.0
66567
- status: 400
66568
- title: VALIDATION_FAILED
66569
- type: urn:gala:problem:validation-failed
66570
- schema:
66571
- $ref: "#/components/schemas/Problem"
66572
- description: REQUEST_FIELD_UNKNOWN, VALIDATION_FAILED
66573
- headers:
66574
- Cache-Control:
66575
- $ref: "#/components/headers/CacheControlNoStore"
66576
- X-Correlation-Id:
66577
- $ref: "#/components/headers/XCorrelationId"
66578
- x-gala-problem-codes:
66579
- - REQUEST_FIELD_UNKNOWN
66580
- - VALIDATION_FAILED
66581
- "401":
66582
- content:
66583
- application/problem+json:
66584
- examples:
66585
- READER_AUTHENTICATION_REQUIRED:
66586
- summary: READER_AUTHENTICATION_REQUIRED
66587
- value:
66588
- code: READER_AUTHENTICATION_REQUIRED
66589
- correlationId: 018f0000-0000-7000-8000-000000000001
66590
- detail: See the operation contract.
66591
- errors: []
66592
- retryable: false
66593
- schemaId: urn:gala:schema:problem:2.0.0
66594
- schemaVersion: 2.0.0
66595
- status: 401
66596
- title: READER_AUTHENTICATION_REQUIRED
66597
- type: urn:gala:problem:reader-authentication-required
66598
- schema:
66599
- $ref: "#/components/schemas/Problem"
66600
- description: READER_AUTHENTICATION_REQUIRED
66601
- headers:
66602
- Cache-Control:
66603
- $ref: "#/components/headers/CacheControlNoStore"
66604
- X-Correlation-Id:
66605
- $ref: "#/components/headers/XCorrelationId"
66606
- x-gala-problem-codes:
66607
- - READER_AUTHENTICATION_REQUIRED
66608
- "403":
66609
- content:
66610
- application/problem+json:
66611
- examples:
66612
- READER_TOKEN_SCOPE:
66613
- summary: READER_TOKEN_SCOPE
66614
- value:
66615
- code: READER_TOKEN_SCOPE
66616
- correlationId: 018f0000-0000-7000-8000-000000000001
66617
- detail: See the operation contract.
66618
- errors: []
66619
- retryable: false
66620
- schemaId: urn:gala:schema:problem:2.0.0
66621
- schemaVersion: 2.0.0
66622
- status: 403
66623
- title: READER_TOKEN_SCOPE
66624
- type: urn:gala:problem:reader-token-scope
66625
- schema:
66626
- $ref: "#/components/schemas/Problem"
66627
- description: READER_TOKEN_SCOPE
66628
- headers:
66629
- Cache-Control:
66630
- $ref: "#/components/headers/CacheControlNoStore"
66631
- X-Correlation-Id:
66632
- $ref: "#/components/headers/XCorrelationId"
66633
- x-gala-problem-codes:
66634
- - READER_TOKEN_SCOPE
66635
- "404":
66636
- content:
66637
- application/problem+json:
66638
- examples:
66639
- COMMENT_NOT_FOUND:
66640
- summary: COMMENT_NOT_FOUND
68170
+ INTERACTIONS_DISABLED:
68171
+ summary: INTERACTIONS_DISABLED
66641
68172
  value:
66642
- code: COMMENT_NOT_FOUND
68173
+ code: INTERACTIONS_DISABLED
66643
68174
  correlationId: 018f0000-0000-7000-8000-000000000001
66644
68175
  detail: See the operation contract.
66645
68176
  errors: []
@@ -66647,11 +68178,11 @@ paths:
66647
68178
  schemaId: urn:gala:schema:problem:2.0.0
66648
68179
  schemaVersion: 2.0.0
66649
68180
  status: 404
66650
- title: COMMENT_NOT_FOUND
66651
- type: urn:gala:problem:comment-not-found
68181
+ title: INTERACTIONS_DISABLED
68182
+ type: urn:gala:problem:interactions-disabled
66652
68183
  schema:
66653
68184
  $ref: "#/components/schemas/Problem"
66654
- description: COMMENT_NOT_FOUND
68185
+ description: COMMENT_NOT_FOUND, INTERACTIONS_DISABLED
66655
68186
  headers:
66656
68187
  Cache-Control:
66657
68188
  $ref: "#/components/headers/CacheControlNoStore"
@@ -66659,47 +68190,7 @@ paths:
66659
68190
  $ref: "#/components/headers/XCorrelationId"
66660
68191
  x-gala-problem-codes:
66661
68192
  - COMMENT_NOT_FOUND
66662
- "409":
66663
- content:
66664
- application/problem+json:
66665
- examples:
66666
- APPEAL_EXISTS:
66667
- summary: APPEAL_EXISTS
66668
- value:
66669
- code: APPEAL_EXISTS
66670
- correlationId: 018f0000-0000-7000-8000-000000000001
66671
- detail: See the operation contract.
66672
- errors: []
66673
- retryable: false
66674
- schemaId: urn:gala:schema:problem:2.0.0
66675
- schemaVersion: 2.0.0
66676
- status: 409
66677
- title: APPEAL_EXISTS
66678
- type: urn:gala:problem:appeal-exists
66679
- APPEAL_NOT_ALLOWED:
66680
- summary: APPEAL_NOT_ALLOWED
66681
- value:
66682
- code: APPEAL_NOT_ALLOWED
66683
- correlationId: 018f0000-0000-7000-8000-000000000001
66684
- detail: See the operation contract.
66685
- errors: []
66686
- retryable: false
66687
- schemaId: urn:gala:schema:problem:2.0.0
66688
- schemaVersion: 2.0.0
66689
- status: 409
66690
- title: APPEAL_NOT_ALLOWED
66691
- type: urn:gala:problem:appeal-not-allowed
66692
- schema:
66693
- $ref: "#/components/schemas/Problem"
66694
- description: APPEAL_EXISTS, APPEAL_NOT_ALLOWED
66695
- headers:
66696
- Cache-Control:
66697
- $ref: "#/components/headers/CacheControlNoStore"
66698
- X-Correlation-Id:
66699
- $ref: "#/components/headers/XCorrelationId"
66700
- x-gala-problem-codes:
66701
- - APPEAL_EXISTS
66702
- - APPEAL_NOT_ALLOWED
68193
+ - INTERACTIONS_DISABLED
66703
68194
  "429":
66704
68195
  content:
66705
68196
  application/problem+json:
@@ -66731,7 +68222,7 @@ paths:
66731
68222
  - RATE_LIMITED
66732
68223
  security:
66733
68224
  - readerBearer: []
66734
- summary: appeal the removal of my comment
68225
+ summary: like one comment as the signed-in reader
66735
68226
  tags:
66736
68227
  - public-interactions
66737
68228
  x-gala-activation-gate: MVP
@@ -66742,20 +68233,19 @@ paths:
66742
68233
  x-gala-conditional-capabilities: []
66743
68234
  x-gala-example-profile: NOMINAL_SUCCESS_AND_EACH_REACHABLE_PROBLEM
66744
68235
  x-gala-nullability: required-and-nullable-are-explicit
66745
- x-gala-purpose: appeal the removal of my comment
68236
+ x-gala-purpose: like one comment as the signed-in reader
66746
68237
  x-gala-reachable-problems:
66747
- - APPEAL_EXISTS
66748
- - APPEAL_NOT_ALLOWED
66749
68238
  - COMMENT_NOT_FOUND
68239
+ - INTERACTIONS_DISABLED
66750
68240
  - RATE_LIMITED
66751
68241
  - READER_AUTHENTICATION_REQUIRED
68242
+ - READER_RESTRICTED
66752
68243
  - READER_TOKEN_SCOPE
66753
- - REQUEST_FIELD_UNKNOWN
66754
68244
  - VALIDATION_FAILED
66755
- x-gala-replay-identity: one-appeal-per-removal
68245
+ x-gala-replay-identity: natural-idempotent-state
66756
68246
  x-gala-state-guards:
66757
68247
  - NONE
66758
- x-gala-success-category: async
68248
+ x-gala-success-category: delete
66759
68249
  x-gala-tenant-scope: NONE
66760
68250
  /v2/public/comments/{commentId}/reports:
66761
68251
  post:
@@ -68619,7 +70109,7 @@ paths:
68619
70109
  x-gala-tenant-scope: NONE
68620
70110
  /v2/public/publications/{publicationId}/contents/{contentId}/comments:
68621
70111
  get:
68622
- description: "Without `parentId`: 20 roots per page, newest first, each with its descendants inline oldest first (at most 50 per root; `moreReplies` is true beyond that). With `parentId`: the children of that comment, oldest first, 50 per page. Removed and deleted comments appear as tombstones only when they have visible descendants."
70112
+ description: "Without `parentId`: 20 roots per page, newest first, each with its descendants inline oldest first (at most 50 per root; `moreReplies` is true beyond that). With `parentId`: the children of that comment, oldest first, 50 per page. Removed and deleted comments appear as tombstones only when they have visible descendants. SCHEMA-3.32.0: `sort` orders the roots, `newest` (the default) or `oldest`; replies stay oldest first. On the first page of a `newest` or `oldest` list, the one pinned root comment, if any, comes first, whatever the sort. A `cursor` is valid only with the `sort` it was issued for."
68623
70113
  operationId: getPublicPublicationsByPublicationIdContentsByContentIdComments
68624
70114
  parameters:
68625
70115
  - $ref: "#/components/parameters/XCorrelationId"
@@ -68648,6 +70138,16 @@ paths:
68648
70138
  format: uuid
68649
70139
  pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
68650
70140
  type: string
70141
+ - example: newest
70142
+ in: query
70143
+ name: sort
70144
+ required: false
70145
+ schema:
70146
+ default: newest
70147
+ enum:
70148
+ - newest
70149
+ - oldest
70150
+ type: string
68651
70151
  responses:
68652
70152
  "200":
68653
70153
  content:
@@ -68669,8 +70169,11 @@ paths:
68669
70169
  depth: 0
68670
70170
  editedAt: null
68671
70171
  id: 018f0000-0000-7000-8000-000000000001
70172
+ likeCount: 3
70173
+ likedByMe: false
68672
70174
  moreReplies: false
68673
70175
  parentId: null
70176
+ pinned: false
68674
70177
  replies: []
68675
70178
  state: VISIBLE
68676
70179
  viewer: