From 35cc7c0caabf7fcd3b7a12a27b2554f4f1f65e62 Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Sat, 26 Mar 2016 21:53:20 +0300 Subject: [PATCH] + hudozka-middlewares, + hudozka-api-v1 --- modules/hudozka-api-v1/.gitignore | 1 + modules/hudozka-api-v1/.npmignore | 2 + modules/hudozka-api-v1/lib/api/timeline.js | 74 +++++++++++++++++++ modules/hudozka-api-v1/lib/index.js | 19 +++++ modules/hudozka-api-v1/package.json | 26 +++++++ .../hudozka-api-v1/src/api/timeline.js | 17 ++--- modules/hudozka-api-v1/src/index.js | 8 ++ modules/hudozka-middlewares/.gitignore | 3 + modules/hudozka-middlewares/.npmignore | 2 + modules/hudozka-middlewares/package.json | 21 ++++++ .../hudozka-middlewares/src}/ejson.js | 6 +- .../src}/ensureServiceAuth.js | 6 +- modules/hudozka-middlewares/src/index.js | 2 + package.json | 2 + src/api/index.js | 8 -- src/middlewares/queryValue.js | 35 --------- src/server.js | 4 +- 17 files changed, 175 insertions(+), 61 deletions(-) create mode 100644 modules/hudozka-api-v1/.gitignore create mode 100644 modules/hudozka-api-v1/.npmignore create mode 100644 modules/hudozka-api-v1/lib/api/timeline.js create mode 100644 modules/hudozka-api-v1/lib/index.js create mode 100644 modules/hudozka-api-v1/package.json rename src/api/feed.js => modules/hudozka-api-v1/src/api/timeline.js (58%) create mode 100644 modules/hudozka-api-v1/src/index.js create mode 100644 modules/hudozka-middlewares/.gitignore create mode 100644 modules/hudozka-middlewares/.npmignore create mode 100644 modules/hudozka-middlewares/package.json rename {src/middlewares => modules/hudozka-middlewares/src}/ejson.js (67%) rename {src/middlewares => modules/hudozka-middlewares/src}/ensureServiceAuth.js (66%) create mode 100644 modules/hudozka-middlewares/src/index.js delete mode 100644 src/api/index.js delete mode 100644 src/middlewares/queryValue.js diff --git a/modules/hudozka-api-v1/.gitignore b/modules/hudozka-api-v1/.gitignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/modules/hudozka-api-v1/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/modules/hudozka-api-v1/.npmignore b/modules/hudozka-api-v1/.npmignore new file mode 100644 index 00000000..ad34573e --- /dev/null +++ b/modules/hudozka-api-v1/.npmignore @@ -0,0 +1,2 @@ +.idea/ +src/ diff --git a/modules/hudozka-api-v1/lib/api/timeline.js b/modules/hudozka-api-v1/lib/api/timeline.js new file mode 100644 index 00000000..7ad6c756 --- /dev/null +++ b/modules/hudozka-api-v1/lib/api/timeline.js @@ -0,0 +1,74 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.add = add; + +var _koaRoute = require('koa-route'); + +var _koaCompose = require('koa-compose'); + +var _koaCompose2 = _interopRequireDefault(_koaCompose); + +var _hudozkaMiddlewares = require('hudozka-middlewares'); + +var _hudozkaMiddlewares2 = _interopRequireDefault(_hudozkaMiddlewares); + +var _koaQuery = require('koa-query'); + +var _koaQuery2 = _interopRequireDefault(_koaQuery); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; } + +function add(auth, data) { + var _this = this; + + return (0, _koaRoute.put)('/timeline', (0, _koaCompose2.default)([_hudozkaMiddlewares2.default.ensureServiceAuth(auth), _hudozkaMiddlewares2.default.ejson(), (0, _koaQuery2.default)({ + save: (0, _koaQuery.toBoolean)() + }), function () { + var ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(ctx) { + var doSave, post, result; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + doSave = ctx.request.query.save || true; + post = ctx.request.body; + _context.prev = 2; + + if (!doSave) data.timeline.disableSaving(); + _context.next = 6; + return data.timeline.add(post); + + case 6: + result = _context.sent; + + if (!doSave) data.timeline.enableSaving(); + + ctx.body = result; + _context.next = 15; + break; + + case 11: + _context.prev = 11; + _context.t0 = _context['catch'](2); + + ctx.status = 400; + ctx.body = _context.t0; + + case 15: + case 'end': + return _context.stop(); + } + } + }, _callee, _this, [[2, 11]]); + })); + + return function (_x) { + return ref.apply(this, arguments); + }; + }()])); +} \ No newline at end of file diff --git a/modules/hudozka-api-v1/lib/index.js b/modules/hudozka-api-v1/lib/index.js new file mode 100644 index 00000000..050fc0e0 --- /dev/null +++ b/modules/hudozka-api-v1/lib/index.js @@ -0,0 +1,19 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (auth, data) { + return (0, _koaCompose2.default)([(0, _timeline.add)(auth, data)]); +}; + +var _timeline = require('./api/timeline'); + +var _koaCompose = require('koa-compose'); + +var _koaCompose2 = _interopRequireDefault(_koaCompose); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +; \ No newline at end of file diff --git a/modules/hudozka-api-v1/package.json b/modules/hudozka-api-v1/package.json new file mode 100644 index 00000000..57b37a40 --- /dev/null +++ b/modules/hudozka-api-v1/package.json @@ -0,0 +1,26 @@ +{ + "name": "hudozka-api-v1", + "private": true, + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "scripts": { + "compile": "babel --presets es2015,stage-0 src/ -d lib/", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "ejson": "^2.1.2", + "hudozka-middlewares": "file:../hudozka-middlewares", + "koa-compose": "^3.1.0", + "koa-query": "0.0.2", + "koa-route": "^3.1.0", + "request-promise": "^2.0.1" + }, + "devDependencies": { + "babel-cli": "^6.6.5", + "babel-preset-es2015": "^6.6.0", + "babel-preset-stage-0": "^6.5.0" + } +} diff --git a/src/api/feed.js b/modules/hudozka-api-v1/src/api/timeline.js similarity index 58% rename from src/api/feed.js rename to modules/hudozka-api-v1/src/api/timeline.js index 947dac85..ebe90280 100644 --- a/src/api/feed.js +++ b/modules/hudozka-api-v1/src/api/timeline.js @@ -1,14 +1,13 @@ import {put} from 'koa-route'; import compose from 'koa-compose'; -import {ensureServiceAuth} from '../middlewares/ensureServiceAuth'; -import {ejson} from '../middlewares/ejson'; +import hm from 'hudozka-middlewares'; import query from 'koa-query'; import {toBoolean} from 'koa-query'; -export function add(auth, store) { +export function add(auth, data) { return put('/timeline', compose([ - ensureServiceAuth(), - ejson(), + hm.ensureServiceAuth(auth), + hm.ejson(), query({ save: toBoolean() }), @@ -17,10 +16,10 @@ export function add(auth, store) { let post = ctx.request.body; try { - if(!doSave) store.timeline.disableSaving(); - let result = await store.timeline.add(post); - if(!doSave) store.timeline.enableSaving(); - + if(!doSave) data.timeline.disableSaving(); + let result = await data.timeline.add(post); + if(!doSave) data.timeline.enableSaving(); + ctx.body = result; } catch (e) { ctx.status = 400; diff --git a/modules/hudozka-api-v1/src/index.js b/modules/hudozka-api-v1/src/index.js new file mode 100644 index 00000000..155cfb28 --- /dev/null +++ b/modules/hudozka-api-v1/src/index.js @@ -0,0 +1,8 @@ +import {add as timelineAdd} from './api/timeline'; +import compose from 'koa-compose'; + +export default function (auth, data) { + return compose([ + timelineAdd(auth, data) + ]); +}; diff --git a/modules/hudozka-middlewares/.gitignore b/modules/hudozka-middlewares/.gitignore new file mode 100644 index 00000000..de1c106a --- /dev/null +++ b/modules/hudozka-middlewares/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +lib/ +.idea/ diff --git a/modules/hudozka-middlewares/.npmignore b/modules/hudozka-middlewares/.npmignore new file mode 100644 index 00000000..791aedb2 --- /dev/null +++ b/modules/hudozka-middlewares/.npmignore @@ -0,0 +1,2 @@ +src/ +.idea/ diff --git a/modules/hudozka-middlewares/package.json b/modules/hudozka-middlewares/package.json new file mode 100644 index 00000000..54e2d5d4 --- /dev/null +++ b/modules/hudozka-middlewares/package.json @@ -0,0 +1,21 @@ +{ + "name": "hudozka-middlewares", + "private": true, + "version": "0.0.1", + "description": "", + "main": "lib/index.js", + "scripts": { + "compile": "babel --presets es2015,stage-0 src/ -d lib/", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "ejson": "^2.1.2" + }, + "devDependencies": { + "babel-cli": "^6.6.5", + "babel-preset-es2015": "^6.6.0", + "babel-preset-stage-0": "^6.5.0" + } +} diff --git a/src/middlewares/ejson.js b/modules/hudozka-middlewares/src/ejson.js similarity index 67% rename from src/middlewares/ejson.js rename to modules/hudozka-middlewares/src/ejson.js index 3f233ad4..79613de1 100644 --- a/src/middlewares/ejson.js +++ b/modules/hudozka-middlewares/src/ejson.js @@ -1,11 +1,11 @@ import {parse} from 'ejson'; -export function ejson() { +export function ejson(type='application/ejson') { return async (ctx, next) => { - let type = ctx.request.headers['content-type']; + let t = ctx.request.headers['content-type']; let data = ctx.request.body; - if (type === 'application/ejson'){ + if (t === type){ data = typeof data === 'string' ? data : JSON.stringify(data); ctx.request.body = parse(data); } diff --git a/src/middlewares/ensureServiceAuth.js b/modules/hudozka-middlewares/src/ensureServiceAuth.js similarity index 66% rename from src/middlewares/ensureServiceAuth.js rename to modules/hudozka-middlewares/src/ensureServiceAuth.js index e83a83c8..99c1bbf1 100644 --- a/src/middlewares/ensureServiceAuth.js +++ b/modules/hudozka-middlewares/src/ensureServiceAuth.js @@ -1,11 +1,9 @@ -import {checkAuth} from '../core/service'; - -export function ensureServiceAuth() { +export function ensureServiceAuth(auth) { return async (ctx, next) => { let service = ctx.request.headers['x-service-name']; let token = ctx.request.headers['x-service-token']; - if (!checkAuth(service, token)) { + if (!auth(service, token)) { ctx.status = 401; } else { await next(); diff --git a/modules/hudozka-middlewares/src/index.js b/modules/hudozka-middlewares/src/index.js new file mode 100644 index 00000000..b2909da0 --- /dev/null +++ b/modules/hudozka-middlewares/src/index.js @@ -0,0 +1,2 @@ +export {ejson} from './ejson'; +export {ensureServiceAuth} from './ensureServiceAuth'; diff --git a/package.json b/package.json index 3250caf7..93f2e08a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,9 @@ "babel-preset-stage-0": "^6.5.0", "co": "^4.4.0", "ejson": "^2.1.2", + "hudozka-api-v1": "file:modules/hudozka-api-v1", "hudozka-data": "file:modules/hudozka-data", + "hudozka-middlewares": "file:modules/hudozka-middlewares", "instagram-node": "^0.5.1", "koa": "^2.0.0-alpha.3", "koa-bodyparser": "^3.0.0", diff --git a/src/api/index.js b/src/api/index.js deleted file mode 100644 index 3ed872e0..00000000 --- a/src/api/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import {add as feedAdd} from './feed'; -import compose from 'koa-compose'; - -export default function (auth, store) { - return compose([ - feedAdd(auth, store) - ]); -}; diff --git a/src/middlewares/queryValue.js b/src/middlewares/queryValue.js deleted file mode 100644 index f8719340..00000000 --- a/src/middlewares/queryValue.js +++ /dev/null @@ -1,35 +0,0 @@ -let contains = (list, i) => list.indexOf(i) > -1; - -export function queryValue(params) { - let keys = Object.keys(params); - - return async (ctx, next) => { - let query = ctx.request.query; - ctx.request.query = Object.keys(query) - .reduce((q, i) => { - if(contains(keys, i)){ - let fn = params[i]; - q[i] = fn(q[i]); - } - return q; - }, query); - - await next(); - }; -} - -export function booleanify(){ - return function(value){ - if(value == 'true') return true; - if(value == '1') return true; - if(value == 'false') return false; - if(value == '0') return false; - return Boolean(value); - } -} - -export function arrayify(sep){ - return function(value){ - return value.split(sep); - } -} diff --git a/src/server.js b/src/server.js index 940eec67..3c16cfa8 100644 --- a/src/server.js +++ b/src/server.js @@ -11,10 +11,10 @@ import helmet from 'koa-helmet'; import mount from 'koa-mount'; import bodyParser from 'koa-bodyparser'; +import api_v1 from 'hudozka-api-v1'; import config from './config'; import {redirectionTable} from './config'; import {routes, queryObject} from './routes'; -import api from './api'; import {redirect} from './routes/redirect'; import {checkAuth} from './core/service'; @@ -49,7 +49,7 @@ export default function(store){ } function apis(store){ - return mount('/api/v1', api(checkAuth, store)); + return mount('/api/v1', api_v1(checkAuth, store)); } function prerenderRmFragment(){