Skip to content

Commit ab920b9

Browse files
authored
Merge pull request #488 from middlewarehq/feat/gitlab-integration
Add GitLab integration functionality
2 parents 418662f + 96b781a commit ab920b9

File tree

33 files changed

+1504
-845
lines changed

33 files changed

+1504
-845
lines changed

backend/analytics_server/mhq/service/code/sync/etl_handler.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import pytz
55

6+
from mhq.store.models.code.enums import CodeProvider
67
from mhq.service.settings.configuration_settings import (
78
get_settings_service,
89
SettingsService,
@@ -42,11 +43,11 @@ def __init__(
4243
self.bookmark_service = bookmark_service
4344
self.settings_service = settings_service
4445

45-
def sync_org_repos(self, org_id: str):
46+
def sync_org_repos(self, org_id: str, provider: CodeProvider):
4647
if not self.etl_service.check_pat_validity():
4748
LOG.error("Invalid PAT for code provider")
4849
return
49-
org_repos: List[OrgRepo] = self._sync_org_repos(org_id)
50+
org_repos: List[OrgRepo] = self._sync_org_repos(org_id, provider)
5051
for org_repo in org_repos:
5152
try:
5253
self._sync_repo_pull_requests_data(org_repo)
@@ -56,9 +57,11 @@ def sync_org_repos(self, org_id: str):
5657
)
5758
continue
5859

59-
def _sync_org_repos(self, org_id: str) -> List[OrgRepo]:
60+
def _sync_org_repos(self, org_id: str, provider: CodeProvider) -> List[OrgRepo]:
6061
try:
61-
org_repos = self.code_repo_service.get_active_org_repos(org_id)
62+
org_repos = self.code_repo_service.get_active_org_repos_for_provider(
63+
org_id, provider
64+
)
6265
org_repos = self.etl_service.get_org_repos(org_repos)
6366
self.code_repo_service.update_org_repos(org_repos)
6467
return org_repos
@@ -141,7 +144,7 @@ def sync_code_repos(org_id: str):
141144
get_bookmark_service(),
142145
get_settings_service(),
143146
)
144-
code_etl_handler.sync_org_repos(org_id)
147+
code_etl_handler.sync_org_repos(org_id, CodeProvider(provider))
145148
LOG.info(f"Synced org repos for provider {provider}")
146149
except Exception as e:
147150
LOG.error(f"Error syncing org repos for provider {provider}: {str(e)}")

backend/analytics_server/mhq/store/repos/code.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from operator import and_
33
from typing import Optional, List
44

5+
from mhq.store.models.code.enums import CodeProvider
56
from sqlalchemy import or_
67
from sqlalchemy.orm import defer
78
from mhq.store.models.core import Team
@@ -35,6 +36,20 @@ def get_active_org_repos(self, org_id: str) -> List[OrgRepo]:
3536
.all()
3637
)
3738

39+
@rollback_on_exc
40+
def get_active_org_repos_for_provider(
41+
self, org_id: str, provider: CodeProvider
42+
) -> List[OrgRepo]:
43+
return (
44+
self._db.session.query(OrgRepo)
45+
.filter(
46+
OrgRepo.org_id == org_id,
47+
OrgRepo.is_active.is_(True),
48+
OrgRepo.provider == provider.value,
49+
)
50+
.all()
51+
)
52+
3853
@rollback_on_exc
3954
def update_org_repos(self, org_repos: List[OrgRepo]):
4055
[self._db.session.merge(org_repo) for org_repo in org_repos]

web-server/pages/api/integrations/orgs.ts

Lines changed: 0 additions & 225 deletions
This file was deleted.

web-server/pages/api/integrations/selected.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { db, dbRaw } from '@/utils/db';
1313

1414
const getSchema = yup.object().shape({
1515
org_id: yup.string().uuid().required(),
16-
provider: yup.string().oneOf(Object.values(Integration))
16+
providers: yup.array(yup.string().oneOf(Object.values(Integration)))
1717
});
1818

1919
const endpoint = new Endpoint(nullSchema);
@@ -23,14 +23,14 @@ endpoint.handle.GET(getSchema, async (req, res) => {
2323
return res.send(selectedDBReposMock);
2424
}
2525

26-
const { org_id, provider } = req.payload;
26+
const { org_id, providers } = req.payload;
2727

28-
res.send(await getSelectedReposForOrg(org_id, provider as Integration));
28+
res.send(await getSelectedReposForOrg(org_id, providers as Integration[]));
2929
});
3030

3131
export const getSelectedReposForOrg = async (
3232
org_id: ID,
33-
provider: Integration
33+
providers: Integration[]
3434
): Promise<RepoWithMultipleWorkflows[]> => {
3535
const dbRepos: RepoWithSingleWorkflow[] = await db(Table.OrgRepo)
3636
.leftJoin({ rw: Table.RepoWorkflow }, function () {
@@ -47,7 +47,8 @@ export const getSelectedReposForOrg = async (
4747
.select(dbRaw.raw('to_json(rw) as repo_workflow'))
4848
.select('tr.deployment_type', 'tr.team_id')
4949
.from('OrgRepo')
50-
.where({ org_id, 'OrgRepo.provider': provider })
50+
.where('org_id', org_id)
51+
.and.whereIn('OrgRepo.provider', providers)
5152
.andWhereNot('OrgRepo.is_active', false);
5253

5354
const repoToWorkflowMap = dbRepos.reduce(

0 commit comments

Comments
 (0)