var express = require("express"); var router = express.Router(); var util = require("util"); var utils = require("../../../../src/utils"); var crossCtl = require("../../../../src/crossCtl"); var path = require("path"); var passport = require("passport"); var localHandler = require("../../"); var mysql = require("mysql"); var moment = require("moment"); const fs = require("fs"); const e = require("express"); const xlsx = require("xlsx"); // operation /* router.use(function (req, res, next) { next() }) */ router.get("/local/download/:filename", function (req, res) { if (req.isAuthenticated() && req.infos.userInfo.adminFlag) { console.log("req.params = ", req.params); console.log("req.query = ", req.query); var hero = req.query; var qry = ""; var subWhereClause = ""; var subUnitLength = 8; if (hero.unit != undefined) { switch (hero.unit) { case "year": subUnitLength = 4; break; case "month": subUnitLength = 6; break; case "day": subUnitLength = 8; break; case "hour": subUnitLength = 10; break; } } if (hero.uid != undefined) { if (hero.uid != "all") { subWhereClause += " AND uid = " + mysql.escape(hero.uid); } } if (hero.key != undefined) { if (hero.key != "all") { subWhereClause += " AND api_key = " + mysql.escape(hero.key); } } var filename = req.params.filename; const book = xlsx.utils.book_new(); // const summary = xlsx.utils.aoa_to_sheet(JSON.parse(req.query.jsonData)); // xlsx.utils.book_append_sheet(book, summary, "Summary"); if (hero.tag === "word") { qry = "SELECT " + " word, sum(count) as count_sum " + "FROM " + localHandler.db.options.database + ".tbl_word_statistics WHERE " + "date_tag >= " + mysql.escape(hero.startDateTag.substring(0, subUnitLength)) + " AND date_tag <= " + mysql.escape(hero.endDateTag.substring(0, subUnitLength)) + " " + subWhereClause + " AND CHAR_LENGTH(date_tag) = " + subUnitLength + " GROUP BY word ORDER BY count_sum DESC, word ASC"; // console.log('qry = ', qry); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { // console.log('results = ', results); if (results.length > 0) { var fullData = xlsx.utils.json_to_sheet(results, {}); fullData["A" + (results.length + 2)] = { v: "합계" }; fullData["!ref"] = xlsx.utils.encode_range({ s: { c: 0, r: 0 }, e: { c: 1, r: 1 + results.length + 1 }, }); fullData["B" + (results.length + 2)] = { f: "SUM(B2:B" + (results.length + 1) + ")" }; xlsx.utils.book_append_sheet(book, fullData, "검출 단어 통계"); // -------------------------------------------------------------------- var tmpId = utils.shortid(); var targetPath = path.join(__dirname, "../../../../", crossCtl.sConfig.cache, "/", tmpId + ".xlsx"); // @files 엑셀파일을 생성하고 저장한다. console.log("targetPath=", targetPath); crossCtl.cache.useFile(targetPath); xlsx.writeFile(book, targetPath); let mimeType = utils.getMimeFromPath(targetPath); // console.log("in ck, mimeType=", mimeType); fs.access(targetPath, fs.constants.F_OK, function (error) { if (error) { req.workTag.res().status(404).send("not found"); } else { req.workTag.res().status(200).type(mimeType).sendFile(targetPath); } }); } else { req.workTag.res().status(404).send("not found"); } } }); } else if (hero.tag === "usage") { qry = "SELECT " + "date_tag, sum(total) as total, sum(hit) as hit, sum(size) as size " + "FROM " + localHandler.db.options.database + ".tbl_key_statistics WHERE " + "date_tag >= " + mysql.escape(hero.startDateTag.substring(0, subUnitLength)) + " AND date_tag <= " + mysql.escape(hero.endDateTag.substring(0, subUnitLength)) + " " + subWhereClause + " AND CHAR_LENGTH(date_tag) = " + subUnitLength + " GROUP BY date_tag ORDER BY date_tag ASC"; // console.log('qry = ', qry); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { // console.log('results = ', results); if (results.length > 0) { var fullData = xlsx.utils.json_to_sheet(results, {}); fullData["A" + (results.length + 2)] = { v: "합계" }; fullData["!ref"] = xlsx.utils.encode_range({ s: { c: 0, r: 0 }, e: { c: 3, r: 1 + results.length + 1 }, // }); fullData["B" + (results.length + 2)] = { f: "SUM(B2:B" + (results.length + 1) + ")" }; fullData["C" + (results.length + 2)] = { f: "SUM(C2:C" + (results.length + 1) + ")" }; fullData["D" + (results.length + 2)] = { f: "SUM(D2:D" + (results.length + 1) + ")" }; xlsx.utils.book_append_sheet(book, fullData, "사용량 통계"); // -------------------------------------------------------------------- var tmpId = utils.shortid(); var targetPath = path.join(__dirname, "../../../../", crossCtl.sConfig.cache, "/", tmpId + ".xlsx"); // @files 엑셀파일을 생성하고 저장한다. console.log("targetPath=", targetPath); crossCtl.cache.useFile(targetPath); xlsx.writeFile(book, targetPath); let mimeType = utils.getMimeFromPath(targetPath); // console.log("in ck, mimeType=", mimeType); fs.access(targetPath, fs.constants.F_OK, function (error) { if (error) { req.workTag.res().status(404).send("not found"); } else { req.workTag.res().status(200).type(mimeType).sendFile(targetPath); } }); } else { req.workTag.res().status(404).send("not found"); } } }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "not found", }); } // @breif CELL 넓이 지정 /* sheet_data["!cols"] = [ { wpx : 130 } // A열 , { wpx : 100 } // B열 , { wpx : 80 } // C열 , { wch : 60 } // D열 ] */ // @breif 첫번째 시트에 작성한 데이터를 넣는다. // @breif 2번 시트 // @details json_to_sheet 방식으로 데이터를 생성한다. /* const fullData = xlsx.utils.json_to_sheet( [ { A : "학과", B : "직급", C : "이름", D : "나이" } , { A : "흉부외과", B : "PA간호사", C : "소이현", D : "33" } , { A : "소아외과", B : "PA간호사", C : "한현희", D : "29" } , { A : "산부인과", B : "분만실간호사", C : "한한승주현희", D : "41" } , { A : "산부인과", B : "PA간호사", C : "은선진", D : "36" } , { A : "간담췌외과", B : "수간호사", C : "송수빈", D : "45" } , { A : "간담췌외과", B : "병동간호사", C : "이영하", D : "35" } , { A : "간담췌외과", B : "병동간호사", C : "김재환", D : "28" } , { A : "간담췌외과", B : "PA간호사", C : "국해성", D : "32" } , { A : "간담췌외과", B : "이식코디네이터", C : "함덕주", D : "37" } , { A : "신경외과", B : "PA간호사", C : "황재신", D : "39" } , { A : "응급의학과", B : "응급실간호사", C : "선우희수", D : "26" } ], { header : ["A", "B", "C", "D"], skipHeader : true } ); */ // @breif CELL 넓이 지정 /* fullData["!cols"] = [ { wpx : 130 } // A열 , { wpx : 100 } // B열 , { wpx : 80 } // C열 , { wch : 60 } // D열 ] */ // @details 두번째 시트에 작성한 데이터를 넣는다. } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } }); router.post("/local/lab", function (req, res) { if (req.isAuthenticated() && req.infos.userInfo.adminFlag) { let hero = req.body; switch (hero.target) { case "hello": req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "hello, world.", hero: hero, }); break; case "makestat": localHandler.makeStatisticsFromScrach(hero.termTag, hero.dateTag, function (error, data) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", hero: hero, data: data, }); }); break; default: req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "unhandled lab cmd", hero: hero, }); } } else { req.workTag .res() .status(403) .send({ ...req.workTag.responsePacket, responseCode: 403, responseMessage: "Forbidden", }); } }); router.post("/local/upload", function (req, res) { if (req.isAuthenticated()) { crossCtl.handleUpload(req, function (err, fields, files) { if (err) { console.log("err=", err); responseCode = 500; responseMessage = err.toString(); req.workTag .res() .status(responseCode) .send({ ...req.workTag.responsePacket, responseCode: responseCode, responseMessage: responseMessage, }); } else { console.log("fields=", fields); console.log("files=", files); var uploadedUrls = []; for (var i = 0; i < files.length; i++) { uploadedUrls.push(files[i]); } var newHero = { ...fields, files: uploadedUrls, airList: JSON.parse(fields.airList), }; req.body = newHero; console.log("newHero=", newHero); switch (newHero.target) { case "note:new": handleLocalInsert(req, res); break; case "note:edit": handleLocalUpdate(req, res); break; default: req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "unknown target : " + newHero.target, }); } } }); } else { req.workTag .res() .status(401) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } }); router.post("/local/insert", function (req, res) { handleLocalInsert(req, res); }); function handleLocalInsert(req, res) { // router.post('/local/insert', function (req, res) { var hero = req.body; console.log("hero=", hero); var authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var qry = ""; var post = {}; var tmpIdGenerated = utils.shortid.generate(); switch (hero.target) { case "key": authorized = req.isAuthenticated(); qry = hero.target; /* qry = 'INSERT INTO ' + localHandler.db.options.database + '.tbl_key_list SET ? '; post = { uid: uid, by: req.isAuthenticated() ? req.infos.userInfo['userName'] : '', api_key: tmpIdGenerated, secret: tmpIdGenerated, name: hero.name, level: hero.level, }; */ break; case "word": authorized = req.infos.userInfo.adminFlag; qry = "INSERT INTO " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " SET ? "; post = { word: hero.raw, raw: hero.raw, level: hero.level, memo: hero.memo, by: req.infos.userInfo["userName"], }; break; case "note:new": authorized = req.isAuthenticated(); qry = "INSERT INTO " + crossCtl.db.options.database + ".tbl_note_list SET ? "; var attachments = []; attachments = hero.airList ? hero.airList.concat(hero.files) : hero.files ? hero.files : []; // profile_url: hero.profile_url ? hero.profile_url : req.infos.userInfo.profile.photo_url, // nick: req.infos.userInfo.profile.display_name, post = { nid: tmpIdGenerated, uid: uid, from_id: uid, sender: req.infos.userInfo.profile.display_name, to_id: crossCtl.sConfig.type + "_all", receivers: crossCtl.sConfig.type + " 사용자", title: hero.title, content: hero.content, attachments: JSON.stringify(attachments), }; break; case "comment": authorized = req.isAuthenticated(); qry = "INSERT INTO " + crossCtl.db.options.database + ".tbl_comment_list SET ? "; post = { cid: hero.cid, uid: uid, nick: req.isAuthenticated() ? req.infos.userInfo.userNick : "anoymous", comment: hero.comment, step: 0.001, }; break; default: } if (qry === "") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: "unknown target : " + hero.target, }); } else if (authorized === false) { req.workTag .res() .status(401) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } else { if (qry === hero.target) { switch (hero.target) { case "key": qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_account_users WHERE uid = " + mysql.escape(uid); // console.log('qry = ', qry) crossCtl.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error["code"], hero: hero, }); } else { // console.log('results = ', results) if (results.length != 1) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: "missing target", }); } else { var limitCount = results[0]["limit_count"]; // console.log('limitCount = ', limitCount); qry = "SELECT count(*) as current_count FROM " + localHandler.db.options.database + ".tbl_key_list WHERE uid = " + mysql.escape(uid) + " AND status = 0"; crossCtl.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error["code"], hero: hero, }); } else { var currentCount = results[0]["current_count"]; // console.log('currentCount = ', currentCount); if (currentCount >= limitCount) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: "exceed limit", }); } else { qry = "INSERT INTO " + localHandler.db.options.database + ".tbl_key_list SET ? "; post = { uid: uid, by: req.isAuthenticated() ? req.infos.userInfo["userName"] : "", api_key: tmpIdGenerated, secret: tmpIdGenerated, name: hero.name, level: hero.level, }; localHandler.db.doEasyQueryPost(qry, post, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error["code"], hero: hero, }); } else { var apiKey = utils.uuid(tmpIdGenerated + "_" + results.insertId); qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET api_key = " + mysql.escape(apiKey) + " WHERE serial = " + results.insertId; localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } }); /* req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); */ } }); } } }); } } }); break; case "comment": req.workTag.responsePacket.cart = req.session.cart; req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); break; default: req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } else { localHandler.db.doEasyQueryPost(qry, post, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error["code"], hero: hero, }); } else { if (hero.target === "note:new") { var msgBase = { collapse_key: "note:new", notification: { title: "새로운 노트 등록됨", body: hero.title, }, data: { eventTag: "note:new", location: "/admin/approve/note", title: "새로운 노트 등록됨", body: hero.title, }, }; crossCtl.sendFCMToLeveledUser(5, msgBase, function (error, response) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } }); } else if (hero.target === "key") { var apiKey = utils.uuid(post.secret + "_" + results.insertId); var currentSerialId = results.insertId; qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET api_key = " + mysql.escape(apiKey) + " WHERE serial = " + currentSerialId; localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { localHandler.logUserAction( uid, req.infos.userInfo["userName"], "key:create", currentSerialId, "self", "API Key serial " + currentSerialId + " 생성.", req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } }); } else if (hero.target === "word") { crossCtl.redis.publishMessage({ cmd: "safekiso:filter:sync", }); localHandler.logUserAction( uid, req.infos.userInfo["userName"], "word:insert", results.insertId, "self", "필터 단어 [" + hero.raw + "]를 추가", req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); /* localHandler.syncFilterWithDbAll(function (error) { localHandler.logUserAction( uid, req.infos.userInfo["userName"], "word:insert", "self", "필터 단어 [" + hero.raw + "]를 추가", req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error != null ? error : "ok", }); }); */ } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } }); } } } router.get("/local/select", function (req, res) { // console.log('req.isAuthenticated()=', req.isAuthenticated()) // console.log('req.cookies=', req.cookies) if (req.session.loopCount) { req.session.loopCount++; } else { req.session.loopCount = 1; } // console.log('req.session.loopCount=', req.session.loopCount) // console.log('req.sessionID=', req.sessionID) var hero = req.query; console.log("hero=", hero); var authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var qry = ""; var subWhereClause = ""; var subUnitLength = 8; switch (hero.target) { case "profile": authorized = hero.hero ? true : req.isAuthenticated(); qry = hero.target; break; case "word": authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() qry = "SELECT * FROM " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " WHERE serial = " + mysql.escape(hero.hero); break; case "key": authorized = req.isAuthenticated(); // req.isAuthenticated() qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_key_list WHERE uid = " + mysql.escape(uid) + " AND serial = " + mysql.escape(hero.hero); break; case "admin:statistics:word": authorized = req.infos.userInfo.adminFlag; if (hero.unit != undefined) { switch (hero.unit) { case "year": subUnitLength = 4; break; case "month": subUnitLength = 6; break; case "day": subUnitLength = 8; break; case "hour": subUnitLength = 10; break; } } if (hero.uid != undefined) { if (hero.uid != "all") { subWhereClause += " AND uid = " + mysql.escape(hero.uid); } } if (hero.key != undefined) { if (hero.key != "all") { subWhereClause += " AND api_key = " + mysql.escape(hero.key); } } qry = "SELECT " + " word, sum(count) as count_sum " + "FROM " + localHandler.db.options.database + ".tbl_word_statistics WHERE " + "date_tag >= " + mysql.escape(hero.startDateTag.substring(0, subUnitLength)) + " AND date_tag <= " + mysql.escape(hero.endDateTag.substring(0, subUnitLength)) + " " + subWhereClause + " AND CHAR_LENGTH(date_tag) = " + subUnitLength + " GROUP BY word ORDER BY count_sum DESC, word ASC"; // console.log('huk qry = ', qry) break; case "admin:statistics:usage": authorized = req.infos.userInfo.adminFlag; if (hero.unit != undefined) { switch (hero.unit) { case "year": subUnitLength = 4; break; case "month": subUnitLength = 6; break; case "day": subUnitLength = 8; break; case "hour": subUnitLength = 10; break; } } if (hero.uid != undefined) { if (hero.uid != "all") { subWhereClause += " AND uid = " + mysql.escape(hero.uid); } } if (hero.key != undefined) { if (hero.key != "all") { subWhereClause += " AND api_key = " + mysql.escape(hero.key); } } qry = "SELECT " + "date_tag, sum(total) as total, sum(hit) as hit, sum(size) as size " + "FROM " + localHandler.db.options.database + ".tbl_key_statistics WHERE " + "date_tag >= " + mysql.escape(hero.startDateTag.substring(0, subUnitLength)) + " AND date_tag <= " + mysql.escape(hero.endDateTag.substring(0, subUnitLength)) + " " + subWhereClause + " AND CHAR_LENGTH(date_tag) = " + subUnitLength + " GROUP BY date_tag ORDER BY date_tag ASC"; break; case "admin:key": authorized = req.infos.userInfo.adminFlag; qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_key_list WHERE serial = " + mysql.escape(hero.hero); break; case "my": authorized = req.isAuthenticated(); // req.isAuthenticated() qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_user_list WHERE uid = " + mysql.escape(uid); break; case "note": authorized = true; qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_note_list WHERE nid = " + mysql.escape(hero.hero) + " AND (status = 1 OR (status = 0 AND uid = " + mysql.escape(uid) + "))"; break; case "like": authorized = true; qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_like_list WHERE domain = " + mysql.escape(hero.hero) + " AND site_id = " + mysql.escape(crossCtl.sConfig.type) + " AND uid = " + mysql.escape(uid); break; case "dashboard": // authorized = req.infos.userInfo.adminFlag; authorized = true; qry = hero.target; break; case "admin:dashboard": // authorized = req.infos.userInfo.adminFlag; authorized = true; qry = hero.target; break; default: } if (qry === "") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "unknown target : " + hero.target, }); } else if (authorized === false) { req.workTag .res() .status(401) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } else { if (qry === hero.target) { if (hero.target === "profile") { var finalProfile = {}; if (hero.hero !== undefined) { qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_profile_list WHERE site_id = " + mysql.escape(crossCtl.sConfig.type) + " AND pid = " + mysql.escape(hero.hero) + " AND status = 0"; } else { qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_profile_list WHERE site_id = " + mysql.escape(crossCtl.sConfig.type) + " AND uid = " + mysql.escape(uid) + " AND status = 0"; } localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { if (results.length == 0) { req.workTag .res() .status(404) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "missing target #1", }); } else { var localUID = uid; if (hero.hero !== undefined) { localUID = results[0].uid + ""; } else { localUID = uid; } // console.log('localUID=', localUID) var filteredResult = results; var myProfile = {}; myProfile = filteredResult[0]; delete myProfile.uid; myProfile.infos = utils.safeJSON(myProfile.infos); if (hero.hero == undefined) { myProfile.addon = req.user.user_info; } else { delete filteredResult[0].updated; delete filteredResult[0].infos; } myProfile.fromAir = false; // console.log('filteredResult=', filteredResult) qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_user_list WHERE uid = " + mysql.escape(localUID); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { if (results.length == 0) { req.workTag .res() .status(404) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "missing target #2", }); } else { filteredResult[0].score = results[0].score; if (filteredResult[0].infos != undefined) { filteredResult[0].infos.score = results[0].score; } qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_guide_list WHERE uid = " + mysql.escape(localUID); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { if (results.length == 1) { filteredResult[0].gid = results[0].gid; filteredResult[0].accompanyFlag = true; if (filteredResult[0].infos != undefined) { filteredResult[0].infos.gid = results[0].gid; filteredResult[0].infos.accompanyFlag = true; } } else { filteredResult[0].accompanyFlag = false; if (filteredResult[0].infos != undefined) { filteredResult[0].infos.accompanyFlag = false; } } // console.log('filteredResult=', filteredResult) req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", data: filteredResult, }); } }); } } }); } } }); } else if (hero.target == "dashboard") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", data: localHandler.getDashboardData(), }); } else if (hero.target == "admin:dashboard") { qry = "SELECT " + "*, " + crossCtl.db.options.database + ".tbl_account_users.serial as serial" + " FROM " + crossCtl.db.options.database + ".tbl_account_users " + "LEFT JOIN " + crossCtl.db.options.database + ".tbl_profile_list ON " + crossCtl.db.options.database + ".tbl_account_users.uid = " + crossCtl.db.options.database + ".tbl_profile_list.uid " + "WHERE " + crossCtl.db.options.database + ".tbl_account_users.site_id = " + mysql.escape(crossCtl.sConfig.type); // console.log('qry = ', qry); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { let tmpUserProfilePool = {}; for (var i = 0; i < results.length; i++) { tmpUserProfilePool[results[i]["uid"]] = { display_name: results[i]["display_name"], email: results[i]["auth_key"], created: results[i]["created"], }; } // console.log('tmpUserProfilePool=', tmpUserProfilePool) qry = "SELECT " + "date_tag, sum(total) as total, sum(hit) as hit, sum(miss) as miss, " + "sum(error) as error, sum(size) as size " + "FROM " + localHandler.db.options.database + ".tbl_key_statistics " + "WHERE date_tag LIKE " + mysql.escape(utils.getDateTimeTag("m") + "%") + " AND CHAR_LENGTH(date_tag) = 10 " + "GROUP BY date_tag ORDER BY date_tag DESC LIMIT 24"; // console.log('qry = ', qry) localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { // var adminDashData1 = JSON.parse(JSON.stringify(results)); var adminDashData1 = []; // = JSON.parse(JSON.stringify(results)); // for (var i = 0; i < results.length; i++) { for (var i = results.length - 1; i >= 0; i--) { adminDashData1.push(JSON.parse(JSON.stringify(results[i]))); } qry = "SELECT " + "api_key, sum(total) as total, sum(hit) as hit, sum(miss) as miss, sum(error) as error, sum(size) as size " + "FROM " + localHandler.db.options.database + ".tbl_key_statistics WHERE date_tag LIKE " + mysql.escape(utils.getDateTimeTag("m") + "%") + " AND CHAR_LENGTH(date_tag) = 10 GROUP BY api_key ORDER BY date_tag DESC LIMIT 24"; localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { var adminDashData2 = JSON.parse(JSON.stringify(results)); let tmpTargetKeys = []; for (var i = 0; i < adminDashData2.length; i++) { tmpTargetKeys.push(adminDashData2[i]["api_key"]); } qry = "SELECT * FROM " + localHandler.db.options.database + ".tbl_key_list"; localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { var tmpKeyInfoPool = {}; for (var i = 0; i < results.length; i++) { tmpKeyInfoPool[results[i]["api_key"]] = { key_name: results[i]["name"], user_name: tmpUserProfilePool[results[i]["uid"]]["display_name"], user_id: tmpUserProfilePool[results[i]["uid"]]["email"], created: results[i]["created"], }; } for (var i = 0; i < adminDashData2.length; i++) { adminDashData2[i]["key_name"] = tmpKeyInfoPool[adminDashData2[i]["api_key"]] != undefined ? tmpKeyInfoPool[adminDashData2[i]["api_key"]]["key_name"] : "unknown"; adminDashData2[i]["user_id"] = tmpKeyInfoPool[adminDashData2[i]["api_key"]] != undefined ? tmpKeyInfoPool[adminDashData2[i]["api_key"]]["user_id"] : "unknown"; } req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", result: { adminDashData1: adminDashData1, adminDashData2: adminDashData2, }, }); } }); } }); } }); } }); } else { switch (hero.target) { case "huk": console.log("req.user=", req.user); req.workTag.responsePacket.data = [req.user]; break; default: } req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } else { localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { switch (hero.target) { case "note": for (var i = 0; i < results.length; i++) { if (results[i].uid == uid) { results[i].myReviewFlag = true; } else { results[i].myReviewFlag = false; } delete results[i].uid; } break; default: } req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", data: results, }); } }); } } }); router.post("/local/update", function (req, res) { handleLocalUpdate(req, res); }); function handleLocalUpdate(req, res) { // router.post('/local/update', function (req, res) { var hero = req.body; console.log("hero=", hero); console.log("huk", hero.target === "accompany" ? "ok!" : "nok!"); var authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var qry = ""; var post = {}; if (hero.target === "like:comment") { crossCtl.handleLike(req, function (error, resultPack) { if (error) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, }); } else { console.log("resultPack=", resultPack); qry = "UPDATE " + crossCtl.db.options.database + ".tbl_comment_list SET " + resultPack.amountTag + " WHERE cid = " + mysql.escape(hero.hero); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "update, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_comment_list WHERE cid = " + mysql.escape(hero.hero); localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "update, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { var finalResult = { hero: hero.hero, oldTag: resultPack.oldTag, oldCount: resultPack.oldCount, newTag: resultPack.newTag, newCount: resultPack.newCount, like_count: results[0].like_count, dislike_count: results[0].dislike_count, likeToggleFlag: crossCtl.sConfig.likeToggleFlag, }; req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", finalResult: finalResult, }); } }); } }); } }); return; } else { switch (hero.target) { case "filter:sync": authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() qry = hero.target; break; case "filter": authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() qry = "TRUNCATE " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; // qry = "SELECT COUNT(*) FROM " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; post = {}; break; case "word": authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() qry = "UPDATE " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " SET ? WHERE serial = " + mysql.escape(hero.hero); post = { raw: hero.raw, level: hero.level, memo: hero.memo, status: hero.status, }; break; case "approve:note": authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() qry = "UPDATE " + crossCtl.db.options.database + ".tbl_note_list SET ? WHERE nid = " + mysql.escape(hero.hero); var judgment = hero.judgment; var reason = hero.reason; post = { status: judgment == "up" ? 1 : judgment == "suspend" ? 2 : 3, reason: reason, }; break; case "admin:key": case "key": authorized = req.isAuthenticated(); if (req.infos.userInfo.adminFlag) { qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET ? WHERE serial = " + mysql.escape(hero.hero); } else { qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET ? WHERE serial = " + mysql.escape(hero.hero) + " AND uid = " + mysql.escape(uid); } post = { name: hero.name, level: hero.level, status: hero.status, }; break; case "note:edit": authorized = req.isAuthenticated(); if (req.infos.userInfo.adminFlag) { qry = "UPDATE " + crossCtl.db.options.database + ".tbl_note_list SET ? WHERE nid = " + mysql.escape(hero.hero); } else { qry = "UPDATE " + crossCtl.db.options.database + ".tbl_note_list SET ? WHERE nid = " + mysql.escape(hero.hero) + " AND uid = " + mysql.escape(uid); } var attachments = []; attachments = hero.airList ? hero.airList.concat(hero.files) : hero.files ? hero.files : []; post = { from_id: uid, sender: req.infos.userInfo.profile.display_name, to_id: crossCtl.sConfig.type + "_all", receivers: crossCtl.sConfig.type + " 사용자", title: hero.title, content: hero.content, attachments: JSON.stringify(attachments), status: 0, }; break; default: } if (qry === "") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: "unknown target : " + hero.target, }); } else if (authorized === false) { req.workTag .res() .status(401) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } else if (qry == hero.target) { if (hero.target == "filter:sync") { crossCtl.redis.publishMessage({ cmd: "safekiso:filter:sync", }); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); /* localHandler.syncFilterWithDbAll(function (error) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error != null ? error : "ok", }); }); */ } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "unknown target : " + hero.target, }); } } else { localHandler.db.doEasyQueryPost(qry, post, function (error, results) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { if (hero.target == "filter") { localHandler.doFilterUpdate(req, res, function (error, count) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error != null ? error : "ok", wordCount: count, }); }); } else if (hero.target == "word") { crossCtl.redis.publishMessage({ cmd: "safekiso:filter:sync", }); localHandler.logUserAction( uid, req.infos.userInfo["userName"], "word:update", hero.hero, "self", "필터 단어 [" + hero.raw + "]를 " + (hero.revive == true ? "복구" : "변경"), req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); /* localHandler.syncFilterWithDbAll(function (error) { localHandler.logUserAction( uid, req.infos.userInfo["userName"], "word:update", "self", "필터 단어 [" + hero.raw + "]를 " + (hero.revive == true ? "복구" : "변경"), req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error != null ? error : "ok", }); }); */ } else if (hero.target == "key" || hero.target == "admin:key") { crossCtl.redis.publishMessage({ cmd: "safekiso:key:update", target: hero.hero, }); localHandler.logUserAction( uid, req.infos.userInfo["userName"], "key:update", hero.hero, hero.target == "admin:key" ? "admin" : "self", "API Key serial " + hero.hero + "를(을) " + (hero.revive == true ? "복구" : "변경"), req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } else if (hero.target === "note:edit") { var msgBase = { collapse_key: "note:edit", notification: { title: "노트 수정됨", body: hero.title, }, data: { eventTag: "note:edit", location: "/admin/approve/note", title: "노트 수정됨", body: hero.title, }, }; crossCtl.sendFCMToLeveledUser(5, msgBase, function (error, response) { if (error) { utils.log("error", "insert, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } }); } } } router.post("/local/delete", function (req, res) { var hero = req.body; console.log("hero=", hero); var authorized = req.infos.userInfo.adminFlag; // req.isAuthenticated() var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var qry = ""; var post = {}; var recordCopy = {}; switch (hero.target) { case "comment": authorized = req.isAuthenticated(); qry = hero.target; break; case "word": authorized = req.isAuthenticated(); qry = "UPDATE " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " SET status = 4 WHERE serial = " + mysql.escape(hero.hero) + " AND status = 0"; break; case "admin:key": case "key": if (req.infos.userInfo.adminFlag) { authorized = true; qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET status = 4 WHERE serial = " + mysql.escape(hero.hero) + " AND status = 0"; } else { authorized = req.isAuthenticated(); qry = "UPDATE " + localHandler.db.options.database + ".tbl_key_list SET status = 4 WHERE uid = " + mysql.escape(uid) + " AND serial = " + mysql.escape(hero.hero) + " AND status = 0"; } break; case "note": if (req.infos.userInfo.adminFlag) { authorized = true; qry = "UPDATE " + crossCtl.db.options.database + ".tbl_note_list SET status = 4 WHERE nid = " + mysql.escape(hero.hero); } else { authorized = req.isAuthenticated(); qry = "UPDATE " + crossCtl.db.options.database + ".tbl_note_list SET status = 4 WHERE uid = " + mysql.escape(uid) + " AND nid = " + mysql.escape(hero.hero); } break; default: } if (qry === "") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 404, responseMessage: "unknown target : " + hero.target, }); } else if (authorized === false) { req.workTag .res() .status(401) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", }); } else { if (qry === hero.target) { if (hero.target === "huk") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } else { switch (hero.target) { default: } req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } else { localHandler.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "delete, hero =", hero, ", error=", error, utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, hero: hero, }); } else { switch (hero.target) { default: } if (hero.target == "word") { crossCtl.redis.publishMessage({ cmd: "safekiso:filter:sync", }); localHandler.logUserAction(uid, req.infos.userInfo["userName"], "word:delete", hero.hero, "self", "필터 단어 [" + hero.raw + "]를 삭제", req, hero); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); /* localHandler.syncFilterWithDbAll(function (error) { localHandler.logUserAction( uid, req.infos.userInfo["userName"], "word:delete", "self", "필터 단어 [" + hero.raw + "]를 삭제", req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error != null ? error : "ok", }); }); */ } else if (hero.target == "key" || hero.target == "admin:key") { crossCtl.redis.publishMessage({ cmd: "safekiso:key:update", target: hero.hero, }); localHandler.logUserAction( uid, req.infos.userInfo["userName"], "key:delete", hero.hero, hero.target == "admin:key" ? "admin" : "self", "API Key serial " + hero.hero + "을 삭제", req, hero ); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } else { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: "ok", }); } } }); } } }); function purify(val) { return val.replace(/,/gi, "").replace(/원/gi, "").replace(/시간/gi, ""); } function doPreListWork(req, res, cb) { var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var hero = req.query; var target = req.query.target; var qry = ""; let wordLevelClause = ""; if (req.query.targetLevel != undefined) { switch (req.query.targetLevel) { case "all": break; case "low": wordLevelClause = " AND level = 100"; break; case "mid": wordLevelClause = " AND level = 50"; break; case "high": wordLevelClause = " AND level = 10"; break; } } switch (target) { case "admin:word:like": qry = "SELECT * FROM " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " WHERE raw = " + mysql.escape(hero.hero) + " AND status = 0 " + wordLevelClause; crossCtl.db.doEasyQuery(qry, function (error, results) { if (error) { console.log("huk error = ", error); utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); cb(error, null); } else { cb(null, { exactMatchs: results }); } }); break; case "admin:word:like:deleted": qry = "SELECT * FROM " + localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + " WHERE raw = " + mysql.escape(hero.hero) + " AND status = 4 " + wordLevelClause; crossCtl.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); cb(error, null); } else { cb(null, { exactMatchs: results }); } }); break; case "key:active": qry = "SELECT * FROM " + crossCtl.db.options.database + ".tbl_account_users WHERE uid = " + mysql.escape(uid); crossCtl.db.doEasyQuery(qry, function (error, results) { if (error) { utils.log("error", "select, hero =", hero, ", error=", error, utils.__where()); cb(error, null); } else { if (results.length != 1) { cb(new Error("missing target"), null); } else { cb(null, { limitCount: results[0]["limit_count"] }); } } }); break; default: cb(null, null); } } router.get("/local/list", function (req, res) { console.log("/list, query=", req.query); var user_info = req.isAuthenticated() ? req.user.user_info : {}; var response = {}; var target = req.query.target; var hero = req.query.hero; var draw = req.query.draw; var start = req.query.start ? req.query.start : 0; var length = req.query.length ? req.query.length : 10; var selectClause = "*"; var tableName = ""; var joinClause = ""; var whereClause = ""; var groupByClause = ""; // var orderByClause = 'serial DESC' var orderByClause = ""; var columns = req.query.columns; var order = req.query.order ? req.query.order : []; // orderByClause = '' for (var i = 0; i < order.length; i++) { if (orderByClause !== "") { orderByClause = orderByClause + ", "; } orderByClause = orderByClause + columns[order[i].column].data + " " + order[i].dir.toUpperCase(); } if (orderByClause == "") { orderByClause = "serial DESC"; } console.log("orderByClause=", orderByClause); var uid = req.isAuthenticated() ? req.user.uid : utils.uuid("uid_" + req.sessionID); var authorized = req.infos.userInfo.adminFlag; let todayDateTag = utils.getDateTimeTag("d"); let wordLevelClause = ""; if (req.query.targetLevel != undefined) { switch (req.query.targetLevel) { case "all": break; case "low": wordLevelClause = " AND level = 100"; break; case "mid": wordLevelClause = " AND level = 50"; break; case "high": wordLevelClause = " AND level = 10"; break; } } switch (target) { case "statistics:month": authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; tableName = localHandler.db.options.database + ".tbl_key_statistics"; let tmpMonthPrefix = utils.getDateTimeTag("m"); whereClause = "uid = " + mysql.escape(uid) + " AND date_tag = " + mysql.escape(tmpMonthPrefix); orderByClause = "date_tag ASC"; break; case "statistics:all": authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; tableName = localHandler.db.options.database + ".tbl_key_statistics"; whereClause = "uid = " + mysql.escape(uid); orderByClause = "date_tag ASC"; break; case "statistics": case "admin:statistics": if (target == "admin:statistics") { authorized = req.infos.userInfo.adminFlag; orderByClause = "date_tag ASC"; } else { authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; } tableName = localHandler.db.options.database + ".tbl_key_statistics"; let termPrefix = req.query.termPrefix + "%"; let termLenth = 4; let term = req.query.term; switch (term) { case "year": termLenth = 4; break; case "month": termLenth = 6; break; case "day": termLenth = 8; break; case "hour": termLenth = 10; break; default: termLenth = 0; } let whereTagByTerm = " AND date_tag like " + mysql.escape(termPrefix) + " AND CHAR_LENGTH(date_tag) = " + termLenth; switch (term) { case "year": whereTagByTerm = " AND CHAR_LENGTH(date_tag) = " + termLenth; break; case "month": break; case "day": break; case "hour": break; default: } if (termLenth == 0) { whereTagByTerm = ""; } if (target == "admin:statistics") { whereClause = "api_key = " + mysql.escape(hero) + whereTagByTerm; orderByClause = "date_tag ASC"; } else { whereClause = "uid = " + mysql.escape(uid) + " AND api_key = " + mysql.escape(hero) + whereTagByTerm; orderByClause = "date_tag ASC"; } break; case "statistics:my": authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; tableName = localHandler.db.options.database + ".tbl_key_statistics"; let termPrefix3 = req.query.termPrefix + "%"; let termLenth3 = 4; let term3 = req.query.term; switch (term3) { case "year": termLenth3 = 4; break; case "month": termLenth3 = 6; break; case "day": termLenth3 = 8; break; case "hour": termLenth3 = 10; break; default: termLenth3 = 0; } let whereTagByTerm3 = " AND date_tag like " + mysql.escape(termPrefix3) + " AND CHAR_LENGTH(date_tag) = " + termLenth3; switch (term3) { case "year": whereTagByTerm3 = " AND CHAR_LENGTH(date_tag) = " + termLenth3; break; case "month": break; case "day": break; case "hour": break; default: } if (termLenth3 == 0) { whereTagByTerm3 = ""; } whereClause = "uid = " + mysql.escape(uid) + " " + whereTagByTerm3; orderByClause = "date_tag ASC"; break; case "statistics:word": case "admin:statistics:word": if (target == "admin:statistics:word") { authorized = req.infos.userInfo.adminFlag; } else { start = 0; length = 10; authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; } orderByClause = "count DESC"; tableName = localHandler.db.options.database + ".tbl_word_statistics"; let termPrefix2 = req.query.termPrefix + "%"; let termLenth2 = 4; let term2 = req.query.term; switch (term2) { case "year": termLenth2 = 4; break; case "month": termLenth2 = 6; break; case "day": termLenth2 = 8; break; default: termLenth2 = 0; } let whereTagByTerm2 = " AND date_tag like " + mysql.escape(termPrefix2) + " AND CHAR_LENGTH(date_tag) = " + termLenth2; if (termLenth2 == 0) { whereTagByTerm = ""; } if (target == "admin:statistics:word") { whereClause = "api_key = " + mysql.escape(hero) + whereTagByTerm2; } else { whereClause = "uid = " + mysql.escape(uid) + " AND api_key = " + mysql.escape(hero) + whereTagByTerm2; } break; case "bill:month": authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; tableName = localHandler.db.options.database + ".tbl_uid_statistics"; todayDateTag = utils.getDateTimeTag("m"); whereClause = "uid = " + mysql.escape(uid) + " AND date_tag = " + mysql.escape(todayDateTag); orderByClause = "serial ASC"; break; case "statistics:daily": authorized = req.isAuthenticated() ? req.user.account_info.user_level > 1 : false; tableName = localHandler.db.options.database + ".tbl_key_statistics"; todayDateTag = utils.getDateTimeTag("d"); whereClause = "uid = " + mysql.escape(uid) + " AND api_key = " + mysql.escape(hero) + " AND date_tag like " + mysql.escape(todayDateTag + "%"); orderByClause = "serial ASC"; break; case "admin:word:all": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "" + " status = 0" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:word:all:deleted": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "" + " status = 4" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:word:like": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "raw like " + mysql.escape(hero + "%") + " AND status = 0" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:word:like:deleted": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "raw like " + mysql.escape(hero + "%") + " AND status = 4" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:word": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "raw = " + mysql.escape(hero) + " AND status = 0" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:word:deleted": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + "." + crossCtl.MAIN_WORD_TBL_NAME + ""; whereClause = "raw = " + mysql.escape(hero) + " AND status = 4" + wordLevelClause; orderByClause = "serial DESC"; break; case "admin:log:key": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_user_log"; whereClause = "tag LIKE 'key:%' AND target_key = " + mysql.escape(hero); orderByClause = "serial ASC"; break; case "admin:log:word": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_user_log"; whereClause = "tag LIKE 'word:%' AND target_key = " + mysql.escape(hero); orderByClause = "serial ASC"; break; case "admin:log:user:all": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_user_log"; whereClause = ""; orderByClause = "serial DESC"; break; case "admin:log:user:target": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_user_log"; whereClause = "name = " + mysql.escape(hero); orderByClause = "serial DESC"; break; case "notice": authorized = true; tableName = crossCtl.db.options.database + ".tbl_notice_list"; whereClause = "site_id = " + mysql.escape(crossCtl.sConfig.type) + " AND status = 0"; break; case "guides:active": authorized = true; tableName = localHandler.db.options.database + ".tbl_guide_list"; whereClause = "status = 0"; break; case "depot:ready": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_depot_list"; whereClause = "status = 0"; break; case "review:ready": authorized = req.infos.userInfo.adminFlag; tableName = crossCtl.db.options.database + ".tbl_note_list"; whereClause = "status = 0 AND to_id = " + mysql.escape(crossCtl.sConfig.type + "_all"); break; case "depot:active": authorized = true; tableName = localHandler.db.options.database + ".tbl_depot_list"; whereClause = "status = 1 OR uid = " + mysql.escape(uid); break; case "comment:active": authorized = true; tableName = crossCtl.db.options.database + ".tbl_comment_list"; whereClause = "tid = " + mysql.escape(hero) + " AND status < 4 AND site_id = " + mysql.escape(crossCtl.sConfig.type); break; case "guide:active": authorized = true; tableName = localHandler.db.options.database + ".tbl_guide_list"; whereClause = "status = 0"; break; case "admin:key:active": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_key_list"; whereClause = "status = 0"; if (hero != undefined && hero != "all") { whereClause = "uid = " + mysql.escape(hero) + " AND " + whereClause; } break; case "admin:key:deleted": authorized = req.infos.userInfo.adminFlag; tableName = localHandler.db.options.database + ".tbl_key_list"; whereClause = "status = 4"; if (hero != undefined && hero != "all") { whereClause = "uid = " + mysql.escape(hero) + " AND " + whereClause; } break; case "key": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_key_list"; whereClause = " uid = " + mysql.escape(uid); break; case "key:active": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_key_list"; whereClause = " uid = " + mysql.escape(uid) + " AND status = 0"; break; case "key:deleted": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_key_list"; whereClause = " uid = " + mysql.escape(uid) + " AND status = 4"; break; case "score": tableName = localHandler.db.options.database + ".tbl_score_list"; if (hero === "me") { authorized = req.isAuthenticated(); whereClause = "uid = " + mysql.escape(uid); } else { authorized = req.infos.userInfo.adminFlag; whereClause = "uid = " + mysql.escape(hero); } break; case "accompany:active": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_accompany_list"; whereClause = "(uid = " + mysql.escape(uid) + " OR guid = " + mysql.escape(uid) + ") AND status <> 4"; break; case "accompany:inactive": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_accompany_list"; whereClause = "(uid = " + mysql.escape(uid) + " OR guid = " + mysql.escape(uid) + ") AND status = 4"; break; case "accompany:received": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_accompany_list"; whereClause = "(guid = " + mysql.escape(uid) + ") AND (status = 0 OR status = 1)"; break; case "accompany:sent": authorized = req.isAuthenticated(); tableName = localHandler.db.options.database + ".tbl_accompany_list"; whereClause = "(uid = " + mysql.escape(uid) + ") AND (status = 0 OR status = 2)"; break; case "review:active": authorized = true; tableName = crossCtl.db.options.database + ".tbl_note_list"; whereClause = "to_id = " + mysql.escape(crossCtl.sConfig.type + "_all") + " AND (status = 1 OR (status = 0 AND uid = " + mysql.escape(uid) + "))"; break; default: } if (tableName === "") { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: "unknown target : " + target, draw: draw, recordsTotal: 0, recordsFiltered: 0, data: [], }); } else if (authorized === false) { req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 401, responseMessage: "Unauthorized", draw: draw, recordsTotal: 0, recordsFiltered: 0, data: [], }); } else { var targetPageNumber = parseInt(start / length) + 1; var targetPageSize = length; console.log("targetPageNumber=", targetPageNumber); console.log("targetPageSize=", targetPageSize); doPreListWork(req, res, function (error, metaData) { console.log("huk error = ", error); console.log("huk metaData = ", metaData); if (error != null) { utils.log("error", "error : " + JSON.stringify(error) + " " + utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, draw: draw, recordsTotal: 0, recordsFiltered: 0, data: [], }); } else { crossCtl.getPagedList( selectClause, tableName, joinClause, whereClause, groupByClause, orderByClause, targetPageSize, targetPageNumber, function (error, results) { var data = []; if (error) { utils.log("error", "error : " + JSON.stringify(error) + " " + utils.__where()); req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 500, responseMessage: error, draw: draw, recordsTotal: 0, recordsFiltered: 0, data: [], }); } else { // console.log('results.fileList=', results.fileList) var rawList = results.fileList; var filteredData = []; for (var i = 0; i < rawList.length; i++) { var tmpObject = JSON.parse(JSON.stringify(rawList[i])); if (tmpObject.created !== undefined) { // tmpObject.created = moment(tmpObject.created).format("LLLL") } if (tmpObject.updated !== undefined) { // tmpObject.updated = moment(tmpObject.updated).format("LLLL") } switch (target) { case "guide:active": delete tmpObject.uid; delete tmpObject.status; break; case "comment:active": if (uid === tmpObject.uid) { tmpObject.myFlag = true; } else { tmpObject.myFlag = false; } delete tmpObject.uid; break; case "accompany:active": case "accompany:inactive": if (uid === tmpObject.guid) { tmpObject.toMeFlag = true; } else { tmpObject.fromMeFlag = true; } delete tmpObject.uid; delete tmpObject.guid; break; default: } filteredData[filteredData.length] = tmpObject; // console.log('tmpObject=', tmpObject) } req.workTag .res() .status(200) .send({ ...req.workTag.responsePacket, responseCode: 200, responseMessage: error, draw: draw, recordsTotal: results.totalCount, recordsFiltered: results.totalCount, pageSize: results.pageSize, totalPageCount: results.totalPageCount, currentPageNumber: results.currentPageNumber, recordsFiltered: results.totalCount, data: filteredData, metaData: metaData, }); } } ); } }); } }); module.exports = router;