@atproto/ozone 0.1.25 → 0.1.27

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 (158) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +8 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/proxied.d.ts.map +1 -1
  6. package/dist/api/proxied.js +30 -0
  7. package/dist/api/proxied.js.map +1 -1
  8. package/dist/api/server/getConfig.d.ts.map +1 -1
  9. package/dist/api/server/getConfig.js +4 -3
  10. package/dist/api/server/getConfig.js.map +1 -1
  11. package/dist/api/team/addMember.d.ts +4 -0
  12. package/dist/api/team/addMember.d.ts.map +1 -0
  13. package/dist/api/team/addMember.js +38 -0
  14. package/dist/api/team/addMember.js.map +1 -0
  15. package/dist/api/team/deleteMember.d.ts +4 -0
  16. package/dist/api/team/deleteMember.d.ts.map +1 -0
  17. package/dist/api/team/deleteMember.js +26 -0
  18. package/dist/api/team/deleteMember.js.map +1 -0
  19. package/dist/api/team/listMembers.d.ts +4 -0
  20. package/dist/api/team/listMembers.d.ts.map +1 -0
  21. package/dist/api/team/listMembers.js +20 -0
  22. package/dist/api/team/listMembers.js.map +1 -0
  23. package/dist/api/team/updateMember.d.ts +4 -0
  24. package/dist/api/team/updateMember.d.ts.map +1 -0
  25. package/dist/api/team/updateMember.js +40 -0
  26. package/dist/api/team/updateMember.js.map +1 -0
  27. package/dist/api/util.d.ts +1 -0
  28. package/dist/api/util.d.ts.map +1 -1
  29. package/dist/api/util.js +10 -1
  30. package/dist/api/util.js.map +1 -1
  31. package/dist/auth-verifier.d.ts +3 -6
  32. package/dist/auth-verifier.d.ts.map +1 -1
  33. package/dist/auth-verifier.js +7 -19
  34. package/dist/auth-verifier.js.map +1 -1
  35. package/dist/context.d.ts +3 -0
  36. package/dist/context.d.ts.map +1 -1
  37. package/dist/context.js +7 -3
  38. package/dist/context.js.map +1 -1
  39. package/dist/db/migrations/20240521T211332580Z-member.d.ts +4 -0
  40. package/dist/db/migrations/20240521T211332580Z-member.d.ts.map +1 -0
  41. package/dist/db/migrations/20240521T211332580Z-member.js +20 -0
  42. package/dist/db/migrations/20240521T211332580Z-member.js.map +1 -0
  43. package/dist/db/migrations/index.d.ts +1 -0
  44. package/dist/db/migrations/index.d.ts.map +1 -1
  45. package/dist/db/migrations/index.js +2 -1
  46. package/dist/db/migrations/index.js.map +1 -1
  47. package/dist/db/schema/index.d.ts +2 -1
  48. package/dist/db/schema/index.d.ts.map +1 -1
  49. package/dist/db/schema/member.d.ts +14 -0
  50. package/dist/db/schema/member.d.ts.map +1 -0
  51. package/dist/db/schema/member.js +5 -0
  52. package/dist/db/schema/member.js.map +1 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +25 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/lexicon/index.d.ts +25 -0
  58. package/dist/lexicon/index.d.ts.map +1 -1
  59. package/dist/lexicon/index.js +54 -1
  60. package/dist/lexicon/index.js.map +1 -1
  61. package/dist/lexicon/lexicons.d.ts +536 -0
  62. package/dist/lexicon/lexicons.d.ts.map +1 -1
  63. package/dist/lexicon/lexicons.js +561 -1
  64. package/dist/lexicon/lexicons.js.map +1 -1
  65. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +5 -0
  66. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  67. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  68. package/dist/lexicon/types/app/bsky/actor/profile.d.ts +3 -0
  69. package/dist/lexicon/types/app/bsky/actor/profile.d.ts.map +1 -1
  70. package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
  71. package/dist/lexicon/types/app/bsky/graph/defs.d.ts +36 -1
  72. package/dist/lexicon/types/app/bsky/graph/defs.d.ts.map +1 -1
  73. package/dist/lexicon/types/app/bsky/graph/defs.js +23 -1
  74. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  75. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts +39 -0
  76. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts.map +1 -0
  77. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js +3 -0
  78. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -0
  79. package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts +37 -0
  80. package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts.map +1 -0
  81. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js +3 -0
  82. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -0
  83. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts +36 -0
  84. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts.map +1 -0
  85. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js +3 -0
  86. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -0
  87. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts +25 -0
  88. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts.map +1 -0
  89. package/dist/lexicon/types/app/bsky/graph/starterpack.js +27 -0
  90. package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -0
  91. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts +2 -2
  92. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts.map +1 -1
  93. package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
  94. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +40 -0
  95. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -0
  96. package/dist/lexicon/types/tools/ozone/team/addMember.js +3 -0
  97. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -0
  98. package/dist/lexicon/types/tools/ozone/team/defs.d.ts +24 -0
  99. package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -0
  100. package/dist/lexicon/types/tools/ozone/team/defs.js +22 -0
  101. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -0
  102. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts +30 -0
  103. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts.map +1 -0
  104. package/dist/lexicon/types/tools/ozone/team/deleteMember.js +3 -0
  105. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -0
  106. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts +38 -0
  107. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts.map +1 -0
  108. package/dist/lexicon/types/tools/ozone/team/listMembers.js +3 -0
  109. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -0
  110. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +41 -0
  111. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -0
  112. package/dist/lexicon/types/tools/ozone/team/updateMember.js +3 -0
  113. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -0
  114. package/dist/team/index.d.ts +37 -0
  115. package/dist/team/index.d.ts.map +1 -0
  116. package/dist/team/index.js +144 -0
  117. package/dist/team/index.js.map +1 -0
  118. package/package.json +4 -4
  119. package/src/api/index.ts +8 -0
  120. package/src/api/proxied.ts +43 -0
  121. package/src/api/server/getConfig.ts +4 -4
  122. package/src/api/team/addMember.ts +46 -0
  123. package/src/api/team/deleteMember.ts +29 -0
  124. package/src/api/team/listMembers.ts +20 -0
  125. package/src/api/team/updateMember.ts +47 -0
  126. package/src/api/util.ts +15 -0
  127. package/src/auth-verifier.ts +14 -12
  128. package/src/context.ts +9 -3
  129. package/src/db/migrations/20240521T211332580Z-member.ts +17 -0
  130. package/src/db/migrations/index.ts +1 -0
  131. package/src/db/schema/index.ts +3 -1
  132. package/src/db/schema/member.ts +19 -0
  133. package/src/index.ts +36 -0
  134. package/src/lexicon/index.ts +100 -0
  135. package/src/lexicon/lexicons.ts +566 -1
  136. package/src/lexicon/types/app/bsky/actor/defs.ts +5 -0
  137. package/src/lexicon/types/app/bsky/actor/profile.ts +3 -0
  138. package/src/lexicon/types/app/bsky/graph/defs.ts +58 -0
  139. package/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +49 -0
  140. package/src/lexicon/types/app/bsky/graph/getStarterPack.ts +47 -0
  141. package/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +46 -0
  142. package/src/lexicon/types/app/bsky/graph/starterpack.ts +50 -0
  143. package/src/lexicon/types/app/bsky/notification/listNotifications.ts +2 -1
  144. package/src/lexicon/types/tools/ozone/team/addMember.ts +53 -0
  145. package/src/lexicon/types/tools/ozone/team/defs.ts +42 -0
  146. package/src/lexicon/types/tools/ozone/team/deleteMember.ts +39 -0
  147. package/src/lexicon/types/tools/ozone/team/listMembers.ts +48 -0
  148. package/src/lexicon/types/tools/ozone/team/updateMember.ts +54 -0
  149. package/src/team/index.ts +213 -0
  150. package/tests/__snapshots__/get-record.test.ts.snap +2 -0
  151. package/tests/__snapshots__/get-repo.test.ts.snap +1 -0
  152. package/tests/__snapshots__/get-starter-pack.test.ts.snap +466 -0
  153. package/tests/__snapshots__/moderation-events.test.ts.snap +1 -0
  154. package/tests/__snapshots__/team.test.ts.snap +688 -0
  155. package/tests/get-config.test.ts +3 -4
  156. package/tests/get-starter-pack.test.ts +104 -0
  157. package/tests/server.test.ts +1 -1
  158. package/tests/team.test.ts +163 -0
@@ -0,0 +1,213 @@
1
+ import Database from '../db'
2
+ import { Selectable } from 'kysely'
3
+ import { Member } from '../db/schema/member'
4
+ import { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs'
5
+ import { ProfileViewDetailed } from '../lexicon/types/app/bsky/actor/defs'
6
+ import { InvalidRequestError } from '@atproto/xrpc-server'
7
+ import { chunkArray } from '@atproto/common'
8
+ import AppContext from '../context'
9
+ import { httpLogger } from '../logger'
10
+
11
+ export type TeamServiceCreator = (db: Database) => TeamService
12
+
13
+ export class TeamService {
14
+ constructor(public db: Database) {}
15
+
16
+ static creator() {
17
+ return (db: Database) => new TeamService(db)
18
+ }
19
+
20
+ async list({
21
+ cursor,
22
+ limit = 25,
23
+ }: {
24
+ cursor?: string
25
+ limit?: number
26
+ }): Promise<{ members: Selectable<Member>[]; cursor?: string }> {
27
+ let builder = this.db.db.selectFrom('member').selectAll()
28
+ if (cursor) {
29
+ builder = builder.where('createdAt', '>', new Date(cursor))
30
+ }
31
+ const members = await builder
32
+ .limit(limit)
33
+ .orderBy('createdAt', 'asc')
34
+ .execute()
35
+
36
+ return { members, cursor: members.at(-1)?.createdAt.toISOString() }
37
+ }
38
+
39
+ async create({
40
+ role,
41
+ did,
42
+ disabled,
43
+ updatedAt,
44
+ createdAt,
45
+ lastUpdatedBy,
46
+ }: Omit<Selectable<Member>, 'createdAt' | 'updatedAt'> & {
47
+ createdAt?: Date
48
+ updatedAt?: Date
49
+ }): Promise<Selectable<Member>> {
50
+ const now = new Date()
51
+ const newMember = await this.db.db
52
+ .insertInto('member')
53
+ .values({
54
+ role,
55
+ did,
56
+ disabled,
57
+ lastUpdatedBy,
58
+ updatedAt: updatedAt || now,
59
+ createdAt: createdAt || now,
60
+ })
61
+ .returningAll()
62
+ .executeTakeFirstOrThrow()
63
+
64
+ return newMember
65
+ }
66
+
67
+ async upsert({
68
+ role,
69
+ did,
70
+ lastUpdatedBy,
71
+ }: Pick<
72
+ Selectable<Member>,
73
+ 'role' | 'did' | 'lastUpdatedBy'
74
+ >): Promise<void> {
75
+ const now = new Date()
76
+ await this.db.db
77
+ .insertInto('member')
78
+ .values({
79
+ role,
80
+ did,
81
+ lastUpdatedBy,
82
+ disabled: false,
83
+ updatedAt: now,
84
+ createdAt: now,
85
+ })
86
+ .onConflict((oc) =>
87
+ oc.column('did').doUpdateSet({ role, updatedAt: now, lastUpdatedBy }),
88
+ )
89
+ .execute()
90
+ }
91
+
92
+ async update(
93
+ did: string,
94
+ updates: Partial<
95
+ Pick<
96
+ Selectable<Member>,
97
+ 'role' | 'disabled' | 'lastUpdatedBy' | 'updatedAt'
98
+ >
99
+ >,
100
+ ): Promise<Selectable<Member>> {
101
+ const { role, disabled, lastUpdatedBy, updatedAt = new Date() } = updates
102
+ const updatedMember = await this.db.db
103
+ .updateTable('member')
104
+ .where('did', '=', did)
105
+ .set({
106
+ role,
107
+ disabled,
108
+ lastUpdatedBy,
109
+ updatedAt,
110
+ })
111
+ .returningAll()
112
+ .executeTakeFirstOrThrow()
113
+
114
+ return updatedMember
115
+ }
116
+
117
+ async delete(did: string): Promise<void> {
118
+ await this.db.db.deleteFrom('member').where('did', '=', did).execute()
119
+ }
120
+
121
+ async assertCanDelete(did: string): Promise<void> {
122
+ const memberExists = await this.doesMemberExist(did)
123
+
124
+ if (!memberExists) {
125
+ throw new InvalidRequestError('member not found', 'MemberNotFound')
126
+ }
127
+ }
128
+
129
+ async doesMemberExist(did: string): Promise<boolean> {
130
+ const member = await this.db.db
131
+ .selectFrom('member')
132
+ .select('did')
133
+ .where('did', '=', did)
134
+ .executeTakeFirst()
135
+
136
+ return !!member
137
+ }
138
+
139
+ async getMember(did: string): Promise<Selectable<Member> | undefined> {
140
+ const member = await this.db.db
141
+ .selectFrom('member')
142
+ .selectAll()
143
+ .where('did', '=', did)
144
+ .executeTakeFirst()
145
+
146
+ return member
147
+ }
148
+
149
+ getMemberRole(member?: Selectable<Member>) {
150
+ const isAdmin = member?.role === 'tools.ozone.team.defs#roleAdmin'
151
+ const isModerator =
152
+ isAdmin || member?.role === 'tools.ozone.team.defs#roleModerator'
153
+ const isTriage =
154
+ isModerator || member?.role === 'tools.ozone.team.defs#roleTriage'
155
+
156
+ return {
157
+ isModerator,
158
+ isAdmin,
159
+ isTriage,
160
+ }
161
+ }
162
+
163
+ // getProfiles() only allows 25 DIDs at a time so we need to query in chunks
164
+ async getProfiles(
165
+ dids: string[],
166
+ ctx: AppContext,
167
+ ): Promise<Map<string, ProfileViewDetailed>> {
168
+ const profiles = new Map<string, ProfileViewDetailed>()
169
+
170
+ try {
171
+ const headers = await ctx.appviewAuth()
172
+
173
+ for (const actors of chunkArray(dids, 25)) {
174
+ const { data } = await ctx.appviewAgent.api.app.bsky.actor.getProfiles(
175
+ { actors },
176
+ headers,
177
+ )
178
+
179
+ data.profiles.forEach((profile) => {
180
+ profiles.set(profile.did, profile)
181
+ })
182
+ }
183
+ } catch (error) {
184
+ httpLogger.error(
185
+ { error, dids },
186
+ 'Failed to get profiles for team members',
187
+ )
188
+ }
189
+
190
+ return profiles
191
+ }
192
+
193
+ async view(
194
+ members: Selectable<Member>[],
195
+ ctx: AppContext,
196
+ ): Promise<TeamMember[]> {
197
+ const profiles = await this.getProfiles(
198
+ members.map(({ did }) => did),
199
+ ctx,
200
+ )
201
+ return members.map((member) => {
202
+ return {
203
+ did: member.did,
204
+ role: member.role,
205
+ disabled: member.disabled,
206
+ profile: profiles.get(member.did),
207
+ createdAt: member.createdAt.toISOString(),
208
+ updatedAt: member.updatedAt.toISOString(),
209
+ lastUpdatedBy: member.lastUpdatedBy,
210
+ }
211
+ })
212
+ }
213
+ }
@@ -66,6 +66,7 @@ Object {
66
66
  },
67
67
  "size": 3976,
68
68
  },
69
+ "createdAt": "1970-01-01T00:00:00.000Z",
69
70
  "description": "its me!",
70
71
  "displayName": "ali",
71
72
  "labels": Object {
@@ -165,6 +166,7 @@ Object {
165
166
  },
166
167
  "size": 3976,
167
168
  },
169
+ "createdAt": "1970-01-01T00:00:00.000Z",
168
170
  "description": "its me!",
169
171
  "displayName": "ali",
170
172
  "labels": Object {
@@ -52,6 +52,7 @@ Object {
52
52
  },
53
53
  "size": 3976,
54
54
  },
55
+ "createdAt": "1970-01-01T00:00:00.000Z",
55
56
  "description": "its me!",
56
57
  "displayName": "ali",
57
58
  "labels": Object {
@@ -0,0 +1,466 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`admin get starter pack view getStarterPack() gets a starterpack by uri 1`] = `
4
+ Object {
5
+ "starterPack": Object {
6
+ "cid": "cids(0)",
7
+ "creator": Object {
8
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
9
+ "createdAt": "1970-01-01T00:00:00.000Z",
10
+ "did": "user(0)",
11
+ "displayName": "ali",
12
+ "handle": "alice.test",
13
+ "labels": Array [
14
+ Object {
15
+ "cid": "cids(2)",
16
+ "cts": "1970-01-01T00:00:00.000Z",
17
+ "src": "user(0)",
18
+ "uri": "record(3)",
19
+ "val": "self-label-a",
20
+ },
21
+ Object {
22
+ "cid": "cids(2)",
23
+ "cts": "1970-01-01T00:00:00.000Z",
24
+ "src": "user(0)",
25
+ "uri": "record(3)",
26
+ "val": "self-label-b",
27
+ },
28
+ ],
29
+ "viewer": Object {
30
+ "blockedBy": false,
31
+ "muted": false,
32
+ },
33
+ },
34
+ "feeds": Array [
35
+ Object {
36
+ "cid": "cids(3)",
37
+ "creator": Object {
38
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
39
+ "createdAt": "1970-01-01T00:00:00.000Z",
40
+ "description": "its me!",
41
+ "did": "user(0)",
42
+ "displayName": "ali",
43
+ "handle": "alice.test",
44
+ "indexedAt": "1970-01-01T00:00:00.000Z",
45
+ "labels": Array [
46
+ Object {
47
+ "cid": "cids(2)",
48
+ "cts": "1970-01-01T00:00:00.000Z",
49
+ "src": "user(0)",
50
+ "uri": "record(3)",
51
+ "val": "self-label-a",
52
+ },
53
+ Object {
54
+ "cid": "cids(2)",
55
+ "cts": "1970-01-01T00:00:00.000Z",
56
+ "src": "user(0)",
57
+ "uri": "record(3)",
58
+ "val": "self-label-b",
59
+ },
60
+ ],
61
+ "viewer": Object {
62
+ "blockedBy": false,
63
+ "muted": false,
64
+ },
65
+ },
66
+ "did": "did:web:example.com",
67
+ "displayName": "alice's feedgen",
68
+ "indexedAt": "1970-01-01T00:00:00.000Z",
69
+ "labels": Array [],
70
+ "likeCount": 0,
71
+ "uri": "record(2)",
72
+ "viewer": Object {},
73
+ },
74
+ ],
75
+ "indexedAt": "1970-01-01T00:00:00.000Z",
76
+ "joinedAllTimeCount": 0,
77
+ "joinedWeekCount": 0,
78
+ "labels": Array [],
79
+ "list": Object {
80
+ "cid": "cids(4)",
81
+ "indexedAt": "1970-01-01T00:00:00.000Z",
82
+ "labels": Array [],
83
+ "listItemCount": 3,
84
+ "name": "n/a",
85
+ "purpose": "app.bsky.graph.defs#referencelist",
86
+ "uri": "record(1)",
87
+ "viewer": Object {
88
+ "muted": false,
89
+ },
90
+ },
91
+ "listItemsSample": Array [
92
+ Object {
93
+ "subject": Object {
94
+ "did": "user(2)",
95
+ "handle": "carol.test",
96
+ "labels": Array [],
97
+ "viewer": Object {
98
+ "blockedBy": false,
99
+ "muted": false,
100
+ },
101
+ },
102
+ "uri": "record(4)",
103
+ },
104
+ Object {
105
+ "subject": Object {
106
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(4)/cids(1)@jpeg",
107
+ "createdAt": "1970-01-01T00:00:00.000Z",
108
+ "description": "hi im bob label_me",
109
+ "did": "user(3)",
110
+ "displayName": "bobby",
111
+ "handle": "bob.test",
112
+ "indexedAt": "1970-01-01T00:00:00.000Z",
113
+ "labels": Array [],
114
+ "viewer": Object {
115
+ "blockedBy": false,
116
+ "muted": false,
117
+ },
118
+ },
119
+ "uri": "record(5)",
120
+ },
121
+ Object {
122
+ "subject": Object {
123
+ "associated": Object {
124
+ "chat": Object {
125
+ "allowIncoming": "none",
126
+ },
127
+ },
128
+ "did": "user(5)",
129
+ "handle": "dan.test",
130
+ "labels": Array [],
131
+ "viewer": Object {
132
+ "blockedBy": false,
133
+ "muted": false,
134
+ },
135
+ },
136
+ "uri": "record(6)",
137
+ },
138
+ ],
139
+ "record": Object {
140
+ "$type": "app.bsky.graph.starterpack",
141
+ "createdAt": "1970-01-01T00:00:00.000Z",
142
+ "feeds": Array [
143
+ Object {
144
+ "uri": "record(2)",
145
+ },
146
+ ],
147
+ "list": "record(1)",
148
+ "name": "alice's starter pack",
149
+ },
150
+ "uri": "record(0)",
151
+ },
152
+ }
153
+ `;
154
+
155
+ exports[`admin get starter pack view getStarterPack() gets a starterpack while taken down 1`] = `
156
+ Object {
157
+ "cid": "cids(0)",
158
+ "creator": Object {
159
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
160
+ "createdAt": "1970-01-01T00:00:00.000Z",
161
+ "did": "user(0)",
162
+ "displayName": "ali",
163
+ "handle": "alice.test",
164
+ "labels": Array [
165
+ Object {
166
+ "cid": "cids(2)",
167
+ "cts": "1970-01-01T00:00:00.000Z",
168
+ "src": "user(0)",
169
+ "uri": "record(3)",
170
+ "val": "self-label-a",
171
+ },
172
+ Object {
173
+ "cid": "cids(2)",
174
+ "cts": "1970-01-01T00:00:00.000Z",
175
+ "src": "user(0)",
176
+ "uri": "record(3)",
177
+ "val": "self-label-b",
178
+ },
179
+ ],
180
+ "viewer": Object {
181
+ "blockedBy": false,
182
+ "muted": false,
183
+ },
184
+ },
185
+ "feeds": Array [
186
+ Object {
187
+ "cid": "cids(3)",
188
+ "creator": Object {
189
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
190
+ "createdAt": "1970-01-01T00:00:00.000Z",
191
+ "description": "its me!",
192
+ "did": "user(0)",
193
+ "displayName": "ali",
194
+ "handle": "alice.test",
195
+ "indexedAt": "1970-01-01T00:00:00.000Z",
196
+ "labels": Array [
197
+ Object {
198
+ "cid": "cids(2)",
199
+ "cts": "1970-01-01T00:00:00.000Z",
200
+ "src": "user(0)",
201
+ "uri": "record(3)",
202
+ "val": "self-label-a",
203
+ },
204
+ Object {
205
+ "cid": "cids(2)",
206
+ "cts": "1970-01-01T00:00:00.000Z",
207
+ "src": "user(0)",
208
+ "uri": "record(3)",
209
+ "val": "self-label-b",
210
+ },
211
+ ],
212
+ "viewer": Object {
213
+ "blockedBy": false,
214
+ "muted": false,
215
+ },
216
+ },
217
+ "did": "did:web:example.com",
218
+ "displayName": "alice's feedgen",
219
+ "indexedAt": "1970-01-01T00:00:00.000Z",
220
+ "labels": Array [],
221
+ "likeCount": 0,
222
+ "uri": "record(2)",
223
+ "viewer": Object {},
224
+ },
225
+ ],
226
+ "indexedAt": "1970-01-01T00:00:00.000Z",
227
+ "joinedAllTimeCount": 0,
228
+ "joinedWeekCount": 0,
229
+ "labels": Array [],
230
+ "list": Object {
231
+ "cid": "cids(4)",
232
+ "indexedAt": "1970-01-01T00:00:00.000Z",
233
+ "labels": Array [],
234
+ "listItemCount": 3,
235
+ "name": "n/a",
236
+ "purpose": "app.bsky.graph.defs#referencelist",
237
+ "uri": "record(1)",
238
+ "viewer": Object {
239
+ "muted": false,
240
+ },
241
+ },
242
+ "listItemsSample": Array [
243
+ Object {
244
+ "subject": Object {
245
+ "did": "user(2)",
246
+ "handle": "carol.test",
247
+ "labels": Array [],
248
+ "viewer": Object {
249
+ "blockedBy": false,
250
+ "followedBy": "record(6)",
251
+ "following": "record(5)",
252
+ "muted": false,
253
+ },
254
+ },
255
+ "uri": "record(4)",
256
+ },
257
+ Object {
258
+ "subject": Object {
259
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(4)/cids(1)@jpeg",
260
+ "createdAt": "1970-01-01T00:00:00.000Z",
261
+ "description": "hi im bob label_me",
262
+ "did": "user(3)",
263
+ "displayName": "bobby",
264
+ "handle": "bob.test",
265
+ "indexedAt": "1970-01-01T00:00:00.000Z",
266
+ "labels": Array [],
267
+ "viewer": Object {
268
+ "blockedBy": false,
269
+ "followedBy": "record(9)",
270
+ "following": "record(8)",
271
+ "muted": false,
272
+ },
273
+ },
274
+ "uri": "record(7)",
275
+ },
276
+ Object {
277
+ "subject": Object {
278
+ "associated": Object {
279
+ "chat": Object {
280
+ "allowIncoming": "none",
281
+ },
282
+ },
283
+ "did": "user(5)",
284
+ "handle": "dan.test",
285
+ "labels": Array [],
286
+ "viewer": Object {
287
+ "blockedBy": false,
288
+ "following": "record(11)",
289
+ "muted": false,
290
+ },
291
+ },
292
+ "uri": "record(10)",
293
+ },
294
+ ],
295
+ "record": Object {
296
+ "$type": "app.bsky.graph.starterpack",
297
+ "createdAt": "1970-01-01T00:00:00.000Z",
298
+ "feeds": Array [
299
+ Object {
300
+ "uri": "record(2)",
301
+ },
302
+ ],
303
+ "list": "record(1)",
304
+ "name": "alice's starter pack",
305
+ },
306
+ "uri": "record(0)",
307
+ }
308
+ `;
309
+
310
+ exports[`admin get starter pack view getStarterPack() gets a starterpack while taken down 2`] = `
311
+ Object {
312
+ "cid": "cids(0)",
313
+ "creator": Object {
314
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
315
+ "createdAt": "1970-01-01T00:00:00.000Z",
316
+ "did": "user(0)",
317
+ "displayName": "ali",
318
+ "handle": "alice.test",
319
+ "labels": Array [
320
+ Object {
321
+ "cid": "cids(2)",
322
+ "cts": "1970-01-01T00:00:00.000Z",
323
+ "src": "user(0)",
324
+ "uri": "record(3)",
325
+ "val": "self-label-a",
326
+ },
327
+ Object {
328
+ "cid": "cids(2)",
329
+ "cts": "1970-01-01T00:00:00.000Z",
330
+ "src": "user(0)",
331
+ "uri": "record(3)",
332
+ "val": "self-label-b",
333
+ },
334
+ ],
335
+ "viewer": Object {
336
+ "blockedBy": false,
337
+ "muted": false,
338
+ },
339
+ },
340
+ "feeds": Array [
341
+ Object {
342
+ "cid": "cids(3)",
343
+ "creator": Object {
344
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(1)/cids(1)@jpeg",
345
+ "createdAt": "1970-01-01T00:00:00.000Z",
346
+ "description": "its me!",
347
+ "did": "user(0)",
348
+ "displayName": "ali",
349
+ "handle": "alice.test",
350
+ "indexedAt": "1970-01-01T00:00:00.000Z",
351
+ "labels": Array [
352
+ Object {
353
+ "cid": "cids(2)",
354
+ "cts": "1970-01-01T00:00:00.000Z",
355
+ "src": "user(0)",
356
+ "uri": "record(3)",
357
+ "val": "self-label-a",
358
+ },
359
+ Object {
360
+ "cid": "cids(2)",
361
+ "cts": "1970-01-01T00:00:00.000Z",
362
+ "src": "user(0)",
363
+ "uri": "record(3)",
364
+ "val": "self-label-b",
365
+ },
366
+ ],
367
+ "viewer": Object {
368
+ "blockedBy": false,
369
+ "muted": false,
370
+ },
371
+ },
372
+ "did": "did:web:example.com",
373
+ "displayName": "alice's feedgen",
374
+ "indexedAt": "1970-01-01T00:00:00.000Z",
375
+ "labels": Array [],
376
+ "likeCount": 0,
377
+ "uri": "record(2)",
378
+ "viewer": Object {},
379
+ },
380
+ ],
381
+ "indexedAt": "1970-01-01T00:00:00.000Z",
382
+ "joinedAllTimeCount": 0,
383
+ "joinedWeekCount": 0,
384
+ "labels": Array [
385
+ Object {
386
+ "cid": "cids(0)",
387
+ "cts": "1970-01-01T00:00:00.000Z",
388
+ "src": "user(2)",
389
+ "uri": "record(0)",
390
+ "val": "!takedown",
391
+ },
392
+ ],
393
+ "list": Object {
394
+ "cid": "cids(4)",
395
+ "indexedAt": "1970-01-01T00:00:00.000Z",
396
+ "labels": Array [],
397
+ "listItemCount": 3,
398
+ "name": "n/a",
399
+ "purpose": "app.bsky.graph.defs#referencelist",
400
+ "uri": "record(1)",
401
+ "viewer": Object {
402
+ "muted": false,
403
+ },
404
+ },
405
+ "listItemsSample": Array [
406
+ Object {
407
+ "subject": Object {
408
+ "did": "user(3)",
409
+ "handle": "carol.test",
410
+ "labels": Array [],
411
+ "viewer": Object {
412
+ "blockedBy": false,
413
+ "muted": false,
414
+ },
415
+ },
416
+ "uri": "record(4)",
417
+ },
418
+ Object {
419
+ "subject": Object {
420
+ "avatar": "https://bsky.public.url/img/avatar/plain/user(5)/cids(1)@jpeg",
421
+ "createdAt": "1970-01-01T00:00:00.000Z",
422
+ "description": "hi im bob label_me",
423
+ "did": "user(4)",
424
+ "displayName": "bobby",
425
+ "handle": "bob.test",
426
+ "indexedAt": "1970-01-01T00:00:00.000Z",
427
+ "labels": Array [],
428
+ "viewer": Object {
429
+ "blockedBy": false,
430
+ "muted": false,
431
+ },
432
+ },
433
+ "uri": "record(5)",
434
+ },
435
+ Object {
436
+ "subject": Object {
437
+ "associated": Object {
438
+ "chat": Object {
439
+ "allowIncoming": "none",
440
+ },
441
+ },
442
+ "did": "user(6)",
443
+ "handle": "dan.test",
444
+ "labels": Array [],
445
+ "viewer": Object {
446
+ "blockedBy": false,
447
+ "muted": false,
448
+ },
449
+ },
450
+ "uri": "record(6)",
451
+ },
452
+ ],
453
+ "record": Object {
454
+ "$type": "app.bsky.graph.starterpack",
455
+ "createdAt": "1970-01-01T00:00:00.000Z",
456
+ "feeds": Array [
457
+ Object {
458
+ "uri": "record(2)",
459
+ },
460
+ ],
461
+ "list": "record(1)",
462
+ "name": "alice's starter pack",
463
+ },
464
+ "uri": "record(0)",
465
+ }
466
+ `;