Skip to content

Add GitLab integration functionality #488

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
78c0a3f
creates new functions for Gitlab PAT's validity and missing-scopes
e-for-eshaan Jul 22, 2024
819675e
adds `meta` arg in `linkProvider` to store custom_domain for gitlab t…
e-for-eshaan Jul 22, 2024
8763966
updates the integration API to handle `provider_meta`
e-for-eshaan Jul 22, 2024
583907e
refactor Github's integration card to separate component
e-for-eshaan Jul 22, 2024
8d226b2
refactors modal body into a separate component
e-for-eshaan Jul 22, 2024
42b975b
adds methods for linking and unlinking Gitlab
e-for-eshaan Jul 22, 2024
e594541
creates integration card and integration modal for the gitlab PAT
e-for-eshaan Jul 22, 2024
d2579e5
renders the integration card for gitlab
e-for-eshaan Jul 22, 2024
3b627f7
adds input, error handling and submission for custom-domain
e-for-eshaan Jul 23, 2024
75d5fcd
removes hardcode custom-domain
e-for-eshaan Jul 23, 2024
82b8d7f
updates image and highlighters for Gitlab PAT permissions
e-for-eshaan Jul 23, 2024
a53146d
fixes color
e-for-eshaan Sep 4, 2024
abdd393
implements gitlab's search API to get projects
e-for-eshaan Jul 23, 2024
16399a5
removes redundant example code
e-for-eshaan Jul 23, 2024
868fdf2
updates BaseRepo type
e-for-eshaan Jul 25, 2024
398533d
adds distinguishing icons to repos, and disables deploy selector for …
e-for-eshaan Jul 25, 2024
db4a80d
handles long names in deployment-selector table
e-for-eshaan Jul 25, 2024
4f67734
removes redundant query data and fixes parent/id fields
e-for-eshaan Jul 25, 2024
a5cff5c
ui-fixes
e-for-eshaan Jul 25, 2024
7e1977a
adds searching support within gitlab-groups
e-for-eshaan Jul 26, 2024
f0df0f2
updates searching logic
e-for-eshaan Jul 26, 2024
88d51b5
updates APIs to handle multiple integration providers
e-for-eshaan Jul 26, 2024
d67b21c
updates fetch-teams API to accept integration list
e-for-eshaan Jul 26, 2024
6ffe265
updates rendering logic for multiple code-provider integrations
e-for-eshaan Jul 26, 2024
92416ae
fixes type
e-for-eshaan Sep 3, 2024
cf8f4a9
implements a new query to search url, group/name
e-for-eshaan Sep 3, 2024
c6b4714
fixes adaptor for base-repo
e-for-eshaan Sep 3, 2024
87e1ba8
allows url as a search param, updates search CTAs
e-for-eshaan Sep 4, 2024
818da00
returns only a single repo if url is passed
e-for-eshaan Sep 4, 2024
b584eb8
fixes url to query conversion, fixes search and selection
e-for-eshaan Sep 4, 2024
067761e
fixes type and id
e-for-eshaan Sep 4, 2024
1e19f03
fixes spacing on the delete button
e-for-eshaan Sep 4, 2024
f4b6d5c
removes provider hard-code
e-for-eshaan Sep 4, 2024
176d12b
adds gitlab into the unlinkprovder CTA
e-for-eshaan Sep 4, 2024
cdb97ba
adds provider to the teams/v2 api repos
e-for-eshaan Sep 4, 2024
de8855a
removes provider hardocode for the teams creation/updation
e-for-eshaan Sep 5, 2024
63dcbae
removes hardcoded provider
e-for-eshaan Sep 5, 2024
e3245b5
converts checks for github to include all integrations
e-for-eshaan Sep 6, 2024
d5b8829
fetch active repos based on code providers
adnanhashmi09 Sep 6, 2024
a7b4d14
fixes integration set to include gitlab
adnanhashmi09 Sep 6, 2024
bc5c0a1
removes dimming effect on the heading
e-for-eshaan Sep 8, 2024
2eca0dc
removes redundant erred files and methods
e-for-eshaan Sep 8, 2024
96b781a
removes provider check from fetchTeams, instead brings up all repos f…
e-for-eshaan Sep 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions backend/analytics_server/mhq/service/code/sync/etl_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)}")
Expand Down
15 changes: 15 additions & 0 deletions backend/analytics_server/mhq/store/repos/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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]
Expand Down
225 changes: 0 additions & 225 deletions web-server/pages/api/integrations/orgs.ts

This file was deleted.

11 changes: 6 additions & 5 deletions web-server/pages/api/integrations/selected.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { db, dbRaw } from '@/utils/db';

const getSchema = yup.object().shape({
org_id: yup.string().uuid().required(),
provider: yup.string().oneOf(Object.values(Integration))
providers: yup.array(yup.string().oneOf(Object.values(Integration)))
});

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

const { org_id, provider } = req.payload;
const { org_id, providers } = req.payload;

res.send(await getSelectedReposForOrg(org_id, provider as Integration));
res.send(await getSelectedReposForOrg(org_id, providers as Integration[]));
});

export const getSelectedReposForOrg = async (
org_id: ID,
provider: Integration
providers: Integration[]
): Promise<RepoWithMultipleWorkflows[]> => {
const dbRepos: RepoWithSingleWorkflow[] = await db(Table.OrgRepo)
.leftJoin({ rw: Table.RepoWorkflow }, function () {
Expand All @@ -47,7 +47,8 @@ export const getSelectedReposForOrg = async (
.select(dbRaw.raw('to_json(rw) as repo_workflow'))
.select('tr.deployment_type', 'tr.team_id')
.from('OrgRepo')
.where({ org_id, 'OrgRepo.provider': provider })
.where('org_id', org_id)
.and.whereIn('OrgRepo.provider', providers)
.andWhereNot('OrgRepo.is_active', false);

const repoToWorkflowMap = dbRepos.reduce(
Expand Down
Loading
Loading