sendNotes.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /**
  2. * ОТПРАВКА АВТОРУ ЗАМЕЧАНИЙ РЕДАКТОРА ИЛИ РЕЦЕНЗЕНТА
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. // Возвращает success или none
  7. // data - это массив вида ["editor", id, notes, resol], где
  8. // "editor" - редактор, "reviewer" - рецензент
  9. // id - id статьи
  10. // notes - собственно замечания
  11. // resol - необязательный аргумент, резолюция рецензента:
  12. // "disc", "edit" или "print"
  13. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  14. module.exports = async (data, user) => {
  15. const flName = data[0] == "editor" ? "editor.txt" : "reviewer.txt",
  16. who = data[0] == "editor" ? "редактора" : "рецензента",
  17. id = data[1] ? data[1] : '',
  18. notes = data[2] ? data[2].substr(0, 10000).trim() : '';
  19. if (!id || !notes) return "none";
  20. try {
  21. // Промисификатор записи файла
  22. const wrFile = cont => {
  23. return new Promise((resolve, reject) => {
  24. fs.writeFile(__dirname + `/../draft/${id}/${flName}`, cont, e => {
  25. if (e) reject("none"); else resolve("yes");
  26. })
  27. })
  28. };
  29. // Запрос действительно от редактора или рецензента?
  30. let roles = "000";
  31. let staff = await dbFind("staff", {login: user[1]});
  32. if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
  33. if (user[1] == ADMIN) {
  34. roles = "111";
  35. staff[0] = {login: ADMIN};
  36. }
  37. if (!roles[0] && !roles[2]) return "none";
  38. // Есть ли такая статья и не опубликована ли она уже?
  39. let res = await dbFind("articles", {_id: id});
  40. if (!res.length) return "none";
  41. if (res[0].status == 7) return "none";
  42. // Определяем автора статьи и его почту, заголовок статьи
  43. let author = res[0].author,
  44. sved = res[0].sved,
  45. eml = res[0].eml,
  46. title = res[0].head;
  47. // Пишем файл с замечаниями
  48. let resWrite = await wrFile(notes);
  49. if (resWrite != "yes") return "none";
  50. // Посылаем письмо автору
  51. let text = `Уважаемый(ая) ${author}!\n\n`
  52. + `Ваша статья «${title}» рассмотрена. Получены замечания ${who}:\n\n`
  53. + `===НАЧАЛО ЗАМЕЧАНИЙ\n${notes}\n===КОНЕЦ ЗАМЕЧАНИЙ`;
  54. let zagol = "Статья отклонена";
  55. if (!data[3] || data[3] == "edit") {
  56. zagol = `Замечания ${who}`;
  57. text += "\n\nДля доработки статьи зайдите в раздел сайта "
  58. + "«Мои статьи» и кликните на значке карандаша справа от "
  59. + "названия статьи. После внесения вами изменений статья "
  60. + "будет рассмотрена повторно.";
  61. }
  62. if (data[3] == "print") zagol = "Статья одобрена";
  63. let resEml = await sendEml(eml, zagol, text);
  64. // Новые статус и дата для записи в базу
  65. let now = (new Date()).toISOString().split('T')[0]
  66. . replace(/(\d+)-(\d+)-(\d+)/, "$3.$2.$1");
  67. let newStatus = data[0] == "editor" ? 2 : 4;
  68. // Если рецензент предлагает удалить или опубликовать статью,
  69. // пишем письмо главному редактору
  70. let resEmlRed = 'a';
  71. if (data[3] == "disc") {
  72. resEmlRed = await sendEml(ADMEML, "Статья к удалению",
  73. `Статья ${id} рекомендована к удалению рецензентом `
  74. + `${staff[0].login}.\nАвтор статьи: ${author}, ${sved}.\n`
  75. + `Заголовок статьи: ${title}.\nЗамечания рецензента:\n\n${notes}`
  76. );
  77. }
  78. if (data[3] == "print") {
  79. resEmlRed = await sendEml(ADMEML, "Статья к корректуре",
  80. `Статья ${id} одобрена рецензентом ${staff[0].login}.\n`
  81. + `Необходимо направить статью корректору.`
  82. );
  83. newStatus = 5;
  84. }
  85. if (!resEml || !resEmlRed) return "none";
  86. // Меняем статус и время последней операции в базе статей
  87. await db.articles.update(
  88. {_id: id}, {$set: {status: newStatus, dt2: now}}, {}
  89. );
  90. return "success";
  91. }
  92. catch(e) {return "none";}
  93. };