sendArticle.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**
  2. * ЗАГРУЗКА СТАТЬИ НА СЕРВЕР
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. // Пишет аннотацию, текст статьи и библиографию в файл article.txt
  7. // в папке со статьей; пишет данные о загруженной статье в базу
  8. // Возвращает success или none
  9. // data - это объект с содержимым статьи
  10. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  11. module.exports = async (data, user) => {
  12. try {
  13. // Промисификатор записи файла
  14. const wrFile = cont => {
  15. return new Promise((resolve, reject) => {
  16. fs.writeFile(__dirname + `/../draft/${id}/article.txt`, cont, e => {
  17. if (e) reject("none"); else resolve("yes");
  18. })
  19. })
  20. };
  21. let LENS = {
  22. "pUDK":50, "pHead":200, "pUnit":10, "pAuthor":50, "pSved":100,
  23. "pEml":80, "pCoAuthors":150, "pAnnot":1000, "pKeyWords":200,
  24. "pText":50000, "pBibl":20000
  25. };
  26. // Проверяем, что пришло; обрезаем; вырезаем открывающие уголки
  27. let id = data["pID"];
  28. if(!/^\w{3,10}$/.test(id)) return "none";
  29. delete data["pID"];
  30. for (let k of Object.keys(data)) {
  31. if (!LENS[k]) return;
  32. data[k] = data[k].trim().substr(0, LENS[k]).trim();
  33. if (k != "pText") data[k] = data[k]
  34. .replace(/<</g, '¤').replace(/</g, '').replace(/¤/g, "<<");
  35. if (k == "pText") data[k] = data[k].replace(/<\s*script/g, '');
  36. }
  37. // Проверяем его роль
  38. let roles = "000";
  39. let staff = await dbFind("staff", {login: user[1]});
  40. if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
  41. if (user[1] == ADMIN) roles = "111";
  42. // Есть ли такая статья и не опубликована ли она уже?
  43. // Проверяем полномочия приславшего статью (автор, ред. или корр.)
  44. let res = await dbFind("articles", {_id: id});
  45. if (!res.length) return "none";
  46. if (res[0].status == 7) return "none";
  47. if (!roles[0] && !roles[1] && res[0].us != user[1]) return "none";
  48. let newStatus = Math.max(1, res[0].status);
  49. // Не подменил ли он имя автора?
  50. let auTr = res[0].author ?
  51. res[0].author.split(' ') : [user[2], user[3]];
  52. let au = data["pAuthor"].split(' ');
  53. if (`${au[0]} ${au[1]}` !== `${auTr[0]} ${auTr[1]}`) return "none";
  54. // Пишем файл с аннотацией, текстом и библиографией
  55. let content =
  56. `${data["pAnnot"]}\n¤\n${data["pText"]}\n¤\n${data["pBibl"]}\n`;
  57. let resWrite = await wrFile(content);
  58. // Дата поступления статьи в редакцию
  59. let now = (new Date()).toISOString().split('T')[0]
  60. . replace(/(\d+)-(\d+)-(\d+)/, "$3.$2.$1");
  61. let dt1 = res[0].dt1 || now;
  62. // Соавторы - это объект
  63. // {ivanov: ["Иванов Иван Иванович", "Учащийся 8А класса"], petrov:...}
  64. let soavt = {},
  65. coAuthArr = data["pCoAuthors"].replace(/[^a-zA-Z0-9 ]/g, '')
  66. . replace(/\s{2,}/g, ' ').trim().split(' ');
  67. if (coAuthArr[0]) for (let us of coAuthArr) {
  68. // Нет ли уже данных этого соавтора?
  69. // Если есть - оставляем их, если нет - пишем пустой массив
  70. let res = await dbFind("articles", {$where: function () {
  71. return (this._id == id && this.coauth[us] !== undefined);
  72. }});
  73. if (res.length) soavt[us] = res[0].coauth[us];
  74. else soavt[us] = [];
  75. }
  76. // Делаем запись в базу (остальные поля)
  77. if (resWrite == "yes") {
  78. let newArtObj = {
  79. dt1: dt1, // дата получения статьи редакцией
  80. dt2: now, // дата последней манипуляции со статьей
  81. us: res[0].us,
  82. status: newStatus,
  83. udk: data["pUDK"],
  84. head: data["pHead"],
  85. unit: data["pUnit"],
  86. author: data["pAuthor"],
  87. sved: data["pSved"],
  88. eml: data["pEml"],
  89. coauth: soavt,
  90. keywords: data["pKeyWords"],
  91. }
  92. db.articles.update({_id: id}, {$set: newArtObj}, {});
  93. // Если отправлял автор, посылаем письма главному редактору и автору
  94. if (user[1] == res[0].us) {
  95. let isEdit = res[0].status ? "Отредактирована" : "Получена";
  96. await sendEml(ADMEML, "Поступила статья",
  97. `${isEdit} статья:\n`
  98. + `ID: ${id}\nАвтор: ${data["pAuthor"]}, ${data["pSved"]}\n`
  99. + `Название: ${data["pHead"]}`
  100. );
  101. await sendEml(data["pEml"], `${isEdit} статья`,
  102. `Уважаемый(ая) ${data["pAuthor"]}!\n\n`
  103. + `Редакция сайта lycArch.urfu.ru получила вашу статью `
  104. + `«${data["pHead"]}». О дальнейших действиях редакции вы будете `
  105. + `проинформированы по электронной почте.\n\nДанное письмо `
  106. + `вы будете получать каждый раз при внесении вами изменений `
  107. + `в статью (редактировании). Благодарим вас за сотрудничество.`
  108. );
  109. }
  110. return "success";
  111. }
  112. }
  113. catch(e) {return "none";}
  114. };