From 324c07bae181a1257a01b60a9a7dd7ec1b787184 Mon Sep 17 00:00:00 2001 From: William Phetsinorath Date: Thu, 28 May 2026 09:51:38 +0200 Subject: [PATCH 1/2] fix: role always return null Signed-off-by: William Phetsinorath --- plugins/gitlab/src/members.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/gitlab/src/members.ts b/plugins/gitlab/src/members.ts index 3cc0ed0a7f..2e558b18a5 100644 --- a/plugins/gitlab/src/members.ts +++ b/plugins/gitlab/src/members.ts @@ -1,4 +1,4 @@ -import type { Config, Project, UserObject } from '@cpn-console/hooks' +import type { Config, Project, Role, UserObject } from '@cpn-console/hooks' import type { GitlabProjectApi } from './class.js' import { AccessLevel } from '@gitbeaker/core' import { @@ -14,7 +14,7 @@ export function getGroupAccessLevelFromProjectRole(project: Project, user: UserO const projectDeveloperGroupPathSuffixes = (config.gitlab?.projectDeveloperGroupPathSuffix ?? DEFAULT_PROJECT_DEVELOPER_GROUP_PATH_SUFFIX).split(',') const projectMaintainerGroupPathSuffixes = (config.gitlab?.projectMaintainerGroupPathSuffix ?? DEFAULT_PROJECT_MAINTAINER_GROUP_PATH_SUFFIX).split(',') - const getAccessLevel = (role: any): number | null => { + const getAccessLevel = (role: Role): number | null => { // TODO: update to AccessLevel.GUEST once we migrated pre-fine grained // projects members to developer access level via database migrations if (!role.oidcGroup) return AccessLevel.DEVELOPER @@ -24,13 +24,15 @@ export function getGroupAccessLevelFromProjectRole(project: Project, user: UserO return null } + // TODO: update to AccessLevel.GUEST once we migrated pre-fine grained + // projects members to developer access level via database migrations return project.roles.reduce((highestAccessLevel, role) => { if (role.users.some(userRole => userRole.id === user.id)) { const level = getAccessLevel(role) if (level && level > (highestAccessLevel ?? 0)) return level } return highestAccessLevel - }, null) + }, AccessLevel.DEVELOPER) } export function getGroupAccessLevel(project: Project, user: UserObject, config: Config): number | null { From ac84293fd26ad14e7b74d8d4924535e7916c59dd Mon Sep 17 00:00:00 2001 From: William Phetsinorath Date: Thu, 28 May 2026 09:57:01 +0200 Subject: [PATCH 2/2] fix: disable NestJS reconciler loop to avoid conflicts Signed-off-by: William Phetsinorath --- apps/server-nestjs/src/modules/argocd/argocd.service.ts | 2 +- apps/server-nestjs/src/modules/gitlab/gitlab.service.ts | 2 +- apps/server-nestjs/src/modules/keycloak/keycloak.service.ts | 2 +- apps/server-nestjs/src/modules/nexus/nexus.service.ts | 2 +- apps/server-nestjs/src/modules/registry/registry.service.ts | 2 +- apps/server-nestjs/src/modules/sonarqube/sonarqube.service.ts | 2 +- apps/server-nestjs/src/modules/vault/vault.service.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/server-nestjs/src/modules/argocd/argocd.service.ts b/apps/server-nestjs/src/modules/argocd/argocd.service.ts index 05d8b94d17..811f5a14a5 100644 --- a/apps/server-nestjs/src/modules/argocd/argocd.service.ts +++ b/apps/server-nestjs/src/modules/argocd/argocd.service.ts @@ -57,7 +57,7 @@ export class ArgoCDService { this.logger.log(`ArgoCD sync completed for project ${project.slug}`) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { this.logger.log('Starting ArgoCD reconciliation') diff --git a/apps/server-nestjs/src/modules/gitlab/gitlab.service.ts b/apps/server-nestjs/src/modules/gitlab/gitlab.service.ts index cbcfb34bc6..3445ef27bb 100644 --- a/apps/server-nestjs/src/modules/gitlab/gitlab.service.ts +++ b/apps/server-nestjs/src/modules/gitlab/gitlab.service.ts @@ -66,7 +66,7 @@ export class GitlabService { this.logger.log(`GitLab sync completed for project ${project.slug}`) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan() diff --git a/apps/server-nestjs/src/modules/keycloak/keycloak.service.ts b/apps/server-nestjs/src/modules/keycloak/keycloak.service.ts index 8ecc199a06..a70a8fad96 100644 --- a/apps/server-nestjs/src/modules/keycloak/keycloak.service.ts +++ b/apps/server-nestjs/src/modules/keycloak/keycloak.service.ts @@ -43,7 +43,7 @@ export class KeycloakService { this.logger.log(`Keycloak cleanup completed for project ${project.slug}`) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan() diff --git a/apps/server-nestjs/src/modules/nexus/nexus.service.ts b/apps/server-nestjs/src/modules/nexus/nexus.service.ts index e24fb68a4e..a70bc97db6 100644 --- a/apps/server-nestjs/src/modules/nexus/nexus.service.ts +++ b/apps/server-nestjs/src/modules/nexus/nexus.service.ts @@ -81,7 +81,7 @@ export class NexusService { await this.ensurePlatformRoles(projects) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan() diff --git a/apps/server-nestjs/src/modules/registry/registry.service.ts b/apps/server-nestjs/src/modules/registry/registry.service.ts index bd9e2f9946..fda5950006 100644 --- a/apps/server-nestjs/src/modules/registry/registry.service.ts +++ b/apps/server-nestjs/src/modules/registry/registry.service.ts @@ -338,7 +338,7 @@ export class RegistryService { await this.deleteProject(project.slug) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan() diff --git a/apps/server-nestjs/src/modules/sonarqube/sonarqube.service.ts b/apps/server-nestjs/src/modules/sonarqube/sonarqube.service.ts index 1a6eec948f..96e4ddc497 100644 --- a/apps/server-nestjs/src/modules/sonarqube/sonarqube.service.ts +++ b/apps/server-nestjs/src/modules/sonarqube/sonarqube.service.ts @@ -107,7 +107,7 @@ export class SonarqubeService implements OnModuleInit { this.logger.log(`SonarQube deletion completed for project ${project.slug}`) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan() diff --git a/apps/server-nestjs/src/modules/vault/vault.service.ts b/apps/server-nestjs/src/modules/vault/vault.service.ts index 43b0eeb8be..0787981c97 100644 --- a/apps/server-nestjs/src/modules/vault/vault.service.ts +++ b/apps/server-nestjs/src/modules/vault/vault.service.ts @@ -92,7 +92,7 @@ export class VaultService { this.logger.log(`Vault zone cleanup completed for ${zone.slug}`) } - @Cron(CronExpression.EVERY_HOUR) + // @Cron(CronExpression.EVERY_HOUR) @StartActiveSpan() async handleCron() { const span = trace.getActiveSpan()