authLogController.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.AuthLogController = void 0;
  4. const authLog_1 = require("../models/authLog");
  5. const helpers_1 = require("../utils/helpers");
  6. class AuthLogController {
  7. static async getAllAuthLogs(req, res) {
  8. try {
  9. const page = Number(req.query.page) || 1;
  10. const limit = Number(req.query.limit) || 20;
  11. const offset = (page - 1) * limit;
  12. const authLogs = await authLog_1.AuthLogModel.getAll(limit, offset);
  13. const total = await authLog_1.AuthLogModel.getCount();
  14. res.status(200).json({
  15. success: true,
  16. data: authLogs,
  17. pagination: {
  18. page,
  19. limit,
  20. total,
  21. pages: Math.ceil(total / limit)
  22. }
  23. });
  24. }
  25. catch (error) {
  26. console.error('获取认证日志列表失败:', error);
  27. res.status(500).json({
  28. success: false,
  29. message: '获取认证日志列表失败',
  30. error: error instanceof Error ? error.message : '未知错误'
  31. });
  32. }
  33. }
  34. static async getAuthLogById(req, res) {
  35. try {
  36. const { id } = req.params;
  37. if (!id || isNaN(Number(id))) {
  38. res.status(400).json({
  39. success: false,
  40. message: '无效的ID'
  41. });
  42. return;
  43. }
  44. const authLog = await authLog_1.AuthLogModel.getById(Number(id));
  45. if (!authLog) {
  46. res.status(404).json({
  47. success: false,
  48. message: '认证日志不存在'
  49. });
  50. return;
  51. }
  52. res.status(200).json({
  53. success: true,
  54. data: authLog
  55. });
  56. }
  57. catch (error) {
  58. console.error('获取认证日志失败:', error);
  59. res.status(500).json({
  60. success: false,
  61. message: '获取认证日志失败',
  62. error: error instanceof Error ? error.message : '未知错误'
  63. });
  64. }
  65. }
  66. static async getAuthLogsByClientId(req, res) {
  67. try {
  68. const { clientid } = req.params;
  69. const page = Number(req.query.page) || 1;
  70. const limit = Number(req.query.limit) || 20;
  71. const offset = (page - 1) * limit;
  72. const clientidStr = (0, helpers_1.toString)(clientid);
  73. if (!clientidStr) {
  74. res.status(400).json({
  75. success: false,
  76. message: '客户端ID不能为空'
  77. });
  78. return;
  79. }
  80. const authLogs = await authLog_1.AuthLogModel.getByClientid(clientidStr, limit, offset);
  81. const total = await authLog_1.AuthLogModel.getCountByClientid(clientidStr);
  82. res.status(200).json({
  83. success: true,
  84. data: authLogs,
  85. pagination: {
  86. page,
  87. limit,
  88. total,
  89. pages: Math.ceil(total / limit)
  90. }
  91. });
  92. }
  93. catch (error) {
  94. console.error('根据客户端ID获取认证日志失败:', error);
  95. res.status(500).json({
  96. success: false,
  97. message: '根据客户端ID获取认证日志失败',
  98. error: error instanceof Error ? error.message : '未知错误'
  99. });
  100. }
  101. }
  102. static async getAuthLogsByUsername(req, res) {
  103. try {
  104. const { username } = req.params;
  105. const page = Number(req.query.page) || 1;
  106. const limit = Number(req.query.limit) || 20;
  107. const offset = (page - 1) * limit;
  108. const usernameStr = (0, helpers_1.toString)(username);
  109. if (!usernameStr) {
  110. res.status(400).json({
  111. success: false,
  112. message: '用户名不能为空'
  113. });
  114. return;
  115. }
  116. const authLogs = await authLog_1.AuthLogModel.getByUsername(usernameStr, limit, offset);
  117. const total = await authLog_1.AuthLogModel.getCountByUsername(usernameStr);
  118. res.status(200).json({
  119. success: true,
  120. data: authLogs,
  121. pagination: {
  122. page,
  123. limit,
  124. total,
  125. pages: Math.ceil(total / limit)
  126. }
  127. });
  128. }
  129. catch (error) {
  130. console.error('根据用户名获取认证日志失败:', error);
  131. res.status(500).json({
  132. success: false,
  133. message: '根据用户名获取认证日志失败',
  134. error: error instanceof Error ? error.message : '未知错误'
  135. });
  136. }
  137. }
  138. static async getAuthLogsByIpAddress(req, res) {
  139. try {
  140. const { ipAddress } = req.params;
  141. const page = Number(req.query.page) || 1;
  142. const limit = Number(req.query.limit) || 20;
  143. const offset = (page - 1) * limit;
  144. const ipAddressStr = (0, helpers_1.toString)(ipAddress);
  145. if (!ipAddressStr) {
  146. res.status(400).json({
  147. success: false,
  148. message: 'IP地址不能为空'
  149. });
  150. return;
  151. }
  152. const authLogs = await authLog_1.AuthLogModel.getByIpAddress(ipAddressStr, limit, offset);
  153. const total = await authLog_1.AuthLogModel.getCountByIpAddress(ipAddressStr);
  154. res.status(200).json({
  155. success: true,
  156. data: authLogs,
  157. pagination: {
  158. page,
  159. limit,
  160. total,
  161. pages: Math.ceil(total / limit)
  162. }
  163. });
  164. }
  165. catch (error) {
  166. console.error('根据IP地址获取认证日志失败:', error);
  167. res.status(500).json({
  168. success: false,
  169. message: '根据IP地址获取认证日志失败',
  170. error: error instanceof Error ? error.message : '未知错误'
  171. });
  172. }
  173. }
  174. static async getAuthLogsByOperationType(req, res) {
  175. try {
  176. const { operationType } = req.params;
  177. const page = Number(req.query.page) || 1;
  178. const limit = Number(req.query.limit) || 20;
  179. const offset = (page - 1) * limit;
  180. const operationTypeStr = (0, helpers_1.toString)(operationType);
  181. if (!operationTypeStr) {
  182. res.status(400).json({
  183. success: false,
  184. message: '操作类型不能为空'
  185. });
  186. return;
  187. }
  188. if (!['connect', 'publish', 'subscribe', 'disconnect'].includes(operationTypeStr)) {
  189. res.status(400).json({
  190. success: false,
  191. message: '操作类型必须是connect、publish、subscribe或disconnect之一'
  192. });
  193. return;
  194. }
  195. const authLogs = await authLog_1.AuthLogModel.getByOperationType(operationTypeStr, limit, offset);
  196. const total = await authLog_1.AuthLogModel.getCountByOperationType(operationTypeStr);
  197. res.status(200).json({
  198. success: true,
  199. data: authLogs,
  200. pagination: {
  201. page,
  202. limit,
  203. total,
  204. pages: Math.ceil(total / limit)
  205. }
  206. });
  207. }
  208. catch (error) {
  209. console.error('根据操作类型获取认证日志失败:', error);
  210. res.status(500).json({
  211. success: false,
  212. message: '根据操作类型获取认证日志失败',
  213. error: error instanceof Error ? error.message : '未知错误'
  214. });
  215. }
  216. }
  217. static async getAuthLogsByResult(req, res) {
  218. try {
  219. const result = (0, helpers_1.toString)(req.params.result);
  220. const page = Number(req.query.page) || 1;
  221. const limit = Number(req.query.limit) || 20;
  222. const offset = (page - 1) * limit;
  223. if (!result) {
  224. res.status(400).json({
  225. success: false,
  226. message: '结果不能为空'
  227. });
  228. return;
  229. }
  230. if (!['success', 'failure'].includes(result)) {
  231. res.status(400).json({
  232. success: false,
  233. message: '结果必须是success或failure之一'
  234. });
  235. return;
  236. }
  237. const authLogs = await authLog_1.AuthLogModel.getByResult(result, limit, offset);
  238. const total = await authLog_1.AuthLogModel.getCountByResult(result);
  239. res.status(200).json({
  240. success: true,
  241. data: authLogs,
  242. pagination: {
  243. page,
  244. limit,
  245. total,
  246. pages: Math.ceil(total / limit)
  247. }
  248. });
  249. }
  250. catch (error) {
  251. console.error('根据结果获取认证日志失败:', error);
  252. res.status(500).json({
  253. success: false,
  254. message: '根据结果获取认证日志失败',
  255. error: error instanceof Error ? error.message : '未知错误'
  256. });
  257. }
  258. }
  259. static async getAuthLogsByTimeRange(req, res) {
  260. try {
  261. const { start_time, end_time } = req.query;
  262. const page = Number(req.query.page) || 1;
  263. const limit = Number(req.query.limit) || 20;
  264. const offset = (page - 1) * limit;
  265. if (!start_time || !end_time) {
  266. res.status(400).json({
  267. success: false,
  268. message: '开始时间和结束时间不能为空'
  269. });
  270. return;
  271. }
  272. const startDate = new Date(start_time);
  273. const endDate = new Date(end_time);
  274. if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
  275. res.status(400).json({
  276. success: false,
  277. message: '无效的时间格式'
  278. });
  279. return;
  280. }
  281. if (startDate >= endDate) {
  282. res.status(400).json({
  283. success: false,
  284. message: '开始时间必须早于结束时间'
  285. });
  286. return;
  287. }
  288. const authLogs = await authLog_1.AuthLogModel.getByTimeRange(startDate, endDate, limit, offset);
  289. const total = await authLog_1.AuthLogModel.getCountByTimeRange(startDate, endDate);
  290. res.status(200).json({
  291. success: true,
  292. data: authLogs,
  293. pagination: {
  294. page,
  295. limit,
  296. total,
  297. pages: Math.ceil(total / limit)
  298. }
  299. });
  300. }
  301. catch (error) {
  302. console.error('根据时间范围获取认证日志失败:', error);
  303. res.status(500).json({
  304. success: false,
  305. message: '根据时间范围获取认证日志失败',
  306. error: error instanceof Error ? error.message : '未知错误'
  307. });
  308. }
  309. }
  310. static async getAuthLogsByMultipleConditions(req, res) {
  311. try {
  312. const { clientid, username, ip_address, operation_type, result, start_time, end_time } = req.query;
  313. const page = Number(req.query.page) || 1;
  314. const limit = Number(req.query.limit) || 20;
  315. const offset = (page - 1) * limit;
  316. const conditions = {};
  317. if (clientid !== undefined && clientid !== '')
  318. conditions.clientid = clientid;
  319. if (username !== undefined && username !== '')
  320. conditions.username = username;
  321. if (ip_address !== undefined && ip_address !== '')
  322. conditions.ip_address = ip_address;
  323. if (operation_type !== undefined && operation_type !== '') {
  324. if (!['connect', 'publish', 'subscribe', 'disconnect'].includes(operation_type)) {
  325. res.status(400).json({
  326. success: false,
  327. message: '操作类型必须是connect、publish、subscribe或disconnect之一'
  328. });
  329. return;
  330. }
  331. conditions.operation_type = operation_type;
  332. }
  333. if (result !== undefined && result !== '') {
  334. if (!['success', 'failure'].includes(result)) {
  335. res.status(400).json({
  336. success: false,
  337. message: '结果必须是success或failure之一'
  338. });
  339. return;
  340. }
  341. conditions.result = result;
  342. }
  343. let startDate, endDate;
  344. if (start_time && end_time) {
  345. startDate = new Date(start_time);
  346. endDate = new Date(end_time);
  347. if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
  348. res.status(400).json({
  349. success: false,
  350. message: '无效的时间格式'
  351. });
  352. return;
  353. }
  354. if (startDate >= endDate) {
  355. res.status(400).json({
  356. success: false,
  357. message: '开始时间必须早于结束时间'
  358. });
  359. return;
  360. }
  361. }
  362. const fuzzyFields = ['clientid', 'username', 'ip_address'];
  363. const authLogs = await authLog_1.AuthLogModel.getByMultipleConditions(conditions, startDate, endDate, limit, offset, fuzzyFields);
  364. const total = await authLog_1.AuthLogModel.getCountByMultipleConditions(conditions, startDate, endDate, fuzzyFields);
  365. res.status(200).json({
  366. success: true,
  367. data: authLogs,
  368. pagination: {
  369. page,
  370. limit,
  371. total,
  372. pages: Math.ceil(total / limit)
  373. }
  374. });
  375. }
  376. catch (error) {
  377. console.error('根据多条件查询认证日志失败:', error);
  378. res.status(500).json({
  379. success: false,
  380. message: '根据多条件查询认证日志失败',
  381. error: error instanceof Error ? error.message : '未知错误'
  382. });
  383. }
  384. }
  385. static async getAuthLogStats(req, res) {
  386. try {
  387. const stats = await authLog_1.AuthLogModel.getFullStats();
  388. res.status(200).json({
  389. success: true,
  390. data: stats,
  391. message: '获取认证日志统计信息成功'
  392. });
  393. }
  394. catch (error) {
  395. console.error('获取认证日志统计信息失败:', error);
  396. res.status(500).json({
  397. success: false,
  398. message: '获取认证日志统计信息失败',
  399. error: error instanceof Error ? error.message : '未知错误'
  400. });
  401. }
  402. }
  403. static async getRecentAuthLogs(req, res) {
  404. try {
  405. const limit = Number(req.query.limit) || 10;
  406. if (limit > 100) {
  407. res.status(400).json({
  408. success: false,
  409. message: '限制数量不能超过100'
  410. });
  411. return;
  412. }
  413. const authLogs = await authLog_1.AuthLogModel.getRecent(limit);
  414. res.status(200).json({
  415. success: true,
  416. data: authLogs,
  417. message: '获取最近认证日志成功'
  418. });
  419. }
  420. catch (error) {
  421. console.error('获取最近认证日志失败:', error);
  422. res.status(500).json({
  423. success: false,
  424. message: '获取最近认证日志失败',
  425. error: error instanceof Error ? error.message : '未知错误'
  426. });
  427. }
  428. }
  429. static async cleanupOldAuthLogs(req, res) {
  430. try {
  431. const { days } = req.query;
  432. let daysToDelete = days;
  433. if (!daysToDelete && req.body && req.body.days) {
  434. daysToDelete = req.body.days;
  435. }
  436. if (!daysToDelete || isNaN(Number(daysToDelete)) || Number(daysToDelete) < 1) {
  437. res.status(400).json({
  438. success: false,
  439. message: '请提供有效的天数(大于0的数字)'
  440. });
  441. return;
  442. }
  443. const deletedCount = await authLog_1.AuthLogModel.cleanupOldLogs(Number(daysToDelete));
  444. res.status(200).json({
  445. success: true,
  446. data: { deletedCount },
  447. message: `成功清理${deletedCount}条${daysToDelete}天前的认证日志`
  448. });
  449. }
  450. catch (error) {
  451. console.error('清理旧认证日志失败:', error);
  452. res.status(500).json({
  453. success: false,
  454. message: '清理旧认证日志失败',
  455. error: error instanceof Error ? error.message : '未知错误'
  456. });
  457. }
  458. }
  459. }
  460. exports.AuthLogController = AuthLogController;
  461. //# sourceMappingURL=authLogController.js.map