From 019638e2ff2886019321693e01025a1b4c1de1af Mon Sep 17 00:00:00 2001 From: Nicolas FRADIN Date: Wed, 20 May 2026 19:10:48 +0200 Subject: [PATCH] feat: add RepositoryClient for workspace, repo, and branch browsing --- src/clients/repository-client.ts | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/clients/repository-client.ts diff --git a/src/clients/repository-client.ts b/src/clients/repository-client.ts new file mode 100644 index 0000000..817a1b9 --- /dev/null +++ b/src/clients/repository-client.ts @@ -0,0 +1,73 @@ +import { BaseClient, ClientOptions } from './base-client.js'; + +export class RepositoryClient extends BaseClient { + constructor(options: ClientOptions = {}) { + super(options); + } + + async listWorkspaces(options?: { page?: number; pagelen?: number }): Promise { + await this.ensureInitialized(); + try { + const params: Record = {}; + if (options?.page) params.page = options.page; + if (options?.pagelen) params.pagelen = options.pagelen; + const response = await this.axiosInstance.get('/workspaces', { params }); + return response.data; + } catch (error) { + throw new Error(`Failed to list workspaces: ${this.formatError(error)}`); + } + } + + async listRepositories( + workspace: string, + options?: { role?: 'member' | 'contributor' | 'owner'; page?: number; pagelen?: number }, + ): Promise { + await this.ensureInitialized(); + try { + const params: Record = {}; + if (options?.role) params.role = options.role; + if (options?.page) params.page = options.page; + if (options?.pagelen) params.pagelen = options.pagelen; + const response = await this.axiosInstance.get( + `/repositories/${workspace}`, + { params }, + ); + return response.data; + } catch (error) { + throw new Error(`Failed to list repositories: ${this.formatError(error)}`); + } + } + + async getRepository(workspace: string, repoSlug: string): Promise { + await this.ensureInitialized(); + try { + const response = await this.axiosInstance.get( + `/repositories/${workspace}/${repoSlug}`, + ); + return response.data; + } catch (error) { + throw new Error(`Failed to get repository: ${this.formatError(error)}`); + } + } + + async listBranches( + workspace: string, + repoSlug: string, + options?: { filter_by_name?: string; page?: number; pagelen?: number }, + ): Promise { + await this.ensureInitialized(); + try { + const params: Record = {}; + if (options?.filter_by_name) params.q = `name~"${options.filter_by_name}"`; + if (options?.page) params.page = options.page; + if (options?.pagelen) params.pagelen = options.pagelen; + const response = await this.axiosInstance.get( + `/repositories/${workspace}/${repoSlug}/refs/branches`, + { params }, + ); + return response.data; + } catch (error) { + throw new Error(`Failed to list branches: ${this.formatError(error)}`); + } + } +}