Skip to content
This repository was archived by the owner on Oct 6, 2020. It is now read-only.

Commit 752e0af

Browse files
author
Francesco Cogno
authored
Merge pull request #215 from MindFlavor/cosmos/user/dev
CosmosDB: Implemented User methods
2 parents 7c99a20 + fcd4f7e commit 752e0af

26 files changed

+894
-8
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
[![Build Status](https://travis-ci.org/MindFlavor/AzureSDKForRust.svg?branch=master)](https://travis-ci.org/MindFlavor/AzureSDKForRust) [![Coverage Status](https://coveralls.io/repos/MindFlavor/AzureSDKForRust/badge.svg?branch=master&service=github)](https://coveralls.io/github/MindFlavor/AzureSDKForRust?branch=master) ![stability-unstable](https://img.shields.io/badge/stability-unstable-yellow.svg)
77

8-
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/core_0.35.0) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/core_0.35.0) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/core_0.35.0.svg)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
8+
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/cosmos_0.32.2) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/cosmos_0.32.2) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/cosmos_0.32.2.svg)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
99

1010
[![GitHub contributors](https://img.shields.io/github/contributors/MindFlavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/graphs/contributors)
1111

1212
Crate | Docs | Crates.io | Downloads | Downloads@Latest |
1313
-- | -- | -- | -- | -- |
1414
[azure_sdk_auth_aad](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_auth_aad) | [![docs](https://docs.rs/azure_sdk_auth_aad/badge.svg)](https://docs.rs/azure_sdk_auth_aad/0.35.0/azure_sdk_auth_aad) | [![Crate](https://img.shields.io/crates/v/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad)
1515
[azure_sdk_core](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_core) | [![docs](https://docs.rs/azure_sdk_core/badge.svg)](https://docs.rs/azure_sdk_core/0.35.0/azure_sdk_core) | [![Crate](https://img.shields.io/crates/v/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core)
16-
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.32.1/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
16+
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.32.2/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
1717
[azure_sdk_service_bus](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_service_bus) | [![docs](https://docs.rs/azure_sdk_service_bus/badge.svg)](https://docs.rs/azure_sdk_service_bus/0.30.1/azure_sdk_service_bus) | [![Crate](https://img.shields.io/crates/v/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus)
1818
[azure_sdk_storage_account](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_account) | [![docs](https://docs.rs/azure_sdk_storage_account/badge.svg)](https://docs.rs/azure_sdk_storage_account/0.30.1/azure_sdk_storage_account) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account)
1919
[azure_sdk_storage_blob](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_blob) | [![docs](https://docs.rs/azure_sdk_storage_blob/badge.svg)](https://docs.rs/azure_sdk_storage_blob/0.30.1/azure_sdk_storage_blob) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob)

azure_sdk_cosmos/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "azure_sdk_cosmos"
3-
version = "0.32.1"
3+
version = "0.32.2"
44
description = "Rust wrappers around Microsoft Azure REST APIs - Azure Cosmos DB crate"
55
readme = "README.md"
66
authors = ["Francesco Cogno <francesco.cogno@outlook.com>", "Max Gortman <mgortman@microsoft.com>"]
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use azure_sdk_cosmos::prelude::*;
2+
use std::error::Error;
3+
4+
#[tokio::main]
5+
async fn main() -> Result<(), Box<dyn Error>> {
6+
// First we retrieve the account name and master key from environment variables.
7+
// We expect master keys (ie, not resource constrained)
8+
let master_key =
9+
std::env::var("COSMOS_MASTER_KEY").expect("Set env variable COSMOS_MASTER_KEY first!");
10+
let account = std::env::var("COSMOS_ACCOUNT").expect("Set env variable COSMOS_ACCOUNT first!");
11+
12+
let database_name = std::env::args()
13+
.nth(1)
14+
.expect("please specify the database name as first command line parameter");
15+
let user_name = std::env::args()
16+
.nth(2)
17+
.expect("please specify the user name as first command line parameter");
18+
19+
let authorization_token =
20+
AuthorizationToken::new(account.clone(), TokenType::Master, &master_key)?;
21+
22+
let client = ClientBuilder::new(authorization_token)?;
23+
let database_client = client.with_database(&database_name);
24+
let user_client = database_client.with_user(&user_name);
25+
26+
let create_user_response = user_client.create_user().execute().await?;
27+
println!("create_user_response == {:#?}", create_user_response);
28+
29+
let list_users_response = database_client.list_users().execute().await?;
30+
println!("list_users_response == {:#?}", list_users_response);
31+
32+
let get_user_response = user_client.get_user().execute().await?;
33+
println!("get_user_response == {:#?}", get_user_response);
34+
35+
let new_user = format!("{}replaced", user_name);
36+
37+
let replace_user_response = user_client
38+
.replace_user()
39+
.with_user_name(&new_user)
40+
.execute()
41+
.await?;
42+
println!("replace_user_response == {:#?}", replace_user_response);
43+
44+
let user_client = database_client.with_user(&new_user);
45+
46+
let delete_user_response = user_client.delete_user().execute().await?;
47+
println!("delete_user_response == {:#?}", delete_user_response);
48+
49+
Ok(())
50+
}

azure_sdk_cosmos/src/clients/client.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub(crate) enum ResourceType {
2727
Collections,
2828
Documents,
2929
StoredProcedures,
30+
Users,
3031
}
3132

3233
pub trait CosmosUriBuilder {
@@ -322,14 +323,15 @@ fn string_to_sign(
322323
ResourceType::Collections => "colls",
323324
ResourceType::Documents => "docs",
324325
ResourceType::StoredProcedures => "sprocs",
326+
ResourceType::Users => "users",
325327
},
326328
resource_link,
327329
time.to_lowercase()
328330
)
329331
}
330332

331333
fn generate_resource_link(u: &str) -> &str {
332-
static ENDING_STRINGS: &[&str] = &["dbs", "colls", "docs"];
334+
static ENDING_STRINGS: &[&str] = &["dbs", "colls", "docs", "users"];
333335

334336
// store the element only if it does not end with dbs, colls or docs
335337
let p = u;

azure_sdk_cosmos/src/clients/database_client.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::clients::{Client, CollectionClient, CosmosUriBuilder, ResourceType};
1+
use crate::clients::{Client, CollectionClient, CosmosUriBuilder, ResourceType, UserClient};
22
use crate::database::DatabaseName;
3-
use crate::requests;
43
use crate::DatabaseBuilderTrait;
4+
use crate::{requests, UserName};
55
use crate::{CollectionName, DatabaseTrait};
66
use azure_sdk_core::No;
77

@@ -66,6 +66,14 @@ where
6666
) -> CollectionClient<'c, CUB> {
6767
CollectionClient::new(self, collection_name)
6868
}
69+
70+
fn with_user<'c>(&'c self, user_name: &'c dyn UserName) -> UserClient<'c, CUB> {
71+
UserClient::new(&self, user_name)
72+
}
73+
74+
fn list_users<'c>(&'c self) -> requests::ListUsersBuilder<'c, CUB> {
75+
requests::ListUsersBuilder::new(self)
76+
}
6977
}
7078

7179
impl<'a, CUB> DatabaseBuilderTrait<'a, CUB> for DatabaseClient<'a, CUB>

azure_sdk_cosmos/src/clients/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ mod collection_client;
33
mod database_client;
44
mod document_client;
55
mod stored_procedure_client;
6+
mod user_client;
67
pub use client::*;
78
pub use collection_client::CollectionClient;
89
pub use database_client::DatabaseClient;
910
pub use document_client::DocumentClient;
1011
pub use stored_procedure_client::StoredProcedureClient;
12+
pub use user_client::UserClient;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use crate::clients::{Client, CosmosUriBuilder, DatabaseClient};
2+
use crate::database::DatabaseName;
3+
use crate::{requests, DatabaseTrait, UserName, UserTrait};
4+
use azure_sdk_core::No;
5+
6+
#[derive(Debug, Clone)]
7+
pub struct UserClient<'a, CUB>
8+
where
9+
CUB: CosmosUriBuilder,
10+
{
11+
database_client: &'a DatabaseClient<'a, CUB>,
12+
user_name: &'a dyn UserName,
13+
}
14+
15+
impl<'a, CUB> UserClient<'a, CUB>
16+
where
17+
CUB: CosmosUriBuilder,
18+
{
19+
pub(crate) fn new(
20+
database_client: &'a DatabaseClient<'a, CUB>,
21+
user_name: &'a dyn UserName,
22+
) -> Self {
23+
Self {
24+
database_client,
25+
user_name,
26+
}
27+
}
28+
29+
pub(crate) fn main_client(&self) -> &Client<CUB> {
30+
self.database_client.main_client()
31+
}
32+
33+
pub(crate) fn hyper_client(
34+
&self,
35+
) -> &hyper::Client<hyper_rustls::HttpsConnector<hyper::client::HttpConnector>> {
36+
self.main_client().hyper_client()
37+
}
38+
}
39+
40+
impl<'a, CUB> UserTrait<'a, CUB> for UserClient<'a, CUB>
41+
where
42+
CUB: CosmosUriBuilder,
43+
{
44+
fn database_name(&self) -> &'a dyn DatabaseName {
45+
self.database_client.database_name()
46+
}
47+
48+
fn user_name(&self) -> &'a dyn UserName {
49+
self.user_name
50+
}
51+
52+
fn create_user(&self) -> requests::CreateUserBuilder<'_, CUB> {
53+
requests::CreateUserBuilder::new(self)
54+
}
55+
56+
fn get_user(&self) -> requests::GetUserBuilder<'_, CUB> {
57+
requests::GetUserBuilder::new(self)
58+
}
59+
60+
fn replace_user(&self) -> requests::ReplaceUserBuilder<'_, CUB, No> {
61+
requests::ReplaceUserBuilder::new(self)
62+
}
63+
64+
fn delete_user(&self) -> requests::DeleteUserBuilder<'_, CUB> {
65+
requests::DeleteUserBuilder::new(self)
66+
}
67+
}

azure_sdk_cosmos/src/lib.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ mod requests;
2323
pub mod responses;
2424
pub mod stored_procedure;
2525
mod to_json_vector;
26+
mod user;
2627

2728
pub use self::authorization_token::*;
2829
use self::collection::IndexingPolicy;
@@ -35,14 +36,15 @@ pub use self::query::{Param, ParamDef, Query};
3536
pub use self::requests::*;
3637
use crate::clients::{
3738
Client, CollectionClient, CosmosUriBuilder, DatabaseClient, DocumentClient,
38-
StoredProcedureClient,
39+
StoredProcedureClient, UserClient,
3940
};
4041
use crate::collection::Collection;
4142
use crate::collection::CollectionName;
4243
use crate::database::DatabaseName;
4344
use crate::headers::*;
4445
pub use crate::partition_keys::PartitionKeys;
4546
use crate::stored_procedure::{Parameters, StoredProcedureName};
47+
pub use crate::user::{User, UserName};
4648
use azure_sdk_core::No;
4749
use http::request::Builder;
4850
use serde::Serialize;
@@ -314,6 +316,13 @@ where
314316
fn stored_procedure_client(&self) -> &'a StoredProcedureClient<'a, CUB>;
315317
}
316318

319+
pub trait UserClientRequired<'a, CUB>
320+
where
321+
CUB: CosmosUriBuilder,
322+
{
323+
fn user_client(&self) -> &'a UserClient<'a, CUB>;
324+
}
325+
317326
pub trait StoredProcedureNameRequired<'a> {
318327
fn stored_procedure_name(&self) -> &'a str;
319328
}
@@ -428,6 +437,15 @@ where
428437
fn with_database_name(self, database_name: &'a DB) -> Self::O;
429438
}
430439

440+
pub trait UserNameRequired<'a> {
441+
fn user_name(&self) -> &'a dyn UserName;
442+
}
443+
444+
pub trait UserNameSupport<'a> {
445+
type O;
446+
fn with_user_name(self, user_name: &'a dyn UserName) -> Self::O;
447+
}
448+
431449
//// New implementation
432450
pub trait CosmosTrait<CUB>
433451
where
@@ -453,6 +471,8 @@ where
453471
&'c self,
454472
collection_name: &'c dyn CollectionName,
455473
) -> CollectionClient<'c, CUB>;
474+
fn with_user<'c>(&'c self, user_name: &'c dyn UserName) -> UserClient<'c, CUB>;
475+
fn list_users<'c>(&'c self) -> requests::ListUsersBuilder<'c, CUB>;
456476
}
457477

458478
pub(crate) trait DatabaseBuilderTrait<'a, CUB>: DatabaseTrait<'a, CUB>
@@ -528,3 +548,15 @@ where
528548
{
529549
fn prepare_request(&self, method: hyper::Method) -> http::request::Builder;
530550
}
551+
552+
pub trait UserTrait<'a, CUB>
553+
where
554+
CUB: CosmosUriBuilder,
555+
{
556+
fn database_name(&self) -> &'a dyn DatabaseName;
557+
fn user_name(&self) -> &'a dyn UserName;
558+
fn create_user(&self) -> requests::CreateUserBuilder<'_, CUB>;
559+
fn get_user(&self) -> requests::GetUserBuilder<'_, CUB>;
560+
fn replace_user(&self) -> requests::ReplaceUserBuilder<'_, CUB, No>;
561+
fn delete_user(&self) -> requests::DeleteUserBuilder<'_, CUB>;
562+
}

azure_sdk_cosmos/src/prelude.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ pub use crate::{
2020
PartitionKeys, PartitionKeysOption, PartitionKeysRequired, PartitionKeysSupport,
2121
PartitionRangeIdOption, PartitionRangeIdSupport, QueryCrossPartitionOption,
2222
QueryCrossPartitionSupport, QueryRequired, QuerySupport, StoredProcedureNameRequired,
23-
StoredProcedureNameSupport, StoredProcedureTrait, TokenType,
23+
StoredProcedureNameSupport, StoredProcedureTrait, TokenType, UserClientRequired, UserName,
24+
UserNameRequired, UserNameSupport, UserTrait,
2425
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "CreateUserBuilder",
3+
"derive": "Debug, Clone",
4+
"uses": [
5+
"crate::clients::{CosmosUriBuilder, UserClient, ResourceType}",
6+
"crate::prelude::*",
7+
"crate::responses::CreateUserResponse",
8+
"azure_sdk_core::errors::{check_status_extract_headers_and_body, AzureError}",
9+
"hyper::StatusCode",
10+
"std::convert::TryInto"
11+
],
12+
"extra_types": [ "'a", "CUB" ],
13+
"inline": true,
14+
"extra_wheres": [ "CUB: CosmosUriBuilder" ],
15+
"constructor_fields": [
16+
{
17+
"name": "user_client",
18+
"field_type": "&'a UserClient<'a, CUB>",
19+
"trait_get": "UserClientRequired<'a, CUB>"
20+
}
21+
],
22+
"fields": [
23+
]
24+
}

0 commit comments

Comments
 (0)