diff --git a/cla-backend-go/cmd/server.go b/cla-backend-go/cmd/server.go
index 150e607a5..c0a6c5a1c 100644
--- a/cla-backend-go/cmd/server.go
+++ b/cla-backend-go/cmd/server.go
@@ -304,14 +304,14 @@ func server(localMode bool) http.Handler {
v2RepositoriesService := v2Repositories.NewService(gitV1Repository, gitV2Repository, v1ProjectClaGroupRepo, githubOrganizationsRepo, gitlabOrganizationRepo, eventsService)
githubOrganizationsService := github_organizations.NewService(githubOrganizationsRepo, gitV1Repository, v1ProjectClaGroupRepo)
gitlabOrganizationsService := gitlab_organizations.NewService(gitlabOrganizationRepo, v2RepositoriesService, v1ProjectClaGroupRepo, storeRepository, usersService, signaturesRepo, v1CompanyRepo)
- gitlabActivityService := gitlab_activity.NewService(gitV1Repository, gitV2Repository, usersRepo, signaturesRepo, v1ProjectClaGroupRepo, v1CompanyRepo, signaturesRepo, gitlabOrganizationsService, storeRepository)
- v1SignaturesService := signatures.NewService(signaturesRepo, v1CompanyService, usersService, eventsService, githubOrgValidation, v1RepositoriesService, githubOrganizationsService, gitlabOrganizationsService, v1ProjectService, gitlabApp, configFile.ClaV1ApiURL, configFile.CLALandingPage, configFile.CLALogoURL, gitlabActivityService)
+ v1SignaturesService := signatures.NewService(signaturesRepo, v1CompanyService, usersService, eventsService, githubOrgValidation, v1RepositoriesService, githubOrganizationsService, v1ProjectService, gitlabApp, configFile.ClaV1ApiURL, configFile.CLALandingPage, configFile.CLALogoURL)
v2SignatureService := v2Signatures.NewService(awsSession, configFile.SignatureFilesBucket, v1ProjectService, v1CompanyService, v1SignaturesService, v1ProjectClaGroupRepo, signaturesRepo, usersService)
v1ClaManagerService := cla_manager.NewService(claManagerReqRepo, v1ProjectClaGroupRepo, v1CompanyService, v1ProjectService, usersService, v1SignaturesService, eventsService, emailTemplateService, configFile.CorporateConsoleV1URL)
v2ClaManagerService := v2ClaManager.NewService(emailTemplateService, v1CompanyService, v1ProjectService, v1ClaManagerService, usersService, v1RepositoriesService, v2CompanyService, eventsService, v1ProjectClaGroupRepo)
v1ApprovalListService := approval_list.NewService(approvalListRepo, v1ProjectClaGroupRepo, v1ProjectService, usersRepo, v1CompanyRepo, v1CLAGroupRepo, signaturesRepo, emailTemplateService, configFile.CorporateConsoleV2URL, http.DefaultClient)
authorizer := auth.NewAuthorizer(authValidator, userRepo)
v2MetricsService := metrics.NewService(metricsRepo, v1ProjectClaGroupRepo)
+ gitlabActivityService := gitlab_activity.NewService(gitV1Repository, gitV2Repository, usersRepo, signaturesRepo, v1ProjectClaGroupRepo, v1CompanyRepo, signaturesRepo, gitlabOrganizationsService)
gitlabSignService := gitlab_sign.NewService(v2RepositoriesService, usersService, storeRepository, gitlabApp, gitlabOrganizationsService)
v2GithubOrganizationsService := v2GithubOrganizations.NewService(githubOrganizationsRepo, gitV1Repository, v1ProjectClaGroupRepo, githubOrganizationsService)
autoEnableService := dynamo_events.NewAutoEnableService(v1RepositoriesService, gitV1Repository, githubOrganizationsRepo, v1ProjectClaGroupRepo, v1ProjectService)
diff --git a/cla-backend-go/signatures/models.go b/cla-backend-go/signatures/models.go
index 8dbf46922..006aedade 100644
--- a/cla-backend-go/signatures/models.go
+++ b/cla-backend-go/signatures/models.go
@@ -132,13 +132,3 @@ type ActivePullRequest struct {
RepositoryID string `json:"repository_id"`
PullRequestID string `json:"pull_request_id"`
}
-
-// ActiveGitLabPullRequest data model
-type ActiveGitLabPullRequest struct {
- GitLabAuthorUserName string `json:"gitlab_author_username"`
- GitLabAuthorEmail string `json:"gitlab_author_email"`
- ClaGroupID string `json:"cla_group_id"`
- RepositoryID string `json:"repository_id"`
- MergeRequestID string `json:"merge_request_id"`
- ProjectID string `json:"project_id"`
-}
diff --git a/cla-backend-go/signatures/repository.go b/cla-backend-go/signatures/repository.go
index c9483dfbe..7473c5be5 100644
--- a/cla-backend-go/signatures/repository.go
+++ b/cla-backend-go/signatures/repository.go
@@ -96,7 +96,6 @@ type SignatureRepository interface {
GetClaGroupCorporateContributors(ctx context.Context, claGroupID string, companyID *string, pageSize *int64, nextKey *string, searchTerm *string) (*models.CorporateContributorList, error)
EclaAutoCreate(ctx context.Context, signatureID string, autoCreateECLA bool) error
ActivateSignature(ctx context.Context, signatureID string) error
- GetGitLabActiveMergeRequestMetadata(ctx context.Context, gitLabAuthorUsername, gitLabAuthorEmail string) (*ActiveGitLabPullRequest, error)
}
type iclaSignatureWithDetails struct {
@@ -3036,7 +3035,7 @@ func (repo repository) UpdateApprovalList(ctx context.Context, claManager *model
// Get ICLAs
var wg sync.WaitGroup
wg.Add(len(params.RemoveGitlabUsernameApprovalList))
- for _, glUsername := range params.RemoveGitlabUsernameApprovalList {
+ for _, ghUsername := range params.RemoveGitlabUsernameApprovalList {
go func(gitLabUsername string) {
defer wg.Done()
var iclas []*models.IclaSignature
@@ -3069,7 +3068,7 @@ func (repo repository) UpdateApprovalList(ctx context.Context, claManager *model
if icla != nil {
// Convert to IclSignature instance to leverage invalidateSignatures helper function
approvalList.ICLAs = []*models.IclaSignature{{
- GitlabUsername: icla.UserGitlabUsername,
+ GitlabUsername: icla.UserGHUsername,
LfUsername: icla.UserLFID,
SignatureID: icla.SignatureID,
}}
@@ -3081,7 +3080,7 @@ func (repo repository) UpdateApprovalList(ctx context.Context, claManager *model
// Send Email
repo.sendEmail(ctx, getBestEmail(claUser), &approvalList, iclas, eclas)
- }(glUsername)
+ }(ghUsername)
}
wg.Wait()
}
@@ -4302,86 +4301,3 @@ func decodeNextKey(str string) (map[string]*dynamodb.AttributeValue, error) {
return m, nil
}
-
-// GetGitLabActiveMergeRequestMetadata returns the pull request metadata for the given user ID
-func (repo repository) GetGitLabActiveMergeRequestMetadata(ctx context.Context, gitLabAuthorUsername, gitLabAuthorEmail string) (*ActiveGitLabPullRequest, error) {
- f := logrus.Fields{
- "functionName": "v1.signatures.repository.GetGitLabActiveMergeRequestMetadata",
- utils.XREQUESTID: ctx.Value(utils.XREQUESTID),
- "gitLabAuthorUsername": gitLabAuthorUsername,
- "gitLabAuthorEmail": gitLabAuthorEmail,
- }
-
- if gitLabAuthorUsername == "" && gitLabAuthorEmail == "" {
- return nil, nil
- }
-
- expr, err := expression.NewBuilder().WithProjection(buildSignatureMetadata()).Build()
- if err != nil {
- log.WithFields(f).WithError(err).Warn("error building expression for user ID query")
- return nil, err
- }
-
- // Try to lookup based on the following keys - could be indexed by either or both (depends if user shared their
- // email and went through the GitHub authorization flow)
- var keys []string
- if gitLabAuthorUsername != "" {
- keys = append(keys, fmt.Sprintf("active_mr:u:%s", gitLabAuthorUsername))
- }
- if gitLabAuthorEmail != "" {
- keys = append(keys, fmt.Sprintf("active_mr:e:%s", gitLabAuthorEmail))
- }
-
- var activeSignature ActiveGitLabPullRequest
- for _, key := range keys {
- itemInput := &dynamodb.GetItemInput{
- Key: map[string]*dynamodb.AttributeValue{
- "key": {S: aws.String(key)},
- },
- ExpressionAttributeNames: expr.Names(),
- ProjectionExpression: expr.Projection(),
- TableName: aws.String(fmt.Sprintf("cla-%s-store", repo.stage)),
- }
-
- // Make the DynamoDb Query API call
- // log.WithFields(f).Debugf("loading active signature using key: %s", key)
- result, queryErr := repo.dynamoDBClient.GetItem(itemInput)
- if queryErr != nil {
- if queryErr.Error() == dynamodb.ErrCodeResourceNotFoundException {
- continue
- }
- log.WithFields(f).WithError(queryErr).Warnf("error retrieving active signature metadata using key: %s", key)
- return nil, queryErr
- }
-
- if result == nil || result.Item == nil || result.Item["value"] == nil || result.Item["value"].S == nil {
- log.WithFields(f).Debugf("query result is empty for key: %s", key)
- continue
- }
- if result.Item["value"] == nil || result.Item["value"].S == nil {
- log.WithFields(f).Debugf("query result value is empty for key: %s", key)
- continue
- }
-
- // Clean up the JSON string
- strValue := utils.StringValue(result.Item["value"].S)
- // log.WithFields(f).Debugf("decoding value: %s", strValue)
- if strings.HasSuffix(strValue, "\"") {
- // Trim the leading and trailing quotes from the JSON record
- strValue = strValue[1 : len(strValue)-1]
- }
- // Unescape the JSON string
- strValue = strings.Replace(strValue, "\\\"", "\"", -1)
- // log.WithFields(f).Debugf("decoding value: %s", strValue)
-
- jsonUnMarshallErr := json.Unmarshal([]byte(strValue), &activeSignature)
- if jsonUnMarshallErr != nil {
- log.WithFields(f).WithError(jsonUnMarshallErr).Warn("unable to convert model for active signature ")
- return nil, jsonUnMarshallErr
- }
-
- return &activeSignature, nil
- }
-
- return nil, nil
-}
diff --git a/cla-backend-go/signatures/service.go b/cla-backend-go/signatures/service.go
index 5d7a6b709..9a37e4a33 100644
--- a/cla-backend-go/signatures/service.go
+++ b/cla-backend-go/signatures/service.go
@@ -8,7 +8,6 @@ import (
"errors"
"fmt"
"regexp"
- "sort"
"strconv"
"strings"
"sync"
@@ -16,9 +15,6 @@ import (
"github.com/aws/aws-sdk-go/aws"
gitlab_api "github.com/communitybridge/easycla/cla-backend-go/gitlab_api"
service2 "github.com/communitybridge/easycla/cla-backend-go/project/service"
- "github.com/communitybridge/easycla/cla-backend-go/v2/common"
- "github.com/communitybridge/easycla/cla-backend-go/v2/gitlab_organizations"
- "github.com/xanzy/go-gitlab"
"github.com/communitybridge/easycla/cla-backend-go/github"
"github.com/communitybridge/easycla/cla-backend-go/github_organizations"
@@ -38,7 +34,6 @@ import (
log "github.com/communitybridge/easycla/cla-backend-go/logging"
"github.com/communitybridge/easycla/cla-backend-go/gen/v1/models"
- v2Models "github.com/communitybridge/easycla/cla-backend-go/gen/v2/models"
githubpkg "github.com/google/go-github/v37/github"
"golang.org/x/oauth2"
)
@@ -75,30 +70,23 @@ type SignatureService interface {
handleGitHubStatusUpdate(ctx context.Context, employeeUserModel *models.User) error
}
-// GitlabActivityService is a redefine the interface here to avoid circular dependency issues
-type GitlabActivityService interface {
- HasUserSigned(ctx context.Context, claGroupID string, gitlabUser *gitlab.User) (bool, error)
-}
-
type service struct {
- repo SignatureRepository
- companyService company.IService
- usersService users.Service
- eventsService events.Service
- githubOrgValidation bool
- repositoryService repositories.Service
- githubOrgService github_organizations.ServiceInterface
- gitlabOrgService gitlab_organizations.ServiceInterface
- claGroupService service2.Service
- gitLabApp *gitlab_api.App
- claBaseAPIURL string
- claLandingPage string
- claLogoURL string
- gitlabActivityService GitlabActivityService
+ repo SignatureRepository
+ companyService company.IService
+ usersService users.Service
+ eventsService events.Service
+ githubOrgValidation bool
+ repositoryService repositories.Service
+ githubOrgService github_organizations.ServiceInterface
+ claGroupService service2.Service
+ gitLabApp *gitlab_api.App
+ claBaseAPIURL string
+ claLandingPage string
+ claLogoURL string
}
// NewService creates a new signature service
-func NewService(repo SignatureRepository, companyService company.IService, usersService users.Service, eventsService events.Service, githubOrgValidation bool, repositoryService repositories.Service, githubOrgService github_organizations.ServiceInterface, gitlabOrgService gitlab_organizations.ServiceInterface, claGroupService service2.Service, gitLabApp *gitlab_api.App, CLABaseAPIURL, CLALandingPage, CLALogoURL string, gitlabActivityService GitlabActivityService) SignatureService {
+func NewService(repo SignatureRepository, companyService company.IService, usersService users.Service, eventsService events.Service, githubOrgValidation bool, repositoryService repositories.Service, githubOrgService github_organizations.ServiceInterface, claGroupService service2.Service, gitLabApp *gitlab_api.App, CLABaseAPIURL, CLALandingPage, CLALogoURL string) SignatureService {
return service{
repo,
companyService,
@@ -107,13 +95,11 @@ func NewService(repo SignatureRepository, companyService company.IService, users
githubOrgValidation,
repositoryService,
githubOrgService,
- gitlabOrgService,
claGroupService,
gitLabApp,
CLABaseAPIURL,
CLALandingPage,
CLALogoURL,
- gitlabActivityService,
}
}
@@ -489,13 +475,6 @@ func (s service) UpdateApprovalList(ctx context.Context, authUser *auth.User, cl
UserModel: userModel,
ProjectSFID: projectSFID,
}
- // Get CCLA signature - For Approval List info
- cclaSignature, err := s.repo.GetCorporateSignature(ctx, claGroupModel.ProjectID, companyModel.CompanyID, &approved, &signed)
- if err != nil || cclaSignature == nil {
- msg := fmt.Sprintf("unable to get corporate signature for CLA Group: %s and company: %s", claGroupModel.ProjectID, companyModel.CompanyID)
- log.WithFields(f).Warn(msg)
- return nil, errors.New(msg)
- }
updatedCorporateSignature, err := s.repo.UpdateApprovalList(ctx, userModel, claGroupModel, companyModel.CompanyID, params, eventArgs)
if err != nil {
@@ -503,34 +482,18 @@ func (s service) UpdateApprovalList(ctx context.Context, authUser *auth.User, cl
return updatedCorporateSignature, err
}
- for _, email := range updatedCorporateSignature.EmailApprovalList {
- if !contains(cclaSignature.EmailApprovalList, email) {
- cclaSignature.EmailApprovalList = append(cclaSignature.EmailApprovalList, email)
- }
- }
- for _, ghUserName := range updatedCorporateSignature.GithubUsernameApprovalList {
- if !contains(cclaSignature.GithubUsernameApprovalList, ghUserName) {
- cclaSignature.GithubUsernameApprovalList = append(cclaSignature.GithubUsernameApprovalList, ghUserName)
- }
- }
- for _, glUserName := range updatedCorporateSignature.GitlabUsernameApprovalList {
- if !contains(cclaSignature.GitlabUsernameApprovalList, glUserName) {
- cclaSignature.GitlabUsernameApprovalList = append(cclaSignature.GitlabUsernameApprovalList, glUserName)
- }
- }
-
// If auto create ECLA is enabled for this Corporate Agreement, then create an ECLA for each employee that was added to the approval list
// we get the complete user list as output from the processing of the approval list
var userModelList []*models.User
if corporateSigModel.AutoCreateECLA {
log.WithFields(f).Debug("auto-create ECLA option is enabled - processing auto-enable request for all items on the approval list...")
- userList, processErr := s.CreateOrUpdateEmployeeSignature(ctx, claGroupModel, companyModel, cclaSignature)
+ userList, processErr := s.CreateOrUpdateEmployeeSignature(ctx, claGroupModel, companyModel, updatedCorporateSignature)
if processErr != nil {
log.WithFields(f).WithError(processErr).Warnf("problem processing auto-enable request for company ID: %s, project ID: %s, cla group ID: %s", companyModel.CompanyID, claGroupModel.ProjectID, claGroupID)
}
userModelList = userList
} else {
- userList, processErr := s.createOrGetEmployeeModels(ctx, claGroupModel, companyModel, cclaSignature)
+ userList, processErr := s.createOrGetEmployeeModels(ctx, claGroupModel, companyModel, updatedCorporateSignature)
if processErr != nil {
log.WithFields(f).WithError(processErr).Warnf("problem processing user list for company ID: %s, project ID: %s, cla group ID: %s", companyModel.CompanyID, claGroupModel.ProjectID, claGroupID)
}
@@ -577,10 +540,6 @@ func (s service) UpdateApprovalList(ctx context.Context, authUser *auth.User, cl
if handleStatusErr != nil {
log.WithFields(f).WithError(handleStatusErr).Warnf("problem updating GitHub status for user: %+v", employeeUserModel)
}
- handleStatusErr = s.handleGitLabStatusUpdate(ctx, employeeUserModel)
- if handleStatusErr != nil {
- log.WithFields(f).WithError(handleStatusErr).Warnf("problem updating GitLabb status for user: %+v", employeeUserModel)
- }
}(utils.NewContextFromParent(ctx), employeeUserModel)
}
@@ -695,7 +654,7 @@ func (s service) createOrGetEmployeeModels(ctx context.Context, claGroupModel *m
if simpleUserInfoModelEntry.GitLabUserName != "" {
employeeUserModel, userLookupErr = s.usersService.GetUserByGitLabUsername(simpleUserInfoModelEntry.GitLabUserName)
if userLookupErr != nil {
- log.WithFields(f).WithError(userLookupErr).Warnf("problem looking up user by GitLab username: %s", simpleUserInfoModelEntry.GitLabUserName)
+ log.WithFields(f).WithError(userLookupErr).Warnf("problem looking up user by GitLab username: %s", simpleUserInfoModelEntry.GitHubUserName)
} else if userLookupErr == nil && employeeUserModel != nil {
updatedEmployeeUserModel, updateErr := s.updateUserCompanyID(ctx, employeeUserModel, companyModel)
if updatedEmployeeUserModel != nil && updateErr == nil {
@@ -731,7 +690,7 @@ func (s service) createOrGetEmployeeModels(ctx context.Context, claGroupModel *m
}
if gitLabUserModel.ID != 0 {
- simpleUserInfoModelEntry.GitLabUserID = strconv.FormatInt(int64(gitLabUserModel.ID), 10)
+ simpleUserInfoModelEntry.GitHubUserID = strconv.FormatInt(int64(gitLabUserModel.ID), 10)
}
// User may not have a public email
if gitLabUserModel.Email != "" {
@@ -1435,188 +1394,3 @@ func (s service) handleGitHubStatusUpdate(ctx context.Context, employeeUserModel
return nil
}
-
-func (s service) handleGitLabStatusUpdate(ctx context.Context, employeeUserModel *models.User) error {
- if employeeUserModel == nil {
- return fmt.Errorf("employee user model is nil")
- }
-
- f := logrus.Fields{
- "functionName": "v1.signatures.service.handleGitLabStatusUpdate",
- utils.XREQUESTID: ctx.Value(utils.XREQUESTID),
- "userID": employeeUserModel.UserID,
- "GitLabUsername": employeeUserModel.GitlabUsername,
- "GitLabID": employeeUserModel.GitlabID,
- "userEmail": employeeUserModel.LfEmail.String(),
- }
-
- log.WithFields(f).Debugf("processing GitLab status check request for user: %s", employeeUserModel.GitlabUsername)
- activeMrMetadata, activeSigErr := s.repo.GetGitLabActiveMergeRequestMetadata(ctx, employeeUserModel.GitlabUsername, employeeUserModel.LfEmail.String())
- if activeSigErr != nil {
- log.WithFields(f).WithError(activeSigErr).Warnf("unable to get active pull request metadata for user: %+v - unable to update GitLab status", employeeUserModel)
- return activeSigErr
- }
- if activeMrMetadata == nil {
- log.WithFields(f).Debugf("unable to get gitlab active merge requst metadata for user: %+v - unable to update gitlab status", employeeUserModel)
- return nil
- }
-
- // Fetch easycla repository
- claRepository, repoErr := s.repositoryService.GetRepositoryByExternalID(ctx, activeMrMetadata.RepositoryID)
- if repoErr != nil {
- log.WithFields(f).WithError(repoErr).Warnf("unable to fetch repository by ID: %s - unable to update GitLab status", activeMrMetadata.RepositoryID)
- return repoErr
- }
-
- if !claRepository.Enabled {
- log.WithFields(f).Debugf("repository: %s associated with PR: %s is NOT enabled - unable to update GitLab status", claRepository.RepositoryURL, activeMrMetadata.MergeRequestID)
- return nil
- }
-
- // fetch GitLab org details
- gitlabOrg, gitlabOrgErr := s.gitlabOrgService.GetGitLabOrganizationByName(ctx, claRepository.RepositoryOrganizationName)
- if gitlabOrgErr != nil {
- log.WithFields(f).WithError(gitlabOrgErr).Warnf("unable to lookup GitLab organization by name: %s - unable to update GitLab status", claRepository.RepositoryOrganizationName)
- return gitlabOrgErr
- }
-
- repositoryID, idErr := strconv.Atoi(activeMrMetadata.RepositoryID)
- if idErr != nil {
- log.WithFields(f).WithError(idErr).Warnf("unable to convert repository ID: %s to integer - unable to update GitLab status", activeMrMetadata.RepositoryID)
- return idErr
- }
-
- mergeRequestID, idErr := strconv.Atoi(activeMrMetadata.MergeRequestID)
- if idErr != nil {
- log.WithFields(f).WithError(idErr).Warnf("unable to convert pull request ID: %s to integer - unable to update GitLab status", activeMrMetadata.RepositoryID)
- return idErr
- }
- projectID, idErr := strconv.Atoi(activeMrMetadata.ProjectID)
- if idErr != nil {
- log.WithFields(f).WithError(idErr).Warnf("unable to convert pull request ID: %s to integer - unable to update GitLab status", activeMrMetadata.RepositoryID)
- return idErr
- }
-
- // Update change request
- log.WithFields(f).Debugf("updating change request for repository: %d, merge request: %d", repositoryID, mergeRequestID)
- updateErr := s.updateGitlabChangeRequest(ctx, gitlabOrg, int64(repositoryID), mergeRequestID, projectID, activeMrMetadata.ClaGroupID)
- if updateErr != nil {
- log.WithFields(f).WithError(updateErr).Warnf("unable to update merge request: %d", mergeRequestID)
- return updateErr
- }
-
- return nil
-}
-
-// updateChangeRequest is a helper function that updates PR - typically after the auto ecla update
-func (s service) updateGitlabChangeRequest(ctx context.Context, gitlabOrg *v2Models.GitlabOrganization, repositoryID int64, mergeRequestID int, projectID int, claGroupID string) error {
- f := logrus.Fields{
- "functionName": "v1.signatures.service.updateGitlabChangeRequest",
- "repositoryID": repositoryID,
- "mergeRequestID": mergeRequestID,
- "claGroupID": claGroupID,
- }
-
- log.WithFields(f).Debugf("internal gitlab org : %s:%s is associated with repository id : %d", gitlabOrg.OrganizationID, gitlabOrg.OrganizationName, repositoryID)
-
- // fetch updated token info
- log.WithFields(f).Debugf("refreshing gitlab org : %s:%s auth info", gitlabOrg.OrganizationID, gitlabOrg.OrganizationName)
- oauthResponse, err := s.gitlabOrgService.RefreshGitLabOrganizationAuth(ctx, common.ToCommonModel(gitlabOrg))
- if err != nil {
- return fmt.Errorf("refreshing gitlab org auth info failed : %v", err)
- }
-
- gitlabClient, err := gitlab_api.NewGitlabOauthClient(*oauthResponse, s.gitLabApp)
- if err != nil {
- return fmt.Errorf("initializing gitlab client : %v", err)
- }
-
- log.WithFields(f).Debugf("loading GitLab merge request info for merge request: %d", mergeRequestID)
- lastSha, err := gitlab_api.GetLatestCommit(gitlabClient, projectID, mergeRequestID)
- if err != nil {
- return fmt.Errorf("fetching info for mr : %d and project : %d, failed : %v", mergeRequestID, projectID, err)
- }
- lastCommitSha := lastSha.ID
-
- f["lastCommitSha"] = lastCommitSha
- log.WithFields(f).Debugf("last commit sha for merge request: %d is %s", mergeRequestID, lastCommitSha)
-
- _, err = gitlab_api.FetchMrInfo(gitlabClient, projectID, mergeRequestID)
- if err != nil {
- return fmt.Errorf("fetching info for mr : %d and project : %d, failed : %v", mergeRequestID, projectID, err)
- }
-
- log.WithFields(f).Debugf("loading GitLab merge request participatants for merge request: %d", mergeRequestID)
- participants, err := gitlab_api.FetchMrParticipants(gitlabClient, projectID, mergeRequestID)
- if err != nil {
- log.WithFields(f).WithError(err).Warnf("problem loading GitLab merge request participants for merge request: %d", mergeRequestID)
- return fmt.Errorf("problem loading GitLab merge request participants for merge request: %d - error: %+v", mergeRequestID, err)
- }
-
- if len(participants) == 0 {
- return fmt.Errorf("no participants found in GitLab mr : %d, and gitlab project : %d", mergeRequestID, projectID)
- }
-
- log.WithFields(f).Debugf("found %d participants for the MR ", len(participants))
- missingCLAMsg := "Missing CLA Authorization"
- signedCLAMsg := "EasyCLA check passed. You are authorized to contribute."
-
- var missingUsers []*utils.GatedGitlabUser
- var signedUsers []*gitlab.User
- for _, gitlabUser := range participants {
- log.WithFields(f).Debugf("checking if GitLab user: %s (%d) with email: %s has signed", gitlabUser.Username, gitlabUser.ID, gitlabUser.Email)
- userSigned, signedCheckErr := s.gitlabActivityService.HasUserSigned(ctx, claGroupID, gitlabUser)
- if signedCheckErr != nil {
- log.WithFields(f).WithError(signedCheckErr).Warnf("problem checking if user : %s (%d) has signed - assuming not signed", gitlabUser.Username, gitlabUser.ID)
- missingUsers = append(missingUsers, &utils.GatedGitlabUser{
- User: gitlabUser,
- Err: err,
- })
- continue
- }
- if userSigned {
- log.WithFields(f).Infof("gitlabUser: %s (%d) has signed", gitlabUser.Username, gitlabUser.ID)
- signedUsers = append(signedUsers, gitlabUser)
- } else {
- log.WithFields(f).Infof("gitlabUser: %s (%d) has NOT signed", gitlabUser.Username, gitlabUser.ID)
- missingUsers = append(missingUsers, &utils.GatedGitlabUser{
- User: gitlabUser,
- Err: err,
- })
- }
- }
-
- signURL := utils.GetFullSignURL(gitlabOrg.OrganizationID, strconv.Itoa(int(repositoryID)), strconv.Itoa(mergeRequestID))
- mrCommentContent := utils.PrepareMrCommentContent(missingUsers, signedUsers, signURL)
- if len(missingUsers) > 0 {
- log.WithFields(f).Errorf("merge request faild with 1 or more users not passing authorization - failed users : %+v", missingUsers)
- if statusErr := gitlab_api.SetCommitStatus(gitlabClient, projectID, lastCommitSha, gitlab.Failed, missingCLAMsg, signURL); statusErr != nil {
- log.WithFields(f).WithError(statusErr).Warnf("problem setting the commit status for merge request ID: %d, sha: %s", mergeRequestID, lastCommitSha)
- return fmt.Errorf("setting commit status failed : %v", statusErr)
- }
-
- if mrCommentErr := gitlab_api.SetMrComment(gitlabClient, projectID, mergeRequestID, mrCommentContent); mrCommentErr != nil {
- log.WithFields(f).WithError(mrCommentErr).Warnf("problem setting the commit merge request comment for merge request ID: %d", mergeRequestID)
- return fmt.Errorf("setting comment failed : %v", mrCommentErr)
- }
-
- return nil
- }
-
- commitStatusErr := gitlab_api.SetCommitStatus(gitlabClient, projectID, lastCommitSha, gitlab.Success, signedCLAMsg, "")
- if commitStatusErr != nil {
- log.WithFields(f).WithError(commitStatusErr).Warnf("problem setting the commit status for merge request ID: %d, sha: %s", mergeRequestID, lastCommitSha)
- return fmt.Errorf("setting commit status failed : %v", commitStatusErr)
- }
-
- if mrCommentErr := gitlab_api.SetMrComment(gitlabClient, projectID, mergeRequestID, mrCommentContent); mrCommentErr != nil {
- log.WithFields(f).WithError(mrCommentErr).Warnf("problem setting the commit merge request comment for merge request ID: %d", mergeRequestID)
- return fmt.Errorf("setting comment failed : %v", mrCommentErr)
- }
- return nil
-}
-
-func contains(s []string, searchterm string) bool {
- i := sort.SearchStrings(s, searchterm)
- return i < len(s) && s[i] == searchterm
-}
diff --git a/cla-backend-go/utils/gitlab.go b/cla-backend-go/utils/gitlab.go
deleted file mode 100644
index 4dede91df..000000000
--- a/cla-backend-go/utils/gitlab.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright The Linux Foundation and each contributor to CommunityBridge.
-// SPDX-License-Identifier: MIT
-
-package utils
-
-import (
- "errors"
- "fmt"
-
- "github.com/communitybridge/easycla/cla-backend-go/config"
- log "github.com/communitybridge/easycla/cla-backend-go/logging"
- "github.com/sirupsen/logrus"
- "github.com/xanzy/go-gitlab"
-)
-
-type GatedGitlabUser struct {
- *gitlab.User
- Err error
-}
-
-var missingCompanyAffiliation = errors.New("must confirm affiliation with their company")
-
-func PrepareMrCommentContent(missingUsers []*GatedGitlabUser, signedUsers []*gitlab.User, signURL string) string {
- landingPage := config.GetConfig().CLALandingPage
- landingPage += "/#/?version=2"
-
- var badgeHyperlink string
- if len(missingUsers) > 0 {
- badgeHyperlink = signURL
- } else {
- badgeHyperlink = landingPage
- }
-
- coveredBadge := fmt.Sprintf(`
-
`, badgeHyperlink)
- failedBadge := fmt.Sprintf(`
-
`, badgeHyperlink)
- // missingUserIDBadge := fmt.Sprintf(`
- //
`, badgeHyperlink)
- confirmationNeededBadge := fmt.Sprintf(`
-
`, badgeHyperlink)
-
- var body string
-
- const startUl = "