getFields.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /**
  2. * ВЫДАЧА ПОЛЕЙ НЕОПУБЛИКОВАННОЙ СТАТЬИ ДЛЯ ЗАГРУЗКИ В ФОРМУ РЕДАКТИРОВАНИЯ
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. // Возвращает объект со статьей, либо "new", если статья создана,
  7. // но еще не загружена, либо "none" в случае ошибки
  8. // id - это id запрашиваемой статьи :)
  9. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  10. module.exports = async (id, user) => {
  11. try {
  12. if (!/^\w{3,20}$/.test(id)) return "none";
  13. // Промисификатор чтения файла
  14. const rFile = fl => {
  15. return new Promise((resolve, reject) => {
  16. fs.readFile(fl, (e, cnt) => {
  17. if (e) reject("none"); else resolve(cnt.toString());
  18. })
  19. })
  20. };
  21. // Проверяем его роль
  22. let roles = "000";
  23. let staff = await dbFind("staff", {login: user[1]});
  24. if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
  25. if (user[1] == ADMIN) roles = "111";
  26. // Загружаем данные статьи из базы
  27. let arts = await dbFind("articles", {_id: id});
  28. if (!arts[0]) return "none";
  29. let artObj = arts[0];
  30. if (artObj.status == 7) return "none";
  31. if (!artObj.status) return "new";
  32. artObj.coauth = Object.keys(artObj.coauth).join(' ');
  33. // Данные отдаем только редактору, корректору и автору
  34. if (!roles[0] && !roles[1] && artObj.us != user[1]) return "none";
  35. // Загружаем текстовый файл со статьей
  36. let art;
  37. try {art = await rFile( __dirname + `/../draft/${id}/article.txt`);}
  38. catch(e) {art = "¤¤";}
  39. // Формируем объект статьи
  40. let fileObj = {};
  41. [fileObj.annot, fileObj.text, fileObj.bibl] = art.split('¤');
  42. let res = {...artObj, ...fileObj};
  43. // Удаляем поле "рецензент"
  44. delete res.rev;
  45. return JSON.stringify(res);
  46. }
  47. catch(e) {return "none";}
  48. };