11use crate :: error:: MutinyError ;
22use crate :: storage:: MutinyStorage ;
33use bitcoin:: hashes:: hex:: ToHex ;
4+ use core:: time:: Duration ;
45use payjoin:: receive:: v2:: Enrolled ;
6+ use serde:: { Deserialize , Serialize } ;
57use std:: collections:: HashMap ;
68
9+ #[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
10+ pub struct Session {
11+ pub enrolled : Enrolled ,
12+ pub expiry : Duration ,
13+ }
14+
15+ impl Session {
16+ pub fn pubkey ( & self ) -> [ u8 ; 33 ] {
17+ self . enrolled . pubkey ( )
18+ }
19+ }
720pub trait PayjoinStorage {
8- fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > ;
9- fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > ;
10- fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > ;
21+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Session > , MutinyError > ;
22+ fn get_payjoins ( & self ) -> Result < Vec < Session > , MutinyError > ;
23+ fn persist_payjoin ( & self , session : Enrolled ) -> Result < Session , MutinyError > ;
24+ fn delete_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < ( ) , MutinyError > ;
1125}
1226
1327const PAYJOIN_KEY_PREFIX : & str = "payjoin/" ;
@@ -17,17 +31,27 @@ fn get_payjoin_key(id: &[u8; 33]) -> String {
1731}
1832
1933impl < S : MutinyStorage > PayjoinStorage for S {
20- fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > {
34+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Session > , MutinyError > {
2135 let sessions = self . get_data ( get_payjoin_key ( id) ) ?;
2236 Ok ( sessions)
2337 }
2438
25- fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > {
26- let map: HashMap < String , Enrolled > = self . scan ( PAYJOIN_KEY_PREFIX , None ) ?;
39+ fn get_payjoins ( & self ) -> Result < Vec < Session > , MutinyError > {
40+ let map: HashMap < String , Session > = self . scan ( PAYJOIN_KEY_PREFIX , None ) ?;
2741 Ok ( map. values ( ) . map ( |v| v. to_owned ( ) ) . collect ( ) )
2842 }
2943
30- fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > {
31- self . set_data ( get_payjoin_key ( & session. pubkey ( ) ) , session, None )
44+ fn persist_payjoin ( & self , enrolled : Enrolled ) -> Result < Session , MutinyError > {
45+ let in_24_hours = crate :: utils:: now ( ) + Duration :: from_secs ( 60 * 60 * 24 ) ;
46+ let session = Session {
47+ enrolled,
48+ expiry : in_24_hours,
49+ } ;
50+ self . set_data ( get_payjoin_key ( & session. pubkey ( ) ) , session. clone ( ) , None )
51+ . map ( |_| session)
52+ }
53+
54+ fn delete_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < ( ) , MutinyError > {
55+ self . delete ( & [ get_payjoin_key ( id) ] )
3256 }
3357}
0 commit comments