1 ! Copyright (C) 2006 Matthew Willis. All Rights Reserved.
2 ! See http://factorcode.org/license.txt for BSD license.
5 USING: httpd threads kernel namespaces furnace sequences
6 html strings math assocs crypto io file-responder calendar
7 prettyprint parser errors sha2 basic-authentication arrays
12 TUPLE: entry title stub body created ;
14 TUPLE: user name password ;
16 TUPLE: meta key value ;
18 : title>stub ( title -- stub )
19 ! creates a url friendly name based on the title
20 " " split [ [ alpha? ] subset ] map "" swap remove "-" join ;
22 C: entry ( title body stub -- entry )
25 dup entry-stub [ over title>stub over set-entry-stub ] unless
26 now over set-entry-created tuck set-entry-title ;
28 C: user ( name password -- user )
29 swap string>sha-256-string over set-user-password
33 "http://" "Host" "header" get at append ;
35 : action>url ( action -- url )
36 "responder-url" get swap append ;
38 : stub>url ( stub -- url )
39 "entry-show?stub=" swap append action>url ;
41 : stub>entry ( stub -- entry )
42 entry get-global [ entry-stub = ] subset-with
43 dup empty? [ drop f ] [ first ] if ;
46 "text/xml" serving-content
47 [ f "atom" render-template ] with-html-stream ;
50 "text/xml" serving-content
51 [ f "sitemap" render-template ] with-html-stream ;
53 : css-path ( -- path )
54 ! "text/css" serving-content
55 "css" meta crud-lookup* meta-value
56 [ "onigirihouse.css" ] unless* ;
60 "title" key>meta* meta-value
62 <furnace-model> "header" render-template
64 [ [ entry-created ] 2apply swap compare-timestamps ] sort
65 [ "entry-show" render-template ] each
66 f "footer" render-template
70 : entry-show ( stub -- )
73 "title" key>meta* meta-value
74 " - " pick entry-title 3append
76 <furnace-model> "header" render-template
77 "entry-show" render-template
78 f "footer" render-template
81 "title" key>meta* meta-value " - Entry not found" append
84 <p> "The entry you are searching for could not be found" write </p>
85 <p> [ entry-list ] "Back to " "title" key>meta
86 [ meta-value ] [ "the main page" ] if* append render-link
92 : entry-edit ( stub wiky -- )
93 swap stub>entry dup [ entry-title ] [ f ] if*
94 "title" key>meta* meta-value " - editing " rot 3append
96 <furnace-model> "header" render-template
97 swap "entry-edit" "entry-edit-plain" ? render-template
98 f "footer" render-template
101 : entry-update ( title body stub -- )
104 nip tuck set-entry-body tuck set-entry-title
106 <entry> dup entry get-global swap add entry set-global
107 ] if* entry-stub entry-show
108 ] with-basic-authentication ;
110 : entry-delete ( stub -- )
112 stub>entry entry get-global remove entry set-global entry-list
113 ] with-basic-authentication ;
116 : onigiri-realm ( name password -- bool )
117 swap name>user [ user-password = ] [ drop f ] if*
118 user get-global empty? or ;
120 : register-actions ( -- )
121 \ entry-list { } define-action
122 \ entry-show { { "stub" } } define-action
123 \ entry-edit { { "stub" } { "wiky" f v-default } } define-action
124 \ entry-update { { "title" } { "body" } { "stub" } } define-action
125 \ entry-delete { { "stub" } } define-action
126 \ atom { } define-action
127 \ sitemap { } define-action
128 "onigiri" "entry-list" "apps/furnace-onigiri/templates/" web-app
129 "onigiri-resources" [
131 "apps/furnace-onigiri/resources/" resource-path "doc-root" set
134 ] add-simple-responder
135 [ onigiri-realm ] "onigiri-realm" add-realm
136 ! and finally, use scaffolding for metadata and user data
138 "furnace:onigiri" set-in
139 meta "key" "onigiri-realm" scaffold
140 user "name" "onigiri-realm" scaffold
145 "default-responder" key>meta* meta-value
146 [ "onigiri" set-default-responder ] when
147 "port" key>meta* meta-value string>number [ 8888 ] unless*
148 [ httpd ] in-thread drop ;
150 : onigiri-dump ( path -- )
153 entry get-global serialize
154 meta get-global serialize
155 user get-global serialize
159 : onigiri-boot ( path -- )
162 deserialize entry set-global
163 deserialize meta set-global
164 deserialize user set-global