Introduction to Basejump

Introduction to Basejump

Build REST APIs on RethinkDB without writing code

Ba70f10866cbab0bc6b9b1d547ef8015?s=128

Ryan Paul

March 14, 2016
Tweet

Transcript

  1. 4.

    API Anatomy • Server to parse & handle requests •

    Routing to manage endpoints • Validation to sanitize user input • Persistence to store & retrieve data
  2. 5.

    API Anatomy RethinkDB NodeJS JOI Koa Vue Browser REST API

    Koa Router W3C Fetch Real-world RethinkDB stack
  3. 6.
  4. 7.

    API Anatomy • Lots of layers between persistence and requests

    • More boilerplate than business logic • Repetitive code that is difficult to reuse
  5. 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}; });
  6. 11.

    Basejump • Visual tool for prototyping API backends • Dynamic

    routing middleware for attaching queries to endpoints • Powered by declarative JSON description format
  7. 12.
  8. 13.
  9. 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
  10. 15.
  11. 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
  12. 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)
  13. 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
  14. 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);
  15. 21.

    Basejump • Not ready for adoption quite yet • API

    and data format still subject to change • New features might necessitate additional format churn
  16. 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
  17. 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
  18. 26.

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

    • Horizon: frontend-first development & WebSockets
  19. 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?