From dee78df69563ee7847d98f672d8f02c91554b53a Mon Sep 17 00:00:00 2001 From: phdesroUbi <83839027+phdesroUbi@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:53:39 -0400 Subject: [PATCH] Add ResourceEvents for merge requests (#547) * Add ResourceEvents for merge requests - Closes #546 * added resources uses in mock * comment fixes * modified mock for resourceLabelEvent for MRs [skip ci] * added resourceMilestones to mock and tests * api changes * added comment to tests --- NGitLab.Mock.Tests/MergeRequestsMockTests.cs | 122 ++++++++++++++++++ NGitLab.Mock/Clients/IssueClient.cs | 105 +-------------- NGitLab.Mock/Clients/MergeRequestClient.cs | 80 +++++++++++- NGitLab.Mock/ResourceLabelEventCollection.cs | 58 +++++++++ .../ResourceMilestoneEventCollection.cs | 42 ++++++ NGitLab.Mock/ResourceStateEventCollection.cs | 24 ++++ NGitLab/IMergeRequestClient.cs | 33 +++++ NGitLab/Impl/MergeRequestClient.cs | 20 ++- NGitLab/PublicAPI.Unshipped.txt | 6 + 9 files changed, 379 insertions(+), 111 deletions(-) diff --git a/NGitLab.Mock.Tests/MergeRequestsMockTests.cs b/NGitLab.Mock.Tests/MergeRequestsMockTests.cs index 2e35f717..2f5bf362 100644 --- a/NGitLab.Mock.Tests/MergeRequestsMockTests.cs +++ b/NGitLab.Mock.Tests/MergeRequestsMockTests.cs @@ -290,5 +290,127 @@ public void Test_merge_request_with_head_pipeline() var pipeline = project.Pipelines.Add(branch, JobStatus.Success, user); Assert.AreEqual(pipeline, mr.HeadPipeline, "A pipeline was just created on the source branch"); } + + [Test] + public void Test_merge_request_resource_state_events_found_on_close_and_reopen() + { + using var server = new GitLabConfig() + .WithUser("user1", isDefault: true) + .WithUser("user2") + .WithProject("Test", configure: project => project + .WithMergeRequest("branch-01", title: "Merge request 1", author: "user1", assignee: "user2")) + .BuildServer(); + + var client = server.CreateClient("user1"); + var projectId = server.AllProjects.First().Id; + var mrClient = client.GetMergeRequest(projectId); + var mergeRequest = mrClient.Get(new MergeRequestQuery { Scope = "created_by_me" }).First(); + + mrClient.Close(mergeRequest.Iid); + mrClient.Reopen(mergeRequest.Iid); + + var resourceStateEvents = mrClient.ResourceStateEventsAsync(projectId: projectId, mergeRequestIid: mergeRequest.Iid).ToArray(); + Assert.AreEqual(2, resourceStateEvents.Length); + + var closeStateEvents = resourceStateEvents.Where(e => string.Equals(e.State, "closed", StringComparison.Ordinal)).ToArray(); + Assert.AreEqual(1, closeStateEvents.Length); + + var reopenMilestoneEvents = resourceStateEvents.Where(e => string.Equals(e.State, "reopened", StringComparison.Ordinal)).ToArray(); + Assert.AreEqual(1, reopenMilestoneEvents.Length); + } + + [Test] + public void Test_merge_request_resource_label_events_found() + { + using var server = new GitLabConfig() + .WithUser("user1", isDefault: true) + .WithUser("user2") + .WithProject("Test", configure: project => project + .WithMergeRequest("branch-01", title: "Merge request 1", author: "user1", assignee: "user2")) + .BuildServer(); + + var client = server.CreateClient("user1"); + var projectId = server.AllProjects.First().Id; + var mrClient = client.GetMergeRequest(projectId); + var mergeRequest = mrClient.Get(new MergeRequestQuery { Scope = "created_by_me" }).First(); + + mrClient.Update(mergeRequest.Iid, new MergeRequestUpdate() + { + AddLabels = "first,second,third", + }); + + mrClient.Update(mergeRequest.Iid, new MergeRequestUpdate() + { + RemoveLabels = "second", + }); + + mrClient.Update(mergeRequest.Iid, new MergeRequestUpdate() + { + Labels = "first,second", + }); + + /* We're expecting this sequence + * 1. Add first + * 1. Add second + * 1. Add third + * 2. Remove second + * 3. Add second + * 3. Remove third + */ + var resourceLabelEvents = mrClient.ResourceLabelEventsAsync(projectId: projectId, mergeRequestIid: mergeRequest.Iid).ToArray(); + Assert.AreEqual(6, resourceLabelEvents.Length); + + var addLabelEvents = resourceLabelEvents.Where(e => e.Action == ResourceLabelEventAction.Add).ToArray(); + Assert.AreEqual(4, addLabelEvents.Length); + + var removeLabelEvents = resourceLabelEvents.Where(e => e.Action == ResourceLabelEventAction.Remove).ToArray(); + Assert.AreEqual(2, removeLabelEvents.Length); + } + + [Test] + public void Test_merge_request_resource_milestone_events_found() + { + using var server = new GitLabConfig() + .WithUser("user1", isDefault: true) + .WithUser("user2") + .WithProject("Test", configure: project => project + .WithMergeRequest("branch-01", title: "Merge request 1", author: "user1", assignee: "user2") + .WithMilestone("Milestone 1") + .WithMilestone("Milestone 2")) + .BuildServer(); + + var client = server.CreateClient("user1"); + var projectId = server.AllProjects.First().Id; + var mrClient = client.GetMergeRequest(projectId); + var mergeRequest = mrClient.Get(new MergeRequestQuery { Scope = "created_by_me" }).First(); + var milestones = client.GetMilestone(1).All.ToArray(); + + mrClient.Update(mergeRequest.Iid, new MergeRequestUpdate() + { + MilestoneId = milestones[0].Id, + }); + + mrClient.Update(mergeRequest.Iid, new MergeRequestUpdate() + { + MilestoneId = milestones[1].Id, + }); + + /* We're expecting this sequence + * 1. Add milestone 1 + * 2. Remove milestone 1 + * 2. Add milestone 2 + */ + var resourceMilestoneEvents = mrClient.ResourceMilestoneEventsAsync(projectId: projectId, mergeRequestIid: mergeRequest.Iid).ToArray(); + Assert.AreEqual(3, resourceMilestoneEvents.Length); + + var removeMilestoneEvents = resourceMilestoneEvents.Where(e => e.Action == ResourceMilestoneEventAction.Remove).ToArray(); + Assert.AreEqual(1, removeMilestoneEvents.Length); + Assert.AreEqual(milestones[0].Id, removeMilestoneEvents[0].Milestone.Id); + + var addMilestoneEvents = resourceMilestoneEvents.Where(e => e.Action == ResourceMilestoneEventAction.Add).ToArray(); + Assert.AreEqual(2, addMilestoneEvents.Length); + Assert.AreEqual(milestones[0].Id, addMilestoneEvents[0].Milestone.Id); + Assert.AreEqual(milestones[1].Id, addMilestoneEvents[1].Milestone.Id); + } } } diff --git a/NGitLab.Mock/Clients/IssueClient.cs b/NGitLab.Mock/Clients/IssueClient.cs index bc1a342b..394097fc 100644 --- a/NGitLab.Mock/Clients/IssueClient.cs +++ b/NGitLab.Mock/Clients/IssueClient.cs @@ -84,7 +84,7 @@ public Models.Issue Edit(IssueEdit issueEdit) if (issueEdit.MilestoneId.HasValue) { issueToModify.Milestone = GetMilestone(projectId, issueEdit.MilestoneId.Value); - CreateResourceMilestoneEvents(issueToModify.Id, prevMilestone, issueToModify.Milestone); + Server.ResourceMilestoneEvents.CreateResourceMilestoneEvents(Context.User, issueToModify.Id, prevMilestone, issueToModify.Milestone, "Issue"); } issueToModify.Title = issueEdit.Title; @@ -107,7 +107,7 @@ public Models.Issue Edit(IssueEdit issueEdit) if (labelsEdit is not null) { - CreateResourceLabelEvents(issueToModify.Labels, labelsEdit, issueToModify.Id); + Server.ResourceLabelEvents.CreateResourceLabelEvents(Context.User, issueToModify.Labels, labelsEdit, issueToModify.Id, "issue"); issueToModify.Labels = labelsEdit; } @@ -451,106 +451,5 @@ private IEnumerable FilterByQuery(IEnumerable issues, IssueQuery q return issues; } - - private void CreateResourceLabelEvents(string[] previousLabels, string[] newLabels, int resourceId) - { - var currentUser = Context.User; - - foreach (var label in previousLabels) - { - if (!newLabels.Any(l => string.Equals(l, label, StringComparison.OrdinalIgnoreCase))) - { - Server.ResourceLabelEvents.Add(new ResourceLabelEvent() - { - Action = ResourceLabelEventAction.Remove, - Label = new Label() { Name = label }, - ResourceId = resourceId, - CreatedAt = DateTime.UtcNow, - Id = Server.GetNewResourceLabelEventId(), - User = new Author() - { - Id = currentUser.Id, - Email = currentUser.Email, - AvatarUrl = currentUser.AvatarUrl, - Name = currentUser.Name, - State = currentUser.State.ToString(), - Username = currentUser.UserName, - CreatedAt = currentUser.CreatedAt, - WebUrl = currentUser.WebUrl, - }, - ResourceType = "issue", - }); - } - } - - foreach (var label in newLabels) - { - if (!previousLabels.Any(l => string.Equals(l, label, StringComparison.OrdinalIgnoreCase))) - { - Server.ResourceLabelEvents.Add(new ResourceLabelEvent() - { - Action = ResourceLabelEventAction.Add, - Label = new Label() { Name = label }, - ResourceId = resourceId, - CreatedAt = DateTime.UtcNow, - Id = Server.GetNewResourceLabelEventId(), - User = new Author() - { - Id = currentUser.Id, - Email = currentUser.Email, - AvatarUrl = currentUser.AvatarUrl, - Name = currentUser.Name, - State = currentUser.State.ToString(), - Username = currentUser.UserName, - CreatedAt = currentUser.CreatedAt, - WebUrl = currentUser.WebUrl, - }, - ResourceType = "issue", - }); - } - } - } - - private void CreateResourceMilestoneEvents(int resourceId, Milestone previousMilestone, Milestone newMilestone) - { - if (previousMilestone is null) - { - CreateResourceMilestoneEvent(resourceId, newMilestone, ResourceMilestoneEventAction.Add); - } - else if (newMilestone is not null && previousMilestone is not null) - { - if (newMilestone.Id != previousMilestone.Id) - { - CreateResourceMilestoneEvent(resourceId, previousMilestone, ResourceMilestoneEventAction.Remove); - } - - CreateResourceMilestoneEvent(resourceId, newMilestone, ResourceMilestoneEventAction.Add); - } - } - - private void CreateResourceMilestoneEvent(int resourceId, Milestone milestone, ResourceMilestoneEventAction action) - { - var currentUser = Context.User; - Server.ResourceMilestoneEvents.Add(new ResourceMilestoneEvent() - { - Action = action, - Milestone = milestone, - ResourceId = resourceId, - CreatedAt = DateTime.UtcNow, - Id = Server.GetNewResourceLabelEventId(), - User = new Author() - { - Id = currentUser.Id, - Email = currentUser.Email, - AvatarUrl = currentUser.AvatarUrl, - Name = currentUser.Name, - State = currentUser.State.ToString(), - Username = currentUser.UserName, - CreatedAt = currentUser.CreatedAt, - WebUrl = currentUser.WebUrl, - }, - ResourceType = "issue", - }); - } } } diff --git a/NGitLab.Mock/Clients/MergeRequestClient.cs b/NGitLab.Mock/Clients/MergeRequestClient.cs index b7354542..201bd7ad 100644 --- a/NGitLab.Mock/Clients/MergeRequestClient.cs +++ b/NGitLab.Mock/Clients/MergeRequestClient.cs @@ -5,6 +5,7 @@ using System.Net; using System.Threading; using System.Threading.Tasks; +using NGitLab.Mock.Internals; using NGitLab.Models; namespace NGitLab.Mock.Clients @@ -262,6 +263,8 @@ public Models.MergeRequest Close(int mergeRequestIid) mergeRequest.ClosedAt = DateTimeOffset.UtcNow; mergeRequest.UpdatedAt = DateTimeOffset.UtcNow; + + Server.ResourceStateEvents.CreateResourceStateEvent(Context.User, "closed", mergeRequest.Id, "MergeRequest"); return mergeRequest.ToMergeRequestClient(); } } @@ -326,22 +329,43 @@ public Models.MergeRequest Create(MergeRequestCreate mergeRequestCreate) mergeRequest.Description = mergeRequestCreate.Description; mergeRequest.ShouldRemoveSourceBranch = mergeRequestCreate.RemoveSourceBranch; mergeRequest.Squash = mergeRequestCreate.Squash; - SetLabels(mergeRequest, mergeRequestCreate.Labels); + SetLabels(mergeRequest, mergeRequestCreate.Labels, labelsToAdd: null, labelsToRemove: null); return mergeRequest.ToMergeRequestClient(); } } - private static void SetLabels(MergeRequest mergeRequest, string labels) + private void SetLabels(MergeRequest mergeRequest, string labels, string labelsToAdd, string labelsToRemove) { - if (labels != null) + if (labels is not null || labelsToAdd is not null || labelsToRemove is not null) { + var newLabels = mergeRequest.Labels.ToArray(); + if (labels is not null) + { + newLabels = labels.Split(',').Distinct(StringComparer.Ordinal).ToArray(); + } + + if (labelsToAdd is not null) + { + newLabels = newLabels.Concat(labelsToAdd.Split(',')).Distinct(StringComparer.Ordinal).ToArray(); + } + + if (labelsToRemove is not null) + { + newLabels = newLabels.Except(labelsToRemove.Split(','), StringComparer.Ordinal).Distinct(StringComparer.Ordinal).ToArray(); + } + + if (newLabels is not null) + { + Server.ResourceLabelEvents.CreateResourceLabelEvents(Context.User, mergeRequest.Labels.ToArray(), newLabels, mergeRequest.Id, "MergeRequest"); + } + mergeRequest.Labels.Clear(); - foreach (var label in labels.Split(',')) + foreach (var newLabel in newLabels) { - if (!string.IsNullOrEmpty(label)) + if (!string.IsNullOrEmpty(newLabel)) { - mergeRequest.Labels.Add(label); + mergeRequest.Labels.Add(newLabel); } } } @@ -571,6 +595,8 @@ public Models.MergeRequest Reopen(int mergeRequestIid) mergeRequest.ClosedAt = null; mergeRequest.UpdatedAt = DateTimeOffset.UtcNow; + + Server.ResourceStateEvents.CreateResourceStateEvent(Context.User, "reopened", mergeRequest.Id, "MergeRequest"); return mergeRequest.ToMergeRequestClient(); } } @@ -621,6 +647,13 @@ public Models.MergeRequest Update(int mergeRequestIid, MergeRequestUpdate mergeR } } + if (mergeRequestUpdate.MilestoneId != null) + { + var prevMilestone = mergeRequest.Milestone; + mergeRequest.Milestone = GetMilestone(project.Id, mergeRequestUpdate.MilestoneId.Value); + Server.ResourceMilestoneEvents.CreateResourceMilestoneEvents(Context.User, mergeRequest.Id, prevMilestone, mergeRequest.Milestone, "MergeRequest"); + } + if (mergeRequestUpdate.ReviewerIds != null) { foreach (var reviewerId in mergeRequestUpdate.ReviewerIds) @@ -658,7 +691,7 @@ public Models.MergeRequest Update(int mergeRequestIid, MergeRequestUpdate mergeR mergeRequest.Title = mergeRequestUpdate.Title; } - SetLabels(mergeRequest, mergeRequestUpdate.Labels); + SetLabels(mergeRequest, mergeRequestUpdate.Labels, mergeRequestUpdate.AddLabels, mergeRequestUpdate.RemoveLabels); mergeRequest.UpdatedAt = DateTimeOffset.UtcNow; return mergeRequest.ToMergeRequestClient(); @@ -681,5 +714,38 @@ public IMergeRequestDiscussionClient Discussions(int mergeRequestIid) return new MergeRequestDiscussionClient(Context, _projectId.GetValueOrDefault(), mergeRequestIid); } + + public GitLabCollectionResponse ResourceLabelEventsAsync(int projectId, int mergeRequestIid) + { + using (Context.BeginOperationScope()) + { + var mergeRequest = GetMergeRequest(projectId, mergeRequestIid); + var resourceLabelEvents = Server.ResourceLabelEvents.Get(mergeRequest.Id); + + return GitLabCollectionResponse.Create(resourceLabelEvents.Select(rle => rle.ToClientResourceLabelEvent())); + } + } + + public GitLabCollectionResponse ResourceMilestoneEventsAsync(int projectId, int mergeRequestIid) + { + using (Context.BeginOperationScope()) + { + var mergeRequest = GetMergeRequest(projectId, mergeRequestIid); + var resourceMilestoneEvents = Server.ResourceMilestoneEvents.Get(mergeRequest.Id); + + return GitLabCollectionResponse.Create(resourceMilestoneEvents.Select(rme => rme.ToClientResourceMilestoneEvent())); + } + } + + public GitLabCollectionResponse ResourceStateEventsAsync(int projectId, int mergeRequestIid) + { + using (Context.BeginOperationScope()) + { + var mergeRequest = GetMergeRequest(projectId, mergeRequestIid); + var resourceStateEvents = Server.ResourceStateEvents.Get(mergeRequest.Id); + + return GitLabCollectionResponse.Create(resourceStateEvents.Select(rle => rle.ToClientResourceStateEvent())); + } + } } } diff --git a/NGitLab.Mock/ResourceLabelEventCollection.cs b/NGitLab.Mock/ResourceLabelEventCollection.cs index d48057f6..bb073045 100644 --- a/NGitLab.Mock/ResourceLabelEventCollection.cs +++ b/NGitLab.Mock/ResourceLabelEventCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using NGitLab.Models; namespace NGitLab.Mock { @@ -40,5 +41,62 @@ private int GetNewId() { return this.Select(rle => rle.Id).DefaultIfEmpty().Max() + 1; } + + internal void CreateResourceLabelEvents(User currentUser, string[] previousLabels, string[] newLabels, int resourceId, string resourceType) + { + foreach (var label in previousLabels) + { + if (!newLabels.Any(l => string.Equals(l, label, StringComparison.OrdinalIgnoreCase))) + { + Add(new ResourceLabelEvent() + { + Action = ResourceLabelEventAction.Remove, + Label = new Label() { Name = label }, + ResourceId = resourceId, + CreatedAt = DateTime.UtcNow, + Id = Server.GetNewResourceLabelEventId(), + User = new Author() + { + Id = currentUser.Id, + Email = currentUser.Email, + AvatarUrl = currentUser.AvatarUrl, + Name = currentUser.Name, + State = currentUser.State.ToString(), + Username = currentUser.UserName, + CreatedAt = currentUser.CreatedAt, + WebUrl = currentUser.WebUrl, + }, + ResourceType = resourceType, + }); + } + } + + foreach (var label in newLabels) + { + if (!previousLabels.Any(l => string.Equals(l, label, StringComparison.OrdinalIgnoreCase))) + { + Add(new ResourceLabelEvent() + { + Action = ResourceLabelEventAction.Add, + Label = new Label() { Name = label }, + ResourceId = resourceId, + CreatedAt = DateTime.UtcNow, + Id = Server.GetNewResourceLabelEventId(), + User = new Author() + { + Id = currentUser.Id, + Email = currentUser.Email, + AvatarUrl = currentUser.AvatarUrl, + Name = currentUser.Name, + State = currentUser.State.ToString(), + Username = currentUser.UserName, + CreatedAt = currentUser.CreatedAt, + WebUrl = currentUser.WebUrl, + }, + ResourceType = resourceType, + }); + } + } + } } } diff --git a/NGitLab.Mock/ResourceMilestoneEventCollection.cs b/NGitLab.Mock/ResourceMilestoneEventCollection.cs index 1418547f..f75fd78a 100644 --- a/NGitLab.Mock/ResourceMilestoneEventCollection.cs +++ b/NGitLab.Mock/ResourceMilestoneEventCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using NGitLab.Models; namespace NGitLab.Mock { @@ -40,5 +41,46 @@ private int GetNewId() { return this.Select(rle => rle.Id).DefaultIfEmpty().Max() + 1; } + + internal void CreateResourceMilestoneEvents(User currentUser, int resourceId, Milestone previousMilestone, Milestone newMilestone, string resourceType) + { + if (previousMilestone is null) + { + CreateResourceMilestoneEvent(currentUser, resourceId, newMilestone, ResourceMilestoneEventAction.Add, resourceType); + } + else if (newMilestone is not null && previousMilestone is not null) + { + if (newMilestone.Id != previousMilestone.Id) + { + CreateResourceMilestoneEvent(currentUser, resourceId, previousMilestone, ResourceMilestoneEventAction.Remove, resourceType); + } + + CreateResourceMilestoneEvent(currentUser, resourceId, newMilestone, ResourceMilestoneEventAction.Add, resourceType); + } + } + + internal void CreateResourceMilestoneEvent(User currentUser, int resourceId, Milestone milestone, ResourceMilestoneEventAction action, string resourceType) + { + Add(new ResourceMilestoneEvent() + { + Action = action, + Milestone = milestone, + ResourceId = resourceId, + CreatedAt = DateTime.UtcNow, + Id = Server.GetNewResourceLabelEventId(), + User = new Author() + { + Id = currentUser.Id, + Email = currentUser.Email, + AvatarUrl = currentUser.AvatarUrl, + Name = currentUser.Name, + State = currentUser.State.ToString(), + Username = currentUser.UserName, + CreatedAt = currentUser.CreatedAt, + WebUrl = currentUser.WebUrl, + }, + ResourceType = resourceType, + }); + } } } diff --git a/NGitLab.Mock/ResourceStateEventCollection.cs b/NGitLab.Mock/ResourceStateEventCollection.cs index 34557005..0123650d 100644 --- a/NGitLab.Mock/ResourceStateEventCollection.cs +++ b/NGitLab.Mock/ResourceStateEventCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using NGitLab.Models; namespace NGitLab.Mock { @@ -40,5 +41,28 @@ private int GetNewId() { return this.Select(rle => rle.Id).DefaultIfEmpty().Max() + 1; } + + internal void CreateResourceStateEvent(User currentUser, string state, int id, string resourceType) + { + Add(new ResourceStateEvent() + { + ResourceId = id, + CreatedAt = DateTime.UtcNow, + Id = Server.GetNewResourceLabelEventId(), + State = state, + User = new Author() + { + Id = currentUser.Id, + Email = currentUser.Email, + AvatarUrl = currentUser.AvatarUrl, + Name = currentUser.Name, + State = currentUser.State.ToString(), + Username = currentUser.UserName, + CreatedAt = currentUser.CreatedAt, + WebUrl = currentUser.WebUrl, + }, + ResourceType = resourceType, + }); + } } } diff --git a/NGitLab/IMergeRequestClient.cs b/NGitLab/IMergeRequestClient.cs index ae59bd36..4628a480 100644 --- a/NGitLab/IMergeRequestClient.cs +++ b/NGitLab/IMergeRequestClient.cs @@ -58,5 +58,38 @@ public interface IMergeRequestClient IMergeRequestApprovalClient ApprovalClient(int mergeRequestIid); IEnumerable ClosesIssues(int mergeRequestIid); + + /// + /// Gets the resource label events. + /// + /// url like GET /projects/:id/merge_requests/:merge_request_iid/resource_label_events + /// + /// + /// The project id. + /// The id of the merge request in the project's scope. + /// A collection of the resource label events linked to this merge request. + GitLabCollectionResponse ResourceLabelEventsAsync(int projectId, int mergeRequestIid); + + /// + /// Gets the resource milestone events. + /// + /// url like GET /projects/:id/merge_requests/:merge_request_iid/resource_milestone_events + /// + /// + /// The project id. + /// The id of the merge request in the project's scope. + /// A collection of the resource milestone events linked to this merge request. + GitLabCollectionResponse ResourceMilestoneEventsAsync(int projectId, int mergeRequestIid); + + /// + /// Gets the resource state events. + /// + /// url like GET /projects/:id/merge_requests/:merge_request_iid/resource_state_events + /// + /// + /// The project id. + /// The id of the merge request in the project's scope. + /// A collection of the resource state events linked to this merge request. + GitLabCollectionResponse ResourceStateEventsAsync(int projectId, int mergeRequestIid); } } diff --git a/NGitLab/Impl/MergeRequestClient.cs b/NGitLab/Impl/MergeRequestClient.cs index 8582ce26..01f9ee25 100644 --- a/NGitLab/Impl/MergeRequestClient.cs +++ b/NGitLab/Impl/MergeRequestClient.cs @@ -10,8 +10,11 @@ namespace NGitLab.Impl { public class MergeRequestClient : IMergeRequestClient { - private readonly API _api; + private const string ResourceLabelEventUrl = "/projects/{0}/merge_requests/{1}/resource_label_events"; + private const string ResourceMilestoneEventUrl = "/projects/{0}/merge_requests/{1}/resource_milestone_events"; + private const string ResourceStateEventUrl = "/projects/{0}/merge_requests/{1}/resource_state_events"; private readonly string _projectPath; + private readonly API _api; public MergeRequestClient(API api, int projectId) { @@ -161,5 +164,20 @@ public GitLabCollectionResponse GetVersionsAsync(int mergeR public IMergeRequestApprovalClient ApprovalClient(int mergeRequestIid) => new MergeRequestApprovalClient(_api, _projectPath, mergeRequestIid); public IMergeRequestChangeClient Changes(int mergeRequestIid) => new MergeRequestChangeClient(_api, _projectPath, mergeRequestIid); + + public GitLabCollectionResponse ResourceLabelEventsAsync(int projectId, int mergeRequestIid) + { + return _api.Get().GetAllAsync(string.Format(CultureInfo.InvariantCulture, ResourceLabelEventUrl, projectId, mergeRequestIid)); + } + + public GitLabCollectionResponse ResourceMilestoneEventsAsync(int projectId, int mergeRequestIid) + { + return _api.Get().GetAllAsync(string.Format(CultureInfo.InvariantCulture, ResourceMilestoneEventUrl, projectId, mergeRequestIid)); + } + + public GitLabCollectionResponse ResourceStateEventsAsync(int projectId, int mergeRequestIid) + { + return _api.Get().GetAllAsync(string.Format(CultureInfo.InvariantCulture, ResourceStateEventUrl, projectId, mergeRequestIid)); + } } } diff --git a/NGitLab/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI.Unshipped.txt index c191f5bf..c209dfac 100644 --- a/NGitLab/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI.Unshipped.txt @@ -353,6 +353,9 @@ NGitLab.IMergeRequestClient.GetVersionsAsync(int mergeRequestIid) -> NGitLab.Git NGitLab.IMergeRequestClient.Rebase(int mergeRequestIid) -> NGitLab.Models.RebaseResult NGitLab.IMergeRequestClient.RebaseAsync(int mergeRequestIid, NGitLab.Models.MergeRequestRebase options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task NGitLab.IMergeRequestClient.Reopen(int mergeRequestIid) -> NGitLab.Models.MergeRequest +NGitLab.IMergeRequestClient.ResourceLabelEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse +NGitLab.IMergeRequestClient.ResourceMilestoneEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse +NGitLab.IMergeRequestClient.ResourceStateEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse NGitLab.IMergeRequestClient.this[int iid].get -> NGitLab.Models.MergeRequest NGitLab.IMergeRequestClient.Update(int mergeRequestIid, NGitLab.Models.MergeRequestUpdate mergeRequest) -> NGitLab.Models.MergeRequest NGitLab.IMergeRequestCommentClient @@ -614,6 +617,9 @@ NGitLab.Impl.MergeRequestClient.MergeRequestClient(NGitLab.Impl.API api, int pro NGitLab.Impl.MergeRequestClient.Rebase(int mergeRequestIid) -> NGitLab.Models.RebaseResult NGitLab.Impl.MergeRequestClient.RebaseAsync(int mergeRequestIid, NGitLab.Models.MergeRequestRebase options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task NGitLab.Impl.MergeRequestClient.Reopen(int mergeRequestIid) -> NGitLab.Models.MergeRequest +NGitLab.Impl.MergeRequestClient.ResourceLabelEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse +NGitLab.Impl.MergeRequestClient.ResourceMilestoneEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse +NGitLab.Impl.MergeRequestClient.ResourceStateEventsAsync(int projectId, int mergeRequestIid) -> NGitLab.GitLabCollectionResponse NGitLab.Impl.MergeRequestClient.this[int iid].get -> NGitLab.Models.MergeRequest NGitLab.Impl.MergeRequestClient.Update(int mergeRequestIid, NGitLab.Models.MergeRequestUpdate mergeRequest) -> NGitLab.Models.MergeRequest NGitLab.Impl.MergeRequestCommentClient