factor/extra/webapps/planet/planet.factor

182 lines
5.0 KiB
Factor
Raw Normal View History

2008-04-20 05:19:06 -04:00
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2008-04-26 12:03:41 -04:00
USING: kernel accessors sequences sorting locals math math.order
2008-04-22 22:08:27 -04:00
calendar alarms logging concurrency.combinators namespaces
2008-04-26 06:49:41 -04:00
sequences.lib db.types db.tuples db fry
2008-04-20 05:19:06 -04:00
rss xml.writer
http.server
http.server.crud
http.server.forms
http.server.actions
http.server.boilerplate
http.server.templating.chloe
2008-04-22 22:08:27 -04:00
http.server.components
2008-05-01 17:24:50 -04:00
http.server.auth.login
http.server.auth ;
2008-04-20 05:19:06 -04:00
IN: webapps.planet
2008-04-22 22:08:27 -04:00
TUPLE: planet-factor < dispatcher postings ;
: planet-template ( name -- template )
"resource:extra/webapps/planet/" swap ".xml" 3append <chloe> ;
2008-04-25 04:23:47 -04:00
TUPLE: blog id name www-url feed-url ;
2008-04-20 05:19:06 -04:00
2008-04-22 22:08:27 -04:00
M: blog link-title name>> ;
M: blog link-href www-url>> ;
2008-04-20 05:19:06 -04:00
blog "BLOGS"
{
2008-04-28 18:38:12 -04:00
{ "id" "ID" INTEGER +db-assigned-id+ }
2008-04-20 05:19:06 -04:00
{ "name" "NAME" { VARCHAR 256 } +not-null+ }
{ "www-url" "WWWURL" { VARCHAR 256 } +not-null+ }
2008-04-25 04:23:47 -04:00
{ "feed-url" "FEEDURL" { VARCHAR 256 } +not-null+ }
2008-04-20 05:19:06 -04:00
} define-persistent
: init-blog-table blog ensure-table ;
: <blog> ( id -- todo )
blog new
swap >>id ;
2008-04-22 22:08:27 -04:00
: blogroll ( -- seq )
f <blog> select-tuples [ [ name>> ] compare ] sort ;
2008-04-20 05:19:06 -04:00
: <entry-form> ( -- form )
"entry" <form>
"entry" planet-template >>view-template
"entry-summary" planet-template >>summary-template
"title" <string> add-field
"description" <html-text> add-field
"pub-date" <date> add-field ;
: <blog-form> ( -- form )
"blog" <form>
"edit-blog" planet-template >>edit-template
2008-04-22 22:08:27 -04:00
"blog-admin-link" planet-template >>summary-template
2008-04-20 05:19:06 -04:00
"id" <integer>
hidden >>renderer
add-field
"name" <string>
t >>required
add-field
"www-url" <url>
t >>required
add-field
2008-04-25 04:23:47 -04:00
"feed-url" <url>
2008-04-20 05:19:06 -04:00
t >>required
add-field ;
: <planet-factor-form> ( -- form )
"planet-factor" <form>
2008-04-22 22:08:27 -04:00
"postings" planet-template >>view-template
"postings-summary" planet-template >>summary-template
2008-04-20 05:19:06 -04:00
"postings" <entry-form> +plain+ <list> add-field
2008-04-22 22:08:27 -04:00
"blogroll" "blog" <link> +unordered+ <list> add-field ;
: <admin-form> ( -- form )
"admin" <form>
"admin" planet-template >>view-template
2008-04-20 05:19:06 -04:00
"blogroll" <blog-form> +unordered+ <list> add-field ;
2008-04-22 22:08:27 -04:00
:: <edit-blogroll-action> ( planet -- action )
[let | form [ <admin-form> ] |
<action>
[
blank-values
2008-04-20 05:19:06 -04:00
2008-04-22 22:08:27 -04:00
blogroll "blogroll" set-value
form view-form
] >>display
] ;
2008-04-20 05:19:06 -04:00
:: <planet-action> ( planet -- action )
[let | form [ <planet-factor-form> ] |
<action>
[
blank-values
planet postings>> "postings" set-value
blogroll "blogroll" set-value
form view-form
] >>display
] ;
:: planet-feed ( planet -- feed )
feed new
2008-04-25 04:23:47 -04:00
"Planet Factor" >>title
2008-04-20 05:19:06 -04:00
"http://planet.factorcode.org" >>link
2008-04-25 04:23:47 -04:00
planet postings>> 16 short head >>entries ;
2008-04-20 05:19:06 -04:00
:: <feed-action> ( planet -- action )
<action>
[
"text/xml" <content>
[ planet planet-feed feed>xml write-xml ] >>body
] >>display ;
: <posting> ( name entry -- entry' )
clone [ ": " swap 3append ] change-title ;
: fetch-feed ( url -- feed )
download-feed entries>> ;
\ fetch-feed DEBUG add-error-logging
: fetch-blogroll ( blogroll -- entries )
dup
2008-04-25 04:23:47 -04:00
[ feed-url>> fetch-feed ] parallel-map
2008-04-20 05:19:06 -04:00
[ >r name>> r> [ <posting> ] with map ] 2map concat ;
: sort-entries ( entries -- entries' )
[ [ pub-date>> ] compare ] sort <reversed> ;
: update-cached-postings ( planet -- )
"webapps.planet" [
2008-04-25 04:23:47 -04:00
blogroll fetch-blogroll sort-entries 8 short head
2008-04-22 22:08:27 -04:00
>>postings drop
2008-04-20 05:19:06 -04:00
] with-logging ;
:: <update-action> ( planet -- action )
<action>
[
planet update-cached-postings
"" f <temporary-redirect>
] >>display ;
2008-04-22 22:08:27 -04:00
:: <planet-factor-admin> ( planet-factor -- responder )
2008-04-20 05:19:06 -04:00
[let | blog-form [ <blog-form> ]
blog-ctor [ [ <blog> ] ] |
2008-04-22 22:08:27 -04:00
<dispatcher>
planet-factor <edit-blogroll-action> >>default
2008-04-20 05:19:06 -04:00
2008-04-25 04:23:47 -04:00
planet-factor <update-action> "update" add-responder
2008-04-20 05:19:06 -04:00
! Administrative CRUD
2008-04-25 04:23:47 -04:00
blog-ctor "$planet-factor/admin" <delete-action> "delete-blog" add-responder
blog-form blog-ctor "$planet-factor/admin" <edit-action> "edit-blog" add-responder
2008-04-20 05:19:06 -04:00
] ;
2008-05-01 17:24:50 -04:00
SYMBOL: can-administer-planet-factor?
can-administer-planet-factor? define-capability
2008-04-22 22:08:27 -04:00
: <planet-factor> ( -- responder )
planet-factor new-dispatcher
2008-04-25 04:23:47 -04:00
dup <planet-action> "list" add-main-responder
2008-04-22 22:08:27 -04:00
dup <feed-action> "feed.xml" add-responder
2008-05-01 17:24:50 -04:00
dup <planet-factor-admin> { can-administer-planet-factor? } <protected> "admin" add-responder
2008-04-20 05:19:06 -04:00
<boilerplate>
2008-04-22 22:08:27 -04:00
"planet" planet-template >>template ;
2008-04-26 06:49:41 -04:00
: start-update-task ( planet db seq -- )
'[
, , , [
dup filter-responder? [ responder>> ] when
update-cached-postings
] with-db
2008-04-26 06:49:41 -04:00
] 10 minutes every drop ;