coffeerest-api-frontend-ng-admin
Version:
Put web admin interface-sauce on top of your coffeerest api
57 lines (49 loc) • 2.1 kB
text/coffeescript
clone = (obj) -> JSON.parse JSON.stringify obj
mustache = require 'mustache'
jsfront = require('jsonschema-frontend')
module.exports = (server, model, lib, urlprefix ) ->
me = {}
me.init = (uimodel) ->
path = __dirname+'/src/mustache'
me.uimodel = uimodel = jsfront.parse uimodel
uimodel.js = require('fs').readFileSync(__dirname+"/node_modules/ng-admin/build/ng-admin.min.js").toString()
jscode = []
jscode.push "var admin = nga.application('"+uimodel.menu.title+"')"
jscode.push " .baseApiUrl('"+uimodel.model.host+"');"
jscode.push "var entity = {};"
for k,resource of uimodel.resources
slug = k.split "/"
jscode.push "entity."+ slug[1] + " = nga.entity('"+ slug[1] + "');"
for menuitem in uimodel.menu.items
jsfront.render "#{path}/menuitem.js", menuitem, jscode
jscode[k] = " "+v for k,v of jscode
uimodel.jsconfig = jscode.join("\n") + ";\n"
uimodel.css = require('fs').readFileSync(__dirname+"/node_modules/ng-admin/build/ng-admin.min.css").toString()
uimodel.html = require('fs').readFileSync(__dirname+"/src/mustache/index.html").toString()
me.generateHTML = () ->
return mustache.render me.uimodel.html, me.uimodel
lib.events.on 'beforeStart', (data, next) ->
server = data.server
model = data.model
lib = data.lib
me.init lib.uimodel
urlprefix = data.urlprefix
# register html url
url = model.frontend['ng-admin'].url if model.frontend?['ng-admin']?.url?
if url and not model.resources[ url ]?
console.log "registering REST resource: "+url
( (urlprefix,model,me) ->
model.resources[url] =
get:
description: "renders html of admin screen"
server.get url, (req,res,next) ->
body = me.generateHTML()
res.writeHead 200,
'Content-Length': Buffer.byteLength(body),
'Content-Type': 'text/html'
res.write(body)
res.end()
next()
)(urlprefix,model,me)
next()
return me