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