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
7- // #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8- // pub struct Session {
9- // pub id: [u8; 16],
10- // pub enrolled: Enrolled,
11- // }
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+ }
1220
1321pub trait PayjoinStorage {
14- fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > ;
15- fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > ;
16- fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > ;
22+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Session > , MutinyError > ;
23+ fn get_payjoins ( & self ) -> Result < Vec < Session > , MutinyError > ;
24+ fn persist_payjoin ( & self , session : Enrolled ) -> Result < Session , MutinyError > ;
25+ fn delete_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < ( ) , MutinyError > ;
1726}
1827
1928const PAYJOIN_KEY_PREFIX : & str = "payjoin/" ;
@@ -23,17 +32,27 @@ fn get_payjoin_key(id: &[u8; 33]) -> String {
2332}
2433
2534impl < S : MutinyStorage > PayjoinStorage for S {
26- fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > {
35+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Session > , MutinyError > {
2736 let sessions = self . get_data ( get_payjoin_key ( id) ) ?;
2837 Ok ( sessions)
2938 }
3039
31- fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > {
32- let map: HashMap < String , Enrolled > = self . scan ( PAYJOIN_KEY_PREFIX , None ) ?;
40+ fn get_payjoins ( & self ) -> Result < Vec < Session > , MutinyError > {
41+ let map: HashMap < String , Session > = self . scan ( PAYJOIN_KEY_PREFIX , None ) ?;
3342 Ok ( map. values ( ) . map ( |v| v. to_owned ( ) ) . collect ( ) )
3443 }
3544
36- fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > {
37- self . set_data ( get_payjoin_key ( & session. pubkey ( ) ) , session, None )
45+ fn persist_payjoin ( & self , enrolled : Enrolled ) -> Result < Session , MutinyError > {
46+ let in_24_hours = crate :: utils:: now ( ) + Duration :: from_secs ( 60 * 60 * 24 ) ;
47+ let session = Session {
48+ enrolled,
49+ expiry : in_24_hours,
50+ } ;
51+ self . set_data ( get_payjoin_key ( & session. pubkey ( ) ) , session. clone ( ) , None )
52+ . map ( |_| session)
53+ }
54+
55+ fn delete_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < ( ) , MutinyError > {
56+ self . delete ( & [ get_payjoin_key ( id) ] )
3857 }
3958}
0 commit comments