Files
2026-04-07 14:50:23 +09:00

2722 lines
84 KiB
JavaScript

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;