This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / webapp / api-client / clients / QueryClient.ts
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}