Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Basejump

Ryan Paul
March 14, 2016

Introduction to Basejump

Build REST APIs on RethinkDB without writing code

Ryan Paul

March 14, 2016
Tweet

More Decks by Ryan Paul

Other Decks in Programming

Transcript

  1. API Anatomy • Server to parse & handle requests •

    Routing to manage endpoints • Validation to sanitize user input • Persistence to store & retrieve data
  2. API Anatomy RethinkDB NodeJS JOI Koa Vue Browser REST API

    Koa Router W3C Fetch Real-world RethinkDB stack
  3. API Anatomy • Lots of layers between persistence and requests

    • More boilerplate than business logic • Repetitive code that is difficult to reuse
  4. API Anatomy router.post("/api/event/:id/messages", function*(id) { this.checkBody("message").notEmpty(); if (this.errors) this.throw(400, {success:

    false, errors: this.errors}); yield r.table("messages").insert({ created: r.now(), text: this.request.body.message, sender: sender, event: id}); this.body = {success: true}; });
  5. Basejump • Visual tool for prototyping API backends • Dynamic

    routing middleware for attaching queries to endpoints • Powered by declarative JSON description format
  6. Basejump Router • Database agnostic routing middleware • Uses Node’s

    VM module to execute code • Integrates seamlessly with Koa and Socket.io • Swagger-based format to describe routes and actions
  7. Swagger • Standard format for describing APIs — can use

    YAML or JSON • Uses JSON Schema for validation • Supported by many tools & frameworks • Extensible via vendor properties
  8. Swagger paths: /test: get: parameters: - {in: query, name: count,

    type: number} x-action: > r.table("test") .orderBy(r.desc("time")) .limit(params.count) post: parameters: - in: body name: body schema: $ref: "#/definitions/test" x-action: > r.table("test").insert(params.body)
  9. Embed Basejump • Embed in your own Node app •

    Pass custom objects into the execution context • Inherit and override the request handler • Custom pre & post processing on input and output
  10. Embed Basejump const app = require("koa")(); const router = require("basejump-router");

    const r = require("rethinkdbdash")(); app.use(require("kcors")()); app.use(require("koa-bodyparser")()); app.use(router.middleware.koa({ swagger: "routes.yaml", context: {r: r} })); app.listen(8000);
  11. Basejump • Not ready for adoption quite yet • API

    and data format still subject to change • New features might necessitate additional format churn
  12. Feature Roadmap • Support for embedding in Express • Interactive

    Schema editing • Pluggable view system • Route collections and blueprints • Authentication and user management • Live API debugging
  13. Feature Ideas • Generate client libraries for mobile & web

    • Use schemas to generate input forms & data dashboard • Support for file uploads & multipart mime • Automatically generate tables and indexes from schemas
  14. Basejump vs Horizon • Basejump: backend-first development & REST APIs

    • Horizon: frontend-first development & WebSockets
  15. Basejump & Horizon • Embed Basejump and Horizon middleware in

    the same Node app • Expose Basejump routes through Horizon custom endpoint • Converge authentication and schema validation?