From a15acb33353708cfb2a6c2fd5bc13cf5802ec1e3 Mon Sep 17 00:00:00 2001 From: Mouad BANI Date: Thu, 25 Jun 2026 15:31:28 +0100 Subject: [PATCH 1/4] chore: add axios logs Signed-off-by: Mouad BANI --- backend/src/services/integrationService.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 8a2a149679..52c1e1aeea 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -2774,6 +2774,19 @@ export default class IntegrationService { await SequelizeRepository.commitTransaction(transaction) } catch (err) { + this.options.log.error( + { + err, + errMessage: err?.message, + errName: err?.name, + errStack: err?.stack, + gitlabStatus: err?.response?.status, + gitlabError: err?.response?.data, + gitlabUrl: err?.config?.url, + isAxiosError: !!err?.isAxiosError, + }, + 'gitlabConnect failed', + ) await SequelizeRepository.rollbackTransaction(transaction) throw err } From e5163099076f7f8a883eec00af64472be1d83c51 Mon Sep 17 00:00:00 2001 From: Mouad BANI Date: Thu, 25 Jun 2026 15:55:03 +0100 Subject: [PATCH 2/4] fix: disable sensitive logs Signed-off-by: Mouad BANI --- backend/src/services/integrationService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/services/integrationService.ts b/backend/src/services/integrationService.ts index 52c1e1aeea..2ff1365a15 100644 --- a/backend/src/services/integrationService.ts +++ b/backend/src/services/integrationService.ts @@ -2776,14 +2776,13 @@ export default class IntegrationService { } catch (err) { this.options.log.error( { - err, errMessage: err?.message, errName: err?.name, errStack: err?.stack, gitlabStatus: err?.response?.status, gitlabError: err?.response?.data, gitlabUrl: err?.config?.url, - isAxiosError: !!err?.isAxiosError, + gitlabMethod: err?.config?.method, }, 'gitlabConnect failed', ) From ccac0539283beec0e228a714d381c74173a680c5 Mon Sep 17 00:00:00 2001 From: Mouad BANI Date: Thu, 25 Jun 2026 16:06:32 +0100 Subject: [PATCH 3/4] feat: fetch group projects concurrently Signed-off-by: Mouad BANI --- .../usecases/gitlab/getProjects.ts | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts b/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts index 41f05205e5..1b51edf7d6 100644 --- a/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts +++ b/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts @@ -23,37 +23,47 @@ export async function fetchAllGitlabGroups(accessToken: string) { })) } -export async function fetchGitlabGroupProjects(accessToken: string, groups: any[]) { - const groupProjects = {} +async function fetchProjectsForGroup(accessToken: string, group: any) { + const projects = [] + let page = 1 + let hasMorePages = true - for (const group of groups) { - const projects = [] - let page = 1 - let hasMorePages = true + while (hasMorePages) { + const response = await axios.get(`https://gitlab.com/api/v4/groups/${group.id}/projects`, { + headers: { Authorization: `Bearer ${accessToken}` }, + params: { page, per_page: 100, archived: false }, + }) + projects.push(...response.data) + hasMorePages = response.headers['x-next-page'] !== '' + page++ + } - while (hasMorePages) { - const response = await axios.get(`https://gitlab.com/api/v4/groups/${group.id}/projects`, { - headers: { Authorization: `Bearer ${accessToken}` }, - params: { page, per_page: 100, archived: false }, - }) - projects.push(...response.data) - hasMorePages = response.headers['x-next-page'] !== '' - page++ - } + return projects.map((project) => ({ + groupId: group.id, + groupName: group.name, + groupPath: group.path, + id: project.id, + name: project.name, + path_with_namespace: project.path_with_namespace, + enabled: false, + forkedFrom: project?.forked_from_project?.web_url || null, + })) +} - groupProjects[group.id] = projects.map((project) => ({ - groupId: group.id, - groupName: group.name, - groupPath: group.path, - id: project.id, - name: project.name, - path_with_namespace: project.path_with_namespace, - enabled: false, - forkedFrom: project?.forked_from_project?.web_url || null, - })) +export async function fetchGitlabGroupProjects(accessToken: string, groups: any[]) { + const groupProjects: Record = {} + + for (let i = 0; i < groups.length; i += CONCURRENCY) { + const batch = groups.slice(i, i + CONCURRENCY) + const results = await Promise.all( + batch.map((group) => fetchProjectsForGroup(accessToken, group)), + ) + batch.forEach((group, idx) => { + groupProjects[group.id] = results[idx] + }) } - return groupProjects as Record + return groupProjects } export async function fetchGitlabUserProjects(accessToken: string, userId: number) { From aa68e957582769b14b6038941d4930761534d6a2 Mon Sep 17 00:00:00 2001 From: Mouad BANI Date: Thu, 25 Jun 2026 16:13:52 +0100 Subject: [PATCH 4/4] fix: typo Signed-off-by: Mouad BANI --- .../src/serverless/integrations/usecases/gitlab/getProjects.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts b/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts index 1b51edf7d6..aba3524e5a 100644 --- a/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts +++ b/backend/src/serverless/integrations/usecases/gitlab/getProjects.ts @@ -51,6 +51,7 @@ async function fetchProjectsForGroup(accessToken: string, group: any) { } export async function fetchGitlabGroupProjects(accessToken: string, groups: any[]) { + const CONCURRENCY = 10 const groupProjects: Record = {} for (let i = 0; i < groups.length; i += CONCURRENCY) {