goCoAuth.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * РАБОТА С ПОДТВЕРЖДЕНИЕМ СОАВТОРСТВА
  3. * Copyright © 2021, А.М.Гольдин. ISC license
  4. */
  5. "use strict";
  6. // arg - это объект с данными соавтора
  7. // Если он пуст, просто отдаем данные статей, требующих подтверждения
  8. // Возвращает массив с элементами - объектами (данными статей)
  9. // Если arg не пуст, возвращает success в случае успешного подтверждения
  10. // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
  11. module.exports = async (arg, user) => {
  12. try {
  13. // Промисификатор записи в базу
  14. const wrBase = (id, soavtObj) => {
  15. return new Promise((resolve, reject) => {
  16. db.articles.update(
  17. {_id: id},
  18. {$set: {coauth: soavtObj}},
  19. {},
  20. (e, n) => {if (e) reject("none"); else resolve("yes");}
  21. )
  22. })
  23. };
  24. // Если получен запрос на перечень статей, требующих подтверждения
  25. if (!Object.keys(arg).length) {
  26. // Получаем все статьи, где этот юзер указан соавтором
  27. // и это соавторство не подтверждено
  28. let res = await dbFind("articles", {$where: function () {
  29. if (!this.coauth[user[1]]) return false;
  30. return (this.status < 7 && this.coauth[user[1]].length == 0);
  31. }});
  32. let resArr = [];
  33. for (let art of res) resArr.push(
  34. {id: art._id, auth: art.author, title: art.head}
  35. );
  36. return JSON.stringify(resArr);
  37. }
  38. // Если получен запрос на обновление данных о соавторах
  39. else {
  40. let res = await dbFind("articles", {_id: arg.id});
  41. if (!res.length) return "none";
  42. let soavt = res[0].coauth;
  43. // Если запрос пришел от редактора, проверяем, редактор ли он
  44. // и формируем данные для записи в базу
  45. if (arg.lgn) {
  46. // Правда ли он редактор?
  47. if (user[1] !== ADMIN) {
  48. let staff = await dbFind("staff", {login: user[1]});
  49. if (!staff.length) return "none";
  50. if (!staff[0].roles.toString(2).padStart(3, '0')[0])
  51. return "none";
  52. }
  53. // Заявлен ли данный соавтор автором статьи?
  54. if (!soavt[arg.lgn]) return "none";
  55. // Формируем новый объект с соавторами
  56. soavt[arg.lgn] = [arg.fio, arg.sved];
  57. }
  58. // Если запрос от самого соавтора
  59. else {
  60. // Правда ли он указан соавтором этой статьи?
  61. if (!soavt[user[1]]) return "none";
  62. // Формируем новый объект с соавторами
  63. soavt[user[1]] = [`${user[2]} ${user[3]} ${arg.otch}`, arg.sved];
  64. }
  65. // Пишем в базу
  66. let baseRes = await wrBase(arg.id, soavt);
  67. return baseRes == "yes" ? "success" : "none";
  68. }
  69. }
  70. catch(e) {return "none";}
  71. };