This repository has no description
18 kB
471 lines
1import { BaseClient } from './BaseClient';
2import {
3 GetUrlMetadataResponse,
4 GetUrlCardsResponse,
5 GetUrlCardViewResponse,
6 GetLibrariesForCardResponse,
7 GetProfileResponse,
8 GetCollectionPageResponse,
9 GetCollectionsResponse,
10 GetUrlStatusForMyLibraryResponse,
11 GetMyUrlCardsParams,
12 GetUrlCardsParams,
13 GetCollectionPageParams,
14 GetMyCollectionsParams,
15 GetCollectionsParams,
16 GetCollectionPageByAtUriParams,
17 GetProfileParams,
18 GetUrlStatusForMyLibraryParams,
19 GetLibrariesForUrlParams,
20 GetLibrariesForUrlResponse,
21 GetNoteCardsForUrlParams,
22 GetNoteCardsForUrlResponse,
23 GetCollectionsForUrlParams,
24 GetCollectionsForUrlResponse,
25 GetSimilarUrlsForUrlParams,
26 GetSimilarUrlsForUrlResponse,
27 SemanticSearchUrlsParams,
28 SemanticSearchUrlsResponse,
29 SearchBskyPostsForUrlParams,
30 SearchBskyPostsForUrlResponse,
31 SearchAtProtoAccountsParams,
32 SearchAtProtoAccountsResponse,
33 SearchLeafletDocsForUrlParams,
34 SearchLeafletDocsForUrlResponse,
35 GetOpenCollectionsWithContributorParams,
36 GetFollowingUsersParams,
37 GetFollowingUsersResponse,
38 GetFollowersParams,
39 GetFollowersResponse,
40 GetFollowingCollectionsParams,
41 GetFollowingCollectionsResponse,
42 GetCollectionFollowersParams,
43 GetCollectionFollowersResponse,
44 GetFollowingCountParams,
45 GetFollowersCountParams,
46 GetFollowingCollectionsCountParams,
47 GetCollectionFollowersCountParams,
48 GetFollowCountResponse,
49 GetCollectionContributorsParams,
50 GetCollectionContributorsResponse,
51} from '@semble/types';
52
53export class QueryClient extends BaseClient {
54 async getUrlMetadata(url: string): Promise<GetUrlMetadataResponse> {
55 const params = new URLSearchParams({ url });
56 return this.request<GetUrlMetadataResponse>(
57 'GET',
58 `/api/cards/metadata?${params}`,
59 );
60 }
61
62 async getMyUrlCards(
63 params?: GetMyUrlCardsParams,
64 ): Promise<GetUrlCardsResponse> {
65 const searchParams = new URLSearchParams();
66 if (params?.page) searchParams.set('page', params.page.toString());
67 if (params?.limit) searchParams.set('limit', params.limit.toString());
68 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
69 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
70 if (params?.urlType) searchParams.set('urlType', params.urlType);
71
72 const queryString = searchParams.toString();
73 const endpoint = queryString
74 ? `/api/cards/my?${queryString}`
75 : '/api/cards/my';
76
77 return this.request<GetUrlCardsResponse>('GET', endpoint);
78 }
79
80 async getUserUrlCards(
81 params: GetUrlCardsParams,
82 ): Promise<GetUrlCardsResponse> {
83 const searchParams = new URLSearchParams();
84 if (params.page) searchParams.set('page', params.page.toString());
85 if (params.limit) searchParams.set('limit', params.limit.toString());
86 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
87 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
88 if (params.urlType) searchParams.set('urlType', params.urlType);
89
90 const queryString = searchParams.toString();
91 const endpoint = queryString
92 ? `/api/cards/user/${params.identifier}?${queryString}`
93 : `/api/cards/user/${params.identifier}`;
94
95 return this.request<GetUrlCardsResponse>('GET', endpoint);
96 }
97
98 async getUrlCardView(cardId: string): Promise<GetUrlCardViewResponse> {
99 return this.request<GetUrlCardViewResponse>('GET', `/api/cards/${cardId}`);
100 }
101
102 async getLibrariesForCard(
103 cardId: string,
104 ): Promise<GetLibrariesForCardResponse> {
105 return this.request<GetLibrariesForCardResponse>(
106 'GET',
107 `/api/cards/${cardId}/libraries`,
108 );
109 }
110
111 async getMyProfile(): Promise<GetProfileResponse> {
112 return this.request<GetProfileResponse>('GET', '/api/users/me');
113 }
114
115 async getUserProfile(params: GetProfileParams): Promise<GetProfileResponse> {
116 return this.request<GetProfileResponse>(
117 'GET',
118 `/api/users/${params.identifier}`,
119 );
120 }
121
122 async getCollectionPage(
123 collectionId: string,
124 params?: GetCollectionPageParams,
125 ): Promise<GetCollectionPageResponse> {
126 const searchParams = new URLSearchParams();
127 if (params?.page) searchParams.set('page', params.page.toString());
128 if (params?.limit) searchParams.set('limit', params.limit.toString());
129 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
130 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
131 if (params?.urlType) searchParams.set('urlType', params.urlType);
132
133 const queryString = searchParams.toString();
134 const endpoint = queryString
135 ? `/api/collections/${collectionId}?${queryString}`
136 : `/api/collections/${collectionId}`;
137
138 return this.request<GetCollectionPageResponse>('GET', endpoint);
139 }
140
141 async getCollectionPageByAtUri(
142 params: GetCollectionPageByAtUriParams,
143 ): Promise<GetCollectionPageResponse> {
144 const { handle, recordKey, ...queryParams } = params;
145 const searchParams = new URLSearchParams();
146
147 if (queryParams.page) searchParams.set('page', queryParams.page.toString());
148 if (queryParams.limit)
149 searchParams.set('limit', queryParams.limit.toString());
150 if (queryParams.sortBy) searchParams.set('sortBy', queryParams.sortBy);
151 if (queryParams.sortOrder)
152 searchParams.set('sortOrder', queryParams.sortOrder);
153 if (queryParams.urlType) searchParams.set('urlType', queryParams.urlType);
154
155 const queryString = searchParams.toString();
156 const endpoint = queryString
157 ? `/api/collections/at/${handle}/${recordKey}?${queryString}`
158 : `/api/collections/at/${handle}/${recordKey}`;
159
160 return this.request<GetCollectionPageResponse>('GET', endpoint);
161 }
162
163 async getMyCollections(
164 params?: GetMyCollectionsParams,
165 ): Promise<GetCollectionsResponse> {
166 const searchParams = new URLSearchParams();
167 if (params?.page) searchParams.set('page', params.page.toString());
168 if (params?.limit) searchParams.set('limit', params.limit.toString());
169 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
170 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
171 if (params?.searchText) searchParams.set('searchText', params.searchText);
172
173 const queryString = searchParams.toString();
174 const endpoint = queryString
175 ? `/api/collections?${queryString}`
176 : '/api/collections';
177
178 return this.request<GetCollectionsResponse>('GET', endpoint);
179 }
180
181 async getUserCollections(
182 params: GetCollectionsParams,
183 ): Promise<GetCollectionsResponse> {
184 const searchParams = new URLSearchParams();
185 if (params.page) searchParams.set('page', params.page.toString());
186 if (params.limit) searchParams.set('limit', params.limit.toString());
187 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
188 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
189 if (params.searchText) searchParams.set('searchText', params.searchText);
190
191 const queryString = searchParams.toString();
192 const endpoint = queryString
193 ? `/api/collections/user/${params.identifier}?${queryString}`
194 : `/api/collections/user/${params.identifier}`;
195
196 return this.request<GetCollectionsResponse>('GET', endpoint);
197 }
198
199 async getUrlStatusForMyLibrary(
200 params: GetUrlStatusForMyLibraryParams,
201 ): Promise<GetUrlStatusForMyLibraryResponse> {
202 const searchParams = new URLSearchParams({ url: params.url });
203 return this.request<GetUrlStatusForMyLibraryResponse>(
204 'GET',
205 `/api/cards/library/status?${searchParams}`,
206 );
207 }
208
209 async getLibrariesForUrl(
210 params: GetLibrariesForUrlParams,
211 ): Promise<GetLibrariesForUrlResponse> {
212 const searchParams = new URLSearchParams({ url: params.url });
213 if (params.page) searchParams.set('page', params.page.toString());
214 if (params.limit) searchParams.set('limit', params.limit.toString());
215 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
216 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
217
218 return this.request<GetLibrariesForUrlResponse>(
219 'GET',
220 `/api/cards/libraries/url?${searchParams}`,
221 );
222 }
223
224 async getNoteCardsForUrl(
225 params: GetNoteCardsForUrlParams,
226 ): Promise<GetNoteCardsForUrlResponse> {
227 const searchParams = new URLSearchParams({ url: params.url });
228 if (params.page) searchParams.set('page', params.page.toString());
229 if (params.limit) searchParams.set('limit', params.limit.toString());
230 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
231 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
232
233 return this.request<GetNoteCardsForUrlResponse>(
234 'GET',
235 `/api/cards/notes/url?${searchParams}`,
236 );
237 }
238
239 async getCollectionsForUrl(
240 params: GetCollectionsForUrlParams,
241 ): Promise<GetCollectionsForUrlResponse> {
242 const searchParams = new URLSearchParams({ url: params.url });
243 if (params.page) searchParams.set('page', params.page.toString());
244 if (params.limit) searchParams.set('limit', params.limit.toString());
245 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
246 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
247
248 return this.request<GetCollectionsForUrlResponse>(
249 'GET',
250 `/api/collections/url?${searchParams}`,
251 );
252 }
253
254 async getSimilarUrlsForUrl(
255 params: GetSimilarUrlsForUrlParams,
256 ): Promise<GetSimilarUrlsForUrlResponse> {
257 const searchParams = new URLSearchParams({ url: params.url });
258 if (params.page) searchParams.set('page', params.page.toString());
259 if (params.limit) searchParams.set('limit', params.limit.toString());
260 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
261 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
262 if (params.threshold)
263 searchParams.set('threshold', params.threshold.toString());
264 if (params.urlType) searchParams.set('urlType', params.urlType);
265
266 return this.request<GetSimilarUrlsForUrlResponse>(
267 'GET',
268 `/api/search/similar-urls?${searchParams}`,
269 );
270 }
271
272 async semanticSearchUrls(
273 params: SemanticSearchUrlsParams,
274 ): Promise<SemanticSearchUrlsResponse> {
275 const searchParams = new URLSearchParams({ query: params.query });
276 if (params.page) searchParams.set('page', params.page.toString());
277 if (params.limit) searchParams.set('limit', params.limit.toString());
278 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
279 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
280 if (params.threshold)
281 searchParams.set('threshold', params.threshold.toString());
282 if (params.urlType) searchParams.set('urlType', params.urlType);
283 if (params.identifier) searchParams.set('identifier', params.identifier);
284
285 return this.request<SemanticSearchUrlsResponse>(
286 'GET',
287 `/api/search/semantic?${searchParams}`,
288 );
289 }
290
291 async searchBskyPosts(
292 params: SearchBskyPostsForUrlParams,
293 ): Promise<SearchBskyPostsForUrlResponse> {
294 const searchParams = new URLSearchParams({ q: params.q });
295 if (params.sort) searchParams.set('sort', params.sort);
296 if (params.since) searchParams.set('since', params.since);
297 if (params.until) searchParams.set('until', params.until);
298 if (params.mentions) searchParams.set('mentions', params.mentions);
299 if (params.author) searchParams.set('author', params.author);
300 if (params.lang) searchParams.set('lang', params.lang);
301 if (params.domain) searchParams.set('domain', params.domain);
302 if (params.url) searchParams.set('url', params.url);
303 if (params.tag) {
304 params.tag.forEach((t) => searchParams.append('tag', t));
305 }
306 if (params.limit) searchParams.set('limit', params.limit.toString());
307 if (params.cursor) searchParams.set('cursor', params.cursor);
308
309 return this.request<SearchBskyPostsForUrlResponse>(
310 'GET',
311 `/api/search/bsky-posts?${searchParams}`,
312 );
313 }
314
315 async searchAtProtoAccounts(
316 params: SearchAtProtoAccountsParams,
317 ): Promise<SearchAtProtoAccountsResponse> {
318 const searchParams = new URLSearchParams();
319 if (params.term) searchParams.set('term', params.term);
320 if (params.q) searchParams.set('q', params.q);
321 if (params.limit) searchParams.set('limit', params.limit.toString());
322 if (params.cursor) searchParams.set('cursor', params.cursor);
323
324 return this.request<SearchAtProtoAccountsResponse>(
325 'GET',
326 `/api/search/accounts?${searchParams}`,
327 );
328 }
329
330 async searchLeafletDocs(
331 params: SearchLeafletDocsForUrlParams,
332 ): Promise<SearchLeafletDocsForUrlResponse> {
333 const searchParams = new URLSearchParams({ url: params.url });
334 if (params.limit) searchParams.set('limit', params.limit.toString());
335 if (params.cursor) searchParams.set('cursor', params.cursor);
336
337 return this.request<SearchLeafletDocsForUrlResponse>(
338 'GET',
339 `/api/search/leaflet-docs?${searchParams}`,
340 );
341 }
342
343 async getOpenCollectionsWithContributor(
344 params: GetOpenCollectionsWithContributorParams,
345 ): Promise<GetCollectionsResponse> {
346 const searchParams = new URLSearchParams();
347 if (params.page) searchParams.set('page', params.page.toString());
348 if (params.limit) searchParams.set('limit', params.limit.toString());
349 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
350 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
351
352 const queryString = searchParams.toString();
353 const endpoint = queryString
354 ? `/api/collections/contributed/${params.identifier}?${queryString}`
355 : `/api/collections/contributed/${params.identifier}`;
356
357 return this.request<GetCollectionsResponse>('GET', endpoint);
358 }
359
360 // Follow query methods
361 async getFollowingUsers(
362 params: GetFollowingUsersParams,
363 ): Promise<GetFollowingUsersResponse> {
364 const searchParams = new URLSearchParams();
365 if (params.page) searchParams.set('page', params.page.toString());
366 if (params.limit) searchParams.set('limit', params.limit.toString());
367
368 const queryString = searchParams.toString();
369 const endpoint = queryString
370 ? `/api/users/${params.identifier}/following?${queryString}`
371 : `/api/users/${params.identifier}/following`;
372
373 return this.request<GetFollowingUsersResponse>('GET', endpoint);
374 }
375
376 async getFollowers(
377 params: GetFollowersParams,
378 ): Promise<GetFollowersResponse> {
379 const searchParams = new URLSearchParams();
380 if (params.page) searchParams.set('page', params.page.toString());
381 if (params.limit) searchParams.set('limit', params.limit.toString());
382
383 const queryString = searchParams.toString();
384 const endpoint = queryString
385 ? `/api/users/${params.identifier}/followers?${queryString}`
386 : `/api/users/${params.identifier}/followers`;
387
388 return this.request<GetFollowersResponse>('GET', endpoint);
389 }
390
391 async getFollowingCollections(
392 params: GetFollowingCollectionsParams,
393 ): Promise<GetFollowingCollectionsResponse> {
394 const searchParams = new URLSearchParams();
395 if (params.page) searchParams.set('page', params.page.toString());
396 if (params.limit) searchParams.set('limit', params.limit.toString());
397
398 const queryString = searchParams.toString();
399 const endpoint = queryString
400 ? `/api/users/${params.identifier}/following-collections?${queryString}`
401 : `/api/users/${params.identifier}/following-collections`;
402
403 return this.request<GetFollowingCollectionsResponse>('GET', endpoint);
404 }
405
406 async getCollectionFollowers(
407 params: GetCollectionFollowersParams,
408 ): Promise<GetCollectionFollowersResponse> {
409 const searchParams = new URLSearchParams();
410 if (params.page) searchParams.set('page', params.page.toString());
411 if (params.limit) searchParams.set('limit', params.limit.toString());
412
413 const queryString = searchParams.toString();
414 const endpoint = queryString
415 ? `/api/collections/${params.collectionId}/followers?${queryString}`
416 : `/api/collections/${params.collectionId}/followers`;
417
418 return this.request<GetCollectionFollowersResponse>('GET', endpoint);
419 }
420
421 async getFollowingCount(
422 params: GetFollowingCountParams,
423 ): Promise<GetFollowCountResponse> {
424 return this.request<GetFollowCountResponse>(
425 'GET',
426 `/api/users/${params.identifier}/following/count`,
427 );
428 }
429
430 async getFollowersCount(
431 params: GetFollowersCountParams,
432 ): Promise<GetFollowCountResponse> {
433 return this.request<GetFollowCountResponse>(
434 'GET',
435 `/api/users/${params.identifier}/followers/count`,
436 );
437 }
438
439 async getFollowingCollectionsCount(
440 params: GetFollowingCollectionsCountParams,
441 ): Promise<GetFollowCountResponse> {
442 return this.request<GetFollowCountResponse>(
443 'GET',
444 `/api/users/${params.identifier}/following-collections/count`,
445 );
446 }
447
448 async getCollectionFollowersCount(
449 params: GetCollectionFollowersCountParams,
450 ): Promise<GetFollowCountResponse> {
451 return this.request<GetFollowCountResponse>(
452 'GET',
453 `/api/collections/${params.collectionId}/followers/count`,
454 );
455 }
456
457 async getCollectionContributors(
458 params: GetCollectionContributorsParams,
459 ): Promise<GetCollectionContributorsResponse> {
460 const searchParams = new URLSearchParams();
461 if (params.page) searchParams.set('page', params.page.toString());
462 if (params.limit) searchParams.set('limit', params.limit.toString());
463
464 const queryString = searchParams.toString();
465 const endpoint = queryString
466 ? `/api/collections/${params.collectionId}/contributors?${queryString}`
467 : `/api/collections/${params.collectionId}/contributors`;
468
469 return this.request<GetCollectionContributorsResponse>('GET', endpoint);
470 }
471}