@@ -10,14 +10,21 @@ import wisp_kv_sessions/internal/utils
10
10
import wisp_kv_sessions/session
11
11
import wisp_kv_sessions/session_config
12
12
13
+ pub type CurrentSession {
14
+ CurrentSession ( req : wisp . Request , config : session_config . Config )
15
+ }
16
+
13
17
/// Try to get the session from the store.
14
18
/// If it does not exist create a new one.
15
19
///
16
- pub fn get_session ( config : session_config . Config , req : wisp . Request ) {
17
- use session_id <- result . try ( utils . get_session_id ( config . cookie_name , req ) )
20
+ pub fn get_session ( current_session : CurrentSession ) {
21
+ use session_id <- result . try ( utils . get_session_id (
22
+ current_session . config . cookie_name ,
23
+ current_session . req ,
24
+ ) )
18
25
use maybe_session <- result . try ( get_session_with_cache (
19
26
session_id ,
20
- config ,
27
+ current_session . config ,
21
28
True ,
22
29
) )
23
30
@@ -34,10 +41,10 @@ pub fn get_session(config: session_config.Config, req: wisp.Request) {
34
41
let session =
35
42
session . builder ( )
36
43
|> session . with_id ( session_id )
37
- |> session . with_expiry ( config . default_expiry )
44
+ |> session . with_expiry ( current_session . config . default_expiry )
38
45
|> session . build
39
46
40
- save_session ( config , session )
47
+ save_session ( current_session . config , session )
41
48
}
42
49
}
43
50
}
@@ -72,26 +79,53 @@ fn save_session(config: session_config.Config, session: session.Session) {
72
79
/// ```gleam
73
80
/// sessions.delete(store, req)
74
81
/// ```
75
- pub fn delete_session ( config : session_config . Config , req : wisp . Request ) {
82
+ pub fn delete_session ( current_session : CurrentSession ) {
83
+ let CurrentSession ( config : config , req : req ) = current_session
76
84
use session_id <- result . try ( utils . get_session_id ( config . cookie_name , req ) )
77
85
config . cache
78
86
|> option . map ( fn ( cache ) { cache . delete_session ( session_id ) } )
79
87
config . store . delete_session ( session_id )
80
88
}
81
89
90
+ pub type SessionKey ( data) {
91
+ SessionKey (
92
+ current_session : CurrentSession ,
93
+ key : String ,
94
+ decode : Decoder ( data) ,
95
+ encode : fn ( data) -> String ,
96
+ )
97
+ }
98
+
99
+ pub fn key ( current_session : CurrentSession , key : String ) {
100
+ SessionKey (
101
+ current_session : ,
102
+ key : ,
103
+ decode : dynamic . string ,
104
+ encode : fn ( str : String ) { json . string ( str ) |> json . to_string } ,
105
+ )
106
+ }
107
+
108
+ pub fn with_codec (
109
+ session_key : SessionKey ( a) ,
110
+ decoder decode : Decoder ( data) ,
111
+ encoder encode : fn ( data) -> String ,
112
+ ) -> SessionKey ( data) {
113
+ SessionKey (
114
+ current_session : session_key . current_session ,
115
+ key : session_key . key ,
116
+ decode : ,
117
+ encode : ,
118
+ )
119
+ }
120
+
82
121
/// Get data from session by key
83
122
///
84
- pub fn get (
85
- config : session_config . Config ,
86
- req : wisp . Request ,
87
- key : session . Key ,
88
- decoder : Decoder ( data) ,
89
- ) {
90
- use session <- result . try ( get_session ( config , req ) )
91
- case dict . get ( session . data , key ) |> option . from_result {
123
+ pub fn get ( entry : SessionKey ( data) ) {
124
+ use session <- result . try ( get_session ( entry . current_session ) )
125
+ case dict . get ( session . data , entry . key ) |> option . from_result {
92
126
option . None -> Ok ( option . None )
93
127
option . Some ( data ) -> {
94
- json . decode ( from : data , using : decoder )
128
+ json . decode ( from : data , using : entry . decode )
95
129
|> result . replace_error ( session . DecodeError )
96
130
|> result . map ( fn ( d ) { option . Some ( d ) } )
97
131
}
@@ -100,31 +134,22 @@ pub fn get(
100
134
101
135
/// Set data in session by key
102
136
///
103
- pub fn set (
104
- config : session_config . Config ,
105
- req : wisp . Request ,
106
- key : session . Key ,
107
- data : data,
108
- encoder : fn ( data) -> String ,
109
- ) {
110
- use session <- result . try ( get_session ( config , req ) )
111
- let json_data = encoder ( data )
112
- let new_session =
137
+ pub fn set ( entry : SessionKey ( data) , data : data) {
138
+ use session <- result . try ( get_session ( entry . current_session ) )
139
+
140
+ let session =
113
141
session . builder_from ( session )
114
- |> session . with_entry ( key , json_data )
142
+ |> session . with_entry ( entry . key , entry . encode ( data ) )
115
143
|> session . build
116
- use _ <- result . map ( save_session ( config , new_session ) )
144
+ use _ <- result . map ( save_session ( entry . current_session . config , session ) )
117
145
data
118
146
}
119
147
120
148
/// Delete key from session
121
149
///
122
- pub fn delete (
123
- config : session_config . Config ,
124
- req : wisp . Request ,
125
- key : session . Key ,
126
- ) {
127
- use session <- result . try ( get_session ( config , req ) )
150
+ pub fn delete ( current_session : CurrentSession , key : session . Key ) {
151
+ let CurrentSession ( config : config , req : _req ) = current_session
152
+ use session <- result . try ( get_session ( current_session ) )
128
153
save_session (
129
154
config ,
130
155
session . Session ( .. session , data : dict . delete ( session . data , key ) ) ,
@@ -134,16 +159,16 @@ pub fn delete(
134
159
/// Replace the session with a new one
135
160
/// Usage:
136
161
/// ```gleam
137
- /// wisp.ok() |> replace_session(session_config, req )
162
+ /// wisp.ok() |> replace_session(new_session )
138
163
/// ```
139
164
///
140
165
pub fn replace_session (
141
- config : session_config . Config ,
166
+ current_session : CurrentSession ,
142
167
res : wisp . Response ,
143
- req : wisp . Request ,
144
168
new_session : session . Session ,
145
169
) {
146
- use _ <- result . try ( delete_session ( config , req ) )
170
+ let CurrentSession ( config : config , req : req ) = current_session
171
+ use _ <- result . try ( delete_session ( current_session ) )
147
172
use _ <- result . map ( save_session ( config , new_session ) )
148
173
utils . set_session_cookie ( config . cookie_name , res , req , new_session )
149
174
}
@@ -154,11 +179,11 @@ pub fn replace_session(
154
179
/// always is a session_id to store data towards
155
180
/// Usage:
156
181
/// ```gleam
157
- /// use <- sessions.middleware(config, req )
182
+ /// use <- sessions.middleware(current_session )
158
183
/// ```
159
184
pub fn middleware (
160
- config : session_config . Config ,
161
185
req : wisp . Request ,
186
+ config : session_config . Config ,
162
187
handle_request : fn ( wisp . Request ) -> wisp . Response ,
163
188
) {
164
189
case utils . get_session_id ( config . cookie_name , req ) {
0 commit comments