feat(sync): add sync subsystem: SyncManager, OpsServer sync handlers, Sync UI and state, provider groupFilter support, and realtime sync log streaming via TypedSocket
This commit is contained in:
@@ -8,8 +8,8 @@ import { BaseProvider, type ITestConnectionResult, type IListOptions } from './c
|
||||
export class GitLabProvider extends BaseProvider {
|
||||
private client: plugins.gitlabClient.GitLabClient;
|
||||
|
||||
constructor(connectionId: string, baseUrl: string, token: string) {
|
||||
super(connectionId, baseUrl, token);
|
||||
constructor(connectionId: string, baseUrl: string, token: string, groupFilterId?: string) {
|
||||
super(connectionId, baseUrl, token, groupFilterId);
|
||||
this.client = new plugins.gitlabClient.GitLabClient(baseUrl, token);
|
||||
}
|
||||
|
||||
@@ -18,13 +18,71 @@ export class GitLabProvider extends BaseProvider {
|
||||
}
|
||||
|
||||
async getProjects(opts?: IListOptions): Promise<interfaces.data.IProject[]> {
|
||||
const projects = await this.client.getProjects(opts);
|
||||
return projects.map((p) => this.mapProject(p));
|
||||
if (this.groupFilterId) {
|
||||
// Auto-paginate group-scoped project listing
|
||||
if (opts?.page) {
|
||||
const projects = await this.client.getGroupProjects(this.groupFilterId, opts);
|
||||
return projects.map((p) => this.mapProject(p));
|
||||
}
|
||||
const allProjects: plugins.gitlabClient.IGitLabProject[] = [];
|
||||
const perPage = opts?.perPage || 50;
|
||||
let page = 1;
|
||||
while (true) {
|
||||
const projects = await this.client.getGroupProjects(this.groupFilterId, { ...opts, page, perPage });
|
||||
allProjects.push(...projects);
|
||||
if (projects.length < perPage) break;
|
||||
page++;
|
||||
}
|
||||
return allProjects.map((p) => this.mapProject(p));
|
||||
}
|
||||
if (opts?.page) {
|
||||
const projects = await this.client.getProjects(opts);
|
||||
return projects.map((p) => this.mapProject(p));
|
||||
}
|
||||
const allProjects: plugins.gitlabClient.IGitLabProject[] = [];
|
||||
const perPage = opts?.perPage || 50;
|
||||
let page = 1;
|
||||
while (true) {
|
||||
const projects = await this.client.getProjects({ ...opts, page, perPage });
|
||||
allProjects.push(...projects);
|
||||
if (projects.length < perPage) break;
|
||||
page++;
|
||||
}
|
||||
return allProjects.map((p) => this.mapProject(p));
|
||||
}
|
||||
|
||||
async getGroups(opts?: IListOptions): Promise<interfaces.data.IGroup[]> {
|
||||
const groups = await this.client.getGroups(opts);
|
||||
return groups.map((g) => this.mapGroup(g));
|
||||
if (this.groupFilterId) {
|
||||
// Auto-paginate descendant groups listing
|
||||
if (opts?.page) {
|
||||
const groups = await this.client.getDescendantGroups(this.groupFilterId, opts);
|
||||
return groups.map((g) => this.mapGroup(g));
|
||||
}
|
||||
const allGroups: plugins.gitlabClient.IGitLabGroup[] = [];
|
||||
const perPage = opts?.perPage || 50;
|
||||
let page = 1;
|
||||
while (true) {
|
||||
const groups = await this.client.getDescendantGroups(this.groupFilterId, { ...opts, page, perPage });
|
||||
allGroups.push(...groups);
|
||||
if (groups.length < perPage) break;
|
||||
page++;
|
||||
}
|
||||
return allGroups.map((g) => this.mapGroup(g));
|
||||
}
|
||||
if (opts?.page) {
|
||||
const groups = await this.client.getGroups(opts);
|
||||
return groups.map((g) => this.mapGroup(g));
|
||||
}
|
||||
const allGroups: plugins.gitlabClient.IGitLabGroup[] = [];
|
||||
const perPage = opts?.perPage || 50;
|
||||
let page = 1;
|
||||
while (true) {
|
||||
const groups = await this.client.getGroups({ ...opts, page, perPage });
|
||||
allGroups.push(...groups);
|
||||
if (groups.length < perPage) break;
|
||||
page++;
|
||||
}
|
||||
return allGroups.map((g) => this.mapGroup(g));
|
||||
}
|
||||
|
||||
// --- Project Secrets (CI/CD Variables) ---
|
||||
|
||||
Reference in New Issue
Block a user