Skip to content

Commit eabfd5e

Browse files
authored
Add support for project job token scope (#974)
* Add support for project job token scope * Fix
1 parent 2c98e92 commit eabfd5e

File tree

11 files changed

+153
-6
lines changed

11 files changed

+153
-6
lines changed

NGitLab.Mock/Clients/GitLabClient.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,10 @@
33

44
namespace NGitLab.Mock.Clients;
55

6-
internal sealed class GitLabClient : ClientBase, IGitLabClient
6+
internal sealed class GitLabClient(ClientContext context) : ClientBase(context), IGitLabClient
77
{
88
private IGraphQLClient _graphQLClient;
99

10-
public GitLabClient(ClientContext context)
11-
: base(context)
12-
{
13-
}
14-
1510
public IGroupsClient Groups => new GroupClient(Context);
1611

1712
public IUserClient Users => new UserClient(Context);
@@ -110,4 +105,6 @@ public IPipelineScheduleClient GetPipelineSchedules(ProjectId projectId)
110105
public ISearchClient GetProjectSearchClient(ProjectId projectId) => new ProjectSearchClient(Context, projectId);
111106

112107
public IGroupHooksClient GetGroupHooksClient(GroupId groupId) => new GroupHooksClient(Context, groupId);
108+
109+
public IProjectJobTokenScopeClient GetProjectJobTokenScopeClient(ProjectId projectId) => new ProjectJobTokenScopeClient(Context, projectId);
113110
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using NGitLab.Models;
5+
6+
namespace NGitLab.Mock.Clients;
7+
8+
internal sealed class ProjectJobTokenScopeClient : ClientBase, IProjectJobTokenScopeClient
9+
{
10+
private readonly long _projectId;
11+
12+
public ProjectJobTokenScopeClient(ClientContext context, ProjectId projectId)
13+
: base(context)
14+
{
15+
_projectId = Server.AllProjects.FindProject(projectId.ValueAsString()).Id;
16+
}
17+
18+
public Task<JobTokenScope> GetProjectJobTokenScopeAsync(CancellationToken cancellationToken = default)
19+
{
20+
throw new NotImplementedException();
21+
}
22+
23+
public Task UpdateProjectJobTokenScopeAsync(JobTokenScope scope, CancellationToken cancellationToken = default)
24+
{
25+
throw new NotImplementedException();
26+
}
27+
}

NGitLab.Tests/ProjectsTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using NGitLab.Extensions;
99
using NGitLab.Models;
1010
using NGitLab.Tests.Docker;
11+
using NuGet.Versioning;
1112
using NUnit.Framework;
1213

1314
namespace NGitLab.Tests;
@@ -789,4 +790,26 @@ public async Task Test_project_groups_query_returns_ancestor_groups()
789790

790791
Assert.That(groups.Select(g => g.Id), Is.EquivalentTo(new[] { group.Id, subgroup.Id }));
791792
}
793+
794+
[Test]
795+
[NGitLabRetry]
796+
public async Task GetAndSetProjectJobTokenScope()
797+
{
798+
// Arrange
799+
using var context = await GitLabTestContext.CreateAsync();
800+
801+
context.IgnoreTestIfGitLabVersionOutOfRange(VersionRange.Parse("[16.1,)"));
802+
803+
var project = context.CreateProject();
804+
var gitLabClient = context.Client;
805+
var jobTokenScopeClient = gitLabClient.GetProjectJobTokenScopeClient(project.Id);
806+
807+
// Act/Assert
808+
var scope = await jobTokenScopeClient.GetProjectJobTokenScopeAsync(CancellationToken.None);
809+
Assert.That(scope.InboundEnabled, Is.True);
810+
811+
await jobTokenScopeClient.UpdateProjectJobTokenScopeAsync(new JobTokenScope { InboundEnabled = false }, CancellationToken.None);
812+
scope = await jobTokenScopeClient.GetProjectJobTokenScopeAsync(CancellationToken.None);
813+
Assert.That(scope.InboundEnabled, Is.False);
814+
}
792815
}

NGitLab/GitLabClient.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,4 +225,7 @@ public ISearchClient GetProjectSearchClient(ProjectId projectId)
225225

226226
public IGroupHooksClient GetGroupHooksClient(GroupId groupId)
227227
=> new GroupHooksClient(_api, groupId);
228+
229+
public IProjectJobTokenScopeClient GetProjectJobTokenScopeClient(ProjectId projectId)
230+
=> new ProjectJobTokenScopeClient(_api, projectId);
228231
}

NGitLab/IGitLabClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,6 @@ public interface IGitLabClient
106106
ISearchClient GetProjectSearchClient(ProjectId projectId);
107107

108108
IGroupHooksClient GetGroupHooksClient(GroupId groupId);
109+
110+
IProjectJobTokenScopeClient GetProjectJobTokenScopeClient(ProjectId projectId);
109111
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using NGitLab.Models;
4+
5+
namespace NGitLab;
6+
7+
public interface IProjectJobTokenScopeClient
8+
{
9+
/// <summary>
10+
/// Gets the Project Job Token Scope.
11+
/// </summary>
12+
/// <returns>Job Token Scope</returns>
13+
Task<JobTokenScope> GetProjectJobTokenScopeAsync(CancellationToken cancellationToken = default);
14+
15+
/// <summary>
16+
/// Sets the Project Job Token Scope.
17+
/// </summary>
18+
Task UpdateProjectJobTokenScopeAsync(JobTokenScope scope, CancellationToken cancellationToken = default);
19+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using NGitLab.Models;
4+
5+
namespace NGitLab.Impl;
6+
7+
public sealed class ProjectJobTokenScopeClient : IProjectJobTokenScopeClient
8+
{
9+
private readonly API _api;
10+
private readonly string _jobTokenScopeUrl;
11+
12+
internal ProjectJobTokenScopeClient(API api, ProjectId projectId)
13+
{
14+
_api = api;
15+
_jobTokenScopeUrl = $"{Project.Url}/{projectId.ValueAsUriParameter()}/job_token_scope";
16+
}
17+
18+
public Task<JobTokenScope> GetProjectJobTokenScopeAsync(CancellationToken cancellationToken = default)
19+
{
20+
return _api.Get().ToAsync<JobTokenScope>(_jobTokenScopeUrl, cancellationToken);
21+
}
22+
23+
public async Task UpdateProjectJobTokenScopeAsync(JobTokenScope scope, CancellationToken cancellationToken = default)
24+
{
25+
await _api.Patch().With(new { enabled = scope.InboundEnabled }).ExecuteAsync(_jobTokenScopeUrl, cancellationToken).ConfigureAwait(false);
26+
}
27+
}

NGitLab/Models/JobTokenScope.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace NGitLab.Models;
4+
5+
public sealed class JobTokenScope
6+
{
7+
/// <summary>
8+
/// Indicates if the "Limit access to this project" setting is enabled.
9+
/// If disabled, then all projects have access.
10+
/// </summary>
11+
[JsonPropertyName("inbound_enabled")]
12+
public bool InboundEnabled { get; set; }
13+
}

NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ NGitLab.GitLabClient.GetPipelineSchedules(NGitLab.Models.ProjectId projectId) ->
7373
NGitLab.GitLabClient.GetProjectBadgeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectBadgeClient
7474
NGitLab.GitLabClient.GetProjectEvents(NGitLab.Models.ProjectId projectId) -> NGitLab.IEventClient
7575
NGitLab.GitLabClient.GetProjectIssueNoteClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectIssueNoteClient
76+
NGitLab.GitLabClient.GetProjectJobTokenScopeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectJobTokenScopeClient
7677
NGitLab.GitLabClient.GetProjectLevelApprovalRulesClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectLevelApprovalRulesClient
7778
NGitLab.GitLabClient.GetProjectSearchClient(NGitLab.Models.ProjectId projectId) -> NGitLab.ISearchClient
7879
NGitLab.GitLabClient.GetProjectVariableClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectVariableClient
@@ -204,6 +205,7 @@ NGitLab.IGitLabClient.GetPipelineSchedules(NGitLab.Models.ProjectId projectId) -
204205
NGitLab.IGitLabClient.GetProjectBadgeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectBadgeClient
205206
NGitLab.IGitLabClient.GetProjectEvents(NGitLab.Models.ProjectId projectId) -> NGitLab.IEventClient
206207
NGitLab.IGitLabClient.GetProjectIssueNoteClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectIssueNoteClient
208+
NGitLab.IGitLabClient.GetProjectJobTokenScopeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectJobTokenScopeClient
207209
NGitLab.IGitLabClient.GetProjectLevelApprovalRulesClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectLevelApprovalRulesClient
208210
NGitLab.IGitLabClient.GetProjectSearchClient(NGitLab.Models.ProjectId projectId) -> NGitLab.ISearchClient
209211
NGitLab.IGitLabClient.GetProjectVariableClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectVariableClient
@@ -876,6 +878,9 @@ NGitLab.Impl.ProjectIssueNoteClient.Edit(NGitLab.Models.ProjectIssueNoteEdit edi
876878
NGitLab.Impl.ProjectIssueNoteClient.ForIssue(long issueId) -> System.Collections.Generic.IEnumerable<NGitLab.Models.ProjectIssueNote>
877879
NGitLab.Impl.ProjectIssueNoteClient.Get(long issueId, long noteId) -> NGitLab.Models.ProjectIssueNote
878880
NGitLab.Impl.ProjectIssueNoteClient.ProjectIssueNoteClient(NGitLab.Impl.API api, NGitLab.Models.ProjectId projectId) -> void
881+
NGitLab.Impl.ProjectJobTokenScopeClient
882+
NGitLab.Impl.ProjectJobTokenScopeClient.GetProjectJobTokenScopeAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.JobTokenScope>
883+
NGitLab.Impl.ProjectJobTokenScopeClient.UpdateProjectJobTokenScopeAsync(NGitLab.Models.JobTokenScope scope, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
879884
NGitLab.Impl.ProjectLevelApprovalRulesClient
880885
NGitLab.Impl.ProjectLevelApprovalRulesClient.CreateProjectLevelRule(NGitLab.Models.ApprovalRuleCreate approvalRuleCreate) -> NGitLab.Models.ApprovalRule
881886
NGitLab.Impl.ProjectLevelApprovalRulesClient.DeleteProjectLevelRule(long approvalRuleIdToDelete) -> void
@@ -1084,6 +1089,9 @@ NGitLab.IProjectIssueNoteClient.Create(NGitLab.Models.ProjectIssueNoteCreate cre
10841089
NGitLab.IProjectIssueNoteClient.Edit(NGitLab.Models.ProjectIssueNoteEdit edit) -> NGitLab.Models.ProjectIssueNote
10851090
NGitLab.IProjectIssueNoteClient.ForIssue(long issueId) -> System.Collections.Generic.IEnumerable<NGitLab.Models.ProjectIssueNote>
10861091
NGitLab.IProjectIssueNoteClient.Get(long issueId, long noteId) -> NGitLab.Models.ProjectIssueNote
1092+
NGitLab.IProjectJobTokenScopeClient
1093+
NGitLab.IProjectJobTokenScopeClient.GetProjectJobTokenScopeAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.JobTokenScope>
1094+
NGitLab.IProjectJobTokenScopeClient.UpdateProjectJobTokenScopeAsync(NGitLab.Models.JobTokenScope scope, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
10871095
NGitLab.IProjectLevelApprovalRulesClient
10881096
NGitLab.IProjectLevelApprovalRulesClient.CreateProjectLevelRule(NGitLab.Models.ApprovalRuleCreate approvalRuleCreate) -> NGitLab.Models.ApprovalRule
10891097
NGitLab.IProjectLevelApprovalRulesClient.DeleteProjectLevelRule(long approvalRuleIdToDelete) -> void
@@ -2650,6 +2658,10 @@ NGitLab.Models.JobScopeMask.Pending = 2 -> NGitLab.Models.JobScopeMask
26502658
NGitLab.Models.JobScopeMask.Running = 4 -> NGitLab.Models.JobScopeMask
26512659
NGitLab.Models.JobScopeMask.Skipped = 64 -> NGitLab.Models.JobScopeMask
26522660
NGitLab.Models.JobScopeMask.Success = 16 -> NGitLab.Models.JobScopeMask
2661+
NGitLab.Models.JobTokenScope
2662+
NGitLab.Models.JobTokenScope.InboundEnabled.get -> bool
2663+
NGitLab.Models.JobTokenScope.InboundEnabled.set -> void
2664+
NGitLab.Models.JobTokenScope.JobTokenScope() -> void
26532665
NGitLab.Models.Label
26542666
NGitLab.Models.Label.ClosedIssuesCount.get -> int
26552667
NGitLab.Models.Label.ClosedIssuesCount.set -> void

NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ NGitLab.GitLabClient.GetPipelineSchedules(NGitLab.Models.ProjectId projectId) ->
7373
NGitLab.GitLabClient.GetProjectBadgeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectBadgeClient
7474
NGitLab.GitLabClient.GetProjectEvents(NGitLab.Models.ProjectId projectId) -> NGitLab.IEventClient
7575
NGitLab.GitLabClient.GetProjectIssueNoteClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectIssueNoteClient
76+
NGitLab.GitLabClient.GetProjectJobTokenScopeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectJobTokenScopeClient
7677
NGitLab.GitLabClient.GetProjectLevelApprovalRulesClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectLevelApprovalRulesClient
7778
NGitLab.GitLabClient.GetProjectSearchClient(NGitLab.Models.ProjectId projectId) -> NGitLab.ISearchClient
7879
NGitLab.GitLabClient.GetProjectVariableClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectVariableClient
@@ -203,6 +204,7 @@ NGitLab.IGitLabClient.GetPipelineSchedules(NGitLab.Models.ProjectId projectId) -
203204
NGitLab.IGitLabClient.GetProjectBadgeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectBadgeClient
204205
NGitLab.IGitLabClient.GetProjectEvents(NGitLab.Models.ProjectId projectId) -> NGitLab.IEventClient
205206
NGitLab.IGitLabClient.GetProjectIssueNoteClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectIssueNoteClient
207+
NGitLab.IGitLabClient.GetProjectJobTokenScopeClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectJobTokenScopeClient
206208
NGitLab.IGitLabClient.GetProjectLevelApprovalRulesClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectLevelApprovalRulesClient
207209
NGitLab.IGitLabClient.GetProjectSearchClient(NGitLab.Models.ProjectId projectId) -> NGitLab.ISearchClient
208210
NGitLab.IGitLabClient.GetProjectVariableClient(NGitLab.Models.ProjectId projectId) -> NGitLab.IProjectVariableClient
@@ -875,6 +877,9 @@ NGitLab.Impl.ProjectIssueNoteClient.Edit(NGitLab.Models.ProjectIssueNoteEdit edi
875877
NGitLab.Impl.ProjectIssueNoteClient.ForIssue(long issueId) -> System.Collections.Generic.IEnumerable<NGitLab.Models.ProjectIssueNote>
876878
NGitLab.Impl.ProjectIssueNoteClient.Get(long issueId, long noteId) -> NGitLab.Models.ProjectIssueNote
877879
NGitLab.Impl.ProjectIssueNoteClient.ProjectIssueNoteClient(NGitLab.Impl.API api, NGitLab.Models.ProjectId projectId) -> void
880+
NGitLab.Impl.ProjectJobTokenScopeClient
881+
NGitLab.Impl.ProjectJobTokenScopeClient.GetProjectJobTokenScopeAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.JobTokenScope>
882+
NGitLab.Impl.ProjectJobTokenScopeClient.UpdateProjectJobTokenScopeAsync(NGitLab.Models.JobTokenScope scope, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
878883
NGitLab.Impl.ProjectLevelApprovalRulesClient
879884
NGitLab.Impl.ProjectLevelApprovalRulesClient.CreateProjectLevelRule(NGitLab.Models.ApprovalRuleCreate approvalRuleCreate) -> NGitLab.Models.ApprovalRule
880885
NGitLab.Impl.ProjectLevelApprovalRulesClient.DeleteProjectLevelRule(long approvalRuleIdToDelete) -> void
@@ -1083,6 +1088,9 @@ NGitLab.IProjectIssueNoteClient.Create(NGitLab.Models.ProjectIssueNoteCreate cre
10831088
NGitLab.IProjectIssueNoteClient.Edit(NGitLab.Models.ProjectIssueNoteEdit edit) -> NGitLab.Models.ProjectIssueNote
10841089
NGitLab.IProjectIssueNoteClient.ForIssue(long issueId) -> System.Collections.Generic.IEnumerable<NGitLab.Models.ProjectIssueNote>
10851090
NGitLab.IProjectIssueNoteClient.Get(long issueId, long noteId) -> NGitLab.Models.ProjectIssueNote
1091+
NGitLab.IProjectJobTokenScopeClient
1092+
NGitLab.IProjectJobTokenScopeClient.GetProjectJobTokenScopeAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.JobTokenScope>
1093+
NGitLab.IProjectJobTokenScopeClient.UpdateProjectJobTokenScopeAsync(NGitLab.Models.JobTokenScope scope, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
10861094
NGitLab.IProjectLevelApprovalRulesClient
10871095
NGitLab.IProjectLevelApprovalRulesClient.CreateProjectLevelRule(NGitLab.Models.ApprovalRuleCreate approvalRuleCreate) -> NGitLab.Models.ApprovalRule
10881096
NGitLab.IProjectLevelApprovalRulesClient.DeleteProjectLevelRule(long approvalRuleIdToDelete) -> void
@@ -2649,6 +2657,10 @@ NGitLab.Models.JobScopeMask.Pending = 2 -> NGitLab.Models.JobScopeMask
26492657
NGitLab.Models.JobScopeMask.Running = 4 -> NGitLab.Models.JobScopeMask
26502658
NGitLab.Models.JobScopeMask.Skipped = 64 -> NGitLab.Models.JobScopeMask
26512659
NGitLab.Models.JobScopeMask.Success = 16 -> NGitLab.Models.JobScopeMask
2660+
NGitLab.Models.JobTokenScope
2661+
NGitLab.Models.JobTokenScope.InboundEnabled.get -> bool
2662+
NGitLab.Models.JobTokenScope.InboundEnabled.set -> void
2663+
NGitLab.Models.JobTokenScope.JobTokenScope() -> void
26522664
NGitLab.Models.Label
26532665
NGitLab.Models.Label.ClosedIssuesCount.get -> int
26542666
NGitLab.Models.Label.ClosedIssuesCount.set -> void

0 commit comments

Comments
 (0)