Skip to content

Commit d879aff

Browse files
authored
Deduplicate payjoin URI creation logic (payjoin#817)
Create a helper function `create_pj_uri` in the v2 module that centralizes the logic for creating Payjoin URIs from a SessionContext. This eliminates code duplication between `SessionHistory::pj_uri` and `Receiver<WithContext>::pj_uri`. The helper function takes a SessionContext reference and an OutputSubstitution parameter, making it flexible for both use cases while maintaining the same behavior as the original implementations.
2 parents 3626678 + e395951 commit d879aff

File tree

2 files changed

+19
-23
lines changed

2 files changed

+19
-23
lines changed

payjoin/src/receive/v2/mod.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -389,14 +389,7 @@ impl Receiver<Initialized> {
389389

390390
/// Build a V2 Payjoin URI from the receiver's context
391391
pub fn pj_uri<'a>(&self) -> crate::PjUri<'a> {
392-
use crate::uri::{PayjoinExtras, UrlExt};
393-
let mut pj = subdir(&self.context.directory, &self.context.id()).clone();
394-
pj.set_receiver_pubkey(self.context.s.public_key().clone());
395-
pj.set_ohttp(self.context.ohttp_keys.clone());
396-
pj.set_exp(self.context.expiry);
397-
let extras =
398-
PayjoinExtras { endpoint: pj, output_substitution: OutputSubstitution::Enabled };
399-
bitcoin_uri::Uri::with_extras(self.context.address.clone(), extras)
392+
pj_uri(&self.context, OutputSubstitution::Enabled)
400393
}
401394

402395
pub(crate) fn apply_unchecked_from_payload(
@@ -904,6 +897,21 @@ fn subdir(directory: &Url, id: &ShortId) -> Url {
904897
url
905898
}
906899

900+
/// Gets the Payjoin URI from a session context
901+
pub(crate) fn pj_uri<'a>(
902+
session_context: &SessionContext,
903+
output_substitution: OutputSubstitution,
904+
) -> crate::PjUri<'a> {
905+
use crate::uri::{PayjoinExtras, UrlExt};
906+
let id = session_context.id();
907+
let mut pj = subdir(&session_context.directory, &id).clone();
908+
pj.set_receiver_pubkey(session_context.s.public_key().clone());
909+
pj.set_ohttp(session_context.ohttp_keys.clone());
910+
pj.set_exp(session_context.expiry);
911+
let extras = PayjoinExtras { endpoint: pj, output_substitution };
912+
bitcoin_uri::Uri::with_extras(session_context.address.clone(), extras)
913+
}
914+
907915
#[cfg(test)]
908916
pub mod test {
909917
use std::str::FromStr;

payjoin/src/receive/v2/session.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
55
use super::{ReceiveSession, Receiver, SessionContext, UninitializedReceiver};
66
use crate::output_substitution::OutputSubstitution;
77
use crate::persist::SessionPersister;
8-
use crate::receive::v2::{extract_err_req, subdir, SessionError};
8+
use crate::receive::v2::{extract_err_req, SessionError};
99
use crate::receive::{v1, JsonReply};
1010
use crate::{ImplementationError, IntoUrl, PjUri, Request};
1111

@@ -79,20 +79,8 @@ impl SessionHistory {
7979
/// Receiver session Payjoin URI
8080
pub fn pj_uri<'a>(&self) -> Option<PjUri<'a>> {
8181
self.events.iter().find_map(|event| match event {
82-
SessionEvent::Created(session_context) => {
83-
// TODO this code was copied from ReceiverInitialized::pj_uri. Should be deduped
84-
use crate::uri::{PayjoinExtras, UrlExt};
85-
let id = session_context.id();
86-
let mut pj = subdir(&session_context.directory, &id).clone();
87-
pj.set_receiver_pubkey(session_context.s.public_key().clone());
88-
pj.set_ohttp(session_context.ohttp_keys.clone());
89-
pj.set_exp(session_context.expiry);
90-
let extras = PayjoinExtras {
91-
endpoint: pj,
92-
output_substitution: OutputSubstitution::Disabled,
93-
};
94-
Some(bitcoin_uri::Uri::with_extras(session_context.address.clone(), extras))
95-
}
82+
SessionEvent::Created(session_context) =>
83+
Some(crate::receive::v2::pj_uri(session_context, OutputSubstitution::Disabled)),
9684
_ => None,
9785
})
9886
}

0 commit comments

Comments
 (0)