1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors namespaces sequences arrays kernel
4 assocs hashtables math.parser urls combinators
5 logging db.types db.tuples
7 html.templates.chloe.syntax
17 TUPLE: aside < server-state session method url post-data ;
19 : <aside> ( id -- aside )
20 aside new-server-state ;
24 { "session" "SESSION" BIG-INTEGER +not-null+ }
25 { "method" "METHOD" { VARCHAR 10 } +not-null+ }
26 { "url" "URL" URL +not-null+ }
27 { "post-data" "POST_DATA" FACTOR-BLOB }
30 TUPLE: asides < server-state-manager ;
32 : <asides> ( responder -- responder' )
33 asides new-server-state-manager ;
35 : begin-aside* ( -- id )
37 session get id>> >>session
41 [ post-data>> >>post-data ]
43 [ asides get touch-state ] [ insert-tuple ] [ id>> ] tri ;
45 : end-aside-post ( aside -- response )
48 over post-data>> >>post-data
51 url>> path>> split-path
52 asides get responder>> call-responder ;
54 \ end-aside-post DEBUG add-input-logging
56 ERROR: end-aside-in-get-error ;
58 : get-aside ( id -- aside )
59 dup [ aside get-state ] when
60 dup [ dup session>> session get id>> = [ drop f ] unless ] when ;
62 : end-aside* ( url id -- response )
63 post-request? [ end-aside-in-get-error ] unless
66 { "GET" [ url>> <redirect> ] }
67 { "HEAD" [ url>> <redirect> ] }
68 { "POST" [ end-aside-post ] }
70 ] [ <redirect> ] ?if ;
74 : aside-id-key "__a" ;
77 begin-aside* aside-id set ;
79 : end-aside ( default -- response )
80 aside-id [ f ] change end-aside* ;
82 : request-aside-id ( request -- aside-id )
83 aside-id-key swap request-params at string>number ;
85 M: asides call-responder*
87 request get request-aside-id aside-id set
90 M: asides link-attr ( tag -- )
92 "aside" optional-attr {
93 { "none" [ aside-id off ] }
94 { "begin" [ begin-aside ] }
99 M: asides modify-query ( query responder -- query' )
101 aside-id get [ aside-id-key associate assoc-union ] when* ;
103 M: asides modify-form ( responder -- )
104 drop aside-id get aside-id-key hidden-form-field ;