risk_management.js 5.29 KB
'use strict';

const Router = require('koa-router');
const ApiCache = require('../../ci/api_cache');
const _ = require('lodash');

const ZookeeperModel = require('../models/zookeeperModel');
let zookeeperModel = new ZookeeperModel();

let r = new Router();
const APPS = [{name: 'yohobuywap-node', app: 'wap', selected: true}, {name: 'yohobuy-node', app: 'pc'}];
const PATHRISK = '/json/risk';

const risk = {
    index: async(ctx, next) => {
        let list = [];
        let ret = await Promise.all(_.map(APPS, (o) => {
            return zookeeperModel.getPath(`/${o.app}${PATHRISK}`);
        }));

        _.map(ret, (o) => {
            if (o) {
                return list.push(JSON.parse(o));
            }
        });

        await ctx.render('action/risk_management', {
            list: _.flattenDeep(list)
        });
    },
    add: async(ctx, next) => {
        var data = {};
        var key = ctx.request.query.key;
        var oldRet = '';

        if (key) {
            key = key.replace(/\s+/g, '+');
        }

        if (key) {
            var app = key.split('/')[0];
            var path = formatPath(app);
            oldRet = await zookeeperModel.getPath(path);

            if (oldRet) {
                oldRet = JSON.parse(oldRet);
            }

            data = _.find(oldRet, function(o) {
                return `${o.app}/${o.route}` === key;
            });

            data.state = data.state === 'off';

            _.each(APPS, (o => {
                o.selected = o.name === app;
            }));
        }

        await ctx.render('action/add_risk', {
            data: data,
            apps: APPS
        });
    },
    edit: async(ctx) => {
        let params = ctx.request.body;
        let path = formatPath(params.param.app);
        let str = `${params.param.app}/${params.param.route}`;
        let editNewRet = await zookeeperModel.getPath(path);

        params.edit = params.edit.split('=')[1];

        let editOldPath = formatPath(params.edit.split('/')[0]);
        let editOldRet;

        if (!editNewRet) {
            editNewRet = [];
        } else {
            editNewRet = JSON.parse(editNewRet);
        }

        if (path != editOldPath) { // 编辑后 new path != old path
            editOldRet = await zookeeperModel.getPath(editOldPath);
            editOldRet = JSON.parse(editOldRet);

            // 删除原路径原始数据
            _.remove(editOldRet, function(o) {
                return `${o.app}/${o.route}` === params.edit;
            });

            let editRet = await zookeeperModel.setPath(editOldPath, JSON.stringify(editOldRet));

            if (!editRet) {
                ctx.body = {
                    code: 500,
                    message: 'update fail,Please retry'
                }
            }

            // 删除 新路径相同的 app/route 数据
            _.remove(editNewRet, function(o) {
                return `${o.app}/${o.route}` === str;
            });

        } else {
            // 删除原始数据
            _.remove(editNewRet, function(o) {
                return `${o.app}/${o.route}` === params.edit;
            });
        }

        editNewRet.push(params.param);

        let result = await zookeeperModel.setPath(path, JSON.stringify(editNewRet));

        if (result) {
            ctx.body = {
                code: 200,
                message: 'update success'
            };
        } else {
            ctx.body = {
                code: 500,
                message: 'update fail,Please retry'
            }
        }
    },
    setter: async(ctx) => {
        let params = ctx.request.body;
        let path = formatPath(params.app);
        let str = `${params.app}/${params.route}`;
        let oldRet = await zookeeperModel.getPath(path);

        if (!oldRet) {
            oldRet = [];
        } else {
            oldRet = JSON.parse(oldRet);
        }

        _.remove(oldRet, function(o) {
            return `${o.app}/${o.route}` === str;
        });

        oldRet.push(params);

        let result = await zookeeperModel.setPath(path, JSON.stringify(oldRet));

        if (result) {
            ctx.body = {
                code: 200,
                message: 'update success'
            };
        } else {
            ctx.body = {
                code: 500,
                message: 'update fail,Please retry'
            }
        }
    },
    remove: async(ctx) => {
        let key = ctx.request.body.key;
        let path = formatPath(key.split('/')[0]);
        let oldRet = await zookeeperModel.getPath(path);

        if (oldRet) {
            oldRet = JSON.parse(oldRet);
        }

        _.remove(oldRet, function(o) {
            return `${o.app}/${o.route}` === key;
        });

        let result = await zookeeperModel.setPath(path, JSON.stringify(oldRet));


        if (result) {
            ctx.body = {
                code: 200,
                message: 'remove success'
            };
        } else {
            ctx.body = {
                code: 500,
                message: 'remove fail,Please retry'
            }
        }
    }
};

function formatPath(app) {
    return `/${_.find(APPS, (o) => {return o.name === app;}).app}${PATHRISK}`;
}

r.get('/risk_management', risk.index);
r.get('/add_risk', risk.add);
r.post('/setter', risk.setter);
r.post('/edit', risk.edit);
r.post('/remove', risk.remove);

module.exports = r;