diff --git a/src/webapp/api-client/ApiClient.ts b/src/webapp/api-client/ApiClient.ts index a8b63d4c..fced1ff1 100644 --- a/src/webapp/api-client/ApiClient.ts +++ b/src/webapp/api-client/ApiClient.ts @@ -59,6 +59,12 @@ import type { GetProfileParams, GetUrlStatusForMyLibraryParams, GetUrlStatusForMyLibraryResponse, + GetLibrariesForUrlParams, + GetLibrariesForUrlResponse, + GetNoteCardsForUrlParams, + GetNoteCardsForUrlResponse, + GetCollectionsForUrlParams, + GetCollectionsForUrlResponse, } from './types'; // Main API Client class using composition @@ -161,6 +167,24 @@ export class ApiClient { return this.queryClient.getUrlStatusForMyLibrary(params); } + async getLibrariesForUrl( + params: GetLibrariesForUrlParams, + ): Promise { + return this.queryClient.getLibrariesForUrl(params); + } + + async getNoteCardsForUrl( + params: GetNoteCardsForUrlParams, + ): Promise { + return this.queryClient.getNoteCardsForUrl(params); + } + + async getCollectionsForUrl( + params: GetCollectionsForUrlParams, + ): Promise { + return this.queryClient.getCollectionsForUrl(params); + } + // Card operations - delegate to CardClient (all require authentication) async addUrlToLibrary( request: AddUrlToLibraryRequest, diff --git a/src/webapp/api-client/clients/QueryClient.ts b/src/webapp/api-client/clients/QueryClient.ts index 26074da1..b0cb6e80 100644 --- a/src/webapp/api-client/clients/QueryClient.ts +++ b/src/webapp/api-client/clients/QueryClient.ts @@ -16,6 +16,12 @@ import { GetCollectionPageByAtUriParams, GetProfileParams, GetUrlStatusForMyLibraryParams, + GetLibrariesForUrlParams, + GetLibrariesForUrlResponse, + GetNoteCardsForUrlParams, + GetNoteCardsForUrlResponse, + GetCollectionsForUrlParams, + GetCollectionsForUrlResponse, } from '../types'; export class QueryClient extends BaseClient { @@ -169,4 +175,49 @@ export class QueryClient extends BaseClient { `/api/cards/library/status?${searchParams}`, ); } + + async getLibrariesForUrl( + params: GetLibrariesForUrlParams, + ): Promise { + const searchParams = new URLSearchParams({ url: params.url }); + if (params.page) searchParams.set('page', params.page.toString()); + if (params.limit) searchParams.set('limit', params.limit.toString()); + if (params.sortBy) searchParams.set('sortBy', params.sortBy); + if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder); + + return this.request( + 'GET', + `/api/cards/libraries/url?${searchParams}`, + ); + } + + async getNoteCardsForUrl( + params: GetNoteCardsForUrlParams, + ): Promise { + const searchParams = new URLSearchParams({ url: params.url }); + if (params.page) searchParams.set('page', params.page.toString()); + if (params.limit) searchParams.set('limit', params.limit.toString()); + if (params.sortBy) searchParams.set('sortBy', params.sortBy); + if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder); + + return this.request( + 'GET', + `/api/cards/notes/url?${searchParams}`, + ); + } + + async getCollectionsForUrl( + params: GetCollectionsForUrlParams, + ): Promise { + const searchParams = new URLSearchParams({ url: params.url }); + if (params.page) searchParams.set('page', params.page.toString()); + if (params.limit) searchParams.set('limit', params.limit.toString()); + if (params.sortBy) searchParams.set('sortBy', params.sortBy); + if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder); + + return this.request( + 'GET', + `/api/collections/url?${searchParams}`, + ); + } } diff --git a/src/webapp/api-client/types/requests.ts b/src/webapp/api-client/types/requests.ts index 2c6b9789..ca0656b7 100644 --- a/src/webapp/api-client/types/requests.ts +++ b/src/webapp/api-client/types/requests.ts @@ -131,3 +131,27 @@ export interface GetProfileParams { export interface GetUrlStatusForMyLibraryParams { url: string; } + +export interface GetLibrariesForUrlParams { + url: string; + page?: number; + limit?: number; + sortBy?: string; + sortOrder?: 'asc' | 'desc'; +} + +export interface GetNoteCardsForUrlParams { + url: string; + page?: number; + limit?: number; + sortBy?: string; + sortOrder?: 'asc' | 'desc'; +} + +export interface GetCollectionsForUrlParams { + url: string; + page?: number; + limit?: number; + sortBy?: string; + sortOrder?: 'asc' | 'desc'; +} diff --git a/src/webapp/api-client/types/responses.ts b/src/webapp/api-client/types/responses.ts index 0b088d07..6a88ae95 100644 --- a/src/webapp/api-client/types/responses.ts +++ b/src/webapp/api-client/types/responses.ts @@ -307,3 +307,41 @@ export interface GetUrlStatusForMyLibraryResponse { description?: string; }[]; } + +export interface GetLibrariesForUrlResponse { + libraries: { + userId: string; + name: string; + handle: string; + avatarUrl?: string; + }[]; + pagination: Pagination; + sorting: Sorting; +} + +export interface GetNoteCardsForUrlResponse { + notes: { + id: string; + note: string; + authorId: string; + createdAt: string; + updatedAt: string; + }[]; + pagination: Pagination; + sorting: Sorting; +} + +export interface GetCollectionsForUrlResponse { + collections: { + id: string; + uri?: string; + name: string; + description?: string; + authorId: string; + }[]; + pagination: Pagination; + sorting: { + sortBy: 'name' | 'createdAt' | 'updatedAt' | 'cardCount'; + sortOrder: 'asc' | 'desc'; + }; +}