74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2008 Alex Chapman
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors assocs db db.sqlite db.postgresql
							 | 
						||
| 
								 | 
							
								http http.server http.server.dispatchers http.server.responses
							 | 
						||
| 
								 | 
							
								http.server.static furnace.actions furnace.json
							 | 
						||
| 
								 | 
							
								io io.files json.writer kernel math.parser namespaces
							 | 
						||
| 
								 | 
							
								semantic-db sequences strings tangle.path ;
							 | 
						||
| 
								 | 
							
								IN: tangle
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC: render* ( content templater -- output )
							 | 
						||
| 
								 | 
							
								GENERIC: render ( content templater -- )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: echo-template ;
							 | 
						||
| 
								 | 
							
								C: <echo-template> echo-template
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: echo-template render* drop ;
							 | 
						||
| 
								 | 
							
								! METHOD: render* { string echo-template } drop ;
							 | 
						||
| 
								 | 
							
								M: object render render* write ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: tangle db seq templater ;
							 | 
						||
| 
								 | 
							
								C: <tangle> tangle
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: with-tangle ( tangle quot -- )
							 | 
						||
| 
								 | 
							
								    [ [ db>> ] [ seq>> ] bi ] dip with-db ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: node-response ( id -- response )
							 | 
						||
| 
								 | 
							
								    load-node [ node-content "text/plain" <content> ] [ <404> ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: display-node ( params -- response )
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        "node_id" swap at* [
							 | 
						||
| 
								 | 
							
								            string>number node-response
							 | 
						||
| 
								 | 
							
								        ] [
							 | 
						||
| 
								 | 
							
								            drop <400>
							 | 
						||
| 
								 | 
							
								        ] if
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        <400>
							 | 
						||
| 
								 | 
							
								    ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: submit-node ( params -- response )
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        "node_content" swap at* [
							 | 
						||
| 
								 | 
							
								            create-node id>> number>string "text/plain" <content>
							 | 
						||
| 
								 | 
							
								        ] [
							 | 
						||
| 
								 | 
							
								            drop <400>
							 | 
						||
| 
								 | 
							
								        ] if
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        <400>
							 | 
						||
| 
								 | 
							
								    ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <node-responder> ( -- responder )
							 | 
						||
| 
								 | 
							
								    <action> [ params get display-node ] >>display
							 | 
						||
| 
								 | 
							
								    [ params get submit-node ] >>submit ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: path-responder ;
							 | 
						||
| 
								 | 
							
								C: <path-responder> path-responder
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: path-responder call-responder* ( path responder -- response )
							 | 
						||
| 
								 | 
							
								    drop path>file [ node-content "text/plain" <content> ] [ <404> ] if* ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: tangle-dispatcher < dispatcher tangle ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <tangle-dispatcher> ( tangle -- dispatcher )
							 | 
						||
| 
								 | 
							
								    tangle-dispatcher new-dispatcher swap >>tangle
							 | 
						||
| 
								 | 
							
								    <path-responder> >>default
							 | 
						||
| 
								 | 
							
								    "resource:extra/tangle/resources" <static> "resources" add-responder
							 | 
						||
| 
								 | 
							
								    <node-responder> "node" add-responder
							 | 
						||
| 
								 | 
							
								    <action> [ all-node-ids <json-content> ] >>display "all" add-responder ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: tangle-dispatcher call-responder* ( path dispatcher -- response )
							 | 
						||
| 
								 | 
							
								    dup tangle>> [
							 | 
						||
| 
								 | 
							
								        find-responder call-responder
							 | 
						||
| 
								 | 
							
								    ] with-tangle ;
							 |