12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /**
- * РАБОТА С ПОДТВЕРЖДЕНИЕМ СОАВТОРСТВА
- * Copyright © 2021, А.М.Гольдин. ISC license
- */
- "use strict";
- // arg - это объект с данными соавтора
- // Если он пуст, просто отдаем данные статей, требующих подтверждения
- // Возвращает массив с элементами - объектами (данными статей)
- // Если arg не пуст, возвращает success в случае успешного подтверждения
- // user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
- module.exports = async (arg, user) => {
- try {
- // Промисификатор записи в базу
- const wrBase = (id, soavtObj) => {
- return new Promise((resolve, reject) => {
- db.articles.update(
- {_id: id},
- {$set: {coauth: soavtObj}},
- {},
- (e, n) => {if (e) reject("none"); else resolve("yes");}
- )
- })
- };
- // Если получен запрос на перечень статей, требующих подтверждения
- if (!Object.keys(arg).length) {
- // Получаем все статьи, где этот юзер указан соавтором
- // и это соавторство не подтверждено
- let res = await dbFind("articles", {$where: function () {
- if (!this.coauth[user[1]]) return false;
- return (this.status < 7 && this.coauth[user[1]].length == 0);
- }});
- let resArr = [];
- for (let art of res) resArr.push(
- {id: art._id, auth: art.author, title: art.head}
- );
- return JSON.stringify(resArr);
- }
- // Если получен запрос на обновление данных о соавторах
- else {
- let res = await dbFind("articles", {_id: arg.id});
- if (!res.length) return "none";
- let soavt = res[0].coauth;
- // Если запрос пришел от редактора, проверяем, редактор ли он
- // и формируем данные для записи в базу
- if (arg.lgn) {
- // Правда ли он редактор?
- if (user[1] !== ADMIN) {
- let staff = await dbFind("staff", {login: user[1]});
- if (!staff.length) return "none";
- if (!staff[0].roles.toString(2).padStart(3, '0')[0])
- return "none";
- }
- // Заявлен ли данный соавтор автором статьи?
- if (!soavt[arg.lgn]) return "none";
- // Формируем новый объект с соавторами
- soavt[arg.lgn] = [arg.fio, arg.sved];
- }
- // Если запрос от самого соавтора
- else {
- // Правда ли он указан соавтором этой статьи?
- if (!soavt[user[1]]) return "none";
- // Формируем новый объект с соавторами
- soavt[user[1]] = [`${user[2]} ${user[3]} ${arg.otch}`, arg.sved];
- }
- // Пишем в базу
- let baseRes = await wrBase(arg.id, soavt);
- return baseRes == "yes" ? "success" : "none";
- }
- }
- catch(e) {return "none";}
- };
|