Skip to content

Commit b46b020

Browse files
dnaglnmklotas
authored andcommitted
Support for Tags (#42)
* Added Tag model * Added query options for tags * Added CreateTagRequest * Added DeleteTagRequest class * Fixed typo in classname and filename for TagQueryOptions * Added TagQueryBuilder * Added TagClient * Fixed URL in GetAsync() * Extended query options for tags * Extended query builder for new properties
1 parent ab4c12e commit b46b020

File tree

8 files changed

+235
-0
lines changed

8 files changed

+235
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Models.Tags.Requests;
5+
6+
namespace GitLabApiClient.Internal.Queries
7+
{
8+
internal class TagQueryBuilder : QueryBuilder<TagQueryOptions>
9+
{
10+
protected override void BuildCore(TagQueryOptions options)
11+
{
12+
if (!string.IsNullOrEmpty(options.ProjectId))
13+
Add("id", options.ProjectId);
14+
15+
if (!string.IsNullOrEmpty(options.Search))
16+
Add("search", options.Search);
17+
18+
Add("order_by", options.OrderBy.ToString().ToLower());
19+
Add("sort", options.Sort.ToString().ToLower());
20+
}
21+
}
22+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Internal.Utilities;
5+
using Newtonsoft.Json;
6+
7+
namespace GitLabApiClient.Models.Tags.Requests
8+
{
9+
/// <summary>
10+
/// Used to create a tag in a project.
11+
/// </summary>
12+
public sealed class CreateTagRequest
13+
{
14+
/// <summary>
15+
/// The ID or URL-encoded path of the project.
16+
/// </summary>
17+
[JsonProperty("id")]
18+
public string ProjectId { get; set; }
19+
20+
/// <summary>
21+
/// Name for the created tag
22+
/// </summary>
23+
[JsonProperty("tag_name")]
24+
public string TagName { get; set; }
25+
26+
/// <summary>
27+
/// Tag reference.
28+
/// </summary>
29+
[JsonProperty("ref")]
30+
public string Reference { get; set; }
31+
32+
/// <summary>
33+
/// Annotated message.
34+
/// </summary>
35+
[JsonProperty("message")]
36+
public string Message { get; set; }
37+
38+
/// <summary>
39+
/// Release notes.
40+
/// </summary>
41+
[JsonProperty("release_description")]
42+
public string ReleaseDescription { get; set; }
43+
44+
/// <summary>
45+
/// Initializes a new instance of the <see cref="CreateTagRequest"/> class.
46+
/// </summary>
47+
/// <param name="projectId">The ID or URL-encoded path of the project.</param>
48+
/// <param name="tagName">The name of the tag the release correspons to.</param>
49+
/// <param name="reference">Commit SHA, another tag name, or branh name.</param>
50+
/// <param name="message">Annotated message</param>
51+
/// <param name="releaseDescription">Release notes</param>
52+
public CreateTagRequest(string projectId, string tagName, string reference, string message, string releaseDescription)
53+
{
54+
Guard.NotEmpty(projectId, nameof(projectId));
55+
Guard.NotEmpty(tagName, nameof(tagName));
56+
Guard.NotEmpty(reference, nameof(reference));
57+
58+
ProjectId = projectId;
59+
TagName = tagName;
60+
Reference = reference;
61+
Message = message;
62+
ReleaseDescription = releaseDescription;
63+
}
64+
}
65+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Internal.Utilities;
5+
6+
namespace GitLabApiClient.Models.Tags.Requests
7+
{
8+
/// <summary>
9+
/// Used to delete a tag in a project
10+
/// </summary>
11+
public sealed class DeleteTagRequest
12+
{
13+
/// <summary>
14+
/// ID or URL-encoded path of the project
15+
/// </summary>
16+
public string ProjectId { get; set; }
17+
18+
/// <summary>
19+
/// Name of the Tag
20+
/// </summary>
21+
public string TagName { get; set; }
22+
23+
/// <summary>
24+
/// Initializes a instance of the <see cref="DeleteTagRequest"/> class.
25+
/// </summary>
26+
/// <param name="projectId"></param>
27+
/// <param name="tagName"></param>
28+
public DeleteTagRequest(string projectId, string tagName)
29+
{
30+
Guard.NotEmpty(projectId, nameof(projectId));
31+
Guard.NotEmpty(tagName, nameof(tagName));
32+
33+
ProjectId = projectId;
34+
TagName = tagName;
35+
}
36+
}
37+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace GitLabApiClient.Models.Tags.Requests
6+
{
7+
public enum TagOrder
8+
{
9+
NAME,
10+
UPDATED
11+
}
12+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace GitLabApiClient.Models.Tags.Requests
6+
{
7+
public sealed class TagQueryOptions
8+
{
9+
public string ProjectId { get; set; }
10+
public string Search { get; set; }
11+
public TagOrder OrderBy { get; set; } = TagOrder.NAME;
12+
public TagSort Sort { get; set; } = TagSort.DESC;
13+
14+
internal TagQueryOptions(string projectId = null) => ProjectId = projectId;
15+
}
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace GitLabApiClient.Models.Tags.Requests
6+
{
7+
public enum TagSort
8+
{
9+
ASC,
10+
DESC
11+
}
12+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Models.Releases.Responses;
5+
using Newtonsoft.Json;
6+
7+
namespace GitLabApiClient.Models.Tags.Responses
8+
{
9+
public sealed class Tag
10+
{
11+
[JsonProperty("commit")]
12+
public Commit Commit { get; set; }
13+
14+
[JsonProperty("release")]
15+
public Release Release { get; set; }
16+
17+
[JsonProperty("name")]
18+
public string Name { get; set; }
19+
20+
[JsonProperty("target")]
21+
public string Target { get; set; }
22+
23+
[JsonProperty("message")]
24+
public string Message { get; set; }
25+
26+
}
27+
}

src/GitLabApiClient/TagClient.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using System.Threading.Tasks;
5+
using GitLabApiClient.Internal.Http;
6+
using GitLabApiClient.Internal.Queries;
7+
using GitLabApiClient.Models.Tags.Requests;
8+
using GitLabApiClient.Models.Tags.Responses;
9+
10+
namespace GitLabApiClient
11+
{
12+
public sealed class TagClient
13+
{
14+
private readonly GitLabHttpFacade _httpFacade;
15+
private readonly TagQueryBuilder _tagQueryBuilder;
16+
17+
internal TagClient(
18+
GitLabHttpFacade httpFacade,
19+
TagQueryBuilder tagQueryBuilder)
20+
{
21+
_httpFacade = httpFacade;
22+
_tagQueryBuilder = tagQueryBuilder;
23+
}
24+
25+
public async Task<Tag> GetAsync(string projectId, string tagName) =>
26+
await _httpFacade.Get<Tag>($"projects/{projectId}/repository/tags/{tagName}");
27+
28+
public async Task<IList<Tag>> GetAsync(string projectId, Action<TagQueryOptions> options)
29+
{
30+
var queryOptions = new TagQueryOptions(projectId);
31+
options?.Invoke(queryOptions);
32+
33+
string url = _tagQueryBuilder.Build($"projects/{projectId}/tags", queryOptions);
34+
return await _httpFacade.GetPagedList<Tag>(url);
35+
}
36+
37+
public async Task<Tag> CreateAsync(CreateTagRequest request) =>
38+
await _httpFacade.Post<Tag>($"projects/{request.ProjectId}/repository/tags", request);
39+
40+
public async Task DeleteAsync(DeleteTagRequest request) =>
41+
await _httpFacade.Delete($"projects/{request.ProjectId}/repository/tags/{request.TagName}");
42+
43+
}
44+
}

0 commit comments

Comments
 (0)