diff --git a/backend/analytics_server/mhq/service/code/sync/etl_handler.py b/backend/analytics_server/mhq/service/code/sync/etl_handler.py index 5a7978dc7..47dfa95c3 100644 --- a/backend/analytics_server/mhq/service/code/sync/etl_handler.py +++ b/backend/analytics_server/mhq/service/code/sync/etl_handler.py @@ -3,6 +3,7 @@ import pytz +from mhq.store.models.code.enums import CodeProvider from mhq.service.settings.configuration_settings import ( get_settings_service, SettingsService, @@ -42,11 +43,11 @@ def __init__( self.bookmark_service = bookmark_service self.settings_service = settings_service - def sync_org_repos(self, org_id: str): + def sync_org_repos(self, org_id: str, provider: CodeProvider): if not self.etl_service.check_pat_validity(): LOG.error("Invalid PAT for code provider") return - org_repos: List[OrgRepo] = self._sync_org_repos(org_id) + org_repos: List[OrgRepo] = self._sync_org_repos(org_id, provider) for org_repo in org_repos: try: self._sync_repo_pull_requests_data(org_repo) @@ -56,9 +57,11 @@ def sync_org_repos(self, org_id: str): ) continue - def _sync_org_repos(self, org_id: str) -> List[OrgRepo]: + def _sync_org_repos(self, org_id: str, provider: CodeProvider) -> List[OrgRepo]: try: - org_repos = self.code_repo_service.get_active_org_repos(org_id) + org_repos = self.code_repo_service.get_active_org_repos_for_provider( + org_id, provider + ) org_repos = self.etl_service.get_org_repos(org_repos) self.code_repo_service.update_org_repos(org_repos) return org_repos @@ -141,7 +144,7 @@ def sync_code_repos(org_id: str): get_bookmark_service(), get_settings_service(), ) - code_etl_handler.sync_org_repos(org_id) + code_etl_handler.sync_org_repos(org_id, CodeProvider(provider)) LOG.info(f"Synced org repos for provider {provider}") except Exception as e: LOG.error(f"Error syncing org repos for provider {provider}: {str(e)}") diff --git a/backend/analytics_server/mhq/store/repos/code.py b/backend/analytics_server/mhq/store/repos/code.py index c6ad97075..115ad6755 100644 --- a/backend/analytics_server/mhq/store/repos/code.py +++ b/backend/analytics_server/mhq/store/repos/code.py @@ -2,6 +2,7 @@ from operator import and_ from typing import Optional, List +from mhq.store.models.code.enums import CodeProvider from sqlalchemy import or_ from sqlalchemy.orm import defer from mhq.store.models.core import Team @@ -35,6 +36,20 @@ def get_active_org_repos(self, org_id: str) -> List[OrgRepo]: .all() ) + @rollback_on_exc + def get_active_org_repos_for_provider( + self, org_id: str, provider: CodeProvider + ) -> List[OrgRepo]: + return ( + self._db.session.query(OrgRepo) + .filter( + OrgRepo.org_id == org_id, + OrgRepo.is_active.is_(True), + OrgRepo.provider == provider.value, + ) + .all() + ) + @rollback_on_exc def update_org_repos(self, org_repos: List[OrgRepo]): [self._db.session.merge(org_repo) for org_repo in org_repos] diff --git a/web-server/src/contexts/ThirdPartyAuthContext.tsx b/web-server/src/contexts/ThirdPartyAuthContext.tsx index 8ac9fd73a..eed4a149b 100644 --- a/web-server/src/contexts/ThirdPartyAuthContext.tsx +++ b/web-server/src/contexts/ThirdPartyAuthContext.tsx @@ -110,9 +110,14 @@ export const AuthProvider: FC = (props) => { const integrationSet = useMemo( () => new Set( - [].concat(integrations.github && IntegrationGroup.CODE).filter(Boolean) + [] + .concat( + (integrations.github || integrations.gitlab) && + IntegrationGroup.CODE + ) + .filter(Boolean) ), - [integrations.github] + [integrations.github, integrations.gitlab] ); const integrationList = useMemo(