mirror of
https://github.com/Permissionless-Software-Foundation/bch-dex.git
synced 2026-09-21 16:52:00 -07:00
+1
-11
@@ -1,16 +1,6 @@
|
||||
{
|
||||
"parser": "babel-eslint",
|
||||
"extends": "airbnb",
|
||||
"plugins": [
|
||||
"react"
|
||||
],
|
||||
"rules": {
|
||||
"semi": [2, "never"],
|
||||
"no-param-reassign": [2, { "props": false }],
|
||||
"strict": 0,
|
||||
"comma-dangle": [2, "never"],
|
||||
"max-len": [2, 80, 2, { "ignoreComments": true }]
|
||||
},
|
||||
"extends": "standard",
|
||||
"env": {
|
||||
"node": true,
|
||||
"mocha": true
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#koa2-api-boilerplate
|
||||
[](http://standardjs.com)
|
||||
|
||||
Boilerplate for building APIs with [koa2](https://github.com/koajs/koa/tree/v2.x) and mongodb.
|
||||
|
||||
This project covers basic necessities of most APIs.
|
||||
* Authentication (passport & jwt)
|
||||
* Database (mongoose)
|
||||
* Testing (mocha)
|
||||
* Doc generation with jsondoc
|
||||
* Doc generation with apidoc
|
||||
* linting using standard
|
||||
|
||||
##Requirements
|
||||
* node __^4.0.0__
|
||||
@@ -27,7 +30,7 @@ git clone https://github.com/adrianObel/koa2-api-boilerplate.git
|
||||
* [Passport](http://passportjs.org/)
|
||||
* [Nodemon](http://nodemon.io/)
|
||||
* [Mocha](https://mochajs.org/)
|
||||
* [jsondoc](http://apidocjs.com/)
|
||||
* [apidoc](http://apidocjs.com/)
|
||||
* [Babel](https://github.com/babel/babel)
|
||||
* [ESLint](http://eslint.org/)
|
||||
|
||||
@@ -60,7 +63,7 @@ git clone https://github.com/adrianObel/koa2-api-boilerplate.git
|
||||
* `npm test` Run mocha tests
|
||||
|
||||
##Documentation
|
||||
API documentation is written inline and generated by [jsondoc](http://apidocjs.com/).
|
||||
API documentation is written inline and generated by [apidoc](http://apidocjs.com/).
|
||||
|
||||
Visit `http://localhost:5000/docs/` to view docs
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import { errorMiddleware } from '../src/middleware'
|
||||
const app = new Koa()
|
||||
app.keys = [config.session]
|
||||
|
||||
mongoose.Promise = global.Promise
|
||||
mongoose.connect(config.database)
|
||||
|
||||
app.use(convert(logger()))
|
||||
|
||||
+12
-10
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "koa2-api-boilerplate",
|
||||
"version": "2.1.2",
|
||||
"version": "2.2.0",
|
||||
"description": "Koa2 boilerplate covering essentials for APIs",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
@@ -18,7 +18,8 @@
|
||||
"boilerplate",
|
||||
"es6",
|
||||
"mongoose",
|
||||
"passportjs"
|
||||
"passportjs",
|
||||
"apidoc"
|
||||
],
|
||||
"author": "Adrian Obelmejias <adrian@obel.me>",
|
||||
"license": "MIT",
|
||||
@@ -31,14 +32,15 @@
|
||||
"url": "https://github.com/adrianObel/koa2-api-boilerplate"
|
||||
},
|
||||
"dependencies": {
|
||||
"apidoc": "^0.16.1",
|
||||
"babel-core": "^6.5.1",
|
||||
"babel-polyfill": "^6.5.0",
|
||||
"babel-preset-es2015-node5": "^1.2.0",
|
||||
"babel-preset-stage-0": "^6.5.0",
|
||||
"bcrypt": "^0.8.5",
|
||||
"glob": "^7.0.0",
|
||||
"jsonwebtoken": "^5.5.4",
|
||||
"koa": "^2.0.0-alpha.3",
|
||||
"jsonwebtoken": "^7.1.9",
|
||||
"koa": "^2.0.0-alpha.6",
|
||||
"koa-bodyparser": "^3.0.0",
|
||||
"koa-convert": "^1.2.0",
|
||||
"koa-generic-session": "^1.10.1",
|
||||
@@ -51,15 +53,15 @@
|
||||
"passport-local": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"apidoc": "^0.15.1",
|
||||
"babel-eslint": "^6.0.2",
|
||||
"babel-register": "^6.5.1",
|
||||
"chai": "^3.5.0",
|
||||
"eslint": "^2.8.0",
|
||||
"eslint-config-airbnb": "^7.0.0",
|
||||
"eslint-plugin-react": "^4.3.0",
|
||||
"mocha": "^2.4.5",
|
||||
"eslint": "^3.4.0",
|
||||
"eslint-config-standard": "^6.0.0",
|
||||
"eslint-plugin-promise": "^2.0.1",
|
||||
"eslint-plugin-standard": "^2.0.0",
|
||||
"mocha": "^3.0.2",
|
||||
"nodemon": "^1.8.1",
|
||||
"supertest": "^1.2.0"
|
||||
"supertest": "^2.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export function errorMiddleware() {
|
||||
export function errorMiddleware () {
|
||||
return async (ctx, next) => {
|
||||
try {
|
||||
await next()
|
||||
|
||||
@@ -3,7 +3,7 @@ import config from '../../config'
|
||||
import { getToken } from '../utils/auth'
|
||||
import { verify } from 'jsonwebtoken'
|
||||
|
||||
export async function ensureUser(ctx, next) {
|
||||
export async function ensureUser (ctx, next) {
|
||||
const token = getToken(ctx)
|
||||
|
||||
if (!token) {
|
||||
@@ -17,8 +17,8 @@ export async function ensureUser(ctx, next) {
|
||||
ctx.throw(401)
|
||||
}
|
||||
|
||||
const user = await User.findById(decoded.id, '-password')
|
||||
if (!user) {
|
||||
ctx.state.user = await User.findById(decoded.id, '-password')
|
||||
if (!ctx.state.user) {
|
||||
ctx.throw(401)
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -10,7 +10,7 @@ const User = new mongoose.Schema({
|
||||
password: { type: String, required: true }
|
||||
})
|
||||
|
||||
User.pre('save', function preSave(next) {
|
||||
User.pre('save', function preSave (next) {
|
||||
const user = this
|
||||
|
||||
if (!user.isModified('password')) {
|
||||
@@ -35,7 +35,7 @@ User.pre('save', function preSave(next) {
|
||||
.catch(err => next(err))
|
||||
})
|
||||
|
||||
User.methods.validatePassword = function validatePassword(password) {
|
||||
User.methods.validatePassword = function validatePassword (password) {
|
||||
const user = this
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -47,7 +47,7 @@ User.methods.validatePassword = function validatePassword(password) {
|
||||
})
|
||||
}
|
||||
|
||||
User.methods.generateToken = function generateToken() {
|
||||
User.methods.generateToken = function generateToken () {
|
||||
const user = this
|
||||
|
||||
return jwt.sign({ id: user.id }, config.token)
|
||||
|
||||
@@ -50,7 +50,7 @@ import passport from 'koa-passport'
|
||||
* }
|
||||
*/
|
||||
|
||||
export async function authUser(ctx, next) {
|
||||
export async function authUser (ctx, next) {
|
||||
return passport.authenticate('local', (user) => {
|
||||
if (!user) {
|
||||
ctx.throw(401)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import glob from 'glob'
|
||||
import Router from 'koa-router'
|
||||
|
||||
exports = module.exports = function initModules(app) {
|
||||
exports = module.exports = function initModules (app) {
|
||||
glob(`${__dirname}/*`, { ignore: '**/index.js' }, (err, matches) => {
|
||||
if (err) { throw err }
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ import User from '../../models/users'
|
||||
* "error": "Unprocessable Entity"
|
||||
* }
|
||||
*/
|
||||
export async function createUser(ctx) {
|
||||
export async function createUser (ctx) {
|
||||
const user = new User(ctx.request.body.user)
|
||||
try {
|
||||
await user.save()
|
||||
@@ -84,7 +84,7 @@ export async function createUser(ctx) {
|
||||
*
|
||||
* @apiUse TokenError
|
||||
*/
|
||||
export async function getUsers(ctx) {
|
||||
export async function getUsers (ctx) {
|
||||
const users = await User.find({}, '-password')
|
||||
ctx.body = { users }
|
||||
}
|
||||
@@ -116,7 +116,7 @@ export async function getUsers(ctx) {
|
||||
*
|
||||
* @apiUse TokenError
|
||||
*/
|
||||
export async function getUser(ctx, next) {
|
||||
export async function getUser (ctx, next) {
|
||||
try {
|
||||
const user = await User.findById(ctx.params.id, '-password')
|
||||
if (!user) {
|
||||
@@ -134,7 +134,7 @@ export async function getUser(ctx, next) {
|
||||
ctx.throw(500)
|
||||
}
|
||||
|
||||
if(next) return next()
|
||||
if (next) { return next() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -177,7 +177,7 @@ export async function getUser(ctx, next) {
|
||||
*
|
||||
* @apiUse TokenError
|
||||
*/
|
||||
export async function updateUser(ctx) {
|
||||
export async function updateUser (ctx) {
|
||||
const user = ctx.body.user
|
||||
|
||||
Object.assign(user, ctx.request.body.user)
|
||||
@@ -210,7 +210,7 @@ export async function updateUser(ctx) {
|
||||
* @apiUse TokenError
|
||||
*/
|
||||
|
||||
export async function deleteUser(ctx) {
|
||||
export async function deleteUser (ctx) {
|
||||
const user = ctx.body.user
|
||||
|
||||
await user.remove()
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
export function getToken(ctx) {
|
||||
export function getToken (ctx) {
|
||||
const header = ctx.request.header.authorization
|
||||
if (!header) {
|
||||
return null
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
import mongoose from 'mongoose'
|
||||
|
||||
export function cleanDb() {
|
||||
export function cleanDb () {
|
||||
for (const collection in mongoose.connection.collections) {
|
||||
if (mongoose.connection.collections.hasOwnProperty(collection)) {
|
||||
mongoose.connection.collections[collection].remove()
|
||||
@@ -8,7 +8,7 @@ export function cleanDb() {
|
||||
}
|
||||
}
|
||||
|
||||
export function authUser(agent, callback) {
|
||||
export function authUser (agent, callback) {
|
||||
agent
|
||||
.post('/users')
|
||||
.set('Accept', 'application/json')
|
||||
|
||||
Reference in New Issue
Block a user