Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
7451617
MI-1845: Added tooltip for pull request and issue links
shivamjosh Jun 1, 2022
915f7e8
MI-1845: Done review fixes
shivamjosh Jun 6, 2022
1805313
Merge pull request #5 from Brightscout/MI-1845
shivamjosh Jun 6, 2022
5e8f935
Added the verbose flag to the npm install command in Makefile to fix …
shivamjosh Jun 6, 2022
65f1b7c
Merge branch 'link_tooltip' of github.com:Brightscout/mattermost-plug…
shivamjosh Jun 6, 2022
acd24e3
Fixed lint errors
shivamjosh Jun 7, 2022
b339c6f
Added regex for url valiation and constants for link types and states
shivamjosh Jun 17, 2022
13f0747
Fixed linting errors
shivamjosh Jun 17, 2022
cfe9658
Removed unnecessary escape character
shivamjosh Jun 17, 2022
94e59dd
Minor code improvement
shivamjosh Jun 17, 2022
73389ab
Fixed CI lint error
shivamjosh Jun 17, 2022
072a9e2
Added babel config for optional chaining
shivamjosh Jun 17, 2022
80393bf
Added missing trailing comma
shivamjosh Jun 17, 2022
ec0ba0f
Fixed typo
shivamjosh Jun 28, 2022
7ffa95f
Merge branch 'link_tooltip' of github.com:Brightscout/mattermost-plug…
Jul 4, 2022
a780e8c
[MI-1919] Fixes issue in link tooltip
Jul 27, 2022
446ddf4
Merge branch 'master' of github.com:Brightscout/mattermost-plugin-git…
Jul 27, 2022
82ca920
Merge branch 'link_tooltip' of github.com:Brightscout/mattermost-plug…
Jul 27, 2022
0322305
Merge pull request #15 from Brightscout/MI-1919
Jul 27, 2022
9077173
[MI-1995] Fixed failing CI in link tooltip PR
Jul 28, 2022
2fd680a
Merge pull request #16 from Brightscout/MI-1995
Aug 3, 2022
bd999aa
Fixed spacing around 'on' using js instead of using css
Aug 26, 2022
d9eeb4f
Merge branch 'master' of github.com:mattermost/mattermost-plugin-gitl…
Nov 25, 2022
60c7447
Merge branch 'master' of github.com:mattermost/mattermost-plugin-gitl…
Dec 15, 2022
f850420
[MI-2755] Review fixes on gitlab PR #301
Feb 13, 2023
e340331
Merge pull request #29 from Brightscout/MI-2755
Feb 14, 2023
f7e03d9
[MI 2837]: Done the review fixes of a gitlab PR #301 (#30)
Nityanand13 Mar 30, 2023
7f41bea
Merge branch 'master' of github.com:mattermost/mattermost-plugin-gitl…
Mar 30, 2023
c21c9cc
[MI-2963]: Did the review fixes of gitlab PR #301 (#32)
Nityanand13 Apr 5, 2023
8d6276a
[MI-2986] Review fixes on Gitlab PR #301(Add link tooltip)
Apr 11, 2023
e3e08f3
Merge pull request #34 from Brightscout/MI-2986
Apr 11, 2023
8777bf3
Merge branch 'master' of github.com:mattermost/mattermost-plugin-gitl…
May 10, 2023
424eec9
Merge branch 'master' of github.com:mattermost/mattermost-plugin-gitl…
Nov 28, 2023
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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ endif
## Ensures NPM dependencies are installed without having to run this all the time.
webapp/node_modules: $(wildcard webapp/package.json)
ifneq ($(HAS_WEBAPP),)
cd webapp && $(NPM) install
cd webapp && $(NPM) install --verbose
touch $@
endif

Expand Down
42 changes: 42 additions & 0 deletions server/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ func (p *Plugin) initializeAPI() {
apiRouter.HandleFunc("/yourprs", p.checkAuth(p.attachUserContext(p.getYourPrs), ResponseTypePlain)).Methods(http.MethodGet)
apiRouter.HandleFunc("/yourassignments", p.checkAuth(p.attachUserContext(p.getYourAssignments), ResponseTypePlain)).Methods(http.MethodGet)
apiRouter.HandleFunc("/unreads", p.checkAuth(p.attachUserContext(p.getUnreads), ResponseTypePlain)).Methods(http.MethodGet)
apiRouter.HandleFunc("/issue", p.checkAuth(p.attachUserContext(p.getIssueByNumber), ResponseTypeJSON)).Methods(http.MethodGet)
apiRouter.HandleFunc("/mergerequest", p.checkAuth(p.attachUserContext(p.getMergeRequestByNumber), ResponseTypeJSON)).Methods(http.MethodGet)

apiRouter.HandleFunc("/settings", p.checkAuth(p.attachUserContext(p.updateSettings), ResponseTypePlain)).Methods(http.MethodPost)
}
Expand Down Expand Up @@ -595,3 +597,43 @@ func (p *Plugin) updateSettings(c *UserContext, w http.ResponseWriter, r *http.R

p.writeAPIResponse(w, info.Settings)
}

func (p *Plugin) getIssueByNumber(c *UserContext, w http.ResponseWriter, r *http.Request) {
owner := r.FormValue("owner")
repo := r.FormValue("repo")
issueID, err := strconv.Atoi(r.FormValue("number"))
if err != nil {
c.Log.WithError(err).Warnf("Unable to convert issueID into int")
p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to convert issueID into int.", StatusCode: http.StatusInternalServerError})
return
}

issue, err := p.GitlabClient.GetIssueByID(c.Ctx, c.GitlabInfo, owner, repo, issueID)
if err != nil {
c.Log.WithError(err).Warnf("Unable to get issue in GitLab API")
p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to get issue in GitLab API.", StatusCode: http.StatusInternalServerError})
return
}

p.writeAPIResponse(w, issue)
}

func (p *Plugin) getMergeRequestByNumber(c *UserContext, w http.ResponseWriter, r *http.Request) {
owner := r.FormValue("owner")
repo := r.FormValue("repo")
mergeRequestID, err := strconv.Atoi(r.FormValue("number"))
if err != nil {
c.Log.WithError(err).Warnf("Unable to convert mergeRequestID into int")
p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to convert mergeRequestID into int.", StatusCode: http.StatusInternalServerError})
return
}

mergeRequest, err := p.GitlabClient.GetMergeRequestByID(c.Ctx, c.GitlabInfo, owner, repo, mergeRequestID)
if err != nil {
c.Log.WithError(err).Warnf("Unable to get merge request in GitLab API")
p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to get merge request in GitLab API.", StatusCode: http.StatusInternalServerError})
return
}

p.writeAPIResponse(w, mergeRequest)
}
82 changes: 82 additions & 0 deletions server/gitlab/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ const (
scopeAll = "all"
)

type Issue struct {
*internGitlab.Issue
LabelsWithDetails []*internGitlab.Label `json:"labels_with_details,omitempty"`
}

type MergeRequest struct {
*internGitlab.MergeRequest
LabelsWithDetails []*internGitlab.Label `json:"labels_with_details,omitempty"`
}

// NewGroupHook creates a webhook associated with a GitLab group
func (g *gitlab) NewGroupHook(ctx context.Context, user *UserInfo, groupName string, webhookOptions *AddWebhookOptions) (*WebhookInfo, error) {
client, err := g.gitlabConnect(*user.Token)
Expand Down Expand Up @@ -473,3 +483,75 @@ func (g *gitlab) ResolveNamespaceAndProject(
}
return "", "", ErrNotFound
}

func (g *gitlab) GetIssueByID(ctx context.Context, user *UserInfo, owner, repo string, issueID int) (*Issue, error) {
client, err := g.gitlabConnect(*user.Token)
if err != nil {
return nil, err
}
projectPath := fmt.Sprintf("%s/%s", owner, repo)
issue, resp, err := client.Issues.GetIssue(projectPath, issueID)
if respErr := checkResponse(resp); respErr != nil {
return nil, respErr
}
if err != nil {
return nil, errors.Wrap(err, "can't get issue in GitLab api")
}

gitlabIssue := &Issue{
Issue: issue,
}
if issue.Labels != nil {
labelsWithDetails, err := g.GetLabelDetails(client, projectPath, issue.Labels)
if err != nil {
return nil, err
}
gitlabIssue.LabelsWithDetails = labelsWithDetails
}

return gitlabIssue, nil
}

func (g *gitlab) GetMergeRequestByID(ctx context.Context, user *UserInfo, owner, repo string, mergeRequestID int) (*MergeRequest, error) {
client, err := g.gitlabConnect(*user.Token)
if err != nil {
return nil, err
}
projectPath := fmt.Sprintf("%s/%s", owner, repo)
mergeRequest, resp, err := client.MergeRequests.GetMergeRequest(projectPath, mergeRequestID, nil)
if respErr := checkResponse(resp); respErr != nil {
return nil, respErr
}
if err != nil {
return nil, errors.Wrap(err, "can't get merge request in GitLab api")
}

gitlabMergeRequest := &MergeRequest{
MergeRequest: mergeRequest,
}
if mergeRequest.Labels != nil {
labelsWithDetails, err := g.GetLabelDetails(client, projectPath, mergeRequest.Labels)
if err != nil {
return nil, err
}
gitlabMergeRequest.LabelsWithDetails = labelsWithDetails
}

return gitlabMergeRequest, nil
}

func (g *gitlab) GetLabelDetails(client *internGitlab.Client, projectPath string, labels internGitlab.Labels) ([]*internGitlab.Label, error) {
var labelsWithDetails []*internGitlab.Label
for _, label := range labels {
labelWithDetails, resp, err := client.Labels.GetLabel(projectPath, label)
if respErr := checkResponse(resp); respErr != nil {
return nil, respErr
}
if err != nil {
return nil, errors.Wrap(err, "can't get label in GitLab api")
}
labelsWithDetails = append(labelsWithDetails, labelWithDetails)
}

return labelsWithDetails, nil
}
2 changes: 2 additions & 0 deletions server/gitlab/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ type Gitlab interface {
GetGroupHooks(ctx context.Context, user *UserInfo, owner string) ([]*WebhookInfo, error)
NewProjectHook(ctx context.Context, user *UserInfo, projectID interface{}, projectHookOptions *AddWebhookOptions) (*WebhookInfo, error)
NewGroupHook(ctx context.Context, user *UserInfo, groupName string, groupHookOptions *AddWebhookOptions) (*WebhookInfo, error)
GetIssueByID(ctx context.Context, user *UserInfo, owner, repo string, issueID int) (*Issue, error)
GetMergeRequestByID(ctx context.Context, user *UserInfo, owner, repo string, mergeRequestID int) (*MergeRequest, error)
// ResolveNamespaceAndProject accepts full path to User, Group or namespaced Project and returns corresponding
// namespace and project name.
//
Expand Down
30 changes: 30 additions & 0 deletions server/gitlab/mocks/mock_gitlab.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions server/mocks/mock_gitlab.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading