A social knowledge tool for researchers built on ATProto
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} from '@semble/types';
28
29export class QueryClient extends BaseClient {
30 async getUrlMetadata(url: string): Promise<GetUrlMetadataResponse> {
31 const params = new URLSearchParams({ url });
32 return this.request<GetUrlMetadataResponse>(
33 'GET',
34 `/api/cards/metadata?${params}`,
35 );
36 }
37
38 async getMyUrlCards(
39 params?: GetMyUrlCardsParams,
40 ): Promise<GetUrlCardsResponse> {
41 const searchParams = new URLSearchParams();
42 if (params?.page) searchParams.set('page', params.page.toString());
43 if (params?.limit) searchParams.set('limit', params.limit.toString());
44 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
45 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
46
47 const queryString = searchParams.toString();
48 const endpoint = queryString
49 ? `/api/cards/my?${queryString}`
50 : '/api/cards/my';
51
52 return this.request<GetUrlCardsResponse>('GET', endpoint);
53 }
54
55 async getUserUrlCards(
56 params: GetUrlCardsParams,
57 ): Promise<GetUrlCardsResponse> {
58 const searchParams = new URLSearchParams();
59 if (params.page) searchParams.set('page', params.page.toString());
60 if (params.limit) searchParams.set('limit', params.limit.toString());
61 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
62 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
63
64 const queryString = searchParams.toString();
65 const endpoint = queryString
66 ? `/api/cards/user/${params.identifier}?${queryString}`
67 : `/api/cards/user/${params.identifier}`;
68
69 return this.request<GetUrlCardsResponse>('GET', endpoint);
70 }
71
72 async getUrlCardView(cardId: string): Promise<GetUrlCardViewResponse> {
73 return this.request<GetUrlCardViewResponse>('GET', `/api/cards/${cardId}`);
74 }
75
76 async getLibrariesForCard(
77 cardId: string,
78 ): Promise<GetLibrariesForCardResponse> {
79 return this.request<GetLibrariesForCardResponse>(
80 'GET',
81 `/api/cards/${cardId}/libraries`,
82 );
83 }
84
85 async getMyProfile(): Promise<GetProfileResponse> {
86 return this.request<GetProfileResponse>('GET', '/api/users/me');
87 }
88
89 async getUserProfile(params: GetProfileParams): Promise<GetProfileResponse> {
90 return this.request<GetProfileResponse>(
91 'GET',
92 `/api/users/${params.identifier}`,
93 );
94 }
95
96 async getCollectionPage(
97 collectionId: string,
98 params?: GetCollectionPageParams,
99 ): Promise<GetCollectionPageResponse> {
100 const searchParams = new URLSearchParams();
101 if (params?.page) searchParams.set('page', params.page.toString());
102 if (params?.limit) searchParams.set('limit', params.limit.toString());
103 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
104 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
105
106 const queryString = searchParams.toString();
107 const endpoint = queryString
108 ? `/api/collections/${collectionId}?${queryString}`
109 : `/api/collections/${collectionId}`;
110
111 return this.request<GetCollectionPageResponse>('GET', endpoint);
112 }
113
114 async getCollectionPageByAtUri(
115 params: GetCollectionPageByAtUriParams,
116 ): Promise<GetCollectionPageResponse> {
117 const { handle, recordKey, ...queryParams } = params;
118 const searchParams = new URLSearchParams();
119
120 if (queryParams.page) searchParams.set('page', queryParams.page.toString());
121 if (queryParams.limit)
122 searchParams.set('limit', queryParams.limit.toString());
123 if (queryParams.sortBy) searchParams.set('sortBy', queryParams.sortBy);
124 if (queryParams.sortOrder)
125 searchParams.set('sortOrder', queryParams.sortOrder);
126
127 const queryString = searchParams.toString();
128 const endpoint = queryString
129 ? `/api/collections/at/${handle}/${recordKey}?${queryString}`
130 : `/api/collections/at/${handle}/${recordKey}`;
131
132 return this.request<GetCollectionPageResponse>('GET', endpoint);
133 }
134
135 async getMyCollections(
136 params?: GetMyCollectionsParams,
137 ): Promise<GetCollectionsResponse> {
138 const searchParams = new URLSearchParams();
139 if (params?.page) searchParams.set('page', params.page.toString());
140 if (params?.limit) searchParams.set('limit', params.limit.toString());
141 if (params?.sortBy) searchParams.set('sortBy', params.sortBy);
142 if (params?.sortOrder) searchParams.set('sortOrder', params.sortOrder);
143 if (params?.searchText) searchParams.set('searchText', params.searchText);
144
145 const queryString = searchParams.toString();
146 const endpoint = queryString
147 ? `/api/collections?${queryString}`
148 : '/api/collections';
149
150 return this.request<GetCollectionsResponse>('GET', endpoint);
151 }
152
153 async getUserCollections(
154 params: GetCollectionsParams,
155 ): Promise<GetCollectionsResponse> {
156 const searchParams = new URLSearchParams();
157 if (params.page) searchParams.set('page', params.page.toString());
158 if (params.limit) searchParams.set('limit', params.limit.toString());
159 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
160 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
161 if (params.searchText) searchParams.set('searchText', params.searchText);
162
163 const queryString = searchParams.toString();
164 const endpoint = queryString
165 ? `/api/collections/user/${params.identifier}?${queryString}`
166 : `/api/collections/user/${params.identifier}`;
167
168 return this.request<GetCollectionsResponse>('GET', endpoint);
169 }
170
171 async getUrlStatusForMyLibrary(
172 params: GetUrlStatusForMyLibraryParams,
173 ): Promise<GetUrlStatusForMyLibraryResponse> {
174 const searchParams = new URLSearchParams({ url: params.url });
175 return this.request<GetUrlStatusForMyLibraryResponse>(
176 'GET',
177 `/api/cards/library/status?${searchParams}`,
178 );
179 }
180
181 async getLibrariesForUrl(
182 params: GetLibrariesForUrlParams,
183 ): Promise<GetLibrariesForUrlResponse> {
184 const searchParams = new URLSearchParams({ url: params.url });
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
190 return this.request<GetLibrariesForUrlResponse>(
191 'GET',
192 `/api/cards/libraries/url?${searchParams}`,
193 );
194 }
195
196 async getNoteCardsForUrl(
197 params: GetNoteCardsForUrlParams,
198 ): Promise<GetNoteCardsForUrlResponse> {
199 const searchParams = new URLSearchParams({ url: params.url });
200 if (params.page) searchParams.set('page', params.page.toString());
201 if (params.limit) searchParams.set('limit', params.limit.toString());
202 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
203 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
204
205 return this.request<GetNoteCardsForUrlResponse>(
206 'GET',
207 `/api/cards/notes/url?${searchParams}`,
208 );
209 }
210
211 async getCollectionsForUrl(
212 params: GetCollectionsForUrlParams,
213 ): Promise<GetCollectionsForUrlResponse> {
214 const searchParams = new URLSearchParams({ url: params.url });
215 if (params.page) searchParams.set('page', params.page.toString());
216 if (params.limit) searchParams.set('limit', params.limit.toString());
217 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
218 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
219
220 return this.request<GetCollectionsForUrlResponse>(
221 'GET',
222 `/api/collections/url?${searchParams}`,
223 );
224 }
225
226 async getSimilarUrlsForUrl(
227 params: GetSimilarUrlsForUrlParams,
228 ): Promise<GetSimilarUrlsForUrlResponse> {
229 const searchParams = new URLSearchParams({ url: params.url });
230 if (params.page) searchParams.set('page', params.page.toString());
231 if (params.limit) searchParams.set('limit', params.limit.toString());
232 if (params.sortBy) searchParams.set('sortBy', params.sortBy);
233 if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);
234 if (params.threshold)
235 searchParams.set('threshold', params.threshold.toString());
236
237 return this.request<GetSimilarUrlsForUrlResponse>(
238 'GET',
239 `/api/search/similar-urls?${searchParams}`,
240 );
241 }
242}