114 lines
3.6 KiB
JavaScript
114 lines
3.6 KiB
JavaScript
const Sequelize = require("sequelize");
|
|
const { Op } = Sequelize;
|
|
const baseModel = require("../../middleware/baseModel");
|
|
const { find_page } = require("../utils/query_helpers");
|
|
|
|
function build_date_where(start_date, end_date) {
|
|
const where = {};
|
|
if (start_date && end_date) {
|
|
where.call_date = { [Op.between]: [start_date, end_date] };
|
|
} else if (start_date) {
|
|
where.call_date = { [Op.gte]: start_date };
|
|
} else if (end_date) {
|
|
where.call_date = { [Op.lte]: end_date };
|
|
}
|
|
return where;
|
|
}
|
|
|
|
module.exports = {
|
|
"POST /biz_api_stats/by_user": async (ctx) => {
|
|
const body = ctx.getBody();
|
|
const { user_id, start_date, end_date } = body;
|
|
if (!user_id) {
|
|
ctx.fail("缺少 user_id");
|
|
return;
|
|
}
|
|
const where = { user_id, ...build_date_where(start_date, end_date) };
|
|
const rows = await baseModel.biz_api_call_log.findAll({
|
|
attributes: [
|
|
"api_path",
|
|
[baseModel.Sequelize.fn("COUNT", baseModel.Sequelize.col("id")), "call_count"],
|
|
[baseModel.Sequelize.fn("AVG", baseModel.Sequelize.col("response_time")), "avg_response_time"],
|
|
],
|
|
where,
|
|
group: ["api_path"],
|
|
order: [[baseModel.Sequelize.literal("call_count"), "DESC"]],
|
|
raw: true,
|
|
});
|
|
const total = rows.reduce((s, r) => s + Number(r.call_count), 0);
|
|
ctx.success({ total, rows });
|
|
},
|
|
|
|
"POST /biz_api_stats/by_api": async (ctx) => {
|
|
const body = ctx.getBody();
|
|
const { api_path, start_date, end_date } = body;
|
|
if (!api_path) {
|
|
ctx.fail("缺少 api_path");
|
|
return;
|
|
}
|
|
const where = { api_path, ...build_date_where(start_date, end_date) };
|
|
const rows = await baseModel.biz_api_call_log.findAll({
|
|
attributes: [
|
|
"user_id",
|
|
[baseModel.Sequelize.fn("COUNT", baseModel.Sequelize.col("id")), "call_count"],
|
|
[baseModel.Sequelize.fn("AVG", baseModel.Sequelize.col("response_time")), "avg_response_time"],
|
|
],
|
|
where,
|
|
group: ["user_id"],
|
|
order: [[baseModel.Sequelize.literal("call_count"), "DESC"]],
|
|
raw: true,
|
|
});
|
|
const total = rows.reduce((s, r) => s + Number(r.call_count), 0);
|
|
ctx.success({ total, rows });
|
|
},
|
|
|
|
"POST /biz_api_stats/summary": async (ctx) => {
|
|
const body = ctx.getBody();
|
|
const { start_date, end_date, top_limit } = body;
|
|
const dateWhere = build_date_where(start_date, end_date);
|
|
const Seq = baseModel.Sequelize;
|
|
const lim = top_limit || 10;
|
|
|
|
const totalResult = await baseModel.biz_api_call_log.count({ where: dateWhere });
|
|
|
|
const daily_trend = await baseModel.biz_api_call_log.findAll({
|
|
attributes: ["call_date", [Seq.fn("COUNT", Seq.col("id")), "call_count"]],
|
|
where: dateWhere,
|
|
group: ["call_date"],
|
|
order: [["call_date", "ASC"]],
|
|
raw: true,
|
|
});
|
|
|
|
const top_apis = await baseModel.biz_api_call_log.findAll({
|
|
attributes: ["api_path", [Seq.fn("COUNT", Seq.col("id")), "call_count"]],
|
|
where: dateWhere,
|
|
group: ["api_path"],
|
|
order: [[Seq.literal("call_count"), "DESC"]],
|
|
limit: lim,
|
|
raw: true,
|
|
});
|
|
|
|
const top_users = await baseModel.biz_api_call_log.findAll({
|
|
attributes: ["user_id", [Seq.fn("COUNT", Seq.col("id")), "call_count"]],
|
|
where: dateWhere,
|
|
group: ["user_id"],
|
|
order: [[Seq.literal("call_count"), "DESC"]],
|
|
limit: lim,
|
|
raw: true,
|
|
});
|
|
|
|
ctx.success({
|
|
total_calls: totalResult,
|
|
daily_trend,
|
|
top_apis,
|
|
top_users,
|
|
});
|
|
},
|
|
|
|
"POST /biz_api_call_log/page": async (ctx) => {
|
|
const body = ctx.getBody();
|
|
const { count, rows } = await find_page(baseModel.biz_api_call_log, "biz_api_call_log", body);
|
|
ctx.success({ rows, count });
|
|
},
|
|
};
|