! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors sequences sorting locals math calendar alarms logging concurrency.combinators namespaces sequences.lib db.types db.tuples db fry rss xml.writer http.server http.server.crud http.server.forms http.server.actions http.server.boilerplate http.server.templating.chloe http.server.components http.server.auth.login ; IN: webapps.planet TUPLE: planet-factor < dispatcher postings ; : planet-template ( name -- template ) "resource:extra/webapps/planet/" swap ".xml" 3append ; TUPLE: blog id name www-url feed-url ; M: blog link-title name>> ; M: blog link-href www-url>> ; blog "BLOGS" { { "id" "ID" INTEGER +native-id+ } { "name" "NAME" { VARCHAR 256 } +not-null+ } { "www-url" "WWWURL" { VARCHAR 256 } +not-null+ } { "feed-url" "FEEDURL" { VARCHAR 256 } +not-null+ } } define-persistent : init-blog-table blog ensure-table ; : ( id -- todo ) blog new swap >>id ; : blogroll ( -- seq ) f select-tuples [ [ name>> ] compare ] sort ; : ( -- form ) "entry"
"entry" planet-template >>view-template "entry-summary" planet-template >>summary-template "title" add-field "description" add-field "pub-date" add-field ; : ( -- form ) "blog" "edit-blog" planet-template >>edit-template "blog-admin-link" planet-template >>summary-template "id" hidden >>renderer add-field "name" t >>required add-field "www-url" t >>required add-field "feed-url" t >>required add-field ; : ( -- form ) "planet-factor" "postings" planet-template >>view-template "postings-summary" planet-template >>summary-template "postings" +plain+ add-field "blogroll" "blog" +unordered+ add-field ; : ( -- form ) "admin" "admin" planet-template >>view-template "blogroll" +unordered+ add-field ; :: ( planet -- action ) [let | form [ ] | [ blank-values blogroll "blogroll" set-value form view-form ] >>display ] ; :: ( planet -- action ) [let | form [ ] | [ blank-values planet postings>> "postings" set-value blogroll "blogroll" set-value form view-form ] >>display ] ; :: planet-feed ( planet -- feed ) feed new "Planet Factor" >>title "http://planet.factorcode.org" >>link planet postings>> 16 short head >>entries ; :: ( planet -- action ) [ "text/xml" [ planet planet-feed feed>xml write-xml ] >>body ] >>display ; : ( 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 [ feed-url>> fetch-feed ] parallel-map [ >r name>> r> [ ] with map ] 2map concat ; : sort-entries ( entries -- entries' ) [ [ pub-date>> ] compare ] sort ; : update-cached-postings ( planet -- ) "webapps.planet" [ blogroll fetch-blogroll sort-entries 8 short head >>postings drop ] with-logging ; :: ( planet -- action ) [ planet update-cached-postings "" f ] >>display ; :: ( planet-factor -- responder ) [let | blog-form [ ] blog-ctor [ [ ] ] | planet-factor >>default planet-factor "update" add-responder ! Administrative CRUD blog-ctor "$planet-factor/admin" "delete-blog" add-responder blog-form blog-ctor "$planet-factor/admin" "edit-blog" add-responder ] ; : ( -- responder ) planet-factor new-dispatcher dup "list" add-main-responder dup "feed.xml" add-responder dup "admin" add-responder "planet" planet-template >>template ; : start-update-task ( planet db seq -- ) '[ , , , [ dup filter-responder? [ responder>> ] when update-cached-postings ] with-db ] 10 minutes every drop ;