Skip to content

Commit 6a42ce6

Browse files
committed
Add delete_object fn to client
1 parent 58976ce commit 6a42ce6

File tree

3 files changed

+81
-14
lines changed

3 files changed

+81
-14
lines changed

src/client.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use reqwest::Client;
44

55
use crate::error::VssError;
66
use crate::types::{
7-
GetObjectRequest, GetObjectResponse, ListKeyVersionsRequest, ListKeyVersionsResponse, PutObjectRequest,
8-
PutObjectResponse,
7+
DeleteObjectRequest, DeleteObjectResponse, GetObjectRequest, GetObjectResponse, ListKeyVersionsRequest,
8+
ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse,
99
};
1010

1111
/// Thin-client to access a hosted instance of Versioned Storage Service (VSS).
@@ -60,6 +60,24 @@ impl VssClient {
6060
}
6161
}
6262

63+
/// Deletes the given `key` and `value` in `request`.
64+
/// Makes a service call to the `DeleteObject` endpoint of the VSS server.
65+
/// For API contract/usage, refer to docs for [`DeleteObjectRequest`] and [`DeleteObjectResponse`].
66+
pub async fn delete_object(&self, request: &DeleteObjectRequest) -> Result<DeleteObjectResponse, VssError> {
67+
let url = format!("{}/deleteObject", self.base_url);
68+
69+
let response_raw = self.client.post(url).body(request.encode_to_vec()).send().await?;
70+
let status = response_raw.status();
71+
let payload = response_raw.bytes().await?;
72+
73+
if status.is_success() {
74+
let response = DeleteObjectResponse::decode(&payload[..])?;
75+
Ok(response)
76+
} else {
77+
Err(VssError::new(status, payload))
78+
}
79+
}
80+
6381
/// Lists keys and their corresponding version for a given [`ListKeyVersionsRequest::store_id`].
6482
/// Makes a service call to the `ListKeyVersions` endpoint of the VSS server.
6583
/// For API contract/usage, refer to docs for [`ListKeyVersionsRequest`] and [`ListKeyVersionsResponse`].

src/lib.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Client-side library to interact with Versioned Storage Service (VSS).
22
//!
33
//! VSS is an open-source project designed to offer a server-side cloud storage solution specifically
4-
//! tailored for non-custodial Lightning supporting mobile wallets. Its primary objective is to
4+
//! tailored for noncustodial Lightning supporting mobile wallets. Its primary objective is to
55
//! simplify the development process for Lightning wallets by providing a secure means to store
66
//! and manage the essential state required for Lightning Network (LN) operations.
77
//!
@@ -10,13 +10,10 @@
1010
#![deny(rustdoc::broken_intra_doc_links)]
1111
#![deny(rustdoc::private_intra_doc_links)]
1212

13-
use crate::client::VssClient;
14-
use crate::error::VssError;
15-
16-
/// Implements a thin-client ([`VssClient`]) to access a hosted instance of Versioned Storage Service (VSS).
13+
/// Implements a thin-client ([`client::VssClient`]) to access a hosted instance of Versioned Storage Service (VSS).
1714
pub mod client;
1815

19-
/// Implements the error type ([`VssError`]) returned on interacting with [`VssClient`]
16+
/// Implements the error type ([`error::VssError`]) returned on interacting with [`client::VssClient`]
2017
pub mod error;
2118

2219
/// Contains request/response types generated from the API definition of VSS.

tests/tests.rs

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ mod tests {
66
use vss_client::error::VssError;
77

88
use vss_client::types::{
9-
ErrorCode, ErrorResponse, GetObjectRequest, GetObjectResponse, KeyValue, ListKeyVersionsRequest,
10-
ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse,
9+
DeleteObjectRequest, DeleteObjectResponse, ErrorCode, ErrorResponse, GetObjectRequest, GetObjectResponse,
10+
KeyValue, ListKeyVersionsRequest, ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse,
1111
};
1212

1313
const GET_OBJECT_ENDPOINT: &'static str = "/getObject";
1414
const PUT_OBJECT_ENDPOINT: &'static str = "/putObjects";
15+
const DELETE_OBJECT_ENDPOINT: &'static str = "/deleteObject";
1516
const LIST_KEY_VERSIONS_ENDPOINT: &'static str = "/listKeyVersions";
1617

1718
#[tokio::test]
@@ -55,6 +56,7 @@ mod tests {
5556
store_id: "store".to_string(),
5657
global_version: Some(4),
5758
transaction_items: vec![KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }],
59+
delete_items: vec![],
5860
};
5961
let mock_response = PutObjectResponse::default();
6062

@@ -76,6 +78,36 @@ mod tests {
7678
mock_server.expect(1).assert();
7779
}
7880

81+
#[tokio::test]
82+
async fn test_delete() {
83+
// Spin-up mock server with mock response for given request.
84+
let base_url = mockito::server_url().to_string();
85+
86+
// Set up the mock request/response.
87+
let request = DeleteObjectRequest {
88+
store_id: "store".to_string(),
89+
key_value: Some(KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }),
90+
};
91+
let mock_response = DeleteObjectResponse::default();
92+
93+
// Register the mock endpoint with the mockito server.
94+
let mock_server = mockito::mock("POST", DELETE_OBJECT_ENDPOINT)
95+
.match_body(request.encode_to_vec())
96+
.with_status(200)
97+
.with_body(mock_response.encode_to_vec())
98+
.create();
99+
100+
// Create a new VssClient with the mock server URL.
101+
let vss_client = VssClient::new(&base_url);
102+
let actual_result = vss_client.delete_object(&request).await.unwrap();
103+
104+
let expected_result = &mock_response;
105+
assert_eq!(actual_result, *expected_result);
106+
107+
// Verify server endpoint was called exactly once.
108+
mock_server.expect(1).assert();
109+
}
110+
79111
#[tokio::test]
80112
async fn test_list_key_versions() {
81113
// Spin-up mock server with mock response for given request.
@@ -142,10 +174,19 @@ mod tests {
142174
store_id: "store".to_string(),
143175
global_version: Some(4),
144176
transaction_items: vec![KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }],
177+
delete_items: vec![],
145178
})
146179
.await;
147180
assert!(matches!(put_result.unwrap_err(), VssError::InvalidRequestError { .. }));
148181

182+
let delete_result = vss_client
183+
.delete_object(&DeleteObjectRequest {
184+
store_id: "store".to_string(),
185+
key_value: Some(KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }),
186+
})
187+
.await;
188+
assert!(matches!(delete_result.unwrap_err(), VssError::InvalidRequestError { .. }));
189+
149190
let list_result = vss_client
150191
.list_key_versions(&ListKeyVersionsRequest {
151192
store_id: "store".to_string(),
@@ -156,8 +197,8 @@ mod tests {
156197
.await;
157198
assert!(matches!(list_result.unwrap_err(), VssError::InvalidRequestError { .. }));
158199

159-
// Verify 3 requests hit the server
160-
mock_server.expect(3).assert();
200+
// Verify 4 requests hit the server
201+
mock_server.expect(4).assert();
161202
}
162203

163204
#[tokio::test]
@@ -178,6 +219,7 @@ mod tests {
178219
store_id: "store".to_string(),
179220
global_version: Some(4),
180221
transaction_items: vec![KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }],
222+
delete_items: vec![],
181223
})
182224
.await;
183225
assert!(matches!(put_result.unwrap_err(), VssError::ConflictError { .. }));
@@ -211,10 +253,19 @@ mod tests {
211253
store_id: "store".to_string(),
212254
global_version: Some(4),
213255
transaction_items: vec![KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }],
256+
delete_items: vec![],
214257
})
215258
.await;
216259
assert!(matches!(put_result.unwrap_err(), VssError::InternalServerError { .. }));
217260

261+
let delete_result = vss_client
262+
.delete_object(&DeleteObjectRequest {
263+
store_id: "store".to_string(),
264+
key_value: Some(KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }),
265+
})
266+
.await;
267+
assert!(matches!(delete_result.unwrap_err(), VssError::InternalServerError { .. }));
268+
218269
let list_result = vss_client
219270
.list_key_versions(&ListKeyVersionsRequest {
220271
store_id: "store".to_string(),
@@ -225,8 +276,8 @@ mod tests {
225276
.await;
226277
assert!(matches!(list_result.unwrap_err(), VssError::InternalServerError { .. }));
227278

228-
// Verify 3 requests hit the server
229-
mock_server.expect(3).assert();
279+
// Verify 4 requests hit the server
280+
mock_server.expect(4).assert();
230281
}
231282

232283
#[tokio::test]
@@ -248,6 +299,7 @@ mod tests {
248299
store_id: "store".to_string(),
249300
global_version: Some(4),
250301
transaction_items: vec![KeyValue { key: "k1".to_string(), version: 2, value: b"k1v3".to_vec() }],
302+
delete_items: vec![],
251303
};
252304
let put_result = vss_client.put_object(&put_request).await;
253305
assert!(matches!(put_result.unwrap_err(), VssError::InternalError { .. }));

0 commit comments

Comments
 (0)