JSPM

koapi

0.2.90
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 277
  • Score
    100M100P100Q65957F
  • License MIT

RESTful API framework based on koajs

Package Exports

  • koapi

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (koapi) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Koapi

RESTful API framework based on koa and bookshelf

Wriging a RESTful API have never been so easy!

Install

npm install koapi

Write your APIs in just 1 minute

Assume you have database below

Table posts

id title contents created_at updated_at
1 Title Contents 2016-8-1 2016-8-1

Table comments

id post_id title contents created_at updated_at
1 1 Title Comment 2016-8-1 2016-8-1

Here we go!

app.js

import Koapi, { ResourceRouter } from 'koapi';
import extend, { initialize } from 'koapi/lib/model'

const app = new Koapi();

/****************** Connect to database ******************/
initialize({
  client: 'pg',
  connection: {
    host     : '127.0.0.1',
    user     : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});



/****************** Model definition    ******************/
const Comment = extend({
  tableName: 'comments',
  hasTimestamps: true,
});

const Post = extend({
  tableName: 'posts',
  hasTimestamps: true,
  comments(){
    return this.hasMany(Comment);
  }
});




/****************** Implement Routers ******************/

// POST /posts
// GET  /posts
// GET  /posts/:id
// PATCH /posts/:id
// DELETE /posts/:id
// are ALL ready!
// YES! IT'S DEAD SIMPLE! RIGHT?
const posts = ResourceRouter.define(Post.collection());

const comments = ResourceRouter.define({
  collection: ctx => ctx.state.post.comments(),
  setup(router){
    // get post instance in context
    router.use(async (ctx, next) => {
      ctx.state.post = await Post.findById(ctx.params.post_id, {require:true});
      await next();
    });
    // method "crud" is a shortcut for create, read, update, destroy
    // YOU CAN ALSO USE MIDDLEWARE in create, read, update, destroy
    // AWESOME! RIGHT?!!!
    router.create(async(ctx, next) => {
      // you can do anything before create
      await next();
      // you can do anything after create
    });
    router.read(/* if you want, you can place any middlewares here */{
      filterable: ['created_at'], // filterable field
      sortable: ['created_at'], // sortable field
    });
    // comment may not have update
    // comments.update();
    router.destroy();
  }
});

// YES! Thanks to koa-router, nested router is supported
posts.use('/posts/:post_id/comments', comments.routes())



/****************** Start server      ******************/
app.bodyparser();
app.routers([ posts ]);

app.listen(3000);

run

babel-node app.js

You have done your RESTful APIs in 1 minute

Your API is more complex?

Checkout Koapi Boilerplate for your situation.