diff --git a/payjoin-cli/src/app/v2/mod.rs b/payjoin-cli/src/app/v2/mod.rs index 4337bf84b..7cd61d83c 100644 --- a/payjoin-cli/src/app/v2/mod.rs +++ b/payjoin-cli/src/app/v2/mod.rs @@ -105,24 +105,16 @@ impl AppTrait for App { } PjParam::V2(pj_param) => { let receiver_pubkey = pj_param.receiver_pubkey(); - let sender_state = - self.db.get_send_session_ids()?.into_iter().find_map(|session_id| { - let session_receiver_pubkey = self - .db - .get_send_session_receiver_pk(&session_id) - .expect("Receiver pubkey should exist if session id exists"); - if session_receiver_pubkey == *receiver_pubkey { - let sender_persister = - SenderPersister::from_id(self.db.clone(), session_id).ok()?; - let (send_session, _) = replay_sender_event_log(&sender_persister) - .map_err(|e| anyhow!("Failed to replay sender event log: {:?}", e)) - .ok()?; - - Some((send_session, sender_persister)) - } else { - None - } - }); + let session_id = self.db.get_send_session_id_with_receiver_pk(receiver_pubkey)?; + let sender_state = match session_id { + Some(session_id) => { + let sender_persister = + SenderPersister::from_id(self.db.clone(), session_id)?; + let (send_session, _) = replay_sender_event_log(&sender_persister)?; + Some((send_session, sender_persister)) + } + None => None, + }; let (sender_state, persister) = match sender_state { Some((sender_state, persister)) => (sender_state, persister), diff --git a/payjoin-cli/src/db/v2.rs b/payjoin-cli/src/db/v2.rs index 708f3b9c3..8c228c723 100644 --- a/payjoin-cli/src/db/v2.rs +++ b/payjoin-cli/src/db/v2.rs @@ -4,7 +4,7 @@ use payjoin::persist::SessionPersister; use payjoin::receive::v2::SessionEvent as ReceiverSessionEvent; use payjoin::send::v2::SessionEvent as SenderSessionEvent; use payjoin::HpkePublicKey; -use rusqlite::params; +use rusqlite::{params, OptionalExtension}; use super::*; @@ -219,14 +219,16 @@ impl Database { Ok(session_ids) } - pub(crate) fn get_send_session_receiver_pk( + pub(crate) fn get_send_session_id_with_receiver_pk( &self, - session_id: &SessionId, - ) -> Result { + receiver_pk: &HpkePublicKey, + ) -> Result> { let conn = self.get_connection()?; let mut stmt = - conn.prepare("SELECT receiver_pubkey FROM send_sessions WHERE session_id = ?1")?; - let receiver_pubkey: Vec = stmt.query_row(params![session_id.0], |row| row.get(0))?; - Ok(HpkePublicKey::from_compressed_bytes(&receiver_pubkey).expect("Valid receiver pubkey")) + conn.prepare("SELECT session_id FROM send_sessions WHERE receiver_pubkey = ?1")?; + let session_id = stmt + .query_row(params![receiver_pk.to_compressed_bytes()], |row| row.get(0)) + .optional()?; + Ok(session_id.map(SessionId)) } }