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

Introduction to Basejump

Introduction to Basejump

Build REST APIs on RethinkDB without writing code


Ryan Paul

March 14, 2016


  1. Basejump Build a REST API on RethinkDB

  2. Ryan Paul RethinkDB Evangelist @segphault

  3. API Anatomy Dissecting an API backend

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

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

    Koa Router W3C Fetch Real-world RethinkDB stack
  6. API Anatomy Persistence Runtime Validation Server Frontend Framework Browser REST

    API Router REST Client Real-world RethinkDB stack
  7. API Anatomy • Lots of layers between persistence and requests

    • More boilerplate than business logic • Repetitive code that is difficult to reuse
  8. 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}; });
  9. Can we abstract away the boilerplate?

  10. Project Basejump Attach queries to endpoints

  11. Basejump • Visual tool for prototyping API backends • Dynamic

    routing middleware for attaching queries to endpoints • Powered by declarative JSON description format
  12. Basejump

  13. {A} 1ST

  14. 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
  15. Swagger

  16. 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
  17. 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)
  18. 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
  19. 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);
  20. Project Basejump Status & Future Plans

  21. Basejump • Not ready for adoption quite yet • API

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

    Schema editing • Pluggable view system • Route collections and blueprints • Authentication and user management • Live API debugging
  23. 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
  24. How does it compare to Fusion?

  25. How does it compare to Fusion? Horizon?

  26. Basejump vs Horizon • Basejump: backend-first development & REST APIs

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

    the same Node app • Expose Basejump routes through Horizon custom endpoint • Converge authentication and schema validation?
  28. • RethinkDB website:
 http://rethinkdb.com • Basejump Router:
 http://github.com/segphault/ basejump-router •

    Follow me on Twitter:
 @segphault Resources