nodulator
Version:
Complete NodeJS Framework for Restfull APIs
458 lines (306 loc) • 16.7 kB
HTML
<html>
<head>
<title>Route.ls</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To …</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page_wrapper">
<div id="jump_page">
<a class="source" href="Nodulator.html">
Nodulator.ls
</a>
<a class="source" href="ClientDB.html">
ClientDB.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="Resource.html">
Resource.ls
</a>
<a class="source" href="Bus.html">
Bus.ls
</a>
<a class="source" href="Cache.html">
Cache.ls
</a>
<a class="source" href="ChangeWatcher.html">
ChangeWatcher.ls
</a>
<a class="source" href="Debug.html">
Debug.ls
</a>
<a class="source" href="Wrappers.html">
Wrappers.ls
</a>
<a class="source" href="Nodulator.html">
Nodulator.ls
</a>
<a class="source" href="Resource.html">
Resource.ls
</a>
<a class="source" href="Schema.html">
Schema.ls
</a>
<a class="source" href="NModule.html">
NModule.ls
</a>
<a class="source" href="AccountResource.html">
AccountResource.ls
</a>
<a class="source" href="User.html">
User.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="Nodulator-Angular.html">
Nodulator-Angular.ls
</a>
<a class="source" href="TaskDirective.html">
TaskDirective.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="TaskService.html">
TaskService.ls
</a>
<a class="source" href="main.html">
main.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="Task.html">
Task.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="DOM.html">
DOM.ls
</a>
<a class="source" href="View.html">
View.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="Nodulator.html">
Nodulator.ls
</a>
<a class="source" href="Mongo.html">
Mongo.ls
</a>
<a class="source" href="Mysql.html">
Mysql.ls
</a>
<a class="source" href="SqlMem.html">
SqlMem.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
<a class="source" href="Resource.html">
Resource.ls
</a>
<a class="source" href="Request.html">
Request.ls
</a>
<a class="source" href="Route.html">
Route.ls
</a>
<a class="source" href="index.html">
index.ls
</a>
</div>
</div>
</li>
</ul>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>Route.ls</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-built_in">require</span>! \prelude-ls : {each, unchars}
_ = <span class="hljs-built_in">require</span> <span class="hljs-string">'underscore'</span>
N = <span class="hljs-literal">null</span>
Request = <span class="hljs-built_in">require</span> <span class="hljs-string">'./Request'</span>
<span class="hljs-built_in">require</span>! {\../../Common/Helpers/Debug}
express = <span class="hljs-built_in">require</span> \express
Client = <span class="hljs-built_in">require</span> <span class="hljs-string">'../../../test/common/client'</span>
http = <span class="hljs-built_in">require</span> <span class="hljs-string">'http'</span>
body-parser = <span class="hljs-built_in">require</span> \body-parser
express-session = <span class="hljs-built_in">require</span> <span class="hljs-string">'express-session'</span>
debug = <span class="hljs-keyword">new</span> Debug <span class="hljs-string">"N::Route"</span>, Debug.colors.purple
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Route</span></span>
basePath: <span class="hljs-string">'/api/'</span>
apiVersion: <span class="hljs-number">1</span>
name: <span class="hljs-string">''</span>
(resource, @config) ->
@resource = resource || @resource
N := <span class="hljs-built_in">require</span> <span class="hljs-string">'../..'</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> N?
<span class="hljs-keyword">if</span> @resource
<span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>(@resource) <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span>
@name = @resource._type
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span>(@resource) <span class="hljs-keyword">is</span> <span class="hljs-string">'string'</span>
@name = @resource
@resource = <span class="hljs-literal">undefined</span>
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Error <span class="hljs-string">'Route needs a Resource (or at least a name)'</span>
@debug = <span class="hljs-keyword">new</span> Debug <span class="hljs-string">"N::Route::<span class="hljs-subst">#{@name}</span>"</span>, Debug.colors.purple
<span class="hljs-keyword">if</span> N.consoleMode
<span class="hljs-keyword">return</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> N.app?
N.Route._InitServer!
@app = N.app</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<p>if @name[<em>-1] is ‘y’
@name = @name[til @name.length - 2]</em>‘’ + ‘ies’</p>
</div>
<div class="content"><div class='highlight'><pre>
@Config()
@_InitServer = <span class="hljs-function">-></span>
N := <span class="hljs-built_in">require</span> <span class="hljs-string">'../..'</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> N?
<span class="hljs-keyword">if</span> N.app?
debug.Log <span class="hljs-string">'Server already started.'</span>
<span class="hljs-keyword">return</span>
N.express = express
N.app = express!
N.app.use bodyParser.urlencoded extended: <span class="hljs-literal">true</span>
N.app.use bodyParser.json extended: <span class="hljs-literal">true</span>
sessions =
key: \N
secret: \N
resave: <span class="hljs-literal">true</span>
saveUninitialized: <span class="hljs-literal">true</span>
<span class="hljs-keyword">if</span> N.config?.store?.type <span class="hljs-keyword">is</span> \redis
RedisStore = <span class="hljs-built_in">require</span>(\connect-redis)(express-session)
N.sessionStore = <span class="hljs-keyword">new</span> RedisStore <span class="hljs-keyword">do</span>
host: N.config.store.host || \localhost
sessions.store = N.sessionStore
N.app.use express-session sessions
debug.Log <span class="hljs-string">'Creating server'</span>
N.server = http.createServer N.app
N.client = <span class="hljs-keyword">new</span> Client N.app
N.server.listen N.config?.port
N.bus.emit \listening
debug.Log <span class="hljs-string">"Listening to 0.0.0.0: <span class="hljs-subst">#{(N.config?.port)}</span>"</span>
_WrapRequest: <span class="hljs-function"><span class="hljs-params">(fName, args)</span> -></span>
Req = <span class="hljs-keyword">new</span> Request args
<span class="hljs-keyword">try</span>
ret = @[fName] Req
<span class="hljs-keyword">if</span> ret?
<span class="hljs-keyword">switch</span>
| ret._promise? =>
ret
.Then -> Req.Send it
.Catch -> Req.SendError it
| _ => Req.Send ret
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ret <span class="hljs-keyword">is</span> <span class="hljs-literal">null</span> => Req.Send <span class="hljs-literal">null</span>
<span class="hljs-keyword">catch</span> e
Req.SendError e
_Add: <span class="hljs-function"><span class="hljs-params">(type, url, ...middle, done)</span> -></span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> done?
done = url
url = <span class="hljs-keyword">switch</span> type
| \all => \*
| _ => \/
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> middle.length <span class="hljs-keyword">and</span> <span class="hljs-keyword">typeof</span>(url) <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span>
middle.push url
url = <span class="hljs-keyword">switch</span> type
| \all => \*
| _ => \/
@debug.Log <span class="hljs-string">"Declaring Route: <span class="hljs-subst">#{type}</span> => <span class="hljs-subst">#{url}</span> "</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> @[type + url]?
@[type + url] = done</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<p>FIXME: code clarity</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> middle.length
middle.push (...args) ~>
@debug.Log <span class="hljs-string">"Request on: <span class="hljs-subst">#{type}</span> => <span class="hljs-subst">#{url}</span> "</span>
@_WrapRequest type + url, args
@app.route(@basePath + @apiVersion + <span class="hljs-string">'/'</span> + @name + url)[type].apply @app.route(@basePath + @apiVersion + <span class="hljs-string">'/'</span> + @name + url), middle
<span class="hljs-keyword">else</span>
@app.route(@basePath + @apiVersion + <span class="hljs-string">'/'</span> + @name + url)[type] (...args) ~>
@debug.Log <span class="hljs-string">"Request on: <span class="hljs-subst">#{type}</span> => <span class="hljs-subst">#{url}</span> "</span>
@_WrapRequest type + url, args
<span class="hljs-keyword">else</span>
@[type + url] = done
Config: <span class="hljs-function">-></span>
@Extend = <span class="hljs-function">-></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExtendedRoute</span> <span class="hljs-keyword">extends</span> @</span>
_set = (verb) ~>
Route::[verb] = <span class="hljs-function"><span class="hljs-params">(...args)</span> -></span>
args.unshift verb[<span class="hljs-number">0</span>].toLowerCase() + verb[<span class="hljs-number">1</span> til verb.length]*<span class="hljs-string">''</span>
@_Add.apply @, args
each _set, <[ All Post Get Put Delete ]>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Collection</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Route</span></span>
Config: <span class="hljs-function">-></span>
<span class="hljs-keyword">super</span>()
@All \/:id* ~> it.SetInstance @resource.Fetch +it.params.id
@Get ~> @resource.List it.query
@Post ~> @resource.Create it.body
@Get \/:id ~> it.instance
@Put \/:id ~> it.instance.Set it.body
@Delete \/:id ~> it.instance.Delete!
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RPC</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Route</span></span>
Config: <span class="hljs-function">-></span>
<span class="hljs-keyword">super</span>()
@Post \/list ~> @resource.List it.body
@Post \/create ~> @resource.Create it.body
@Post \/fetch ~> @resource.Fetch it.body
@Post \<span class="hljs-regexp">/set/</span>:id ~> @resource.Fetch +it.params.id .Set it.body
@Post \<span class="hljs-regexp">/delete/</span>:id ~> @resource.Delete +it.params.id
Route.RPC = RPC
Route.Collection = Collection
<span class="hljs-built_in">module</span>.exports = Route</pre></div></div>
</li>
</ul>
</div>
</body>
</html>