PostArticle.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. const { slugify, isValidSlug, ensureUniqueSlug } = require("../../../lib/slugify");
  6. class PostArticle extends API {
  7. constructor() {
  8. super();
  9. this.setPath('/Admin/Article');
  10. this.setMethod('POST');
  11. }
  12. async onRequest(req, res) {
  13. let {
  14. uuid,
  15. session,
  16. id,
  17. title,
  18. slug,
  19. cover,
  20. describe,
  21. content,
  22. type,
  23. state
  24. } = req.body;
  25. if ([uuid, session, title, cover, content, type].some(value => value === '' || value === null || value === undefined))
  26. return res.json({ ...BaseStdResponse.MISSING_PARAMETER });
  27. if (!await AccessControl.checkSession(uuid, session))
  28. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED });
  29. const permission = await AccessControl.getPermission(uuid);
  30. if (!permission.includes("admin") && !permission.includes("article"))
  31. return res.json({ ...BaseStdResponse.PERMISSION_DENIED });
  32. const time = new Date().getTime();
  33. try {
  34. if (!id) {
  35. let baseSlug = slug ? String(slug).trim().toLowerCase() : slugify(title);
  36. if (!isValidSlug(baseSlug))
  37. return res.json({ ...BaseStdResponse.ERR, msg: '文章标识格式无效(3-64位小写字母、数字、连字符)' });
  38. const finalSlug = await ensureUniqueSlug(db, baseSlug);
  39. const articleCover = (cover && String(cover).trim()) ? String(cover).trim().slice(0, 16) : '📄';
  40. const sql = 'INSERT INTO article (title, slug, cover, time, content, author, state, `describe`, type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
  41. const r = await db.query(sql, [title, finalSlug, articleCover, time, content, uuid, state, describe, type]);
  42. if (r && r.affectedRows > 0) {
  43. return res.json({ ...BaseStdResponse.OK, id: r.insertId, slug: finalSlug });
  44. }
  45. return res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '发表文章失败!数据库错误' });
  46. }
  47. const existing = await db.query('SELECT slug FROM article WHERE id = ?', [id]);
  48. if (!existing || existing.length === 0)
  49. return res.json({ ...BaseStdResponse.ERR, msg: '文章不存在' });
  50. const articleCover = (cover && String(cover).trim()) ? String(cover).trim().slice(0, 16) : '📄';
  51. const sql = 'UPDATE article SET title = ?, cover = ?, content = ?, state = ?, `describe` = ?, type = ? WHERE id = ?';
  52. const r = await db.query(sql, [title, articleCover, content, state, describe, type, id]);
  53. if (r && r.affectedRows > 0) {
  54. return res.json({ ...BaseStdResponse.OK, slug: existing[0].slug });
  55. }
  56. return res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '发表文章失败!数据库错误' });
  57. } catch (err) {
  58. this.logger.error(`发表文章失败!${err.stack}`);
  59. res.json({ ...BaseStdResponse.ERR, msg: "发表文章失败!" });
  60. }
  61. }
  62. }
  63. module.exports.PostArticle = PostArticle;