Skip to content

Commit 95d4d8f

Browse files
committed
Create permission
1 parent 30e58ba commit 95d4d8f

File tree

10 files changed

+101
-108
lines changed

10 files changed

+101
-108
lines changed

sdk/data_cosmos/examples/permission_00.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,10 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
6868
let permission_mode = get_collection_response.collection.read_permission();
6969

7070
let create_permission_response = permission_client
71-
.create_permission(
72-
Context::new(),
73-
CreatePermissionOptions::new()
74-
.consistency_level(&create_user_response)
75-
.expiry_seconds(18000u64),
76-
&permission_mode,
77-
)
71+
.create_permission(permission_mode)
72+
.consistency_level(&create_user_response)
73+
.expiry_seconds(18000u64)
74+
.into_future()
7875
.await
7976
.unwrap();
8077
println!(
@@ -87,11 +84,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
8784
let permission_mode = get_collection2_response.collection.all_permission();
8885

8986
let create_permission2_response = permission_client
90-
.create_permission(
91-
Context::new(),
92-
CreatePermissionOptions::new().consistency_level(&create_user_response),
93-
&permission_mode,
94-
)
87+
.create_permission(permission_mode)
88+
.consistency_level(&create_user_response)
89+
.into_future()
9590
.await
9691
.unwrap();
9792

sdk/data_cosmos/examples/user_permission_token.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
6161
let permission_mode = get_collection_response.collection.read_permission();
6262

6363
let create_permission_response = permission_client
64-
.create_permission(
65-
Context::new(),
66-
CreatePermissionOptions::new().expiry_seconds(18000u64), // 5 hours, max!
67-
&permission_mode,
68-
)
64+
.create_permission(permission_mode)
65+
.expiry_seconds(18000u64) // 5 hours, max!
66+
.into_future()
6967
.await
7068
.unwrap();
7169
println!(
@@ -137,11 +135,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
137135
// All includes read and write.
138136
let permission_mode = get_collection_response.collection.all_permission();
139137
let create_permission_response = permission_client
140-
.create_permission(
141-
Context::new(),
142-
CreatePermissionOptions::new().expiry_seconds(18000u64), // 5 hours, max!
143-
&permission_mode,
144-
)
138+
.create_permission(permission_mode)
139+
.expiry_seconds(18000u64)
140+
.into_future()
145141
.await
146142
.unwrap();
147143
println!(

sdk/data_cosmos/src/clients/permission_client.rs

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,38 +44,17 @@ impl PermissionClient {
4444
}
4545

4646
/// Create the permission
47-
pub async fn create_permission(
48-
&self,
49-
ctx: Context,
50-
options: CreatePermissionOptions,
51-
permission_mode: &PermissionMode<'_>,
52-
) -> crate::Result<PermissionResponse<'_>> {
53-
let mut request = self.cosmos_client().prepare_request_pipeline(
54-
&format!(
55-
"dbs/{}/users/{}/permissions",
56-
self.database_client().database_name(),
57-
self.user_client().user_name()
58-
),
59-
http::Method::POST,
60-
);
61-
62-
options.decorate_request(&mut request, self.permission_name(), permission_mode)?;
63-
64-
let response = self
65-
.pipeline()
66-
.send(ctx.clone().insert(ResourceType::Permissions), &mut request)
67-
.await?;
68-
69-
Ok(PermissionResponse::try_from(response).await?)
47+
pub fn create_permission(&self, permission_mode: PermissionMode) -> CreatePermissionBuilder {
48+
CreatePermissionBuilder::new(self.clone(), permission_mode)
7049
}
7150

7251
/// Replace the permission
7352
pub async fn replace_permission(
7453
&self,
7554
ctx: Context,
7655
options: ReplacePermissionOptions,
77-
permission_mode: &PermissionMode<'_>,
78-
) -> crate::Result<PermissionResponse<'_>> {
56+
permission_mode: &PermissionMode,
57+
) -> crate::Result<PermissionResponse> {
7958
let mut request = self.prepare_request_with_permission_name(http::Method::PUT);
8059

8160
options.decorate_request(&mut request, self.permission_name(), permission_mode)?;
@@ -93,7 +72,7 @@ impl PermissionClient {
9372
&self,
9473
ctx: Context,
9574
options: GetPermissionOptions,
96-
) -> crate::Result<PermissionResponse<'_>> {
75+
) -> crate::Result<PermissionResponse> {
9776
let mut request = self.prepare_request_with_permission_name(http::Method::GET);
9877

9978
options.decorate_request(&mut request)?;
@@ -136,7 +115,7 @@ impl PermissionClient {
136115
)
137116
}
138117

139-
fn pipeline(&self) -> &Pipeline {
118+
pub(crate) fn pipeline(&self) -> &Pipeline {
140119
self.cosmos_client().pipeline()
141120
}
142121
}
Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
use crate::prelude::*;
2-
use crate::resources::permission::{ExpirySeconds, PermissionMode};
2+
use crate::resources::permission::{ExpirySeconds, PermissionMode, PermissionResponse};
33

4-
use azure_core::Request as HttpRequest;
4+
use azure_core::Context;
55

66
#[derive(Debug, Clone)]
7-
pub struct CreatePermissionOptions {
7+
pub struct CreatePermissionBuilder {
8+
client: PermissionClient,
89
expiry_seconds: Option<ExpirySeconds>,
910
consistency_level: Option<ConsistencyLevel>,
11+
permission_mode: PermissionMode,
12+
context: Context,
1013
}
1114

12-
impl CreatePermissionOptions {
13-
pub fn new() -> Self {
15+
impl CreatePermissionBuilder {
16+
pub(crate) fn new(client: PermissionClient, permission_mode: PermissionMode) -> Self {
1417
Self {
18+
client,
1519
expiry_seconds: Some(ExpirySeconds::new(3600)),
1620
consistency_level: None,
21+
permission_mode,
22+
context: Context::new(),
1723
}
1824
}
1925

@@ -22,30 +28,47 @@ impl CreatePermissionOptions {
2228
consistency_level: ConsistencyLevel => Some(consistency_level),
2329
}
2430

25-
pub(crate) fn decorate_request(
26-
&self,
27-
request: &mut HttpRequest,
28-
id: &str,
29-
permission_mode: &PermissionMode<'_>,
30-
) -> crate::Result<()> {
31-
azure_core::headers::add_optional_header2(&self.consistency_level, request)?;
32-
azure_core::headers::add_optional_header2(&self.expiry_seconds, request)?;
33-
34-
#[derive(Serialize, Deserialize)]
35-
struct RequestBody<'x> {
36-
id: &'x str,
37-
#[serde(rename = "permissionMode")]
38-
permission_mode: &'x str,
39-
resource: &'x str,
40-
}
31+
pub fn into_future(self) -> CreatePermission {
32+
Box::pin(async move {
33+
let mut request = self.client.cosmos_client().prepare_request_pipeline(
34+
&format!(
35+
"dbs/{}/users/{}/permissions",
36+
self.client.database_client().database_name(),
37+
self.client.user_client().user_name()
38+
),
39+
http::Method::POST,
40+
);
41+
42+
azure_core::headers::add_optional_header2(&self.consistency_level, &mut request)?;
43+
azure_core::headers::add_optional_header2(&self.expiry_seconds, &mut request)?;
44+
45+
#[derive(Serialize, Deserialize)]
46+
struct RequestBody<'x> {
47+
id: &'x str,
48+
#[serde(rename = "permissionMode")]
49+
permission_mode: &'x str,
50+
resource: &'x str,
51+
}
4152

42-
let request_body = RequestBody {
43-
id,
44-
permission_mode: permission_mode.kind(),
45-
resource: permission_mode.resource(),
46-
};
53+
let request_body = RequestBody {
54+
id: &self.client.permission_name(),
55+
permission_mode: self.permission_mode.kind(),
56+
resource: self.permission_mode.resource(),
57+
};
4758

48-
request.set_body(bytes::Bytes::from(serde_json::to_string(&request_body)?).into());
49-
Ok(())
59+
request.set_body(bytes::Bytes::from(serde_json::to_string(&request_body)?).into());
60+
let response = self
61+
.client
62+
.pipeline()
63+
.send(
64+
self.context.clone().insert(ResourceType::Permissions),
65+
&mut request,
66+
)
67+
.await?;
68+
69+
Ok(PermissionResponse::try_from(response).await?)
70+
})
5071
}
5172
}
73+
74+
type CreatePermission = futures::future::BoxFuture<'static, crate::Result<PermissionResponse>>;

sdk/data_cosmos/src/operations/replace_permission.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl ReplacePermissionOptions {
2626
&self,
2727
request: &mut HttpRequest,
2828
id: &str,
29-
permission_mode: &PermissionMode<'_>,
29+
permission_mode: &PermissionMode,
3030
) -> crate::Result<()> {
3131
azure_core::headers::add_optional_header2(&self.consistency_level, request)?;
3232
azure_core::headers::add_optional_header2(&self.expiry_seconds, request)?;

sdk/data_cosmos/src/requests/list_permissions_builder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl<'a, 'b> ListPermissionsBuilder<'a, 'b> {
3636
max_item_count: i32 => MaxItemCount::new(max_item_count),
3737
}
3838

39-
pub async fn execute(&self) -> crate::Result<ListPermissionsResponse<'a>> {
39+
pub async fn execute(&self) -> crate::Result<ListPermissionsResponse> {
4040
trace!("ListPermissionsBuilder::execute called");
4141

4242
let request = self.user_client.cosmos_client().prepare_request(
@@ -66,7 +66,7 @@ impl<'a, 'b> ListPermissionsBuilder<'a, 'b> {
6666
.try_into()?)
6767
}
6868

69-
pub fn stream(&self) -> impl Stream<Item = crate::Result<ListPermissionsResponse<'a>>> + '_ {
69+
pub fn stream(&self) -> impl Stream<Item = crate::Result<ListPermissionsResponse>> + '_ {
7070
#[derive(Debug, Clone, PartialEq)]
7171
enum States {
7272
Init,

sdk/data_cosmos/src/resources/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ pub trait Resource {
4040
fn uri(&self) -> &str;
4141

4242
/// Get the read permissions for the resource
43-
fn read_permission(&self) -> PermissionMode<'_> {
43+
fn read_permission(&self) -> PermissionMode {
4444
PermissionMode::read(self)
4545
}
4646

4747
/// Get all permissions for the resource
48-
fn all_permission(&self) -> PermissionMode<'_> {
48+
fn all_permission(&self) -> PermissionMode {
4949
PermissionMode::all(self)
5050
}
5151
}

sdk/data_cosmos/src/resources/permission/permission.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ use std::borrow::Cow;
1111
/// attachments, stored procedures, triggers, and user-defined functions for a particular user.
1212
/// You can learn more about permissions [here](https://docs.microsoft.com/rest/api/cosmos-db/permissions).
1313
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14-
pub struct Permission<'a> {
14+
pub struct Permission {
1515
/// The unique name that identifies the permission.
16-
pub id: Cow<'a, str>,
16+
pub id: String,
1717
#[serde(flatten)]
1818
/// The access mode on the resource for the user
1919
///
2020
/// Represented as both "permissionMode" and "resource" in the JSON representation.
21-
pub permission_mode: PermissionMode<'a>,
21+
pub permission_mode: PermissionMode,
2222
#[serde(rename = "_rid")]
23-
rid: Cow<'a, str>,
23+
rid: String,
2424
/// The last updated timestamp of the resource.
2525
///
2626
/// Represented as "_ts" in the JSON representation.
@@ -30,12 +30,12 @@ pub struct Permission<'a> {
3030
///
3131
/// Represented as "_self" in the JSON representation.
3232
#[serde(rename = "_self")]
33-
pub uri: Cow<'a, str>,
33+
pub uri: String,
3434
/// The resource etag required for optimistic concurrency control.
3535
///
3636
/// Represented as "_etag" in the JSON representation.
3737
#[serde(rename = "_etag")]
38-
pub etag: Cow<'a, str>,
38+
pub etag: String,
3939
/// The resource token for the particular resource and user.
4040
///
4141
/// Represented as "_token" in the JSON representation.
@@ -51,22 +51,22 @@ pub struct Permission<'a> {
5151
/// Constructing a `PermissionMode` manually is error prone. Use one of the constructor methods
5252
/// (i.e., [`PermissionMode::read`] or [`PermissionMode::all`]) or get a permission directly
5353
/// from a resource (e.g., `Collection::read_permission`).
54-
pub enum PermissionMode<'a> {
54+
pub enum PermissionMode {
5555
/// read, write, and delete access
56-
All(Cow<'a, str>),
56+
All(Cow<'static, str>),
5757
/// read access only
58-
Read(Cow<'a, str>),
58+
Read(Cow<'static, str>),
5959
}
6060

61-
impl<'a> PermissionMode<'a> {
61+
impl PermissionMode {
6262
/// Read permission for a given resource
63-
pub fn read<T: Resource + ?Sized + 'a>(resource: &'a T) -> Self {
64-
PermissionMode::Read(Cow::Borrowed(resource.uri()))
63+
pub fn read<T: Resource + ?Sized>(resource: &T) -> Self {
64+
PermissionMode::Read(Cow::Owned(resource.uri().to_owned()))
6565
}
6666

6767
/// Read, write, and delete permissions for a given resource
68-
pub fn all<T: Resource + ?Sized + 'a>(resource: &'a T) -> Self {
69-
PermissionMode::All(Cow::Borrowed(resource.uri()))
68+
pub fn all<T: Resource + ?Sized>(resource: &T) -> Self {
69+
PermissionMode::All(Cow::Owned(resource.uri().to_owned()))
7070
}
7171

7272
/// The kind of permission mode as a string. Either "All" or "Read".
@@ -86,7 +86,7 @@ impl<'a> PermissionMode<'a> {
8686
}
8787
}
8888

89-
impl<'a> std::convert::TryFrom<&[u8]> for Permission<'a> {
89+
impl std::convert::TryFrom<&[u8]> for Permission {
9090
type Error = crate::Error;
9191

9292
fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
@@ -112,7 +112,7 @@ mod tests {
112112

113113
#[test]
114114
fn parse_permission() {
115-
let permission: Permission<'_> = serde_json::from_str(PERMISSION_JSON).unwrap();
115+
let permission: Permission = serde_json::from_str(PERMISSION_JSON).unwrap();
116116

117117
assert_eq!(
118118
permission.permission_token,

sdk/data_cosmos/src/resources/permission/permission_response.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use azure_core::{collect_pinned_stream, Response as HttpResponse};
66
use super::Permission;
77

88
#[derive(Debug, Clone, PartialEq)]
9-
pub struct PermissionResponse<'a> {
10-
pub permission: Permission<'a>,
9+
pub struct PermissionResponse {
10+
pub permission: Permission,
1111
pub charge: f64,
1212
pub activity_id: uuid::Uuid,
1313
pub etag: String,
@@ -16,8 +16,8 @@ pub struct PermissionResponse<'a> {
1616
pub alt_content_path: String,
1717
}
1818

19-
impl<'a> PermissionResponse<'a> {
20-
pub async fn try_from(response: HttpResponse) -> crate::Result<PermissionResponse<'a>> {
19+
impl PermissionResponse {
20+
pub async fn try_from(response: HttpResponse) -> crate::Result<PermissionResponse> {
2121
let (_status_code, headers, pinned_stream) = response.deconstruct();
2222
let body = collect_pinned_stream(pinned_stream).await?;
2323

0 commit comments

Comments
 (0)