How to quickly make REST APIs with CompoundJS
description
Transcript of How to quickly make REST APIs with CompoundJS
How to quickly make REST APIs
infos
made by Anatoliy Chakkaev1208 stars on github1000+ commitspreviously named RailwayJS
based on top of ExpressJS
Express is inspired by Sinatra: simple and light Express has cool stuff: middlewares, error handling, logging...
an express server
express = require 'express'app = express()
app.get '/hello', (req, res) -> res.end hello: 'world'
Neat but almost nothing is configured by default.
compound
inspired by Rails: full featured and scaffolding
quickstart
compound init blog-api --coffee
configuration
Load dependencies
cd blog-apinpm install
Backend only: we remove UI
rm -rf public app/assets app/views
# remove code from config/environment.coffee- app.use compound.assetsCompiler.init()- app.set 'cssEngine', 'stylus'- app.use express.static ''#{app.root}/public'', maxAge: 86400000
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
our files
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
routes
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
controllers
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
models
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
log, dependencies, infos
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
config
app/app/models/app/controllers/app/controllers/application_controller.coffeeapp/observers/app/helpers/db/db/schema.coffeelog/node_modules/config/config/locales/config/initializers/config/environments/config/environment.coffeeconfig/environments/development.coffeeconfig/environments/production.coffeeconfig/environments/test.coffeeconfig/initializers/db-tools.coffeeconfig/routes.coffeeconfig/autoload.coffeeconfig/database.coffeeserver.coffeeREADME.mdpackage.json
start + commands
models and JugglingDB
ORM/ODM for Node.jsIntegrated with Compoundadaptable to any data sourcevalidatorsrelations
generator
compound g model post title content published:boolean
renders:
# db/schema.coffeePost = describe 'Post', -> property 'title', String property 'content', String property 'published', Boolean
# app/models/post.coffeemodule.exports = (compound, Post) →
let's add this: Post.published = (callback) -> Post.all published: true, callback
controllers
# app/controllers/posts_controller.coffee
action 'create', -> Post.create body (err, post) -> if err then send 500 else send post, 201
action 'all', -> Post.all (err, posts) -> if err then send 500 else send posts
action 'published', -> Post.published (err, posts) -> if err then send 500 else send posts
pre-processors and post-processors
before -> Post.find params.id, (err, post) => if err then send 500 else if not post then send 404 else @post = post next(), only: ['show', 'update', 'destroy']
after -> console.log 'request processed' next()
That makes simpler controllers!
action 'show', -> send @post
action 'update', -> @post.updateAttributes body, (err) -> if err then send 500 else send 200
action 'destroy', -> @post.destroy -> if err then send 500 else send 204
routing helpers
basic
# config/routes.coffeemap.get 'posts', 'posts#published'map.get 'admin/posts', 'posts#all'map.post 'admin/posts', 'posts#create'map.get 'admin/posts/:id', 'posts#show'map.put 'admin/posts/:id', 'posts#modify'map.del 'admin/posts/:id', 'posts#destroy'
evolved
# generate standard CRUD routesmap.resources 'posts'
# Link directly to controller with the right namemap.all ':controller/:action'map.all ':controller/:action/:id'
namespaces
map.get 'posts', 'posts#published'map.namespace 'admin', -> map.get 'posts', 'posts#all' map.post 'posts', 'posts#create' map.get 'posts/:id', 'posts#show' map.put 'posts/:id', 'posts#modify' map.del 'posts/:id', 'posts#destroy'
more
generators for controllersSoon: custom generators Soon: custom structure + a lof of features if you want to make UIs
[email protected]://blog.cozycloud.cchttps://twitter.com/mycozycloud
Crédits photos: blmiers2, Ethan Ableman
License Creative Commons by-3.0
a talk by...