From e5a0ecb6ce1f9a4cdfeb160c4af753ecc4a1f96a Mon Sep 17 00:00:00 2001 From: paoloar77 Date: Fri, 14 Jan 2022 23:54:33 +0100 Subject: [PATCH] - Add to Friends - remove from Friend list - Cancel Ask Friend .... OK ! --- src/server/models/user.js | 188 +++++++++++++++++++++++++++--- src/server/router/index_router.js | 11 +- src/server/tools/general.js | 98 +++++++++++----- src/server/tools/shared_nodejs.js | 4 + 4 files changed, 254 insertions(+), 47 deletions(-) diff --git a/src/server/models/user.js b/src/server/models/user.js index 84c61a1..17c810c 100755 --- a/src/server/models/user.js +++ b/src/server/models/user.js @@ -312,6 +312,7 @@ const UserSchema = new mongoose.Schema({ rating: {type: Number}, }], friends: [], // username + req_friends: [], // username }, }) @@ -1211,6 +1212,16 @@ UserSchema.statics.getUsernameFriendsByUsername = async function( }, {'profile.friends': 1}).then((rec) => rec ? rec._doc.profile.friends : []); }; +UserSchema.statics.getUsernameReqFriendsByUsername = async function( + idapp, username) { + + return User.findOne({ + idapp, 'username': username, + $or: [{deleted: {$exists: false}}, {deleted: {$exists: true, $eq: false}}], + }, {'profile.req_friends': 1}). + then((rec) => rec ? rec._doc.profile.req_friends : []); +}; + UserSchema.statics.setFriendsCmd = async function( idapp, usernameOrig, usernameDest, cmd, value) { @@ -1218,6 +1229,9 @@ UserSchema.statics.setFriendsCmd = async function( let update = {}; if (cmd === shared_consts.FRIENDSCMD.SETTRUST) { + // Aggiungi alle amicizie + await this.setFriendsCmd(idapp, usernameOrig, usernameDest, shared_consts.FRIENDSCMD.SETFRIEND, value); + return User.updateOne({idapp, username: usernameDest}, {$set: {verified_by_aportador: value}}, {new: false}); @@ -1226,32 +1240,68 @@ UserSchema.statics.setFriendsCmd = async function( const foundIfAlreadyFriend = await User.findOne({ idapp, username: usernameOrig, - members: { - $elemMatch: {'profile.friends': usernameDest}, + 'profile.friends': { + $elemMatch: {$eq: usernameDest}, }, }); if (!foundIfAlreadyFriend) { update = {$push: {'profile.friends': [usernameDest]}}; ris = await User.updateOne({idapp, username: usernameOrig}, update); + + update = {$pullAll: {'profile.req_friends': [usernameDest]}}; + ris = await User.updateOne({idapp, username: usernameOrig}, update); } // Controlla se lui aveva già la mia amicizia const foundIfAlreadyFriend2 = await User.findOne({ idapp, username: usernameDest, - members: { - $elemMatch: {'profile.friends': usernameOrig}, + 'profile.friends': { + $elemMatch: {$eq: usernameOrig}, }, }); if (!foundIfAlreadyFriend2) { update = {$push: {'profile.friends': [usernameOrig]}}; ris = await User.updateOne({idapp, username: usernameDest}, update); + + update = {$pullAll: {'profile.req_friends': [usernameOrig]}}; + ris = await User.updateOne({idapp, username: usernameDest}, update); } if (ris) { ris = await User.getInfoFriendByUsername(idapp, usernameDest); } + } else if (cmd === shared_consts.FRIENDSCMD.REQFRIEND) { + // Aggiungo l'Amicizia a me + const foundIfAlreadyAskFriend = await User.findOne({ + idapp, + username: usernameDest, + 'profile.req_friends': { + $elemMatch: {$eq: usernameOrig}, + }, + }); + + if (value) { + if (!foundIfAlreadyAskFriend) { + update = {$push: {'profile.req_friends': [usernameOrig]}}; + ris = await User.updateOne({idapp, username: usernameDest}, update); + } + if (ris) { + // Invia una notifica alla persona + tools.sendNotificationByUsername(idapp, usernameDest, cmd, true); + } + } else { + if (foundIfAlreadyAskFriend) { + update = {$pullAll: {'profile.req_friends': [usernameOrig]}}; + ris = await User.updateOne({idapp, username: usernameDest}, update); + } + } + + if (ris) { + ris = await User.getInfoAskFriendByUsername(idapp, usernameDest); + } + } else if (cmd === shared_consts.FRIENDSCMD.REMOVE_FROM_MYFRIENDS) { // Rimuovo l'Amicizia da lui await User.updateOne({idapp, username: usernameDest}, @@ -1259,6 +1309,15 @@ UserSchema.statics.setFriendsCmd = async function( // Rimuovo l'Amicizia da me ris = await User.updateOne({idapp, username: usernameOrig}, {$pullAll: {'profile.friends': [usernameDest]}}); + } else if (cmd === shared_consts.FRIENDSCMD.CANCEL_REQ_FRIEND) { + + // Rimuovo la Richiesta di Amicizia da lui + await User.updateOne({idapp, username: usernameDest}, + {$pullAll: {'profile.req_friends': [usernameOrig]}}); + // Rimuovo l'Amicizia da me + ris = await User.updateOne({idapp, username: usernameOrig}, + {$pullAll: {'profile.friends': [usernameDest]}}); + } else if (cmd === shared_consts.FRIENDSCMD.BLOCK_USER) { // Rimuovo l'Amicizia da lui await User.updateOne({idapp, username: usernameDest}, @@ -1307,6 +1366,24 @@ function getWhatToShow(idapp, username) { } +function getWhatToShow_Unknown(idapp, username) { + return { + username: 1, + aportador_solidario: 1, + name: 1, + // deleted: 1, + // sospeso: 1, + verified_email: 1, + verified_by_aportador: 1, + 'profile.img': 1, + 'profile.sex': 1, + 'profile.born_province': 1, + 'profile.born_country': 1, + date_reg: 1, + }; + +} + UserSchema.statics.getInfoFriendByUsername = async function(idapp, username) { const whatToShow = getWhatToShow(idapp, username); @@ -1318,25 +1395,99 @@ UserSchema.statics.getInfoFriendByUsername = async function(idapp, username) { }, whatToShow).then((rec) => !!rec ? rec._doc : null); }; + +UserSchema.statics.getInfoAskFriendByUsername = async function( + idapp, username) { + + const whatToShow = getWhatToShow_Unknown(idapp, username); + + return User.findOne({ + idapp, + username, + $or: [{deleted: {$exists: false}}, {deleted: {$exists: true, $eq: false}}], + }, whatToShow).then((rec) => !!rec ? rec._doc : null); + +}; + +UserSchema.statics.getAskedFriendsByUsername = async function(idapp, username) { + + const whatToShow_Unknown = getWhatToShow_Unknown(idapp, username); + + return User.find({ + idapp, + 'profile.req_friends': { + $elemMatch: {$eq: username}, + }, + $or: [{deleted: {$exists: false}}, {deleted: {$exists: true, $eq: false}}], + }, whatToShow_Unknown).then((rec) => { + + //return rec.map(m => m.username); + }); + +}; + UserSchema.statics.getFriendsByUsername = async function(idapp, username) { - const whatToShow = getWhatToShow(idapp, username); - const arrUsernameFriends = await User.getUsernameFriendsByUsername(idapp, - username); + try { + const whatToShow = getWhatToShow(idapp, username); + const whatToShow_Unknown = getWhatToShow_Unknown(idapp, username); + const arrUsernameFriends = await User.getUsernameFriendsByUsername(idapp, + username); + const arrUsernameReqFriends = await User.getUsernameReqFriendsByUsername( + idapp, username); - const listFriends = await User.find({ - idapp, - username: {$in: arrUsernameFriends}, - $or: [{deleted: {$exists: false}}, {deleted: {$exists: true, $eq: false}}], - }, whatToShow); + let listFriends = await User.find({ + idapp, + username: {$in: arrUsernameFriends}, + $or: [ + {deleted: {$exists: false}}, + {deleted: {$exists: true, $eq: false}}], + }, whatToShow); - const listTrusted = await User.find({ - idapp, aportador_solidario: username, - $or: [{deleted: {$exists: false}}, {deleted: {$exists: true, $eq: false}}], - }, whatToShow); + let listRequestFriends = await User.find({ + idapp, + username: {$in: arrUsernameReqFriends}, + $or: [ + {deleted: {$exists: false}}, + {deleted: {$exists: true, $eq: false}}], + }, whatToShow_Unknown); - return ({listFriends, listTrusted}); + let listSentRequestFriends = await User.find({ + idapp, + 'profile.req_friends': { + $elemMatch: {$eq: username}, + }, + $or: [ + {deleted: {$exists: false}}, + {deleted: {$exists: true, $eq: false}}], + }, whatToShow_Unknown); + let listTrusted = await User.find({ + idapp, aportador_solidario: username, + $or: [ + {deleted: {$exists: false}}, + {deleted: {$exists: true, $eq: false}}], + }, whatToShow); + + + return { + listFriends, + listRequestFriends, + listTrusted, + listSentRequestFriends, + }; + + } catch (e) { + console.log('Error', e); + } + + return { + listFriends: [], + listRequestFriends: [], + listTrusted: [], + listSentRequestFriends: [], + + } }; UserSchema.statics.getAportadorSolidarioByUsername = async function( @@ -1769,7 +1920,8 @@ UserSchema.statics.getFieldsForSearchUserFriend = function() { UserSchema.statics.executeQueryTable = function(idapp, params) { params.fieldsearch = this.getFieldsForSearch(); if (params.options) { - if (tools.isBitActive(params.options, shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS)) { + if (tools.isBitActive(params.options, + shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS)) { params.fieldsearch = this.getFieldsForSearchUserFriend(); } } diff --git a/src/server/router/index_router.js b/src/server/router/index_router.js index b8fcd58..23223b8 100755 --- a/src/server/router/index_router.js +++ b/src/server/router/index_router.js @@ -1333,6 +1333,10 @@ function load(req, res, version) { orderscart = OrdersCart.getOrdersCartByUserId(req.user.id, idapp, 0); } } + let askedfriends = [] + if (req.user) { + // askedfriends = User.getAskedFriendsByUsername(idapp, req.user.username); + } return Promise.all([ bookedevent, @@ -1368,8 +1372,11 @@ function load(req, res, version) { // console.table(arrdata); const myuser = req.user; if (myuser) { - myuser.password = ''; - myuser._doc.calcstat = arrdata[13]; + try { + myuser.password = ''; + myuser._doc.calcstat = arrdata[13]; + // myuser._doc.profile.asked_friends = arrdata[30]; + } catch (e) {} } if (version < 91) { res.send({ diff --git a/src/server/tools/general.js b/src/server/tools/general.js index 98576f0..cb85ab5 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -8,6 +8,8 @@ require('../config/config'); require('../models/subscribers'); +const printf = require('util').format; + const Site = require('../models/site'); const CryptoJS = require('crypto-js'); @@ -117,9 +119,9 @@ const textlang = { 'NAVE': 'NAVE', 'MSG_SEND_FROM': 'Msg Inviato da', 'ZOOM_CONFERMATO': 'Sei stato confermato ad aver visto la Video Conferenza di Benvenuto!', + 'RICHIESTA_AMICIZIA': 'Richiesta d\'Amicizia da parte di %s', }, - si: { - }, + si: {}, es: { 'L\'Email è già stata Verificata': 'El correo electrónico ya ha sido verificado', 'Nuova Registrazione': 'Nuevo Registro', @@ -670,11 +672,12 @@ module.exports = { publicKey: process.env.PUBLIC_VAPI_KEY, }, TTL: payload.ttl, - headers: {} + headers: {}, }; // Pass object into sendNotification - return webpush.sendNotification(subscription, JSON.stringify(payload), pushOptions). + return webpush.sendNotification(subscription, JSON.stringify(payload), + pushOptions). catch(err => { if (err.statusCode === 410) { // Gone: is not valid anymore (Expired probably!), so I have to delete from my db @@ -794,6 +797,45 @@ module.exports = { }); }, + + sendNotificationByUsername: async function(idapp, username, cmd, telegram) { + + var {User} = require('../models/user'); + + const user = await User.findOne({idapp, username}, {_id: 1, lang: 1}); + if (!user) + return; + + let userId = user._id; + let lang = user.lang; + + let title = this.getNomeAppByIdApp(idapp); + let descr = ''; + let openUrl = '/'; + let tag = ''; + let actions = []; + if (cmd) { + if (cmd === shared_consts.FRIENDSCMD.REQFRIEND) { + descr = printf(this.get__('RICHIESTA_AMICIZIA', lang) , username); + openUrl = '/my/' + username; + tag = 'reqfriends'; + } + } + + if (userId) { + this.sendNotificationToUser(userId, title, descr, openUrl, '', tag, actions); + } + + if (telegram) { + const telegrambot = require('../telegram/telegrambot'); + + const idtelegram = await User.TelegIdByUsername(idapp, username); + + await telegrambot.sendMsgTelegramByIdTelegram(idapp, idtelegram, descr); + } + + }, + // ********************** // SORT WITH PREV_ID // ********************** @@ -929,7 +971,8 @@ module.exports = { const myapp = this.getApps().find(item => item.idapp === idapp); if (myapp) { - let siteport = (myapp.portapp && myapp.portapp !== '0') ? (':' + myapp.portapp) : ''; + let siteport = (myapp.portapp && myapp.portapp !== '0') ? (':' + + myapp.portapp) : ''; if (process.env.NODE_ENV === 'test') return myapp.host_test + siteport; @@ -1035,14 +1078,14 @@ module.exports = { }, getLookup: function(params, num, pass_proj) { - const query = [] + const query = []; if (!params) return; let mylkLF = params.lk_LF; if (params.af_objId_tab) { - const myobj = {} + const myobj = {}; myobj['myId' + num] = {'$toObjectId': '$' + params.lk_LF}; query.push( {'$addFields': myobj}, @@ -1053,9 +1096,9 @@ module.exports = { } if (params.lk_tab) { - let proj = params.lk_proj + let proj = params.lk_proj; if (!!pass_proj) { - proj = pass_proj + proj = pass_proj; } query.push( { @@ -1096,7 +1139,6 @@ module.exports = { let query = []; - if (params.filter && params.fieldsearch) { let myregexp = {}; @@ -1160,9 +1202,11 @@ module.exports = { if (params.filterand.includes( shared_consts.FILTER_USER_CODICE_AUTH_TELEGRAM)) filtriadded.push({'profile.teleg_checkcode': {$gt: 1}}); - if (params.filterand.includes(shared_consts.FILTER_USER_NO_EMAIL_VERIFICATA)) + if (params.filterand.includes( + shared_consts.FILTER_USER_NO_EMAIL_VERIFICATA)) filtriadded.push({verified_email: false}); - if (params.filterand.includes(shared_consts.FILTER_USER_NO_VERIFIED_APORTADOR)) + if (params.filterand.includes( + shared_consts.FILTER_USER_NO_VERIFIED_APORTADOR)) filtriadded.push({ $or: [ {verified_by_aportador: {$exists: false}}, @@ -1245,8 +1289,8 @@ module.exports = { if (params.filtercustom) { for (const myfilter of params.filtercustom) { - if (myfilter["userId"]) { - myfilter["userId"] = ObjectID(myfilter["userId"]); + if (myfilter['userId']) { + myfilter['userId'] = ObjectID(myfilter['userId']); } filtriadded.push(myfilter); } @@ -1257,7 +1301,8 @@ module.exports = { } if (params.options) { - if (this.isBitActive(params.options, shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS)) { + if (this.isBitActive(params.options, + shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS)) { } } @@ -1286,13 +1331,12 @@ module.exports = { if (numrowend < 0) numrowend = 1; - if (newvers) { // NUOVA VERSIONE let proj = params.lookup2 ? params.lookup2.lk_proj : null; const q1 = this.getLookup(params.lookup1, 1, proj); - if (q1) query = [...query, ...q1] + if (q1) query = [...query, ...q1]; const q2 = this.getLookup(params.lookup2, 2, proj); if (q2) query = [...query, ...q2]; @@ -1312,10 +1356,9 @@ module.exports = { } else { // VECCHIA VERSIONE const q1 = this.getLookup(params, 1); - if (q1) query = [...query, ...q1] + if (q1) query = [...query, ...q1]; } - query.push( { $group: { @@ -1919,12 +1962,12 @@ module.exports = { } }, - extractFileName: function (filename) { - return path.basename(filename) + extractFileName: function(filename) { + return path.basename(filename); }, - extractFilePath: function (filename) { - return path.dirname(filename) + extractFilePath: function(filename) { + return path.dirname(filename); }, delete(mypath, alsothumb, callback) { @@ -1932,7 +1975,8 @@ module.exports = { fs.unlink(mypath, function(err) { if (alsothumb) { try { - let img_small = path.dirname(mypath) + '/' + server_constants.PREFIX_IMG_SMALL + path.basename(mypath); + let img_small = path.dirname(mypath) + '/' + + server_constants.PREFIX_IMG_SMALL + path.basename(mypath); fs.unlink(img_small, () => {}); } catch (e) { console.error(err); @@ -2212,7 +2256,7 @@ module.exports = { versionarr = versionarr.reverse(); for (let i = 0; i < versionarr.length; i++) { - version += versionarr[i] * Math.pow(10, i*2); + version += versionarr[i] * Math.pow(10, i * 2); } return parseInt(version); @@ -2222,8 +2266,8 @@ module.exports = { return mystr.replace(/-/g, '/'); }, - isNumber(n){ - return typeof(n) != "boolean" && !isNaN(n) && n; + isNumber(n) { + return typeof (n) != 'boolean' && !isNaN(n) && n; }, getNumObj(obj) { let count = 0; diff --git a/src/server/tools/shared_nodejs.js b/src/server/tools/shared_nodejs.js index 8deca98..867a736 100755 --- a/src/server/tools/shared_nodejs.js +++ b/src/server/tools/shared_nodejs.js @@ -36,9 +36,13 @@ module.exports = { FRIENDSCMD: { SETTRUST: 121, + REQFRIEND: 125, SETFRIEND: 132, REMOVE_FROM_MYFRIENDS: 144, + REFUSE_REQ_FRIEND: 145, + CANCEL_REQ_FRIEND: 146, BLOCK_USER: 155, + FIND_PEOPLE: 166, }, REPORT_FILT_RESP: 1,