Skip to content

Commit 720e2bc

Browse files
dnaglnmklotas
authored andcommitted
24 support release (#36)
* Added response models for Gitlab-Releases * Changed property names and types * Added ReleaseQueryBuilder class * Implemented ReleaseClient class * Extended GitLabApiHelper class with some values * Added release tests * Added ProjectId property to Release model * Added documentation
1 parent c5983ad commit 720e2bc

File tree

14 files changed

+438
-0
lines changed

14 files changed

+438
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Models.Releases.Requests;
5+
6+
namespace GitLabApiClient.Internal.Queries
7+
{
8+
class ReleaseQueryBuilder : QueryBuilder<ReleaseQueryOptions>
9+
{
10+
protected override void BuildCore(ReleaseQueryOptions options)
11+
{
12+
if (!string.IsNullOrEmpty(options.ProjectId))
13+
Add("id", options.ProjectId);
14+
15+
if (!string.IsNullOrEmpty(options.TagName))
16+
Add("tag_name", options.TagName);
17+
}
18+
}
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace GitLabApiClient.Internal.Queries
6+
{
7+
class ReleasesQueryBuilder
8+
{
9+
}
10+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Internal.Utilities;
5+
using GitLabApiClient.Models.Releases.Responses;
6+
using Newtonsoft.Json;
7+
8+
namespace GitLabApiClient.Models.Releases.Requests
9+
{
10+
/// <summary>
11+
/// Used to create a release in a project.
12+
/// </summary>
13+
public sealed class CreateReleaseRequest : Release
14+
{
15+
/// <summary>
16+
/// Initializes a new instance of the <see cref="CreateReleaseRequest"/> class.
17+
/// </summary>
18+
/// <param name="projectId">The ID or URL-encoded path of the project.</param>
19+
/// <param name="releaseName">The name of the release.</param>
20+
/// <param name="tagName">The name of the tag the release correspons to.</param>
21+
/// <param name="description">A description of the release</param>
22+
/// <param name="releasedAt">The date the release will be/was ready.</param>
23+
public CreateReleaseRequest(string projectId, string releaseName, string tagName, string description, DateTime? releasedAt = null)
24+
{
25+
Guard.NotEmpty(projectId, nameof(projectId));
26+
Guard.NotEmpty(releaseName, nameof(releaseName));
27+
Guard.NotEmpty(tagName, nameof(tagName));
28+
29+
ProjectId = projectId;
30+
ReleaseName = releaseName;
31+
TagName = tagName;
32+
Description = description;
33+
ReleasedAt = (releasedAt == null) ? DateTime.Now : releasedAt;
34+
}
35+
}
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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.Releases.Requests
8+
{
9+
/// <summary>
10+
/// Used to delete a release in a project.
11+
/// </summary>
12+
public sealed class DeleteReleaseRequest
13+
{
14+
/// <summary>
15+
/// Initializes a new instance of the <see cref="DeleteReleaseRequest"/> class
16+
/// </summary>
17+
/// <param name="projectId">The ID or URL-encoded path of the project.</param>
18+
/// <param name="tagName">The name of the tag which corresponds to the release</param>
19+
public DeleteReleaseRequest(string projectId, string tagName)
20+
{
21+
Guard.NotEmpty(projectId, nameof(projectId));
22+
Guard.NotEmpty(tagName, tagName);
23+
24+
ProjectId = projectId;
25+
TagName = tagName;
26+
}
27+
28+
[JsonProperty("id")]
29+
public string ProjectId { get; set; }
30+
31+
[JsonProperty("tag_name")]
32+
public string TagName { get; set; }
33+
}
34+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Models.Projects.Responses;
5+
6+
namespace GitLabApiClient.Models.Releases.Requests
7+
{
8+
public sealed class ReleaseQueryOptions
9+
{
10+
public string ProjectId { get; set; }
11+
public string TagName { get; set; }
12+
13+
internal ReleaseQueryOptions(string projectId = null) => ProjectId = projectId;
14+
}
15+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Newtonsoft.Json;
5+
6+
namespace GitLabApiClient.Models.Releases.Requests
7+
{
8+
/// <summary>
9+
/// Used to update releases in a project
10+
/// </summary>
11+
public sealed class UpdateReleaseRequest
12+
{
13+
[JsonProperty("id")]
14+
public string ProjectId { get; set; }
15+
[JsonProperty("tag_name")]
16+
public string TagName { get; set; }
17+
[JsonProperty("name")]
18+
public string ReleaseName { get; set; }
19+
[JsonProperty("description")]
20+
public string Description { get; set; }
21+
[JsonProperty("released_at")]
22+
public DateTime? ReleasedAt { get; set; }
23+
24+
/// <summary>
25+
/// Initializes a new instance of the <see cref="CreateReleaseRequest"/> class
26+
/// </summary>
27+
/// <param name="projectId">The ID or URL-encoed path of the project.</param>
28+
/// <param name="releaseName">The name for the release</param>
29+
/// <param name="tagName">The name of the tag, the release will be created from</param>
30+
/// <param name="description">The description for the release.</param>
31+
/// <param name="releasedAt">The date the release will be/was ready.</param>
32+
public UpdateReleaseRequest(string projectId, string releaseName, string tagName, string description, DateTime? releasedAt = null)
33+
{
34+
ProjectId = projectId;
35+
ReleaseName = releaseName;
36+
TagName = tagName;
37+
Description = description;
38+
ReleasedAt = releasedAt;
39+
}
40+
}
41+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Newtonsoft.Json;
5+
6+
namespace GitLabApiClient.Models.Releases.Responses
7+
{
8+
public sealed class Asset
9+
{
10+
[JsonProperty("count")]
11+
public int Count { get; set; }
12+
13+
[JsonProperty("sources")]
14+
public Source[] Sources { get; set; }
15+
16+
[JsonProperty("links")]
17+
public Link[] Links { get; set; }
18+
}
19+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Newtonsoft.Json;
5+
6+
namespace GitLabApiClient.Models.Releases.Responses
7+
{
8+
public sealed class Commit
9+
{
10+
[JsonProperty("id")]
11+
public string Id { get; set; }
12+
13+
[JsonProperty("short_id")]
14+
public string ShortId { get; set; }
15+
16+
[JsonProperty("title")]
17+
public string Title { get; set; }
18+
19+
[JsonProperty("created_at")]
20+
public string CreatedAt { get; set; }
21+
22+
[JsonProperty("parent_ids")]
23+
public string[] ParentIds { get; set; }
24+
25+
[JsonProperty("message")]
26+
public string Message { get; set; }
27+
28+
[JsonProperty("author_name")]
29+
public string AuthorName { get; set; }
30+
31+
[JsonProperty("author_email")]
32+
public string AuthorEmail { get; set; }
33+
34+
[JsonProperty("authored_date")]
35+
public string AuthoredDate { get; set; }
36+
37+
[JsonProperty("committer_name")]
38+
public string CommitterName { get; set; }
39+
40+
[JsonProperty("committer_email")]
41+
public string CommitterEmail { get; set; }
42+
43+
[JsonProperty("committed_date")]
44+
public string CommittedDate { get; set; }
45+
}
46+
}
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 Newtonsoft.Json;
5+
6+
namespace GitLabApiClient.Models.Releases.Responses
7+
{
8+
public sealed class Link
9+
{
10+
[JsonProperty("id")]
11+
public int Id { get; set; }
12+
13+
[JsonProperty("name")]
14+
public string Name { get; set; }
15+
16+
[JsonProperty("url")]
17+
public string Url { get; set; }
18+
19+
[JsonProperty("external")]
20+
public bool External { get; set; }
21+
}
22+
}
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 GitLabApiClient.Models.Milestones.Responses;
5+
using Newtonsoft.Json;
6+
7+
namespace GitLabApiClient.Models.Releases.Responses
8+
{
9+
public class Release
10+
{
11+
[JsonProperty("id")]
12+
public string ProjectId { get; set; }
13+
14+
[JsonProperty("tag_name")]
15+
public string TagName { get; set; }
16+
17+
[JsonProperty("description")]
18+
public string Description { get; set; }
19+
20+
[JsonProperty("name")]
21+
public string ReleaseName { get; set; }
22+
23+
[JsonProperty("description_html")]
24+
public string DescriptionHtml { get; set; }
25+
26+
[JsonProperty("created_at")]
27+
public DateTime? CreatedAt { get; set; }
28+
29+
[JsonProperty("released_at")]
30+
public DateTime? ReleasedAt { get; set; }
31+
32+
[JsonProperty("author")]
33+
public Member Author { get; set; }
34+
35+
[JsonProperty("commit")]
36+
public Commit Commit { get; set; }
37+
38+
[JsonProperty("milestone")]
39+
public Milestone Milestone { get; set; }
40+
41+
[JsonProperty("assets")]
42+
public Asset Assets { get; set; }
43+
}
44+
}
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+
using Newtonsoft.Json;
5+
6+
namespace GitLabApiClient.Models.Releases.Responses
7+
{
8+
public sealed class Source
9+
{
10+
[JsonProperty("format")]
11+
public string Format { get; set; }
12+
13+
[JsonProperty("url")]
14+
public string Url { get; set; }
15+
}
16+
}

src/GitLabApiClient/ReleaseClient.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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.Releases.Requests;
8+
using GitLabApiClient.Models.Releases.Responses;
9+
10+
namespace GitLabApiClient
11+
{
12+
public sealed class ReleaseClient
13+
{
14+
private readonly GitLabHttpFacade _httpFacade;
15+
private readonly ReleaseQueryBuilder _releaseQueryBuilder;
16+
17+
internal ReleaseClient(
18+
GitLabHttpFacade httpFacade,
19+
ReleaseQueryBuilder releaseQueryBuilder)
20+
{
21+
_httpFacade = httpFacade;
22+
_releaseQueryBuilder = releaseQueryBuilder;
23+
}
24+
25+
public async Task<Release> GetAsync(string projectId, string tagName) =>
26+
await _httpFacade.Get<Release>($"projects/{projectId}/releases/{tagName}");
27+
28+
public async Task<IList<Release>> GetAsync(string projectId, Action<ReleaseQueryOptions> options = null)
29+
{
30+
var queryOptions = new ReleaseQueryOptions(projectId);
31+
options?.Invoke(queryOptions);
32+
33+
string url = _releaseQueryBuilder.Build($"projects/{projectId}/releases", queryOptions);
34+
return await _httpFacade.GetPagedList<Release>(url);
35+
}
36+
37+
public async Task<Release> CreateAsync(CreateReleaseRequest request) =>
38+
await _httpFacade.Post<Release>($"projects/{request.ProjectId}/releases/", request);
39+
40+
public async Task<Release> UpdateAsync(UpdateReleaseRequest request) =>
41+
await _httpFacade.Put<Release>($"projects/{request.ProjectId}/releases/", request);
42+
43+
public async Task DeleteAsync(DeleteReleaseRequest request) =>
44+
await _httpFacade.Delete($"projects/{request.ProjectId}/releases/{request.TagName}");
45+
46+
}
47+
}

0 commit comments

Comments
 (0)