Last active
November 1, 2017 17:49
-
-
Save brunoguerra/c6ac8af5305c220aaace9a6642d5c699 to your computer and use it in GitHub Desktop.
Declarative Backend
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export default { | |
'users': 'User' | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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; | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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