1 ! Copyright (c) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel sequences namespaces
4 db db.types db.tuples validators hashtables urls
8 http.server.dispatchers
18 TUPLE: todo-list < dispatcher ;
20 TUPLE: todo uid id priority summary description ;
24 { "uid" "UID" { VARCHAR 256 } +not-null+ }
25 { "id" "ID" +db-assigned-id+ }
26 { "priority" "PRIORITY" INTEGER +not-null+ }
27 { "summary" "SUMMARY" { VARCHAR 256 } +not-null+ }
28 { "description" "DESCRIPTION" { VARCHAR 256 } }
31 : init-todo-table ( -- ) todo ensure-table ;
33 : <todo> ( id -- todo )
38 : <view-action> ( -- action )
42 "id" value <todo> select-tuple from-object
45 { todo-list "view-todo" } >>template ;
47 : validate-todo ( -- )
49 { "summary" [ v-one-line ] }
50 { "priority" [ v-integer 0 v-min-value 10 v-max-value ] }
51 { "description" [ v-required ] }
54 : view-todo-url ( id -- url )
55 <url> "$todo-list/view" >>path swap "id" set-query-param ;
57 : <new-action> ( -- action )
59 [ 0 "priority" set-value ] >>init
61 { todo-list "new-todo" } >>template
63 [ validate-todo ] >>validate
67 dup { "summary" "priority" "description" } deposit-slots
68 [ insert-tuple ] [ id>> view-todo-url <redirect> ] bi
71 : <edit-action> ( -- action )
75 "id" value <todo> select-tuple from-object
78 { todo-list "edit-todo" } >>template
87 dup { "id" "summary" "priority" "description" } deposit-slots
88 [ update-tuple ] [ id>> view-todo-url <redirect> ] bi
91 : todo-list-url ( -- url )
92 URL" $todo-list/list" ;
94 : <delete-action> ( -- action )
96 [ validate-integer-id ] >>validate
99 "id" get <todo> delete-tuples
100 todo-list-url <redirect>
103 : <list-action> ( -- action )
105 [ f <todo> select-tuples "items" set-value ] >>init
106 { todo-list "todo-list" } >>template ;
108 : <todo-list> ( -- responder )
109 todo-list new-dispatcher
110 <list-action> "list" add-main-responder
111 <view-action> "view" add-responder
112 <new-action> "new" add-responder
113 <edit-action> "edit" add-responder
114 <delete-action> "delete" add-responder
116 { todo-list "todo" } >>template
118 "view your todo list" >>description ;