UNPKG

nodulator

Version:

Complete NodeJS Framework for Restfull APIs

458 lines (306 loc) 16.7 kB
<!DOCTYPE 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 &hellip;</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">&#182;</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) -&gt; @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">&#182;</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">-&gt;</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> -&gt;</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? =&gt; ret .Then -&gt; Req.Send it .Catch -&gt; Req.SendError it | _ =&gt; 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> =&gt; 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> -&gt;</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 =&gt; \* | _ =&gt; \/ <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 =&gt; \* | _ =&gt; \/ @debug.Log <span class="hljs-string">"Declaring Route: <span class="hljs-subst">#{type}</span> =&gt; <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">&#182;</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) ~&gt; @debug.Log <span class="hljs-string">"Request on: <span class="hljs-subst">#{type}</span> =&gt; <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) ~&gt; @debug.Log <span class="hljs-string">"Request on: <span class="hljs-subst">#{type}</span> =&gt; <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">-&gt;</span> @Extend = <span class="hljs-function">-&gt;</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) ~&gt; Route::[verb] = <span class="hljs-function"><span class="hljs-params">(...args)</span> -&gt;</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, &lt;[ All Post Get Put Delete ]&gt; <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">-&gt;</span> <span class="hljs-keyword">super</span>() @All \/:id* ~&gt; it.SetInstance @resource.Fetch +it.params.id @Get ~&gt; @resource.List it.query @Post ~&gt; @resource.Create it.body @Get \/:id ~&gt; it.instance @Put \/:id ~&gt; it.instance.Set it.body @Delete \/:id ~&gt; 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">-&gt;</span> <span class="hljs-keyword">super</span>() @Post \/list ~&gt; @resource.List it.body @Post \/create ~&gt; @resource.Create it.body @Post \/fetch ~&gt; @resource.Fetch it.body @Post \<span class="hljs-regexp">/set/</span>:id ~&gt; @resource.Fetch +it.params.id .Set it.body @Post \<span class="hljs-regexp">/delete/</span>:id ~&gt; @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>