Skip to content

Commit 192edbb

Browse files
committed
api/projects: add access token APIs
1 parent 53b2338 commit 192edbb

File tree

9 files changed

+784
-5
lines changed

9 files changed

+784
-5
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
# v0.1611.3 (unreleased)
2+
3+
## Additions
4+
5+
* Add `api::projects::access_tokens::CreateProjectAccessToken` endpoint
6+
* Add `api::projects::access_tokens::ProjectAccessToken` endpoint
7+
* Add `api::projects::access_tokens::ProjectAccessTokens` endpoint
8+
* Add `api::projects::access_tokens::RevokeProjectAccessToken` endpoint
9+
* Add `api::projects::access_tokens::RotateProjectAccessToken` endpoint
10+
111
# v0.1611.2
212

313
## Additions

src/api/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ These API endpoints have been implemented.
5050
* `POST /projects` `projects/create.rs`
5151
* `GET /projects/:project` `projects/project.rs`
5252
* `PUT /projects/:project` `projects/edit.rs`
53+
* `GET /projects/:project/access_tokens` `projects/access_tokens/access_tokens.rs`
54+
* `POST /projects/:project/access_tokens` `projects/access_tokens/create.rs`
55+
* `GET /projects/:project/access_tokens/:token` `projects/access_tokens/access_token.rs`
56+
* `DELETE /projects/:project/access_tokens/:token` `projects/access_tokens/revoke.rs`
57+
* `POST /prgjects/:project/access_tokens/rotate` `projects/access_tokens/rotate.rs`
5358
* `GET /projects/:project/access_requests` `projects/access_requests/access_requests.rs`
5459
* `POST /projects/:project/access_requests` `projects/access_requests/request.rs`
5560
This should be a `POST` action `POST /projects/:project/access_requests/:user_id/approve`.
@@ -326,11 +331,6 @@ instead of having to search the page for missing endpoints.
326331
* `GET /job/allowed_agents` https://gitlab.kitware.com/help/api/jobs.md#get-gitlab-agent-by-ci_job_token
327332
* `GET /merge_requests` https://gitlab.kitware.com/help/api/merge_requests.md#list-merge-requests (#102)
328333
* `DELETE /projects/:project` https://gitlab.kitware.com/help/api/projects.md#delete-project
329-
* `GET /projects/:project/access_tokens` https://gitlab.kitware.com/help/api/project_access_tokens.md#list-project-access-tokens
330-
* `POST /projects/:project/access_tokens` https://gitlab.kitware.com/help/api/project_access_tokens.md#create-a-project-access-token
331-
* `GET /projects/:project/access_tokens/:token` https://gitlab.kitware.com/help/api/project_access_tokens.md#get-a-project-access-token
332-
* `DELETE /projects/:project/access_tokens/:token` https://gitlab.kitware.com/help/api/project_access_tokens.md#revoke-a-project-access-token
333-
* `POST /projects/:project/access_tokens/rotate` https://gitlab.kitware.com/help/api/project_access_tokens.md#rotate-a-project-access-token
334334
* `GET /projects/:project/approvals` https://gitlab.kitware.com/help/api/merge_request_approvals.md#get-configuration
335335
* `POST /projects/:project/approvals` https://gitlab.kitware.com/help/api/merge_request_approvals.md#change-configuration
336336
* `GET /projects/:project/approval_rules` https://gitlab.kitware.com/help/api/merge_request_approvals.md#get-project-level-rules

src/api/projects.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//! These endpoints are used for querying and modifying projects and their resources.
1212
1313
pub mod access_requests;
14+
pub mod access_tokens;
1415
mod archive;
1516
mod create;
1617
pub mod deploy_keys;

src/api/projects/access_tokens.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4+
// option. This file may not be copied, modified, or distributed
5+
// except according to those terms.
6+
7+
//! Project access token API endpoints
8+
//!
9+
//! These endpoints are used for querying and modifying project access tokens.
10+
11+
mod access_token;
12+
mod access_tokens;
13+
mod create;
14+
mod revoke;
15+
mod rotate;
16+
17+
pub use self::access_token::ProjectAccessToken;
18+
pub use self::access_token::ProjectAccessTokenBuilder;
19+
pub use self::access_token::ProjectAccessTokenBuilderError;
20+
21+
pub use self::access_tokens::ProjectAccessTokens;
22+
pub use self::access_tokens::ProjectAccessTokensBuilder;
23+
pub use self::access_tokens::ProjectAccessTokensBuilderError;
24+
25+
pub use self::create::CreateProjectAccessToken;
26+
pub use self::create::CreateProjectAccessTokenBuilder;
27+
pub use self::create::CreateProjectAccessTokenBuilderError;
28+
pub use self::create::ProjectAccessTokenAccessLevel;
29+
pub use self::create::ProjectAccessTokenScope;
30+
31+
pub use self::revoke::RevokeProjectAccessToken;
32+
pub use self::revoke::RevokeProjectAccessTokenBuilder;
33+
pub use self::revoke::RevokeProjectAccessTokenBuilderError;
34+
35+
pub use self::rotate::RotateProjectAccessToken;
36+
pub use self::rotate::RotateProjectAccessTokenBuilder;
37+
pub use self::rotate::RotateProjectAccessTokenBuilderError;
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4+
// option. This file may not be copied, modified, or distributed
5+
// except according to those terms.
6+
7+
use derive_builder::Builder;
8+
9+
use crate::api::common::NameOrId;
10+
use crate::api::endpoint_prelude::*;
11+
12+
/// Get a single project access token.
13+
#[derive(Debug, Builder, Clone)]
14+
pub struct ProjectAccessToken<'a> {
15+
/// The ID of the project.
16+
#[builder(setter(into))]
17+
project: NameOrId<'a>,
18+
/// The ID of the project access token.
19+
id: u64,
20+
}
21+
22+
impl<'a> ProjectAccessToken<'a> {
23+
/// Create a builder for the endpoint.
24+
pub fn builder() -> ProjectAccessTokenBuilder<'a> {
25+
ProjectAccessTokenBuilder::default()
26+
}
27+
}
28+
29+
impl<'a> Endpoint for ProjectAccessToken<'a> {
30+
fn method(&self) -> Method {
31+
Method::GET
32+
}
33+
34+
fn endpoint(&self) -> Cow<'static, str> {
35+
format!("projects/{}/access_tokens/{}", self.project, self.id).into()
36+
}
37+
}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use http::Method;
42+
43+
use crate::api::projects::access_tokens::{ProjectAccessToken, ProjectAccessTokenBuilderError};
44+
use crate::api::{self, Query};
45+
use crate::test::client::{ExpectedUrl, SingleTestClient};
46+
47+
#[test]
48+
fn project_id_is_necessary() {
49+
let err = ProjectAccessToken::builder().build().unwrap_err();
50+
crate::test::assert_missing_field!(err, ProjectAccessTokenBuilderError, "project");
51+
}
52+
53+
#[test]
54+
fn project_is_necessary() {
55+
let err = ProjectAccessToken::builder().id(1).build().unwrap_err();
56+
crate::test::assert_missing_field!(err, ProjectAccessTokenBuilderError, "project");
57+
}
58+
59+
#[test]
60+
fn id_is_necessary() {
61+
let err = ProjectAccessToken::builder()
62+
.project(1)
63+
.build()
64+
.unwrap_err();
65+
crate::test::assert_missing_field!(err, ProjectAccessTokenBuilderError, "id");
66+
}
67+
68+
#[test]
69+
fn project_and_id_are_sufficient() {
70+
ProjectAccessToken::builder()
71+
.project(1)
72+
.id(1)
73+
.build()
74+
.unwrap();
75+
}
76+
77+
#[test]
78+
fn endpoint() {
79+
let endpoint = ExpectedUrl::builder()
80+
.method(Method::GET)
81+
.endpoint("projects/foo/access_tokens/1")
82+
.build()
83+
.unwrap();
84+
let client = SingleTestClient::new_raw(endpoint, "");
85+
86+
let endpoint = ProjectAccessToken::builder()
87+
.project("foo")
88+
.id(1)
89+
.build()
90+
.unwrap();
91+
api::ignore(endpoint).query(&client).unwrap();
92+
}
93+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4+
// option. This file may not be copied, modified, or distributed
5+
// except according to those terms.
6+
7+
use derive_builder::Builder;
8+
9+
use crate::api::common::NameOrId;
10+
use crate::api::endpoint_prelude::*;
11+
12+
/// Get access tokens of a project.
13+
#[derive(Debug, Builder, Clone)]
14+
pub struct ProjectAccessTokens<'a> {
15+
/// The project for which to list tokens.
16+
#[builder(setter(into))]
17+
project: NameOrId<'a>,
18+
}
19+
20+
impl<'a> ProjectAccessTokens<'a> {
21+
/// Create a builder for the endpoint.
22+
pub fn builder() -> ProjectAccessTokensBuilder<'a> {
23+
ProjectAccessTokensBuilder::default()
24+
}
25+
}
26+
27+
impl<'a> Endpoint for ProjectAccessTokens<'a> {
28+
fn method(&self) -> Method {
29+
Method::GET
30+
}
31+
32+
fn endpoint(&self) -> Cow<'static, str> {
33+
format!("projects/{}/access_tokens", self.project).into()
34+
}
35+
}
36+
37+
impl<'a> Pageable for ProjectAccessTokens<'a> {}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use http::Method;
42+
43+
use crate::api::projects::access_tokens::{
44+
ProjectAccessTokens, ProjectAccessTokensBuilderError,
45+
};
46+
use crate::api::{self, Query};
47+
use crate::test::client::{ExpectedUrl, SingleTestClient};
48+
49+
#[test]
50+
fn project_is_required() {
51+
let err = ProjectAccessTokens::builder().build().unwrap_err();
52+
crate::test::assert_missing_field!(err, ProjectAccessTokensBuilderError, "project");
53+
}
54+
55+
#[test]
56+
fn project_is_sufficient() {
57+
ProjectAccessTokens::builder().project(1).build().unwrap();
58+
}
59+
60+
#[test]
61+
fn endpoint() {
62+
let endpoint = ExpectedUrl::builder()
63+
.method(Method::GET)
64+
.endpoint("projects/1/access_tokens")
65+
.build()
66+
.unwrap();
67+
let client = SingleTestClient::new_raw(endpoint, "");
68+
69+
let endpoint = ProjectAccessTokens::builder().project(1).build().unwrap();
70+
api::ignore(endpoint).query(&client).unwrap();
71+
}
72+
}

0 commit comments

Comments
 (0)