@@ -6,6 +6,7 @@ use std::str::FromStr;
66use thiserror:: Error ;
77
88use crate :: schema:: persistent_sessions;
9+ use crate :: util:: token:: NewSecureToken ;
910use crate :: util:: token:: SecureToken ;
1011use crate :: util:: token:: SecureTokenKind ;
1112
@@ -31,12 +32,10 @@ pub struct PersistentSession {
3132}
3233
3334impl PersistentSession {
34- /// Creates a `NewPersistentSession` that can be inserted into the database.
35- pub fn create < ' a > ( user_id : i32 , token : & ' a SecureToken ) -> NewPersistentSession < ' a > {
36- NewPersistentSession {
37- user_id,
38- hashed_token : token,
39- }
35+ /// Creates a `NewPersistentSession` for the `user_id` and the token associated with it.
36+ pub fn create < ' a > ( user_id : i32 ) -> NewPersistentSession {
37+ let token = SecureToken :: generate ( SecureTokenKind :: Session ) ;
38+ NewPersistentSession { user_id, token }
4039 }
4140
4241 /// Finds the session with the ID.
@@ -81,19 +80,32 @@ impl PersistentSession {
8180}
8281
8382/// A new, insertable persistent session.
84- #[ derive( Clone , Debug , PartialEq , Eq , Insertable ) ]
85- #[ table_name = "persistent_sessions" ]
86- pub struct NewPersistentSession < ' a > {
83+ pub struct NewPersistentSession {
8784 user_id : i32 ,
88- hashed_token : & ' a SecureToken ,
85+ token : NewSecureToken ,
8986}
9087
91- impl NewPersistentSession < ' _ > {
88+ impl NewPersistentSession {
9289 /// Inserts the session into the database.
93- pub fn insert ( self , conn : & PgConnection ) -> Result < PersistentSession , diesel:: result:: Error > {
94- diesel:: insert_into ( persistent_sessions:: table)
95- . values ( self )
96- . get_result ( conn)
90+ ///
91+ /// # Returns
92+ ///
93+ /// The
94+ pub fn insert (
95+ self ,
96+ conn : & PgConnection ,
97+ ) -> Result < ( PersistentSession , SessionCookie ) , diesel:: result:: Error > {
98+ let session: PersistentSession = diesel:: insert_into ( persistent_sessions:: table)
99+ . values ( (
100+ persistent_sessions:: user_id. eq ( & self . user_id ) ,
101+ persistent_sessions:: hashed_token. eq ( & * self . token ) ,
102+ ) )
103+ . get_result ( conn) ?;
104+ let id = session. id ;
105+ Ok ( (
106+ session,
107+ SessionCookie :: new ( id, self . token . plaintext ( ) . to_string ( ) ) ,
108+ ) )
97109 }
98110}
99111
0 commit comments