Skip to content

Commit e725935

Browse files
authored
add endpoint for all local bills regardless of selected identity (#379)
1 parent 253c0ff commit e725935

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

src/service/bill_service.rs

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ pub trait BillServiceApi: Send + Sync {
283283
async fn get_bills(&self, current_identity_node_id: &str)
284284
-> Result<Vec<BitcreditBillToReturn>>;
285285

286+
/// Gets all bills from all identities
287+
async fn get_bills_from_all_identities(&self) -> Result<Vec<BitcreditBillToReturn>>;
288+
286289
/// Gets the combined bitcoin private key for a given bill
287290
async fn get_combined_bitcoin_key_for_bill(
288291
&self,
@@ -1815,6 +1818,22 @@ impl BillServiceApi for BillService {
18151818
Ok(result)
18161819
}
18171820

1821+
async fn get_bills_from_all_identities(&self) -> Result<Vec<BitcreditBillToReturn>> {
1822+
let mut res = vec![];
1823+
let bill_ids = self.store.get_ids().await?;
1824+
let identity = self.identity_store.get().await?;
1825+
let current_timestamp = external::time::TimeApi::get_atomic_time().await.timestamp;
1826+
1827+
for bill_id in bill_ids {
1828+
let bill = self
1829+
.get_full_bill(&bill_id, &identity, &identity.node_id, current_timestamp)
1830+
.await?;
1831+
res.push(bill)
1832+
}
1833+
1834+
Ok(res)
1835+
}
1836+
18181837
async fn get_bills(
18191838
&self,
18201839
current_identity_node_id: &str,
@@ -4081,6 +4100,87 @@ pub mod tests {
40814100
assert!(service.get_bill_keys("test").await.is_err());
40824101
}
40834102

4103+
#[tokio::test]
4104+
async fn get_bills_from_all_identities_baseline() {
4105+
let (
4106+
mut storage,
4107+
mut chain_storage,
4108+
mut identity_storage,
4109+
file_upload_storage,
4110+
identity_chain_store,
4111+
company_chain_store,
4112+
contact_storage,
4113+
company_storage,
4114+
) = get_storages();
4115+
let company_node_id = BcrKeys::new().get_public_key();
4116+
let mut bill1 = get_baseline_bill("1234");
4117+
bill1.drawee = IdentityPublicData::new_only_node_id(BcrKeys::new().get_public_key());
4118+
bill1.drawer = IdentityPublicData::new_only_node_id(BcrKeys::new().get_public_key());
4119+
bill1.payee = IdentityPublicData::new(get_baseline_identity().identity).unwrap();
4120+
let mut bill2 = get_baseline_bill("5555");
4121+
bill2.drawee = IdentityPublicData::new_only_node_id(BcrKeys::new().get_public_key());
4122+
bill2.drawer = IdentityPublicData::new_only_node_id(BcrKeys::new().get_public_key());
4123+
bill2.payee = IdentityPublicData::new_only_node_id(company_node_id.clone());
4124+
4125+
let mut notification_service = MockNotificationServiceApi::new();
4126+
4127+
identity_storage
4128+
.expect_get()
4129+
.returning(|| Ok(get_baseline_identity().identity));
4130+
storage.expect_get_keys().returning(|_| {
4131+
Ok(BillKeys {
4132+
private_key: TEST_PRIVATE_KEY_SECP.to_owned(),
4133+
public_key: TEST_PUB_KEY_SECP.to_owned(),
4134+
})
4135+
});
4136+
chain_storage
4137+
.expect_get_chain()
4138+
.withf(|id| id == "1234")
4139+
.returning(move |_| {
4140+
let chain = get_genesis_chain(Some(bill1.clone()));
4141+
Ok(chain)
4142+
});
4143+
chain_storage
4144+
.expect_get_chain()
4145+
.withf(|id| id == "5555")
4146+
.returning(move |_| {
4147+
let chain = get_genesis_chain(Some(bill2.clone()));
4148+
Ok(chain)
4149+
});
4150+
storage
4151+
.expect_get_ids()
4152+
.returning(|| Ok(vec!["1234".to_string(), "5555".to_string()]));
4153+
storage.expect_is_paid().returning(|_| Ok(true));
4154+
4155+
notification_service
4156+
.expect_get_active_bill_notification()
4157+
.returning(|_| None);
4158+
4159+
let service = get_service_base(
4160+
storage,
4161+
chain_storage,
4162+
identity_storage,
4163+
file_upload_storage,
4164+
identity_chain_store,
4165+
notification_service,
4166+
company_chain_store,
4167+
contact_storage,
4168+
company_storage,
4169+
);
4170+
4171+
let res_personal = service
4172+
.get_bills(&get_baseline_identity().identity.node_id)
4173+
.await;
4174+
let res_company = service.get_bills(&company_node_id).await;
4175+
let res_both = service.get_bills_from_all_identities().await;
4176+
assert!(res_personal.is_ok());
4177+
assert!(res_company.is_ok());
4178+
assert!(res_both.is_ok());
4179+
assert!(res_personal.as_ref().unwrap().len() == 1);
4180+
assert!(res_company.as_ref().unwrap().len() == 1);
4181+
assert!(res_both.as_ref().unwrap().len() == 2);
4182+
}
4183+
40844184
#[tokio::test]
40854185
async fn get_bills_baseline() {
40864186
let (
@@ -4093,8 +4193,71 @@ pub mod tests {
40934193
contact_storage,
40944194
company_storage,
40954195
) = get_storages();
4196+
let mut bill = get_baseline_bill("1234");
4197+
bill.payee = IdentityPublicData::new(get_baseline_identity().identity).unwrap();
4198+
40964199
let mut notification_service = MockNotificationServiceApi::new();
4200+
4201+
identity_storage
4202+
.expect_get()
4203+
.returning(|| Ok(get_baseline_identity().identity));
4204+
storage.expect_get_keys().returning(|_| {
4205+
Ok(BillKeys {
4206+
private_key: TEST_PRIVATE_KEY_SECP.to_owned(),
4207+
public_key: TEST_PUB_KEY_SECP.to_owned(),
4208+
})
4209+
});
4210+
chain_storage.expect_get_chain().returning(move |_| {
4211+
let chain = get_genesis_chain(Some(bill.clone()));
4212+
Ok(chain)
4213+
});
4214+
storage
4215+
.expect_get_ids()
4216+
.returning(|| Ok(vec!["1234".to_string()]));
4217+
storage.expect_is_paid().returning(|_| Ok(true));
4218+
4219+
notification_service
4220+
.expect_get_active_bill_notification()
4221+
.with(eq("1234"))
4222+
.returning(|_| None);
4223+
4224+
let service = get_service_base(
4225+
storage,
4226+
chain_storage,
4227+
identity_storage,
4228+
file_upload_storage,
4229+
identity_chain_store,
4230+
notification_service,
4231+
company_chain_store,
4232+
contact_storage,
4233+
company_storage,
4234+
);
4235+
4236+
let res = service
4237+
.get_bills(&get_baseline_identity().identity.node_id)
4238+
.await;
4239+
assert!(res.is_ok());
4240+
let returned_bills = res.unwrap();
4241+
assert!(returned_bills.len() == 1);
4242+
assert_eq!(returned_bills[0].id, "1234".to_string());
4243+
}
4244+
4245+
#[tokio::test]
4246+
async fn get_bills_baseline_company() {
4247+
let (
4248+
mut storage,
4249+
mut chain_storage,
4250+
mut identity_storage,
4251+
file_upload_storage,
4252+
identity_chain_store,
4253+
company_chain_store,
4254+
contact_storage,
4255+
company_storage,
4256+
) = get_storages();
40974257
let company_node_id = BcrKeys::new().get_public_key();
4258+
let mut bill = get_baseline_bill("1234");
4259+
bill.payee = IdentityPublicData::new(get_baseline_identity().identity).unwrap();
4260+
let mut notification_service = MockNotificationServiceApi::new();
40984261

40994262
identity_storage
41004263
.expect_get()

src/web/api_docs.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use utoipa::OpenApi;
1414
handlers::notifications::websocket,
1515
handlers::notifications::sse,
1616
handlers::bill::list,
17+
handlers::bill::all_bills_from_all_identities,
1718
handlers::bill::list_light,
1819
handlers::bill::search,
1920
handlers::bill::bill_detail,

src/web/handlers/bill.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,23 @@ pub async fn list(
219219
Ok(Json(BillsResponse { bills }))
220220
}
221221

222+
#[utoipa::path(
223+
tag = "All Bills from all identities",
224+
path = "/bill/list_all",
225+
description = "Get all local bills regardless of the selected identity",
226+
responses(
227+
(status = 200, description = "List of all local bills", body = BillsResponse<BitcreditBillToReturn>)
228+
)
229+
)]
230+
#[get("/list_all")]
231+
pub async fn all_bills_from_all_identities(
232+
_identity: IdentityCheck,
233+
state: &State<ServiceContext>,
234+
) -> Result<Json<BillsResponse<BitcreditBillToReturn>>> {
235+
let bills = state.bill_service.get_bills_from_all_identities().await?;
236+
Ok(Json(BillsResponse { bills }))
237+
}
238+
222239
#[get("/numbers_to_words_for_sum/<id>")]
223240
pub async fn numbers_to_words_for_sum(
224241
_identity: IdentityCheck,

src/web/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ pub fn rocket_main(context: ServiceContext) -> Rocket<Build> {
127127
.mount(
128128
"/bill",
129129
routes![
130+
handlers::bill::all_bills_from_all_identities,
130131
handlers::bill::issue_bill,
131132
handlers::bill::bill_detail,
132133
handlers::bill::list,

0 commit comments

Comments
 (0)