@atproto/bsky 0.0.76 → 0.0.77

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 (219) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/api/app/bsky/feed/getActorLikes.js +2 -2
  3. package/dist/api/app/bsky/feed/getActorLikes.js.map +1 -1
  4. package/dist/api/app/bsky/feed/getLikes.js +6 -6
  5. package/dist/api/app/bsky/feed/getLikes.js.map +1 -1
  6. package/dist/api/app/bsky/feed/getPosts.js +4 -4
  7. package/dist/api/app/bsky/feed/getPosts.js.map +1 -1
  8. package/dist/api/app/bsky/feed/getQuotes.d.ts +4 -0
  9. package/dist/api/app/bsky/feed/getQuotes.d.ts.map +1 -0
  10. package/dist/api/app/bsky/feed/getQuotes.js +67 -0
  11. package/dist/api/app/bsky/feed/getQuotes.js.map +1 -0
  12. package/dist/api/app/bsky/feed/getRepostedBy.js +6 -6
  13. package/dist/api/app/bsky/feed/getRepostedBy.js.map +1 -1
  14. package/dist/api/app/bsky/feed/searchPosts.js +4 -4
  15. package/dist/api/app/bsky/feed/searchPosts.js.map +1 -1
  16. package/dist/api/app/bsky/graph/getFollowers.js +8 -8
  17. package/dist/api/app/bsky/graph/getFollowers.js.map +1 -1
  18. package/dist/api/app/bsky/graph/getList.js +3 -3
  19. package/dist/api/app/bsky/graph/getList.js.map +1 -1
  20. package/dist/api/app/bsky/notification/listNotifications.d.ts.map +1 -1
  21. package/dist/api/app/bsky/notification/listNotifications.js +29 -8
  22. package/dist/api/app/bsky/notification/listNotifications.js.map +1 -1
  23. package/dist/api/index.d.ts.map +1 -1
  24. package/dist/api/index.js +2 -0
  25. package/dist/api/index.js.map +1 -1
  26. package/dist/data-plane/server/db/database-schema.d.ts +4 -2
  27. package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
  28. package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.d.ts +4 -0
  29. package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.d.ts.map +1 -0
  30. package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.js +15 -0
  31. package/dist/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.js.map +1 -0
  32. package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.d.ts +4 -0
  33. package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.d.ts.map +1 -0
  34. package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.js +30 -0
  35. package/dist/data-plane/server/db/migrations/20240723T220703655Z-quotes.js.map +1 -0
  36. package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.d.ts +4 -0
  37. package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.d.ts.map +1 -0
  38. package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.js +20 -0
  39. package/dist/data-plane/server/db/migrations/20240801T193939827Z-post-gate.js.map +1 -0
  40. package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.d.ts +4 -0
  41. package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.d.ts.map +1 -0
  42. package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.js +28 -0
  43. package/dist/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.js.map +1 -0
  44. package/dist/data-plane/server/db/migrations/index.d.ts +4 -0
  45. package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
  46. package/dist/data-plane/server/db/migrations/index.js +5 -1
  47. package/dist/data-plane/server/db/migrations/index.js.map +1 -1
  48. package/dist/data-plane/server/db/tables/post-agg.d.ts +1 -0
  49. package/dist/data-plane/server/db/tables/post-agg.d.ts.map +1 -1
  50. package/dist/data-plane/server/db/tables/post-gate.d.ts +14 -0
  51. package/dist/data-plane/server/db/tables/post-gate.d.ts.map +1 -0
  52. package/dist/data-plane/server/db/tables/post-gate.js +4 -0
  53. package/dist/data-plane/server/db/tables/post-gate.js.map +1 -0
  54. package/dist/data-plane/server/db/tables/post.d.ts +3 -0
  55. package/dist/data-plane/server/db/tables/post.d.ts.map +1 -1
  56. package/dist/data-plane/server/db/tables/quote.d.ts +16 -0
  57. package/dist/data-plane/server/db/tables/quote.d.ts.map +1 -0
  58. package/dist/data-plane/server/db/tables/quote.js +4 -0
  59. package/dist/data-plane/server/db/tables/quote.js.map +1 -0
  60. package/dist/data-plane/server/indexing/index.d.ts +2 -0
  61. package/dist/data-plane/server/indexing/index.d.ts.map +1 -1
  62. package/dist/data-plane/server/indexing/index.js +6 -0
  63. package/dist/data-plane/server/indexing/index.js.map +1 -1
  64. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts +10 -0
  65. package/dist/data-plane/server/indexing/plugins/post-gate.d.ts.map +1 -0
  66. package/dist/data-plane/server/indexing/plugins/post-gate.js +101 -0
  67. package/dist/data-plane/server/indexing/plugins/post-gate.js.map +1 -0
  68. package/dist/data-plane/server/indexing/plugins/post.d.ts +2 -0
  69. package/dist/data-plane/server/indexing/plugins/post.d.ts.map +1 -1
  70. package/dist/data-plane/server/indexing/plugins/post.js +122 -15
  71. package/dist/data-plane/server/indexing/plugins/post.js.map +1 -1
  72. package/dist/data-plane/server/indexing/plugins/thread-gate.d.ts.map +1 -1
  73. package/dist/data-plane/server/indexing/plugins/thread-gate.js +12 -0
  74. package/dist/data-plane/server/indexing/plugins/thread-gate.js.map +1 -1
  75. package/dist/data-plane/server/routes/index.d.ts.map +1 -1
  76. package/dist/data-plane/server/routes/index.js +2 -0
  77. package/dist/data-plane/server/routes/index.js.map +1 -1
  78. package/dist/data-plane/server/routes/interactions.d.ts.map +1 -1
  79. package/dist/data-plane/server/routes/interactions.js +2 -1
  80. package/dist/data-plane/server/routes/interactions.js.map +1 -1
  81. package/dist/data-plane/server/routes/quotes.d.ts +6 -0
  82. package/dist/data-plane/server/routes/quotes.d.ts.map +1 -0
  83. package/dist/data-plane/server/routes/quotes.js +27 -0
  84. package/dist/data-plane/server/routes/quotes.js.map +1 -0
  85. package/dist/data-plane/server/routes/records.d.ts.map +1 -1
  86. package/dist/data-plane/server/routes/records.js +11 -1
  87. package/dist/data-plane/server/routes/records.js.map +1 -1
  88. package/dist/data-plane/server/util.d.ts +6 -7
  89. package/dist/data-plane/server/util.d.ts.map +1 -1
  90. package/dist/data-plane/server/util.js +1 -9
  91. package/dist/data-plane/server/util.js.map +1 -1
  92. package/dist/hydration/feed.d.ts +10 -0
  93. package/dist/hydration/feed.d.ts.map +1 -1
  94. package/dist/hydration/feed.js +31 -7
  95. package/dist/hydration/feed.js.map +1 -1
  96. package/dist/hydration/hydrator.d.ts +4 -2
  97. package/dist/hydration/hydrator.d.ts.map +1 -1
  98. package/dist/hydration/hydrator.js +89 -34
  99. package/dist/hydration/hydrator.js.map +1 -1
  100. package/dist/hydration/util.d.ts +0 -1
  101. package/dist/hydration/util.d.ts.map +1 -1
  102. package/dist/hydration/util.js +1 -5
  103. package/dist/hydration/util.js.map +1 -1
  104. package/dist/lexicon/index.d.ts +2 -0
  105. package/dist/lexicon/index.d.ts.map +1 -1
  106. package/dist/lexicon/index.js +4 -0
  107. package/dist/lexicon/index.js.map +1 -1
  108. package/dist/lexicon/lexicons.d.ts +141 -0
  109. package/dist/lexicon/lexicons.d.ts.map +1 -1
  110. package/dist/lexicon/lexicons.js +142 -0
  111. package/dist/lexicon/lexicons.js.map +1 -1
  112. package/dist/lexicon/types/app/bsky/embed/record.d.ts +8 -1
  113. package/dist/lexicon/types/app/bsky/embed/record.d.ts.map +1 -1
  114. package/dist/lexicon/types/app/bsky/embed/record.js +11 -1
  115. package/dist/lexicon/types/app/bsky/embed/record.js.map +1 -1
  116. package/dist/lexicon/types/app/bsky/feed/defs.d.ts +2 -0
  117. package/dist/lexicon/types/app/bsky/feed/defs.d.ts.map +1 -1
  118. package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
  119. package/dist/lexicon/types/app/bsky/feed/getQuotes.d.ts +44 -0
  120. package/dist/lexicon/types/app/bsky/feed/getQuotes.d.ts.map +1 -0
  121. package/dist/lexicon/types/app/bsky/feed/getQuotes.js +3 -0
  122. package/dist/lexicon/types/app/bsky/feed/getQuotes.js.map +1 -0
  123. package/dist/lexicon/types/app/bsky/feed/postgate.d.ts +25 -0
  124. package/dist/lexicon/types/app/bsky/feed/postgate.d.ts.map +1 -0
  125. package/dist/lexicon/types/app/bsky/feed/postgate.js +27 -0
  126. package/dist/lexicon/types/app/bsky/feed/postgate.js.map +1 -0
  127. package/dist/lexicon/types/app/bsky/feed/threadgate.d.ts +2 -0
  128. package/dist/lexicon/types/app/bsky/feed/threadgate.d.ts.map +1 -1
  129. package/dist/lexicon/types/app/bsky/feed/threadgate.js.map +1 -1
  130. package/dist/proto/bsky_connect.d.ts +21 -1
  131. package/dist/proto/bsky_connect.d.ts.map +1 -1
  132. package/dist/proto/bsky_connect.js +20 -0
  133. package/dist/proto/bsky_connect.js.map +1 -1
  134. package/dist/proto/bsky_pb.d.ts +96 -0
  135. package/dist/proto/bsky_pb.d.ts.map +1 -1
  136. package/dist/proto/bsky_pb.js +306 -4
  137. package/dist/proto/bsky_pb.js.map +1 -1
  138. package/dist/util/uris.d.ts +12 -0
  139. package/dist/util/uris.d.ts.map +1 -0
  140. package/dist/util/uris.js +34 -0
  141. package/dist/util/uris.js.map +1 -0
  142. package/dist/views/index.d.ts +8 -2
  143. package/dist/views/index.d.ts.map +1 -1
  144. package/dist/views/index.js +83 -39
  145. package/dist/views/index.js.map +1 -1
  146. package/dist/views/types.d.ts +1 -1
  147. package/dist/views/types.d.ts.map +1 -1
  148. package/dist/views/types.js.map +1 -1
  149. package/dist/views/util.d.ts +11 -1
  150. package/dist/views/util.d.ts.map +1 -1
  151. package/dist/views/util.js +19 -8
  152. package/dist/views/util.js.map +1 -1
  153. package/package.json +4 -4
  154. package/proto/bsky.proto +33 -0
  155. package/src/api/app/bsky/feed/getActorLikes.ts +1 -1
  156. package/src/api/app/bsky/feed/getLikes.ts +1 -1
  157. package/src/api/app/bsky/feed/getPosts.ts +1 -1
  158. package/src/api/app/bsky/feed/getQuotes.ts +105 -0
  159. package/src/api/app/bsky/feed/getRepostedBy.ts +1 -1
  160. package/src/api/app/bsky/feed/searchPosts.ts +1 -1
  161. package/src/api/app/bsky/graph/getFollowers.ts +1 -1
  162. package/src/api/app/bsky/graph/getList.ts +1 -1
  163. package/src/api/app/bsky/notification/listNotifications.ts +32 -6
  164. package/src/api/index.ts +2 -0
  165. package/src/data-plane/server/db/database-schema.ts +7 -3
  166. package/src/data-plane/server/db/migrations/20240723T220700077Z-quotes-post-aggs.ts +12 -0
  167. package/src/data-plane/server/db/migrations/20240723T220703655Z-quotes.ts +28 -0
  168. package/src/data-plane/server/db/migrations/20240801T193939827Z-post-gate.ts +17 -0
  169. package/src/data-plane/server/db/migrations/20240808T224251220Z-post-gate-flags.ts +25 -0
  170. package/src/data-plane/server/db/migrations/index.ts +4 -0
  171. package/src/data-plane/server/db/tables/post-agg.ts +1 -0
  172. package/src/data-plane/server/db/tables/post-gate.ts +12 -0
  173. package/src/data-plane/server/db/tables/post.ts +3 -0
  174. package/src/data-plane/server/db/tables/quote.ts +15 -0
  175. package/src/data-plane/server/indexing/index.ts +7 -0
  176. package/src/data-plane/server/indexing/plugins/post-gate.ts +104 -0
  177. package/src/data-plane/server/indexing/plugins/post.ts +151 -16
  178. package/src/data-plane/server/indexing/plugins/thread-gate.ts +12 -0
  179. package/src/data-plane/server/routes/index.ts +2 -0
  180. package/src/data-plane/server/routes/interactions.ts +2 -1
  181. package/src/data-plane/server/routes/quotes.ts +32 -0
  182. package/src/data-plane/server/routes/records.ts +11 -1
  183. package/src/data-plane/server/util.ts +0 -8
  184. package/src/hydration/feed.ts +58 -12
  185. package/src/hydration/hydrator.ts +94 -22
  186. package/src/hydration/util.ts +0 -4
  187. package/src/lexicon/index.ts +12 -0
  188. package/src/lexicon/lexicons.ts +145 -0
  189. package/src/lexicon/types/app/bsky/embed/record.ts +19 -0
  190. package/src/lexicon/types/app/bsky/feed/defs.ts +2 -0
  191. package/src/lexicon/types/app/bsky/feed/getQuotes.ts +54 -0
  192. package/src/lexicon/types/app/bsky/feed/postgate.ts +47 -0
  193. package/src/lexicon/types/app/bsky/feed/threadgate.ts +2 -0
  194. package/src/proto/bsky_connect.ts +24 -0
  195. package/src/proto/bsky_pb.ts +289 -0
  196. package/src/util/uris.ts +31 -0
  197. package/src/views/index.ts +90 -35
  198. package/src/views/types.ts +1 -0
  199. package/src/views/util.ts +37 -7
  200. package/tests/__snapshots__/feed-generation.test.ts.snap +37 -0
  201. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +18 -0
  202. package/tests/data-plane/indexing.test.ts +1 -0
  203. package/tests/postgates.test.ts +186 -0
  204. package/tests/seed/feed-hidden-replies.ts +62 -0
  205. package/tests/seed/postgates.ts +56 -0
  206. package/tests/views/__snapshots__/author-feed.test.ts.snap +56 -0
  207. package/tests/views/__snapshots__/block-lists.test.ts.snap +6 -0
  208. package/tests/views/__snapshots__/blocks.test.ts.snap +10 -0
  209. package/tests/views/__snapshots__/list-feed.test.ts.snap +22 -0
  210. package/tests/views/__snapshots__/mute-lists.test.ts.snap +8 -0
  211. package/tests/views/__snapshots__/mutes.test.ts.snap +6 -0
  212. package/tests/views/__snapshots__/posts.test.ts.snap +12 -0
  213. package/tests/views/__snapshots__/quotes.test.ts.snap +399 -0
  214. package/tests/views/__snapshots__/thread.test.ts.snap +50 -0
  215. package/tests/views/__snapshots__/timeline.test.ts.snap +170 -0
  216. package/tests/views/author-feed.test.ts +3 -9
  217. package/tests/views/feed-hidden-replies.test.ts +246 -0
  218. package/tests/views/feed-view-post.test.ts +501 -0
  219. package/tests/views/quotes.test.ts +105 -0
package/src/views/util.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { AtUri } from '@atproto/syntax'
2
1
  import { BlobRef } from '@atproto/lexicon'
3
2
  import { Record as PostRecord } from '../lexicon/types/app/bsky/feed/post'
4
3
  import {
@@ -7,12 +6,12 @@ import {
7
6
  isListRule,
8
7
  isMentionRule,
9
8
  } from '../lexicon/types/app/bsky/feed/threadgate'
9
+ import {
10
+ Record as PostgateRecord,
11
+ isDisableRule as isPostgateDisableRule,
12
+ } from '../lexicon/types/app/bsky/feed/postgate'
10
13
  import { isMention } from '../lexicon/types/app/bsky/richtext/facet'
11
14
 
12
- export const creatorFromUri = (uri: string): string => {
13
- return new AtUri(uri).hostname
14
- }
15
-
16
15
  export const parseThreadGate = (
17
16
  replierDid: string,
18
17
  ownerDid: string,
@@ -27,8 +26,8 @@ export const parseThreadGate = (
27
26
  return { canReply: true }
28
27
  }
29
28
 
30
- const allowMentions = !!gate.allow.find(isMentionRule)
31
- const allowFollowing = !!gate.allow.find(isFollowingRule)
29
+ const allowMentions = gate.allow.some(isMentionRule)
30
+ const allowFollowing = gate.allow.some(isFollowingRule)
32
31
  const allowListUris = gate.allow?.filter(isListRule).map((item) => item.list)
33
32
 
34
33
  // check mentions first since it's quick and synchronous
@@ -62,3 +61,34 @@ export const cidFromBlobJson = (json: BlobRef) => {
62
61
  }
63
62
  return (json['cid'] ?? '') as string
64
63
  }
64
+
65
+ export const parsePostgate = ({
66
+ gate,
67
+ viewerDid,
68
+ authorDid,
69
+ }: {
70
+ gate: PostgateRecord | undefined
71
+ viewerDid: string | undefined
72
+ authorDid: string
73
+ }): ParsedPostgate => {
74
+ if (viewerDid === authorDid) {
75
+ return { embeddingRules: { canEmbed: true } }
76
+ }
77
+ // default state is unset, allow everyone
78
+ if (!gate || !gate.embeddingRules) {
79
+ return { embeddingRules: { canEmbed: true } }
80
+ }
81
+
82
+ const disabled = gate.embeddingRules.some(isPostgateDisableRule)
83
+ if (disabled) {
84
+ return { embeddingRules: { canEmbed: false } }
85
+ }
86
+
87
+ return { embeddingRules: { canEmbed: true } }
88
+ }
89
+
90
+ type ParsedPostgate = {
91
+ embeddingRules: {
92
+ canEmbed: boolean
93
+ }
94
+ }
@@ -26,6 +26,7 @@ Object {
26
26
  "indexedAt": "1970-01-01T00:00:00.000Z",
27
27
  "labels": Array [],
28
28
  "likeCount": 0,
29
+ "quoteCount": 0,
29
30
  "record": Object {
30
31
  "$type": "app.bsky.feed.post",
31
32
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -42,6 +43,7 @@ Object {
42
43
  "repostCount": 0,
43
44
  "uri": "record(0)",
44
45
  "viewer": Object {
46
+ "embeddingDisabled": false,
45
47
  "threadMuted": false,
46
48
  },
47
49
  }
@@ -73,6 +75,7 @@ Object {
73
75
  "indexedAt": "1970-01-01T00:00:00.000Z",
74
76
  "labels": Array [],
75
77
  "likeCount": 0,
78
+ "quoteCount": 0,
76
79
  "record": Object {
77
80
  "$type": "app.bsky.feed.post",
78
81
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -89,6 +92,7 @@ Object {
89
92
  "repostCount": 0,
90
93
  "uri": "record(0)",
91
94
  "viewer": Object {
95
+ "embeddingDisabled": false,
92
96
  "threadMuted": false,
93
97
  },
94
98
  }
@@ -160,6 +164,7 @@ Object {
160
164
  "indexedAt": "1970-01-01T00:00:00.000Z",
161
165
  "labels": Array [],
162
166
  "likeCount": 0,
167
+ "quoteCount": 0,
163
168
  "record": Object {
164
169
  "$type": "app.bsky.feed.post",
165
170
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -176,6 +181,7 @@ Object {
176
181
  "repostCount": 0,
177
182
  "uri": "record(0)",
178
183
  "viewer": Object {
184
+ "embeddingDisabled": false,
179
185
  "threadMuted": false,
180
186
  },
181
187
  }
@@ -249,6 +255,7 @@ Object {
249
255
  "indexedAt": "1970-01-01T00:00:00.000Z",
250
256
  "labels": Array [],
251
257
  "likeCount": 0,
258
+ "quoteCount": 0,
252
259
  "record": Object {
253
260
  "$type": "app.bsky.feed.post",
254
261
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -265,6 +272,7 @@ Object {
265
272
  "repostCount": 0,
266
273
  "uri": "record(0)",
267
274
  "viewer": Object {
275
+ "embeddingDisabled": false,
268
276
  "threadMuted": false,
269
277
  },
270
278
  }
@@ -531,6 +539,7 @@ Array [
531
539
  },
532
540
  ],
533
541
  "likeCount": 0,
542
+ "quoteCount": 0,
534
543
  "record": Object {
535
544
  "$type": "app.bsky.feed.post",
536
545
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -548,6 +557,7 @@ Array [
548
557
  "repostCount": 0,
549
558
  "uri": "record(0)",
550
559
  "viewer": Object {
560
+ "embeddingDisabled": false,
551
561
  "threadMuted": false,
552
562
  },
553
563
  },
@@ -573,6 +583,7 @@ Array [
573
583
  "indexedAt": "1970-01-01T00:00:00.000Z",
574
584
  "labels": Array [],
575
585
  "likeCount": 0,
586
+ "quoteCount": 1,
576
587
  "record": Object {
577
588
  "$type": "app.bsky.feed.post",
578
589
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -586,6 +597,7 @@ Array [
586
597
  "repostCount": 0,
587
598
  "uri": "record(2)",
588
599
  "viewer": Object {
600
+ "embeddingDisabled": false,
589
601
  "threadMuted": false,
590
602
  },
591
603
  },
@@ -662,6 +674,7 @@ Array [
662
674
  "indexedAt": "1970-01-01T00:00:00.000Z",
663
675
  "labels": Array [],
664
676
  "likeCount": 2,
677
+ "quoteCount": 1,
665
678
  "record": Object {
666
679
  "$type": "app.bsky.feed.post",
667
680
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -707,6 +720,7 @@ Array [
707
720
  "repostCount": 0,
708
721
  "uri": "record(5)",
709
722
  "viewer": Object {
723
+ "embeddingDisabled": false,
710
724
  "like": "record(8)",
711
725
  "threadMuted": false,
712
726
  },
@@ -730,6 +744,7 @@ Array [
730
744
  "indexedAt": "1970-01-01T00:00:00.000Z",
731
745
  "labels": Array [],
732
746
  "likeCount": 0,
747
+ "quoteCount": 0,
733
748
  "record": Object {
734
749
  "$type": "app.bsky.feed.post",
735
750
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -749,6 +764,7 @@ Array [
749
764
  "repostCount": 0,
750
765
  "uri": "record(9)",
751
766
  "viewer": Object {
767
+ "embeddingDisabled": false,
752
768
  "threadMuted": false,
753
769
  },
754
770
  },
@@ -786,6 +802,7 @@ Array [
786
802
  "indexedAt": "1970-01-01T00:00:00.000Z",
787
803
  "labels": Array [],
788
804
  "likeCount": 3,
805
+ "quoteCount": 0,
789
806
  "record": Object {
790
807
  "$type": "app.bsky.feed.post",
791
808
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -795,6 +812,7 @@ Array [
795
812
  "repostCount": 1,
796
813
  "uri": "record(10)",
797
814
  "viewer": Object {
815
+ "embeddingDisabled": false,
798
816
  "threadMuted": false,
799
817
  },
800
818
  },
@@ -831,6 +849,7 @@ Array [
831
849
  "indexedAt": "1970-01-01T00:00:00.000Z",
832
850
  "labels": Array [],
833
851
  "likeCount": 3,
852
+ "quoteCount": 0,
834
853
  "record": Object {
835
854
  "$type": "app.bsky.feed.post",
836
855
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -840,6 +859,7 @@ Array [
840
859
  "repostCount": 1,
841
860
  "uri": "record(10)",
842
861
  "viewer": Object {
862
+ "embeddingDisabled": false,
843
863
  "threadMuted": false,
844
864
  },
845
865
  },
@@ -987,6 +1007,7 @@ Array [
987
1007
  "indexedAt": "1970-01-01T00:00:00.000Z",
988
1008
  "labels": Array [],
989
1009
  "likeCount": 0,
1010
+ "quoteCount": 1,
990
1011
  "record": Object {
991
1012
  "$type": "app.bsky.feed.post",
992
1013
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1017,6 +1038,7 @@ Array [
1017
1038
  "repostCount": 1,
1018
1039
  "uri": "record(11)",
1019
1040
  "viewer": Object {
1041
+ "embeddingDisabled": false,
1020
1042
  "threadMuted": false,
1021
1043
  },
1022
1044
  },
@@ -1079,6 +1101,7 @@ Array [
1079
1101
  },
1080
1102
  ],
1081
1103
  "likeCount": 0,
1104
+ "quoteCount": 0,
1082
1105
  "record": Object {
1083
1106
  "$type": "app.bsky.feed.post",
1084
1107
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1157,6 +1180,7 @@ Array [
1157
1180
  "indexedAt": "1970-01-01T00:00:00.000Z",
1158
1181
  "labels": Array [],
1159
1182
  "likeCount": 2,
1183
+ "quoteCount": 1,
1160
1184
  "record": Object {
1161
1185
  "$type": "app.bsky.feed.post",
1162
1186
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1215,6 +1239,7 @@ Array [
1215
1239
  "indexedAt": "1970-01-01T00:00:00.000Z",
1216
1240
  "labels": Array [],
1217
1241
  "likeCount": 0,
1242
+ "quoteCount": 0,
1218
1243
  "record": Object {
1219
1244
  "$type": "app.bsky.feed.post",
1220
1245
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1264,6 +1289,7 @@ Array [
1264
1289
  "indexedAt": "1970-01-01T00:00:00.000Z",
1265
1290
  "labels": Array [],
1266
1291
  "likeCount": 3,
1292
+ "quoteCount": 0,
1267
1293
  "record": Object {
1268
1294
  "$type": "app.bsky.feed.post",
1269
1295
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -1302,6 +1328,7 @@ Array [
1302
1328
  "indexedAt": "1970-01-01T00:00:00.000Z",
1303
1329
  "labels": Array [],
1304
1330
  "likeCount": 3,
1331
+ "quoteCount": 0,
1305
1332
  "record": Object {
1306
1333
  "$type": "app.bsky.feed.post",
1307
1334
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -1360,6 +1387,7 @@ Array [
1360
1387
  },
1361
1388
  ],
1362
1389
  "likeCount": 0,
1390
+ "quoteCount": 0,
1363
1391
  "record": Object {
1364
1392
  "$type": "app.bsky.feed.post",
1365
1393
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1377,6 +1405,7 @@ Array [
1377
1405
  "repostCount": 0,
1378
1406
  "uri": "record(0)",
1379
1407
  "viewer": Object {
1408
+ "embeddingDisabled": false,
1380
1409
  "threadMuted": false,
1381
1410
  },
1382
1411
  },
@@ -1453,6 +1482,7 @@ Array [
1453
1482
  "indexedAt": "1970-01-01T00:00:00.000Z",
1454
1483
  "labels": Array [],
1455
1484
  "likeCount": 2,
1485
+ "quoteCount": 1,
1456
1486
  "record": Object {
1457
1487
  "$type": "app.bsky.feed.post",
1458
1488
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1498,6 +1528,7 @@ Array [
1498
1528
  "repostCount": 0,
1499
1529
  "uri": "record(2)",
1500
1530
  "viewer": Object {
1531
+ "embeddingDisabled": false,
1501
1532
  "like": "record(8)",
1502
1533
  "threadMuted": false,
1503
1534
  },
@@ -1521,6 +1552,7 @@ Array [
1521
1552
  "indexedAt": "1970-01-01T00:00:00.000Z",
1522
1553
  "labels": Array [],
1523
1554
  "likeCount": 0,
1555
+ "quoteCount": 0,
1524
1556
  "record": Object {
1525
1557
  "$type": "app.bsky.feed.post",
1526
1558
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -1540,6 +1572,7 @@ Array [
1540
1572
  "repostCount": 0,
1541
1573
  "uri": "record(9)",
1542
1574
  "viewer": Object {
1575
+ "embeddingDisabled": false,
1543
1576
  "threadMuted": false,
1544
1577
  },
1545
1578
  },
@@ -1577,6 +1610,7 @@ Array [
1577
1610
  "indexedAt": "1970-01-01T00:00:00.000Z",
1578
1611
  "labels": Array [],
1579
1612
  "likeCount": 3,
1613
+ "quoteCount": 0,
1580
1614
  "record": Object {
1581
1615
  "$type": "app.bsky.feed.post",
1582
1616
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -1586,6 +1620,7 @@ Array [
1586
1620
  "repostCount": 1,
1587
1621
  "uri": "record(10)",
1588
1622
  "viewer": Object {
1623
+ "embeddingDisabled": false,
1589
1624
  "threadMuted": false,
1590
1625
  },
1591
1626
  },
@@ -1622,6 +1657,7 @@ Array [
1622
1657
  "indexedAt": "1970-01-01T00:00:00.000Z",
1623
1658
  "labels": Array [],
1624
1659
  "likeCount": 3,
1660
+ "quoteCount": 0,
1625
1661
  "record": Object {
1626
1662
  "$type": "app.bsky.feed.post",
1627
1663
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -1631,6 +1667,7 @@ Array [
1631
1667
  "repostCount": 1,
1632
1668
  "uri": "record(10)",
1633
1669
  "viewer": Object {
1670
+ "embeddingDisabled": false,
1634
1671
  "threadMuted": false,
1635
1672
  },
1636
1673
  },
@@ -59,6 +59,7 @@ Array [
59
59
  "indexedAt": "1970-01-01T00:00:00.000Z",
60
60
  "labels": Array [],
61
61
  "likeCount": 0,
62
+ "quoteCount": 0,
62
63
  "record": Object {
63
64
  "$type": "app.bsky.feed.post",
64
65
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -68,6 +69,7 @@ Array [
68
69
  "repostCount": 0,
69
70
  "uri": "record(2)",
70
71
  "viewer": Object {
72
+ "embeddingDisabled": false,
71
73
  "threadMuted": false,
72
74
  },
73
75
  },
@@ -87,6 +89,7 @@ Array [
87
89
  "indexedAt": "1970-01-01T00:00:00.000Z",
88
90
  "labels": Array [],
89
91
  "likeCount": 0,
92
+ "quoteCount": 0,
90
93
  "record": Object {
91
94
  "$type": "app.bsky.feed.post",
92
95
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -106,6 +109,7 @@ Array [
106
109
  "repostCount": 1,
107
110
  "uri": "record(3)",
108
111
  "viewer": Object {
112
+ "embeddingDisabled": false,
109
113
  "threadMuted": false,
110
114
  },
111
115
  },
@@ -164,6 +168,7 @@ Array [
164
168
  },
165
169
  ],
166
170
  "likeCount": 0,
171
+ "quoteCount": 0,
167
172
  "record": Object {
168
173
  "$type": "app.bsky.feed.post",
169
174
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -199,6 +204,7 @@ Array [
199
204
  "repostCount": 0,
200
205
  "uri": "record(5)",
201
206
  "viewer": Object {
207
+ "embeddingDisabled": false,
202
208
  "threadMuted": false,
203
209
  },
204
210
  },
@@ -217,6 +223,7 @@ Array [
217
223
  "indexedAt": "1970-01-01T00:00:00.000Z",
218
224
  "labels": Array [],
219
225
  "likeCount": 3,
226
+ "quoteCount": 0,
220
227
  "record": Object {
221
228
  "$type": "app.bsky.feed.post",
222
229
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -226,6 +233,7 @@ Array [
226
233
  "repostCount": 1,
227
234
  "uri": "record(4)",
228
235
  "viewer": Object {
236
+ "embeddingDisabled": false,
229
237
  "threadMuted": false,
230
238
  },
231
239
  },
@@ -374,6 +382,7 @@ Array [
374
382
  },
375
383
  ],
376
384
  "likeCount": 2,
385
+ "quoteCount": 0,
377
386
  "record": Object {
378
387
  "$type": "app.bsky.feed.post",
379
388
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -390,6 +399,7 @@ Array [
390
399
  "repostCount": 0,
391
400
  "uri": "record(6)",
392
401
  "viewer": Object {
402
+ "embeddingDisabled": false,
393
403
  "threadMuted": false,
394
404
  },
395
405
  },
@@ -409,6 +419,7 @@ Array [
409
419
  "indexedAt": "1970-01-01T00:00:00.000Z",
410
420
  "labels": Array [],
411
421
  "likeCount": 3,
422
+ "quoteCount": 0,
412
423
  "record": Object {
413
424
  "$type": "app.bsky.feed.post",
414
425
  "createdAt": "1970-01-01T00:00:00.000000Z",
@@ -418,6 +429,7 @@ Array [
418
429
  "repostCount": 1,
419
430
  "uri": "record(4)",
420
431
  "viewer": Object {
432
+ "embeddingDisabled": false,
421
433
  "threadMuted": false,
422
434
  },
423
435
  },
@@ -445,6 +457,7 @@ Array [
445
457
  },
446
458
  ],
447
459
  "likeCount": 0,
460
+ "quoteCount": 0,
448
461
  "record": Object {
449
462
  "$type": "app.bsky.feed.post",
450
463
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -462,6 +475,7 @@ Array [
462
475
  "repostCount": 0,
463
476
  "uri": "record(12)",
464
477
  "viewer": Object {
478
+ "embeddingDisabled": false,
465
479
  "threadMuted": false,
466
480
  },
467
481
  },
@@ -554,6 +568,7 @@ Object {
554
568
  "indexedAt": "1970-01-01T00:00:00.000Z",
555
569
  "labels": Array [],
556
570
  "likeCount": 0,
571
+ "quoteCount": 0,
557
572
  "record": Object {
558
573
  "$type": "app.bsky.feed.post",
559
574
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -577,6 +592,7 @@ Object {
577
592
  "repostCount": 0,
578
593
  "uri": "record(0)",
579
594
  "viewer": Object {
595
+ "embeddingDisabled": false,
580
596
  "threadMuted": false,
581
597
  },
582
598
  },
@@ -621,6 +637,7 @@ Object {
621
637
  "indexedAt": "1970-01-01T00:00:00.000Z",
622
638
  "labels": Array [],
623
639
  "likeCount": 0,
640
+ "quoteCount": 0,
624
641
  "record": Object {
625
642
  "$type": "app.bsky.feed.post",
626
643
  "createdAt": "1970-01-01T00:00:00.000Z",
@@ -644,6 +661,7 @@ Object {
644
661
  "repostCount": 0,
645
662
  "uri": "record(0)",
646
663
  "viewer": Object {
664
+ "embeddingDisabled": false,
647
665
  "threadMuted": false,
648
666
  },
649
667
  },
@@ -277,6 +277,7 @@ describe('indexing', () => {
277
277
  replyCount: 1,
278
278
  repostCount: 1,
279
279
  likeCount: 1,
280
+ quoteCount: 0,
280
281
  })
281
282
  // Cleanup
282
283
  const del = (uri: AtUri) => {
@@ -0,0 +1,186 @@
1
+ import { TestNetwork, SeedClient, RecordRef } from '@atproto/dev-env'
2
+ import AtpAgent, { AppBskyEmbedRecord } from '@atproto/api'
3
+
4
+ import { ids } from '../src/lexicon/lexicons'
5
+ import { postgatesSeed, Users } from './seed/postgates'
6
+
7
+ describe('postgates', () => {
8
+ let network: TestNetwork
9
+ let agent: AtpAgent
10
+ let pdsAgent: AtpAgent
11
+ let sc: SeedClient
12
+ let users: Users
13
+
14
+ beforeAll(async () => {
15
+ network = await TestNetwork.create({
16
+ dbPostgresSchema: 'bsky_tests_postgates',
17
+ })
18
+ agent = network.bsky.getClient()
19
+ pdsAgent = network.pds.getClient()
20
+ sc = network.getSeedClient()
21
+
22
+ const result = await postgatesSeed(sc)
23
+ users = result.users
24
+
25
+ await network.processAll()
26
+ })
27
+
28
+ afterAll(async () => {
29
+ await network.close()
30
+ })
31
+
32
+ describe(`quotee <-> quoter`, () => {
33
+ it(`quotee detaches own post from quoter`, async () => {
34
+ const quoteePost = await sc.post(users.quotee.did, `post`)
35
+ const quoterPost = await sc.post(
36
+ users.quoter.did,
37
+ `quote post`,
38
+ undefined,
39
+ undefined,
40
+ quoteePost.ref,
41
+ )
42
+ await pdsAgent.api.app.bsky.feed.postgate.create(
43
+ {
44
+ repo: users.quotee.did,
45
+ rkey: quoteePost.ref.uri.rkey,
46
+ },
47
+ {
48
+ post: quoteePost.ref.uriStr,
49
+ createdAt: new Date().toISOString(),
50
+ detachedEmbeddingUris: [quoterPost.ref.uriStr],
51
+ },
52
+ sc.getHeaders(users.quotee.did),
53
+ )
54
+ await network.processAll()
55
+
56
+ const root = await agent.api.app.bsky.feed.getPostThread(
57
+ { uri: quoterPost.ref.uriStr },
58
+ {
59
+ headers: await network.serviceHeaders(
60
+ users.viewer.did,
61
+ ids.AppBskyFeedGetPostThread,
62
+ ),
63
+ },
64
+ )
65
+
66
+ expect(
67
+ // @ts-ignore I know more than you
68
+ AppBskyEmbedRecord.isViewDetached(root.data.thread.post.embed.record),
69
+ ).toBe(true)
70
+ })
71
+
72
+ it(`postgate made by bystander has no effect`, async () => {
73
+ const quoteePost = await sc.post(users.quotee.did, `post`)
74
+ const quoterPost = await sc.post(
75
+ users.quoter.did,
76
+ `quote post`,
77
+ undefined,
78
+ undefined,
79
+ quoteePost.ref,
80
+ )
81
+ await pdsAgent.api.app.bsky.feed.postgate.create(
82
+ {
83
+ repo: users.viewer.did,
84
+ rkey: quoteePost.ref.uri.rkey,
85
+ },
86
+ {
87
+ post: quoteePost.ref.uriStr,
88
+ createdAt: new Date().toISOString(),
89
+ detachedEmbeddingUris: [quoterPost.ref.uriStr],
90
+ },
91
+ sc.getHeaders(users.viewer.did),
92
+ )
93
+ await network.processAll()
94
+
95
+ const root = await agent.api.app.bsky.feed.getPostThread(
96
+ { uri: quoterPost.ref.uriStr },
97
+ {
98
+ headers: await network.serviceHeaders(
99
+ users.viewer.did,
100
+ ids.AppBskyFeedGetPostThread,
101
+ ),
102
+ },
103
+ )
104
+
105
+ expect(
106
+ // @ts-ignore I know more than you
107
+ AppBskyEmbedRecord.isViewDetached(root.data.thread.post.embed.record),
108
+ ).toBe(false)
109
+ })
110
+ })
111
+
112
+ describe(`embeddingRules`, () => {
113
+ it(`disables quoteposts`, async () => {
114
+ const quoteePost = await sc.post(users.quotee.did, `post`)
115
+ await pdsAgent.api.app.bsky.feed.postgate.create(
116
+ {
117
+ repo: users.quotee.did,
118
+ rkey: quoteePost.ref.uri.rkey,
119
+ },
120
+ {
121
+ post: quoteePost.ref.uriStr,
122
+ createdAt: new Date().toISOString(),
123
+ embeddingRules: [{ $type: 'app.bsky.feed.postgate#disableRule' }],
124
+ },
125
+ sc.getHeaders(users.quotee.did),
126
+ )
127
+ await network.processAll()
128
+
129
+ const root = await agent.api.app.bsky.feed.getPostThread(
130
+ { uri: quoteePost.ref.uriStr },
131
+ {
132
+ headers: await network.serviceHeaders(
133
+ users.viewer.did,
134
+ ids.AppBskyFeedGetPostThread,
135
+ ),
136
+ },
137
+ )
138
+
139
+ expect(
140
+ // @ts-ignore I know more than you
141
+ root.data.thread.post.viewer.embeddingDisabled,
142
+ ).toBe(true)
143
+ })
144
+
145
+ it(`quotepost created after quotes disabled hides embed`, async () => {
146
+ const quoteePost = await sc.post(users.quotee.did, `post`)
147
+ await pdsAgent.api.app.bsky.feed.postgate.create(
148
+ {
149
+ repo: users.quotee.did,
150
+ rkey: quoteePost.ref.uri.rkey,
151
+ },
152
+ {
153
+ post: quoteePost.ref.uriStr,
154
+ createdAt: new Date().toISOString(),
155
+ embeddingRules: [{ $type: 'app.bsky.feed.postgate#disableRule' }],
156
+ },
157
+ sc.getHeaders(users.quotee.did),
158
+ )
159
+ await network.processAll()
160
+
161
+ const quoterPost = await sc.post(
162
+ users.quoter.did,
163
+ `quote post`,
164
+ undefined,
165
+ undefined,
166
+ quoteePost.ref,
167
+ )
168
+ await network.processAll()
169
+
170
+ const root = await agent.api.app.bsky.feed.getPostThread(
171
+ { uri: quoterPost.ref.uriStr },
172
+ {
173
+ headers: await network.serviceHeaders(
174
+ users.viewer.did,
175
+ ids.AppBskyFeedGetPostThread,
176
+ ),
177
+ },
178
+ )
179
+
180
+ expect(
181
+ // @ts-ignore I know more than you
182
+ AppBskyEmbedRecord.isViewDetached(root.data.thread.post.embed.record),
183
+ ).toBe(true)
184
+ })
185
+ })
186
+ })