Skip to content

Commit fdb49ce

Browse files
dremerdtjetersen
andauthored
Added opportunity to retrieve merge request notes and time statistics (#115)
Co-authored-by: Joseph Petersen <josephp90@gmail.com>
1 parent 75aa036 commit fdb49ce

File tree

7 files changed

+99
-3
lines changed

7 files changed

+99
-3
lines changed

src/GitLabApiClient/GitLabClient.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public GitLabClient(string hostUrl, string authenticationToken = "")
3838

3939
var projectQueryBuilder = new ProjectsQueryBuilder();
4040
var projectIssueNotesQueryBuilder = new ProjectIssueNotesQueryBuilder();
41+
var projectMergeRequestsNotesQueryBuilder = new ProjectMergeRequestsNotesQueryBuilder();
4142
var issuesQueryBuilder = new IssuesQueryBuilder();
4243
var mergeRequestsQueryBuilder = new MergeRequestsQueryBuilder();
4344
var projectMilestonesQueryBuilder = new MilestonesQueryBuilder();
@@ -58,7 +59,7 @@ public GitLabClient(string hostUrl, string authenticationToken = "")
5859

5960
Issues = new IssuesClient(_httpFacade, issuesQueryBuilder, projectIssueNotesQueryBuilder);
6061
Uploads = new UploadsClient(_httpFacade);
61-
MergeRequests = new MergeRequestsClient(_httpFacade, mergeRequestsQueryBuilder, projectMergeRequestsQueryBuilder);
62+
MergeRequests = new MergeRequestsClient(_httpFacade, mergeRequestsQueryBuilder, projectMergeRequestsQueryBuilder, projectMergeRequestsNotesQueryBuilder);
6263
Projects = new ProjectsClient(_httpFacade, projectQueryBuilder, projectMilestonesQueryBuilder, jobQueryBuilder);
6364
Users = new UsersClient(_httpFacade);
6465
Groups = new GroupsClient(_httpFacade, groupsQueryBuilder, projectsGroupsQueryBuilder, projectMilestonesQueryBuilder, groupLabelsQueryBuilder);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using GitLabApiClient.Models;
3+
using GitLabApiClient.Models.Notes.Requests;
4+
5+
namespace GitLabApiClient.Internal.Queries
6+
{
7+
internal class ProjectMergeRequestsNotesQueryBuilder : QueryBuilder<MergeRequestNotesQueryOptions>
8+
{
9+
protected override void BuildCore(MergeRequestNotesQueryOptions options)
10+
{
11+
if (options.SortOrder != SortOrder.Descending)
12+
Add("sort", GetSortOrderQueryValue(options.SortOrder));
13+
14+
if (options.Order != NoteOrder.CreatedAt)
15+
Add("order_by", GetNoteOrderQueryValue(options.Order));
16+
}
17+
18+
private static string GetNoteOrderQueryValue(NoteOrder order)
19+
{
20+
switch (order)
21+
{
22+
case NoteOrder.CreatedAt:
23+
return "created_at";
24+
case NoteOrder.UpdatedAt:
25+
return "updated_at";
26+
default:
27+
throw new NotSupportedException($"Order {order} is not supported");
28+
}
29+
}
30+
}
31+
}

src/GitLabApiClient/MergeRequestsClient.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
using GitLabApiClient.Internal.Queries;
88
using GitLabApiClient.Models.MergeRequests.Requests;
99
using GitLabApiClient.Models.MergeRequests.Responses;
10+
using GitLabApiClient.Models.Notes.Requests;
11+
using GitLabApiClient.Models.Notes.Responses;
1012
using GitLabApiClient.Models.Projects.Responses;
1113

1214
namespace GitLabApiClient
@@ -22,15 +24,18 @@ public sealed class MergeRequestsClient
2224
private readonly GitLabHttpFacade _httpFacade;
2325
private readonly MergeRequestsQueryBuilder _mergeRequestsQueryBuilder;
2426
private readonly ProjectMergeRequestsQueryBuilder _projectMergeRequestsQueryBuilder;
27+
private readonly ProjectMergeRequestsNotesQueryBuilder _projectMergeRequestNotesQueryBuilder;
2528

2629
internal MergeRequestsClient(
2730
GitLabHttpFacade httpFacade,
2831
MergeRequestsQueryBuilder mergeRequestsQueryBuilder,
29-
ProjectMergeRequestsQueryBuilder projectMergeRequestsQueryBuilder)
32+
ProjectMergeRequestsQueryBuilder projectMergeRequestsQueryBuilder,
33+
ProjectMergeRequestsNotesQueryBuilder projectMergeRequestNotesQueryBuilder)
3034
{
3135
_httpFacade = httpFacade;
3236
_mergeRequestsQueryBuilder = mergeRequestsQueryBuilder;
3337
_projectMergeRequestsQueryBuilder = projectMergeRequestsQueryBuilder;
38+
_projectMergeRequestNotesQueryBuilder = projectMergeRequestNotesQueryBuilder;
3439
}
3540

3641
/// <summary>
@@ -107,5 +112,21 @@ public async Task<MergeRequest> AcceptAsync(ProjectId projectId, int mergeReques
107112
/// <param name="mergeRequestId">The Internal Merge Request Id.</param>
108113
public async Task DeleteAsync(ProjectId projectId, int mergeRequestId) =>
109114
await _httpFacade.Delete($"projects/{projectId}/merge_requests/{mergeRequestId}");
115+
116+
/// <summary>
117+
/// Retrieves notes (comments) of a merge request.
118+
/// </summary>
119+
/// <param name="projectId">The ID, path or <see cref="Project"/> of the project.</param>
120+
/// <param name="mergeRequestIid">Iid of the merge request.</param>
121+
/// <param name="options">MergeRequestNotes retrieval options.</param>
122+
/// <returns>Merge requests satisfying options.</returns>
123+
public async Task<IList<Note>> GetNotesAsync(ProjectId projectId, int mergeRequestIid, Action<MergeRequestNotesQueryOptions> options = null)
124+
{
125+
var queryOptions = new MergeRequestNotesQueryOptions();
126+
options?.Invoke(queryOptions);
127+
128+
string url = _projectMergeRequestNotesQueryBuilder.Build($"projects/{projectId}/merge_requests/{mergeRequestIid}/notes", queryOptions);
129+
return await _httpFacade.GetPagedList<Note>(url);
130+
}
110131
}
111132
}

src/GitLabApiClient/Models/MergeRequests/Responses/MergeRequest.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,8 @@ public sealed class MergeRequest : ModifiableObject
8282

8383
[JsonProperty("work_in_progress")]
8484
public bool WorkInProgress { get; set; }
85+
86+
[JsonProperty("time_stats")]
87+
public MergeRequestTimeStatistic TimeStats { get; set; }
8588
}
8689
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Newtonsoft.Json;
2+
3+
namespace GitLabApiClient.Models.MergeRequests.Responses
4+
{
5+
public class MergeRequestTimeStatistic
6+
{
7+
[JsonProperty("time_estimate")]
8+
public int TimeEstimate { get; set; }
9+
10+
[JsonProperty("total_time_spent")]
11+
public int TotalTimeSpent { get; set; }
12+
13+
[JsonProperty("human_time_estimate")]
14+
public string HumanTimeEstimate { get; set; }
15+
16+
[JsonProperty("human_total_time_spent")]
17+
public string HumanTotalTimeSpent { get; set; }
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace GitLabApiClient.Models.Notes.Requests
2+
{
3+
/// <summary>
4+
/// Options for note (comment) listing
5+
/// </summary>
6+
public sealed class MergeRequestNotesQueryOptions
7+
{
8+
internal MergeRequestNotesQueryOptions() { }
9+
10+
/// <summary>
11+
/// Return merge request notes sorted in asc or desc order. Default is desc
12+
/// </summary>
13+
public SortOrder SortOrder { get; set; } = SortOrder.Descending;
14+
15+
/// <summary>
16+
/// Return merge request notes ordered by created_at or updated_at fields. Default is created_at
17+
/// </summary>
18+
public NoteOrder Order { get; set; } = NoteOrder.CreatedAt;
19+
}
20+
}

test/GitLabApiClient.Test/MergeRequestClientTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ namespace GitLabApiClient.Test
1717
public class MergeRequestClientTest : IAsyncLifetime
1818
{
1919
private readonly MergeRequestsClient _sut = new MergeRequestsClient(
20-
GitLabApiHelper.GetFacade(), new MergeRequestsQueryBuilder(), new ProjectMergeRequestsQueryBuilder());
20+
GitLabApiHelper.GetFacade(), new MergeRequestsQueryBuilder(), new ProjectMergeRequestsQueryBuilder(),
21+
new ProjectMergeRequestsNotesQueryBuilder());
2122

2223
[Fact]
2324
public async Task CreatedMergeRequestCanBeRetrieved()

0 commit comments

Comments
 (0)