GetArticleList.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. const API = require("../../../lib/API");
  2. const db = require("../../../plugin/DataBase/db");
  3. const AccessControl = require("../../../lib/AccessControl");
  4. const { BaseStdResponse } = require("../../../BaseStdResponse");
  5. class GetArticleList extends API {
  6. constructor() {
  7. super();
  8. this.setPath('/Admin/Article/List');
  9. this.setMethod('GET');
  10. }
  11. async onRequest(req, res) {
  12. let { uuid, session, pagesize, current, type, state } = req.query;
  13. if ([uuid, session, pagesize, current, type, state].some(value => value === '' || value === null || value === undefined)) {
  14. return res.json({
  15. ...BaseStdResponse.MISSING_PARAMETER,
  16. endpoint: 1513126
  17. });
  18. }
  19. if (!await AccessControl.checkSession(uuid, session))
  20. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED });
  21. const permission = await AccessControl.getPermission(uuid);
  22. if (!permission.includes("admin") && !permission.includes("article"))
  23. return res.json({ ...BaseStdResponse.PERMISSION_DENIED });
  24. pagesize = parseInt(pagesize, 10);
  25. current = parseInt(current, 10);
  26. state = parseInt(state, 10);
  27. if (isNaN(pagesize) || pagesize <= 0 || isNaN(current) || current <= 0) {
  28. return res.json({ ...BaseStdResponse.ERR, msg: '参数错误' });
  29. }
  30. const offset = (current - 1) * pagesize;
  31. const filterAllTypes = type === 'all';
  32. let sql = `
  33. SELECT
  34. a.id,
  35. a.slug,
  36. a.title,
  37. a.cover,
  38. a.\`describe\`,
  39. a.type,
  40. a.time,
  41. a.views,
  42. a.state,
  43. u.username AS author
  44. FROM article a
  45. LEFT JOIN users u ON a.author = u.uuid
  46. WHERE a.state = ?
  47. `;
  48. const params = [state];
  49. if (!filterAllTypes) {
  50. sql += ' AND a.type = ?';
  51. params.push(type);
  52. }
  53. sql += ' ORDER BY a.id DESC LIMIT ? OFFSET ?';
  54. params.push(String(pagesize), String(offset));
  55. let countSql = 'SELECT COUNT(*) AS total FROM article a WHERE a.state = ?';
  56. const countParams = [state];
  57. if (!filterAllTypes) {
  58. countSql += ' AND a.type = ?';
  59. countParams.push(type);
  60. }
  61. try {
  62. const articles = await db.query(sql, params);
  63. const countResult = await db.query(countSql, countParams);
  64. const total = countResult[0].total;
  65. const totalPages = Math.ceil(total / pagesize);
  66. res.json({
  67. ...BaseStdResponse.OK,
  68. data: articles || [],
  69. pagination: {
  70. current,
  71. pagesize,
  72. total,
  73. totalPages
  74. }
  75. });
  76. } catch (err) {
  77. this.logger.error(`获取文章列表失败!${err.stack}`);
  78. res.json({
  79. ...BaseStdResponse.ERR,
  80. msg: '获取文章列表失败!',
  81. endpoint: 153127
  82. });
  83. }
  84. }
  85. }
  86. module.exports.GetArticleList = GetArticleList;