const express = require('express'); const router = express.Router(); const rt = require('../ResTool'); const config = require('../../config.json'); const mysql = require('../../libs/mysql_pool'); const tool = require('../../includes/apiTool'); router .get('/', (req, res) => { res.send({ name: 'WebIO Link API' }); }) .post('*', async(req,res,n) => { try{ res.db = await mysql.getConn(); }catch(e){ console.log(`Get DB Connection ERROR ${e}`); return n('ERR8100'); } n(); }) .post('/getlinklist', (req, res, n) => { if (!config.permission.link) return n('ERR9000'); let query = "select * from ??.?? \ where \ `jcioclntuid` not in ( \ select n2.jcioclntuid \ from ??.?? n1 \ left join \ ??.?? n2\ on \ n1.`lnlcid1` = concat('ln', n2.`jcioclntuid`) \ or n1.`lnlcid2` = concat('ln', n2.`jcioclntuid`) \ where n2.`jcioclntuid` is not null \ )"; let param = [config.db.db8, 'jcioclnt', config.db.db8, 'jcioclnt', config.db.db8, 'jcioclnt']; res.db.query(query, param, (err, row) => { if (err) return n('ERR8000'); res.api_res = { record: tool.checkArray(row) }; return n(); }); }) .post('/getlink', (req, res, n) => { if (!config.permission.link) return n('ERR9000'); let arr = req.body; if (!arr.data) return n('ERR0000'); if (!arr.data.id) return n('ERR0028'); res.api_res = { record: [{ root: arr.data.id }], rt: { ln: [], lc: [] } } let query = "select ??.??(?) as ids"; let param = [config.db.db8, 'getLink', arr.data.id]; res.db.query(query, param, (err, row) => { if (err || row.length == 0) return n('ERR8000'); let ids = row[0].ids; let id = ids.split(','); id.splice(0, 1); let ida = id.filter(t => { if (t != '') return t; }); let pros = []; let lnq = "select * from ??.?? where `jcioclntuid` in (?)"; let lnp = [config.db.db8, 'jcioclnt', ida]; pros.push(tool.promiseQuery(res, lnq, lnp, 'ln')); let lcq = "select c.* from ??.?? n \ left join ??.?? c \ on \ c.`jcioclctuid` = substr(n.`lnlcid1`, 3) \ or c.`jcioclctuid` = substr(n.`lnlcid2`, 3) \ where \ n.`jcioclntuid` in ( ? ) \ and ( \ substr(n.`lnlcid1`, 1,2) = 'lc' \ or \ substr(n.`lnlcid2`, 2,2) = 'lc' \ ) \ and c.`jcioclctuid` is not null \ group by c.`jcioclctuid`"; let lcp = [config.db.db8, 'jcioclnt', config.db.db7, 'jcioclct', ida]; pros.push(tool.promiseQuery(res, lcq, lcp, 'lc')); Promise.all(pros) .then(r => { for (let i in r) { if (r[i].key == 'lc') res.api_res.rt.lc = r[i].data; if (r[i].key == 'ln') res.api_res.rt.ln = r[i].data; } return n(); }) .catch(err => n('ERR8000')); }); }) .post('/addlink', (req, res, n) => { if (!config.permission.link) return n('ERR9000'); if (!tool.checkPermission(req)) return n('ERR9000'); let arr = req.body; if (!arr.data) return n('ERR0000'); if (!arr.data.link || Object.keys(arr.data.link).length == 0) return n('ERR0057'); if (!('active' in arr.data)) return n('ERR0032'); if (!arr.data.action) return n('ERR0030'); ! function runLoop(unit, cb) { if (typeof unit != 'object' || Object.keys(unit).length == 0) return cb(0); if (unit.type == 'ln') { let p1 = new Promise((resolve, reject) => { runLoop(unit.id1, id => { resolve({ id, key: 'id1' }); }); }); let p2 = new Promise((resolve, reject) => { runLoop(unit.id2, id => { resolve({ id, key: 'id2' }); }); }); Promise.all([p1, p2]) .then(r => { let id1 = 0; let id2 = 0; for (let i in r) { if (r[i].key == 'id1') id1 = r[i].id; if (r[i].key == 'id2') id2 = r[i].id; } let q = "insert into ??.?? \ (`lnname`, `lnlcid1`, `lnlcid2`, `lnlcop`, `lnactive`, `lnaddtst`, `lnmodtst`) values (?,?,?,?,'1',unix_timestamp(),unix_timestamp())"; let p = [config.db.db8, 'jcioclnt', unit.name, id1, id2, unit.op]; res.db.query(q, p, (err, row) => { if (err) return cb(0); return cb(`ln${row.insertId}`); }); }) .catch(err => { return cb(0); }); } else if (unit.type == 'lc') { let q = "insert into ??.?? \ (`lcname`, `lcioid`, `lciovalue`, `lcioop`, `lcactive`, `lcaddtst`, `lcmodtst`) values ('-', ?, ?, ?, '1', unix_timestamp(), unix_timestamp())"; let p = [config.db.db7, 'jcioclct', unit.id, unit.value, unit.op]; res.db.query(q, p, (err, row) => { if (err) return cb(0); return cb(`lc${row.insertId}`); }); } else { return cb(0); } }(arr.data.link, (id) => { if (id == 0) return n('ERR8001'); if (typeof id != 'string') id = id.toString(); let query = "update ??.?? set \ `lnactive` = ?, \ `lnaction` = ? \ where \ `jcioclntuid` = ?"; let param = [config.db.db8, 'jcioclnt', (arr.data.active == 1 ? 1 : 0), arr.data.action, id.substr(2)]; res.db.query(query, param, (err, row) => { if (err) return n('ERR8002'); res.api_res = { record: [] }; return n(); }); }); }) .post('/swlinkactive', (req, res, n) => { if (!config.permission.link) return n('ERR9000'); if (!tool.checkPermission(req)) return n('ERR9000'); let arr = req.body; if (!arr.data) return n('ERR0000'); if (!arr.data.id) return n('ERR0028'); let query = "update ??.?? set \ `lnactive` = (case when `lnactive` = 1 then 0 else 1 end), \ `lnmodtst` = unix_timestamp() \ where \ `jcioclntuid` = ?"; let param = [config.db.db8, 'jcioclnt', arr.data.id]; res.db.query(query, param, (err, row) => { if (err) return n('ERR8002'); res.api_res = { record: [] }; return n(); }); }) .post('/dellink', (req, res, n) => { if (!config.permission.link) return n('ERR9000'); if (!tool.checkPermission(req)) return n('ERR9000'); let arr = req.body; if (!arr.data) return n('ERR0000'); if (!arr.data.id) return n('ERR0028'); let query = "select ??.??(?) as ids"; let param = [config.db.db8, 'getLink', arr.data.id]; res.db.query(query, param, (err, row) => { if (err || row.length == 0) return n('ERR8000'); let ids = row[0].ids; let id = ids.split(','); id.splice(0, 1); let ida = id.filter(t => { if (t != '') return t; }); let query = "delete c,n from ??.?? n \ left join ??.?? c \ on \ ( \ c.`jcioclctuid` = substr(n.`lnlcid1`, 3) \ or c.`jcioclctuid` = substr(n.`lnlcid2`, 3)\ ) \ and ( \ substr(n.`lnlcid1`, 1,2) = 'lc' \ or substr(n.`lnlcid2` ,1,2) = 'lc'\ ) \ where \ n.`jcioclntuid` in (?)"; let param = [config.db.db8, 'jcioclnt', config.db.db7, 'jcioclct', ida]; res.db.query(query, param, (err, row) => { if (err) return n('ERR8003'); res.api_res = { record: [] }; return n(); }); }); }) .all('*', rt.send); module.exports = router;