├── app ├── modules │ ├── user │ │ ├── user.service.js │ │ ├── user.model.js │ │ ├── user.controller.js │ │ └── user.router.js │ └── auth │ │ ├── auth.controller.js │ │ └── auth.router.js ├── middlewares │ ├── jwt.js │ ├── compress.js │ └── cors.js ├── config │ ├── api.js │ ├── instance.js │ └── mongodb.js ├── helpers │ ├── templates │ │ └── error.pug │ └── logger.js ├── common │ ├── routerCommon.js │ ├── serviceCommon.js │ └── controllerCommon.js ├── routes.js └── models.js ├── .gitignore ├── Dockerfile ├── docker-compose.yml ├── package.json ├── cert ├── server.csr ├── server.crt └── server.key ├── README.md ├── server.js └── test └── index.js /app/modules/user/user.service.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Add any directories, files, or patterns you don't want to be tracked by version control 2 | 3 | *.log 4 | .vscode/ 5 | npm-debug.log* 6 | node_modules/ 7 | dist/ -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:8.5.0 2 | 3 | RUN mkdir /app 4 | WORKDIR /app 5 | COPY package.json /app 6 | RUN npm install 7 | COPY . /app 8 | ENV MONGO_HOST=mongodb://mongo:27017/Teste_local 9 | EXPOSE 3001 10 | -------------------------------------------------------------------------------- /app/middlewares/jwt.js: -------------------------------------------------------------------------------- 1 | const convert = require('koa-convert') 2 | const jwt = require('koa-jwt') 3 | const options = require('../config/api').jwt 4 | 5 | module.exports = convert(jwt({ secret: options.public })) 6 | -------------------------------------------------------------------------------- /app/config/api.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | prefix: 'api', 3 | port: { 4 | http: 3000, 5 | http2: 3001 6 | }, 7 | jwt: { 8 | public: 'public-key', 9 | private: 'private-key', 10 | algorithm: 'HS512' 11 | } 12 | } -------------------------------------------------------------------------------- /app/helpers/templates/error.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= 'Error - ' + status 5 | body 6 | #error 7 | h3 Error: 8 | pre: code= status 9 | h3 Message: 10 | pre: code= error 11 | h3 Stack: 12 | pre: code= stack -------------------------------------------------------------------------------- /app/config/instance.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | mongoose.Promise = global.Promise; 3 | 4 | const mongodb = require('./mongodb')() 5 | const instance = mongoose.connect(mongodb.connection.url, mongodb.options) 6 | mongoose.connection.on('error', console.error) 7 | 8 | module.exports = { 9 | instance, 10 | mongoose 11 | } -------------------------------------------------------------------------------- /app/modules/user/user.model.js: -------------------------------------------------------------------------------- 1 | module.exports = (mongoose) => { 2 | const UserSchema = new mongoose.Schema({ 3 | email: { 4 | type: String, 5 | }, 6 | isActive: { 7 | type: Boolean, 8 | default: true 9 | }, 10 | }) 11 | 12 | return mongoose.model('User', UserSchema) 13 | } -------------------------------------------------------------------------------- /app/middlewares/compress.js: -------------------------------------------------------------------------------- 1 | const compress = require('koa-compress') 2 | const compressible = require('compressible') 3 | 4 | module.exports = 5 | compress({ 6 | filter: function (content_type) { 7 | return compressible(content_type) 8 | }, 9 | threshold: 1024, 10 | flush: require('zlib').Z_SYNC_FLUSH 11 | }) -------------------------------------------------------------------------------- /app/modules/auth/auth.controller.js: -------------------------------------------------------------------------------- 1 | const jwt = require('jsonwebtoken'); 2 | const options = require('../../config/api').jwt 3 | 4 | const token = async (ctx, next) => { 5 | let body = ctx.request.body 6 | let token = jwt.sign({ data: body }, options.public) 7 | 8 | ctx.body = { token } 9 | ctx.status = 200 10 | } 11 | 12 | module.exports = { 13 | token: token 14 | } -------------------------------------------------------------------------------- /app/modules/user/user.controller.js: -------------------------------------------------------------------------------- 1 | const user = require('../../models').models.user 2 | 3 | const factory = new (require('../../common/controllerCommon'))(user) 4 | const service = require('./user.service') 5 | 6 | module.exports = { 7 | find: factory.find, 8 | findById: factory.findById, 9 | save: factory.save, 10 | update: factory.update, 11 | remove: factory.remove 12 | } -------------------------------------------------------------------------------- /app/middlewares/cors.js: -------------------------------------------------------------------------------- 1 | const convert = require('koa-convert') 2 | const cors = require('koa-cors') 3 | const corsError = require('koa-cors-error') 4 | 5 | module.exports = { 6 | corsError: convert(corsError), 7 | cors: convert(cors( 8 | { 9 | origin: '*', 10 | methods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', 11 | headers: ['Content-Type', 'Authorization'], 12 | } 13 | )) 14 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | services: 3 | web: 4 | build: 5 | context: . 6 | dockerfile: Dockerfile 7 | command: node_modules/.bin/nodemon --exec npm start 8 | environment: 9 | NODE_ENV: development 10 | ports: 11 | - "3001:3001" 12 | links: 13 | - mongo 14 | volumes: 15 | - ./:/app 16 | - /app/node_modules 17 | mongo: 18 | image: mongo 19 | ports: 20 | - "27017:27017" 21 | -------------------------------------------------------------------------------- /app/helpers/logger.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | 3 | const generateChalk = color => msg => console.log(chalk.bold[color](`[${new Date().toISOString()}] ${msg}`)) 4 | 5 | const error = generateChalk('red') 6 | const success = generateChalk('green') 7 | const info = generateChalk('blue') 8 | const warning = generateChalk('yellow') 9 | const log = generateChalk('white') 10 | 11 | module.exports = { 12 | error, 13 | success, 14 | info, 15 | warning, 16 | log, 17 | } -------------------------------------------------------------------------------- /app/modules/auth/auth.router.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const prefix = require('../../config/api').prefix 3 | 4 | const baseUrl = 'auth' 5 | const controller = require(`./${baseUrl}.controller`) 6 | 7 | const createRoutes = (jwt) => { 8 | let router = new Router() 9 | 10 | router.prefix(`/${prefix}/${baseUrl}`) 11 | router.post('/', async (ctx, next) => controller.token(ctx, next)) 12 | 13 | return router 14 | } 15 | 16 | module.exports = (jwt) => createRoutes(jwt) -------------------------------------------------------------------------------- /app/modules/user/user.router.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const prefix = require('../../config/api').prefix 3 | 4 | const baseUrl = 'user' 5 | const controller = require(`./${baseUrl}.controller`) 6 | 7 | const createRoutes = (jwt) => { 8 | let router = new Router() 9 | 10 | router.prefix(`/${prefix}/${baseUrl}`) 11 | router = new (require('../../common/routerCommon'))(controller, router, jwt) 12 | 13 | return router 14 | } 15 | 16 | module.exports = (jwt) => createRoutes(jwt) -------------------------------------------------------------------------------- /app/config/mongodb.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | const dbInstance = 'Teste_local' 3 | const ip = 'localhost' 4 | const port = 27017 5 | const url = process.env.MONGO_HOST || `mongodb://${ip}:${port}/${dbInstance}` 6 | const connection = { 7 | url, 8 | port 9 | } 10 | const options = { 11 | useMongoClient: true, 12 | socketTimeoutMS: 0, 13 | keepAlive: true, 14 | reconnectTries: 30 15 | } 16 | return { 17 | connection, 18 | options 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/common/routerCommon.js: -------------------------------------------------------------------------------- 1 | let routerCommon = function(controller, router, jwt) { 2 | router.del('/:id', jwt, async (ctx, next) => controller.remove(ctx, next)) 3 | router.get('/:id', jwt, async (ctx, next) => controller.findById(ctx, next)) 4 | router.patch('/:id', jwt, async (ctx, next) => controller.update(ctx, next)) 5 | router.post('/', jwt, async (ctx, next) => controller.find(ctx, next)) 6 | router.post('/create', jwt, async (ctx, next) => controller.save(ctx, next)) 7 | return router 8 | } 9 | 10 | module.exports = routerCommon 11 | -------------------------------------------------------------------------------- /app/routes.js: -------------------------------------------------------------------------------- 1 | const glob = require('glob') 2 | const path = require('path') 3 | 4 | const modulesPath = path.resolve('app/modules') 5 | 6 | const createRoutes = (app, jwt) => { 7 | glob(`${modulesPath}/**/*.router.js`, { dot: true }, function (er, files) { 8 | files.forEach(function(file) { 9 | const route = require(file)(jwt) 10 | app.use(route.routes()) 11 | .use(route.allowedMethods({ 12 | throw: true 13 | })) 14 | }) 15 | }) 16 | } 17 | 18 | module.exports = (app, jwt) => createRoutes(app, jwt) -------------------------------------------------------------------------------- /app/models.js: -------------------------------------------------------------------------------- 1 | const glob = require('glob') 2 | const path = require('path') 3 | 4 | const modelsPath = path.resolve('app/modules') 5 | 6 | const instance = require('./config/instance') 7 | const mongoose = instance.mongoose 8 | 9 | let models = [] 10 | const init = async function() { 11 | let files = glob.sync(`${modelsPath}/**/*.model.js`, { dot: true }) 12 | await files.forEach(function(model) { 13 | const fileName = modelName(model) 14 | models[fileName] = (require(model)(mongoose)) 15 | }) 16 | } 17 | 18 | const modelName = function(model) { 19 | let result = model.split('/') 20 | return result[result.length - 1].replace('.model.js', '') 21 | } 22 | 23 | module.exports = { 24 | models, 25 | init 26 | } -------------------------------------------------------------------------------- /app/common/serviceCommon.js: -------------------------------------------------------------------------------- 1 | let serviceCommon = function(model) { 2 | let _model = model; 3 | 4 | const find = async (_params) => { 5 | return await _model.find(_params) 6 | } 7 | const findById = async (_id) => { 8 | return await _model.findById(_id) 9 | } 10 | const save = async (_params) => { 11 | let saved = new _model(_params) 12 | return await saved.save() 13 | } 14 | const update = async (_id, _params) => { 15 | return await _model.update({ _id : _id }, { $set: _params }) 16 | } 17 | const remove = async (_id) => { 18 | return await _model.remove({ _id: _id }) 19 | } 20 | 21 | return { 22 | find, 23 | findById, 24 | save, 25 | update, 26 | remove 27 | } 28 | } 29 | 30 | module.exports = serviceCommon 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "boilerplate-koa2", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "nodemon server.js", 8 | "test": "mocha" 9 | }, 10 | "author": "X-Apps Desenvolvimento de Sistemas", 11 | "license": "ISC", 12 | "dependencies": { 13 | "chalk": "^2.1.0", 14 | "compressible": "^2.0.11", 15 | "glob": "^7.1.2", 16 | "http": "0.0.0", 17 | "http2": "^3.3.6", 18 | "jsonwebtoken": "^8.0.1", 19 | "koa": "^2.3.0", 20 | "koa-body": "^2.3.0", 21 | "koa-compress": "^2.0.0", 22 | "koa-convert": "^1.2.0", 23 | "koa-cors": "0.0.16", 24 | "koa-cors-error": "0.0.2", 25 | "koa-error": "^3.1.0", 26 | "koa-helmet": "^3.2.0", 27 | "koa-jwt": "^3.2.2", 28 | "koa-logger": "^3.0.1", 29 | "koa-router": "^7.2.1", 30 | "mongoose": "^4.11.11", 31 | "pug": "^2.0.0-rc.4" 32 | }, 33 | "devDependencies": { 34 | "chai": "^4.1.2", 35 | "mocha": "^3.5.3", 36 | "nodemon": "^1.12.0", 37 | "supertest": "^3.0.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /cert/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIDBDCCAewCAQAwgZIxCzAJBgNVBAYTAkJSMRIwEAYDVQQIEwlTYW8tUGF1bG8x 3 | EjAQBgNVBAcTCVNhby1QYXVsbzEPMA0GA1UEChMGWC1BcHBzMQswCQYDVQQLEwJJ 4 | VDEYMBYGA1UEAxMPU2VyZ2lvIEZpb3JvdHRpMSMwIQYJKoZIhvcNAQkBFhRzZXJn 5 | aW9AeC1hcHBzLmNvbS5icjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB 6 | AOQHjKnVrKvzauRNcpHYA3WNTN002WDXC8vMvVB7BvYUPWZZQPxZbzFe2GTm0Tc1 7 | eohnbXCW6m9vQzEaQ8OknD5YK90d8h78Mktb4snVQHsj0vM1OKhBJnXNWtBmf6tV 8 | tfUNEpMoCjb/p+frT0wkImnvUFnGgczFuwlSaEf/CkIjvzoOej7vOU2EyhMqR45J 9 | rQuiIiSgG0B2xqxf6f8mmri7DEh6XYpfK0/GTwu0AG7z9CBQ6+37axBNa+kZPijK 10 | Fq3Ft7QpdID8nqB/El+Sb/iol/hDuZCFVUcFUnQ8FkHve6d2gd/LVLdrOrnYlKjm 11 | VKf4OBCB2sjAf9iItvzyyUUCAwEAAaAsMBMGCSqGSIb3DQEJBzEGEwQxMjM0MBUG 12 | CSqGSIb3DQEJAjEIEwZYLUFwcHMwDQYJKoZIhvcNAQEFBQADggEBALcuSLGsXds1 13 | HA+xV/xfgD+nXbZ2r3k8Np7zFwvhpIZRh5A8UiaX7A5d2tj9x0sWDxCqQxZT2Uwm 14 | 763opv4rqhUnygVoc+01jqD0kFAa0mCBWz+cJg5zmqI5JgjDghlmLUkyfMckmVXX 15 | XSTYybQS/w25BaD0IFBw9IBpp1no60w74gWkG7P9VbmXGCDodg6N9CMlJkAS3FbA 16 | A4UBdJfYc7MP/dYtZ580/SIxZCrZ1uigbnMIgSehgNWQT9S0yrhXB5r2ZO8dfF2W 17 | aWkDkI8Ze705wj1G9cWVTuvbnpTva4X1ZvKzOjDSxCR1zO3Zc/C6d+If3FEljKhj 18 | qk965hHtvH4= 19 | -----END CERTIFICATE REQUEST----- 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![dependency Status](https://img.shields.io/david/xappsdev/boilerplate-koa2.svg?maxAge=1000)](https://img.shields.io/david/xappsdev/boilerplate-koa2.svg) 2 | [![devDependency Status](https://img.shields.io/david/dev/xappsdev/boilerplate-koa2.svg?maxAge=1000)](https://img.shields.io/david/dev/xappsdev/boilerplate-koa2.svg) 3 | [![stars](https://img.shields.io/github/stars/xappsdev/boilerplate-koa2.svg?maxAge=1000)](https://img.shields.io/github/stars/xappsdev/boilerplate-koa2.svg) 4 | [![forks](https://img.shields.io/github/forks/xappsdev/boilerplate-koa2.svg?maxAge=1000)](https://img.shields.io/github/forks/xappsdev/boilerplate-koa2.svg) 5 | 6 | ## Description 7 | Koa 2.x API using: 8 | 9 | - Koa 2.x 10 | - Asynchronous Functions (Async/Await) 11 | - Compress, Cors, Error 12 | - Json Web Token 13 | - HTTP/2 14 | - Mongodb 15 | - Mongoose 16 | - Mocha and Chai 17 | 18 | ## Running 19 | Install dependencies 20 | ``` 21 | npm install 22 | ``` 23 | 24 | Start a Local Server 25 | ``` 26 | npm start 27 | ``` 28 | **Note : Please make sure your MongoDB is running before using ```npm start``` ** 29 | 30 | Run Test 31 | ``` 32 | npm test 33 | ``` 34 | 35 | ## Running with docker 36 | single command 37 | ``` 38 | docker-compose up 39 | ``` 40 | 41 | ## License 42 | MIT © [X-Apps](https://github.com/xappsdev) 43 | -------------------------------------------------------------------------------- /cert/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDojCCAooCCQDDhSm1xgBL3TANBgkqhkiG9w0BAQsFADCBkjELMAkGA1UEBhMC 3 | QlIxEjAQBgNVBAgTCVNhby1QYXVsbzESMBAGA1UEBxMJU2FvLVBhdWxvMQ8wDQYD 4 | VQQKEwZYLUFwcHMxCzAJBgNVBAsTAklUMRgwFgYDVQQDEw9TZXJnaW8gRmlvcm90 5 | dGkxIzAhBgkqhkiG9w0BCQEWFHNlcmdpb0B4LWFwcHMuY29tLmJyMB4XDTE3MDkx 6 | MzE4NTEzOFoXDTE4MDkxMzE4NTEzOFowgZIxCzAJBgNVBAYTAkJSMRIwEAYDVQQI 7 | EwlTYW8tUGF1bG8xEjAQBgNVBAcTCVNhby1QYXVsbzEPMA0GA1UEChMGWC1BcHBz 8 | MQswCQYDVQQLEwJJVDEYMBYGA1UEAxMPU2VyZ2lvIEZpb3JvdHRpMSMwIQYJKoZI 9 | hvcNAQkBFhRzZXJnaW9AeC1hcHBzLmNvbS5icjCCASIwDQYJKoZIhvcNAQEBBQAD 10 | ggEPADCCAQoCggEBAOQHjKnVrKvzauRNcpHYA3WNTN002WDXC8vMvVB7BvYUPWZZ 11 | QPxZbzFe2GTm0Tc1eohnbXCW6m9vQzEaQ8OknD5YK90d8h78Mktb4snVQHsj0vM1 12 | OKhBJnXNWtBmf6tVtfUNEpMoCjb/p+frT0wkImnvUFnGgczFuwlSaEf/CkIjvzoO 13 | ej7vOU2EyhMqR45JrQuiIiSgG0B2xqxf6f8mmri7DEh6XYpfK0/GTwu0AG7z9CBQ 14 | 6+37axBNa+kZPijKFq3Ft7QpdID8nqB/El+Sb/iol/hDuZCFVUcFUnQ8FkHve6d2 15 | gd/LVLdrOrnYlKjmVKf4OBCB2sjAf9iItvzyyUUCAwEAATANBgkqhkiG9w0BAQsF 16 | AAOCAQEAkTmKKD+kI+PPDkeKoASzJO8z4a4fcZtrHIzETx1ZXy4GKqoaeitQewOP 17 | sLK5b1ITUad4+FJqyHxQyjlNwLCFfLrCptO5XfRR1QuL+DDwczoCfG6oCc7ESGWI 18 | kOJkS8U74TT9d31RPCNWmGv3e/Dos/WkmHCizRZFOv74s+C/xFgUB5UraGQZvjOh 19 | dcAMbia+pxBP4KneUPu4yjJZ50LFBVtGVzMpcEtWdEH7B2QQaS9wDUIu3GLnbzr8 20 | ugrMk8HzCyUh3dXBw4I6LbDztvAhr0zk0/gYY1uVy7rWG4MbYj7CgJrdHy+iUIhU 21 | P2+bZ9oes6CBW15wR3eNUbv+naktOQ== 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /app/common/controllerCommon.js: -------------------------------------------------------------------------------- 1 | let controllerCommon = function(model) { 2 | let _service = new (require('./serviceCommon'))(model) 3 | 4 | const find = async (ctx, next) => { 5 | let all = await _service.find(ctx.request.body) 6 | await next() 7 | 8 | ctx.body = all 9 | ctx.status = 200 10 | } 11 | const findById = async (ctx, next) => { 12 | let one = await _service.findById(ctx.params.id) 13 | await next() 14 | 15 | ctx.body = one 16 | ctx.status = 200 17 | } 18 | const save = async (ctx, next) => { 19 | let saved = await _service.save(ctx.request.body) 20 | await next() 21 | 22 | ctx.body = { message: "Saved with Success!", result: saved } 23 | ctx.status = 200 24 | } 25 | const update = async (ctx, next) => { 26 | var updated = await _service.update(ctx.params.id, ctx.request.body) 27 | await next() 28 | 29 | ctx.body = { message: "Updated with Success!", result: updated } 30 | ctx.status = 200 31 | } 32 | const remove = async (ctx, next) => { 33 | var removed = await _service.remove(ctx.params.id) 34 | await next() 35 | 36 | ctx.body = { message: "Removed with Success!", result: removed } 37 | ctx.status = 200 38 | } 39 | 40 | return { 41 | find, 42 | findById, 43 | save, 44 | update, 45 | remove 46 | } 47 | } 48 | 49 | module.exports = controllerCommon 50 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // lib's 2 | const body = require('koa-body') 3 | const error = require('koa-error') 4 | const fs = require('fs') 5 | const helmet = require('koa-helmet') 6 | const http = require('http') 7 | const http2 = require('http2') 8 | const loggerMiddleware = require('koa-logger') 9 | 10 | // constants 11 | const jwt = require('./app/middlewares/jwt') 12 | const compress = require('./app/middlewares/compress') 13 | const cors = require('./app/middlewares/cors') 14 | 15 | const logger = require('./app/helpers/logger') 16 | const models = require('./app/models') 17 | const routes = require('./app/routes') 18 | const port = require('./app/config/api').port 19 | 20 | // certificados 21 | const certificates = { 22 | key: fs.readFileSync('./cert/server.key'), 23 | cert: fs.readFileSync('./cert/server.crt') 24 | } 25 | 26 | // init 27 | const Koa = require('koa') 28 | let app = new Koa() 29 | 30 | // middlewares 31 | app.use(body()) 32 | app.use(helmet()) 33 | app.use(loggerMiddleware()) 34 | app.use(cors.corsError) 35 | app.use(cors.cors) 36 | app.use(compress) 37 | app.use(error({ 38 | engine: 'pug', 39 | template: __dirname + '/app/helpers/templates/error.pug' 40 | })) 41 | 42 | // models and routes 43 | models.init() 44 | routes(app, jwt) 45 | 46 | // start 47 | http.createServer(app.callback()).listen(port.http, () => { 48 | logger.log(`Server listening at http://localhost:${port.http}/api/`) 49 | }) 50 | // http2.createServer(certificates, app.callback()).listen(port.http2, () => { 51 | // logger.log(`Server listening at https://localhost:${port.http2}/api/`) 52 | // }) 53 | 54 | module.exports = app -------------------------------------------------------------------------------- /cert/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpgIBAAKCAQEA5AeMqdWsq/Nq5E1ykdgDdY1M3TTZYNcLy8y9UHsG9hQ9ZllA 3 | /FlvMV7YZObRNzV6iGdtcJbqb29DMRpDw6ScPlgr3R3yHvwyS1viydVAeyPS8zU4 4 | qEEmdc1a0GZ/q1W19Q0SkygKNv+n5+tPTCQiae9QWcaBzMW7CVJoR/8KQiO/Og56 5 | Pu85TYTKEypHjkmtC6IiJKAbQHbGrF/p/yaauLsMSHpdil8rT8ZPC7QAbvP0IFDr 6 | 7ftrEE1r6Rk+KMoWrcW3tCl0gPyeoH8SX5Jv+KiX+EO5kIVVRwVSdDwWQe97p3aB 7 | 38tUt2s6udiUqOZUp/g4EIHayMB/2Ii2/PLJRQIDAQABAoIBAQDAz51iEdnyf13X 8 | 86C3r1aldDgVJ1XTa6J+zf0Z6x0kwFJ2k2u+tQSvU0pYb09ihma4pfPE6ucKGKNR 9 | Bqtb53lxwe49BtAu4QLJ88Uc8qOWO+FoYo0owAX8QArVAoZbYpr7vPUC1y1j+eKI 10 | 2NBxSnCK8J8Zeh9Q/bS8GiExF3ceGjEVAEJKIAxB0W5yvuXCvYPeHRg3VtRRxOoL 11 | AaEBRzZpRE3OUUQDtRvKncIJwnwW3r1u2IRq9gxonQ235MTkimVFzTIZGkOD3NfN 12 | sKWTNPPQq5N4kJ7/lsPxTaaCgqixobJRbCHI0bdyjBWeZ9w+9onrIiZDAGR3d50H 13 | rZUec4fBAoGBAPj+i9eHwGVeepBgX2VrFLTvU7/Lr94BQVrGVbSs/j4UvftjJ/Mb 14 | BusNi8cUNp3s9ktcNenWKrqa+13qqkQqUwahmL3uQm1mT3IfZ96XOtECgVOM6+6/ 15 | hP1G0dhnNR2hRpXbblB4pnrJq/cupnPrTUKJb6u5VhI0hU3DUWpRBv/RAoGBAOpx 16 | /3ja063+LOwxbi/djfqAK483aJVsvBAqcyFt0cDfKdb1GQwElBxRnUFk3iK3rVJL 17 | 8Du3gHUcV9wuFoPfLLNPoCZKpvH5IZnLW/lulqpsus9pRK2RdWiniYwKCZp9qMEx 18 | 1YAMd2Y1e9pDbm4nTn7mjA1/Pmmc3XSLg59O8mM1AoGBAO/6hVVJZUlN8drMx6S7 19 | u81XDOTBr9LMauzOUzQ7tx6mZySuwIYx+kz5VUqeVLWI+ShQyzWAUNZhIPu3fDsO 20 | f87YWJpV1HgUL2XSlw2Vu/5N589a9tm4hLiHVSC4+ByCn8E3J+8vGWUmkjM+Jvd6 21 | RZBnXdWoXyhUrlXwdbt+NLzBAoGBANWuw7AOm0MJ2T4KK6j64c5BBfLKCMuwyJRf 22 | bII6iySlAoiG6qZWgfxxssgIvKKeER5iUnrLXQzgoX/wjdryDdb9KzXbcuA3NxXr 23 | EVB+KFr7MSWch9k/K+kQUsDN4UTrZWV5G2RTeHwzIUilj0BdGSF21o3yvRsbu4jf 24 | JD+OgERFAoGBAMb9NfdkADyy7zFv5Vh6G33SfGCauzFkcN9D2tg6IaypMhCinI8z 25 | rnF0ecT+zIiKO4i/zK5bQsWHB+pd1LugMl73CJr9M3dlQG1Bsf3Wbi3v4HvAsN3x 26 | B60T2Bj5tZZ00sriFACf+orpMSvvZ7K5DT1XATpXM4zZCMKQkRKUgvNP 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | // chai 2 | const chai = require('chai') 3 | const expect = chai.expect 4 | 5 | // mocha and supertest 6 | const mocha = require('mocha') 7 | const supertest = require('supertest') 8 | 9 | // koa app 10 | const app = require('../server') 11 | const request = supertest.agent(app.listen()) 12 | 13 | chai.should() 14 | 15 | let token = "" 16 | let user = {} 17 | 18 | // tests 19 | mocha.describe('POST api/auth/', () => { 20 | mocha.it('should create a token', (done) => { 21 | request 22 | .post('/api/auth/') 23 | .set('Accept', 'application/json') 24 | .send({}) 25 | .expect(200, (err, res) => { 26 | token = "Bearer " + res.body.token 27 | done() 28 | }) 29 | }) 30 | }) 31 | 32 | mocha.describe('POST api/user/create', () => { 33 | mocha.it('should create a users', (done) => { 34 | request 35 | .post('/api/user/create/') 36 | .set('Accept', 'application/json') 37 | .set('Authorization', token) 38 | .send({ 39 | email: "test@test.com" 40 | }) 41 | .expect(200, (err, res) => { 42 | user = res.body.result 43 | done() 44 | }) 45 | }) 46 | }) 47 | 48 | mocha.describe('POST api/user', () => { 49 | mocha.it('should get all users', (done) => { 50 | request 51 | .post('/api/user/') 52 | .set('Accept', 'application/json') 53 | .set('Authorization', token) 54 | .send({ 55 | }) 56 | .expect(200, (err, res) => { 57 | done() 58 | }) 59 | }) 60 | }) 61 | 62 | mocha.describe('GET api/user/:id', () => { 63 | mocha.it('should get a user', (done) => { 64 | request 65 | .get('/api/user/' + user._id) 66 | .set('Accept', 'application/json') 67 | .set('Authorization', token) 68 | .expect(200, (err, res) => { 69 | done() 70 | }) 71 | }) 72 | }) 73 | 74 | mocha.describe('PATCH api/user/:id', () => { 75 | mocha.it('should get a user', (done) => { 76 | request 77 | .patch('/api/user/' + user._id) 78 | .set('Accept', 'application/json') 79 | .set('Authorization', token) 80 | .send({ 81 | email: "trocouemail@test.com" 82 | }) 83 | .expect(200, (err, res) => { 84 | done() 85 | }) 86 | }) 87 | }) 88 | 89 | mocha.describe('DELETE api/user/:id', () => { 90 | mocha.it('should get a user', (done) => { 91 | request 92 | .delete('/api/user/' + user._id) 93 | .set('Accept', 'application/json') 94 | .set('Authorization', token) 95 | .send({ 96 | }) 97 | .expect(200, (err, res) => { 98 | done() 99 | }) 100 | }) 101 | }) --------------------------------------------------------------------------------