Skip to content

Instantly share code, notes, and snippets.

@brunoguerra
Last active November 1, 2017 17:49
Show Gist options
  • Save brunoguerra/c6ac8af5305c220aaace9a6642d5c699 to your computer and use it in GitHub Desktop.
Save brunoguerra/c6ac8af5305c220aaace9a6642d5c699 to your computer and use it in GitHub Desktop.
Declarative Backend
export default {
'users': 'User'
}
'use strict';
import compose from 'koa-compose';
import convert from 'koa-convert';
import logger from 'koa-logger';
import cors from 'koa-cors';
import bodyParser from 'koa-bodyparser';
//import session from 'koa-generic-session';
export default function middleware() {
return compose([
logger(),
convert(cors()),
convert(bodyParser()),
// convert(session()),
]);
}
export const create = (model) =>
(ctx, next) => (ctx.state[model.name] = new model()) && next();
export const save = (model) => {
return async (ctx, next) => {
const interest = Object.assign(ctx.state[model.name], ctx.request.body);
await interest.save();
await next();
}
}
export const findOne = (config) => (model) => {
return async (ctx, next) => {
const optional = (name) => ctx.params[name] || ctx.request.body[name];
const interest = ctx.state[model.name] = await model.findOne({
[config.name]: optional(config.name)
});
if (!config.throwFound ^ !!interest) {
ctx.throw(config.throwCode || 404);
}
await next();
}
}
export const findById = findOne({ name: '_id' });
export const index = ({route, model}) => (async (ctx) => {
ctx.body = await model.find({});
});
export const response = ({route, model}) => (async (ctx) => {
ctx.body = ctx.state.model;
});
import mongoose from 'mongoose';
import routes from './gen.config';
import {
index,
findOne,
findById,
create,
save,
response
} from '../../middleware';
const generateRoutes = (router, params) => {
console.log(`generate route for /${params.route}`);
router
// GET /api/{route.name} - Get item list
.get(`/${params.route}`,
index(params))
// GET /api/{route.name}/:itemId - Get item
.get(`/${params.route}/:_id`,
findById(params.model),
response(params))
// POST /api/{route.name} - Create item
.post(`/${params.route}`,
create(params.model),
save(params.model),
response(params))
// PUT /api/{route.name}/:itemId - Update item
.put(`/${params.route}/:_id`,
findById(params.model),
save(params.model),
response(params)
)
;
}
export default (router) => Object.keys(routes).reduce(
(prev, key) => {
const params = routes[key];
let { model, auth } = params;
model = model || params;
return generateRoutes(router, {
route: key,
model: mongoose.model(model),
auth
})
}, {}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment