4854 lines
144 KiB
JavaScript
Executable File
4854 lines
144 KiB
JavaScript
Executable File
const os = require('os');
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
require('../config/config');
|
||
require('../models/subscribers');
|
||
|
||
const printf = require('util').format;
|
||
|
||
const CryptoJS = require('crypto-js');
|
||
const Url = require('url-parse');
|
||
|
||
const { ObjectID, ObjectId } = require('mongodb');
|
||
|
||
const shared_consts = require('./shared_nodejs');
|
||
|
||
const mongoose = require('mongoose').set('debug', false);
|
||
|
||
const server_constants = require('./server_constants');
|
||
|
||
// SETTINGS WebPush Configuration
|
||
const webpush = require('web-push');
|
||
|
||
const i18n = require('i18n');
|
||
|
||
const FILELOG = 'filelog.txt';
|
||
const FILEEVENTS = 'logevents.txt';
|
||
const FILEMANAGERS = 'logmanagers.txt';
|
||
const FILETRANSACTION = 'logtrans.txt';
|
||
const FILEERRLOGIN = 'errlogin.txt';
|
||
const FILESOSTITUZIONI = 'log_sostituzioni.txt';
|
||
const FILEIP_TO_BAN = 'log_iptoban.txt';
|
||
const FILENAVE = 'logNave.txt';
|
||
const subject = process.env.VAPI_KEY_SUBJECT;
|
||
const publicVapidKey = process.env.PUBLIC_VAPI_KEY;
|
||
const privateVapidKey = process.env.PRIVATE_VAPI_KEY;
|
||
|
||
const FIELDS_REGEX = ['username', 'name', 'surname'];
|
||
|
||
// Code goes here
|
||
const keySize = 256;
|
||
const ivSize = 128;
|
||
const iterations = 100;
|
||
|
||
if (!!process.env.GCM_API_KEY && process.env.GCM_API_KEY !== '') {
|
||
webpush.setGCMAPIKey(process.env.GCM_API_KEY);
|
||
|
||
webpush.setVapidDetails(subject, publicVapidKey, privateVapidKey);
|
||
}
|
||
// console.log('setVapidDetails... config...');
|
||
|
||
// To Translate!
|
||
const textlang = {
|
||
it: {
|
||
'L\'Email è già stata Verificata': 'L\'Email è già stata Verificata',
|
||
'Nuova Registrazione': 'Nuova Registrazione',
|
||
'Effettuata una Nuova Registrazione': 'Effettuata una Nuova Registrazione',
|
||
'partecipanti': 'partecipanti all\'Evento',
|
||
'partecipanti a Pranzo': 'partecipanti a Pranzo',
|
||
'partecipanti a Cena': 'partecipanti a Cena',
|
||
'partecipanti a Cena Condivisa': 'partecipanti a Cena Condivisa',
|
||
'TESTO_ASSISTENZA': '<strong><a href="%s">👉 Per entrare nel Sito</a></strong>\n\n' +
|
||
'👉 <strong><a href="https://freeplanet.app/requestresetpwd">Hai dimenticato la password?</a></strong>\n\n',
|
||
'BENVENUTO': 'Benvenut@',
|
||
'TUE_NAVI': 'Ecco le tue Navi programmate',
|
||
'HAI_I_7_REQUISITI': 'PRIMI PASSI OK!\nHai i Primi Requisiti per Entrare nella Lista !',
|
||
'NON_HAI_I_7_REQUISITI': 'Attenzione!\nAncora non hai i 7 Requisiti per Entrare nella Lista !',
|
||
'INFO_LA_MIA_LAVAGNA': '✨ Lista dei Passi: ✨ \n',
|
||
'INFO_LAVAGNA_SITO_COMPLETARE': 'Per completare tutti i requisiti vai sul sito:\n%s\n👉🏻 <a href="%s">Entra nella tua Lavagna</a>.\n',
|
||
'INFO_LAVAGNA_SITO': 'Per vedere in dettaglio lo <strong>STATO</strong>, sul sito \n 👉🏻 <a href="%s">Entra nella tua Lavagna</a>.\n',
|
||
'INFO_LINK_DA_CONDIVIDERE': 'Link da condividere ai tuoi invitati per farli registrare al sito:\n\n%s',
|
||
'INFO_LINK_ZOOM': 'Link da condividere per partecipare allo Zoom (Conferenza OnLine):\n%s',
|
||
'ZOOM_CONFERENCE': 'Ecco il programma delle Conferenze (Zoom) aperti a TUTTI:',
|
||
'NON_VERIF': 'Non Verificata',
|
||
'VERIF': 'Verificata',
|
||
'EMAIL': 'Email',
|
||
'BOT': 'BOT',
|
||
'EMAIL_NON_VERIF': 'Email Non Verificata\nleggi la tua casella email e trova **"Confermare la Registrazione"**\ne clicca sul bottone **"Verifica Registrazione"**',
|
||
'TELEGRAM_NOT_CONNECTED': 'Telegram non associato al tuo account!',
|
||
'NESSUN_INVITATO': 'Non hai invitato nessuno',
|
||
'ZOOM_PARTECIPATO': 'Partecipazione ad almeno 1 Conferenza (Zoom)',
|
||
'LINEE_GUIDA': 'Accettato le Linee Guida',
|
||
'VIDEO_INTRO': 'Visto il Video',
|
||
'SCRITTO_SOGNO': 'Hai scritto il tuo Sogno',
|
||
'PAYMENTS': 'Modalità di Pagamento',
|
||
'INVITATI': 'persone registrate che hai invitato',
|
||
'INVITATI_ATTIVI': 'Invitati con i 7 Requisiti',
|
||
'NONREG': 'Invitati non Registrati',
|
||
'CLICCA_PER_ZOOM': 'AL GIORNO E ORA INDICATA, PER ENTRARE NELLA VIDEO-CONFERENZA, CLICCA SUL LINK INDICATO',
|
||
'CLICCA_ENTRA': 'CLICCA QUI PER ENTRARE !',
|
||
'ZOOM_INIZIATO': 'QUESTA CONFERENZA E\' INIZIATA!',
|
||
'SCEGLI_VOCE': 'scegli una voce:',
|
||
'INVITATI_LISTA': 'I Tuoi Invitati (in verde con almeno i primi 7 Requisiti)',
|
||
'CIAO': 'Ciao',
|
||
'ADDED_TOLISTAINGRESSO': '<strong>Complimenti! 🎊</strong>\nSei stato aggiunto alla <strong>Lista D\'Imbarco</strong> !\nNei prossimi giorni riceverai un messaggio qui quando la tua Nave sarà pronta a partire.\nRicorda che per salire di graduatoria, puoi condividere il Movimento con i tuoi amici ❤️.',
|
||
'REGALATO_INVITANTE': 'da fare.... 😍🎊 Hai ricevuto in Regalo un Invitato {invitato} da parte di {mittente} !',
|
||
'NO_PROG': 'Attualmente non sei ancora dentro alla Lista d\'Imbarco!',
|
||
'SEND_LINK_CHAT_DONATORI': 'Ciao %s!\nLa tua NAVE sta finalmente Salpando!\nEntra nella Gift Chat della nave {%s} cliccando qui: %s',
|
||
'SEND_LINK_CHAT_SOGNATORE': 'Ciao %s!\nOggi Diventi Sognatore !!! 🎊🎊🎊 Entra nella Gift Chat della nave {%s} cliccando qui: %s',
|
||
'ENTRA_GIFT_CHAT': 'Entra nella Gift Chat',
|
||
'DATA_PART_NAVE': 'data di Partenza della Nave:',
|
||
'SOGNATORE': 'SOGNATORE',
|
||
'INTERMEDIO': 'Intermedio',
|
||
'MEDIATORE': 'MEDIATORE',
|
||
'DONATORI': 'DONATORI',
|
||
'RITESSITURA': 'RITESSITURA',
|
||
'NAVE COMPLETATA': 'NAVE COMPLETATA',
|
||
'Doni Effettuati': 'Doni Effettuati',
|
||
'Facilitatore che affianchèra il Mediatore': 'Facilitatore che affianchèra il Mediatore',
|
||
'APERTURA_CHIUSURA_GIFT_CHAT': '%s: Apertura GIFT CHAT\n%s Chiusura GIFT CHAT\nNota Bene: Hai tempo 3 giorni dall\'apertura per entrare in Chat ed effettuare il tuo Dono, dopodichè effettueremo la sostituzione.',
|
||
'Giorno di Apertura GIFT CHAT': 'Giorno di Apertura GIFT CHAT',
|
||
'Giorno in cui Inviare il DONO': 'Hai 3 giorni di tempo per inviare il tuo dono.\nGiorno di Chiusura',
|
||
'SPOSTATO': 'Sei stato Spostato in una Nuova Nave !',
|
||
'Note': 'Note',
|
||
'TEMPORANEA': 'TEMPORANEA',
|
||
'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',
|
||
'RICHIESTA_HANDSHAKE': '🌈 %s ha comunicato che ti conosce personalmente e ha fiducia in te.',
|
||
'ACCETTATO_SUL_GRUPPO': '✅ Sei stato accettato da %s a far parte del Gruppo %s',
|
||
'CREATO_NUOVO_GRUPPO': '✅ Hai appena creato un nuovo Gruppo chiamato %s',
|
||
'ACCETTATO_NOTIFICA_ADMINS': '✅ l\'utente %s è stato accettato a far parte del Gruppo %s (da parte di %s)',
|
||
'GROUP_REQUEST': 'Richiesta di entrare nel Gruppo %s da parte di %s',
|
||
"CLICCA_QUI": "CLICCA QUI",
|
||
},
|
||
si: {},
|
||
es: {
|
||
'L\'Email è già stata Verificata': 'El correo electrónico ya ha sido verificado',
|
||
'Nuova Registrazione': 'Nuevo Registro',
|
||
'Effettuata una Nuova Registrazione': 'Se ha realizado un nuevo registro',
|
||
'partecipanti': 'participantes',
|
||
'partecipanti a Pranzo': 'partecipanti a Pranzo',
|
||
'partecipanti a Cena': 'partecipanti a Cena',
|
||
'TESTO_ASSISTENZA': 'Para entrar en el sitio:\n%s\n\n' +
|
||
'¿Olvidó su contraseña para acceder al sitio?\nhttps://freeplanet.app/requestresetpwd\n\n',
|
||
'BENVENUTO': 'Bienvenido',
|
||
'TUE_NAVI': 'Aquí están sus naves programadas',
|
||
'HAI_I_7_REQUISITI': '¡LOS PRIMEROS PASOS ESTÁN BIEN!\nTiene los primeros 7 requisitos para entrar en la lista de embarque!',
|
||
'NON_HAI_I_7_REQUISITI': '¡Atención!\nTodavía no tienes los 7 requisitos para entrar en la lista de embarque!',
|
||
'HAI_I_9_REQUISITI': '¡FELICITACIONES!\n¡Has completado los 9 pasos de la Guía! Gracias por ayudar a expandirse!',
|
||
'NON_HAI_I_9_REQUISITI': 'Recuerda que puedes ayudar a que el Movimiento crezca y se expanda compartiendo nuestro viaje con todos.!',
|
||
'INFO_LA_MIA_LAVAGNA': '✨ Lista de pasos: ✨ \n',
|
||
'INFO_LAVAGNA_SITO_COMPLETARE': 'Para completar todos los requisitos vaya al sitio:\n%s\nPara ver el estado de su nave y sus invitados,👉🏻 <a href="%s">Pizarra</a>.\n',
|
||
'INFO_LAVAGNA_SITO': 'Para ver en detalle el estado de su nave, en el sitio web, haga clic en las 3 líneas de la parte superior izquierda y vaya a "Pizarra"..\n',
|
||
'INFO_LINK_DA_CONDIVIDERE': 'Enlaces para compartir con sus invitados para que se registren en el sitio web:\n\n%s',
|
||
'INFO_LINK_ZOOM': 'Enlaces para compartir para participar en el Zoom (Conferencia en línea):\n%s',
|
||
'ZOOM_CONFERENCE': 'Aquí puedes encontrar las fechas de programación en el Zoom:',
|
||
'NON_VERIF': 'No verificado',
|
||
'VERIF': 'Verificado',
|
||
'EMAIL': 'Email',
|
||
'BOT': 'BOT',
|
||
'EMAIL_NON_VERIF': 'Correo electrónico no verificado\nlea su buzón y encuentre **"Confirmar Registro "** <marca>y haga clic en el botón **"Verificar Registro "**.',
|
||
'TELEGRAM_NOT_CONNECTED': 'Telegram no asociado a su cuenta!',
|
||
'NESSUN_INVITATO': 'No invitaste a nadie',
|
||
'ZOOM_PARTECIPATO': 'Participación en al menos 1 Conferencia (Zoom)',
|
||
'LINEE_GUIDA': 'Directrices aceptadas',
|
||
'VIDEO_INTRO': 'Ver el video',
|
||
'SCRITTO_SOGNO': 'Escribiste tu sueño',
|
||
'PAYMENTS': 'Métodos de pago',
|
||
'INVITATI': 'las personas registradas que usted invitó',
|
||
'INVITATI_ATTIVI': 'Invitado con los 7 requisitos',
|
||
'NONREG': 'Invitados no registrados',
|
||
'CLICCA_PER_ZOOM': 'AL DÍA Y HORA INDICADOS, PARA ENTRAR EN LA VIDEOCONFERENCIA, PULSE AQUÍ',
|
||
'CLICCA_ENTRA': 'HAGA CLIC AQUÍ PARA ENTRAR !',
|
||
'ZOOM_INIZIATO': 'ESTA CONFERENCIA HA COMENZADO!',
|
||
'SCEGLI_VOCE': 'elegir una voz:',
|
||
'INVITATI_LISTA': 'Sus invitados (en verde con al menos los 7 primeros requisitos)',
|
||
'CIAO': 'Hola',
|
||
'ADDED_TOLISTAINGRESSO': 'Has sido añadido a la lista de personas que entrarán en Lista de embarque!',
|
||
'NO_PROG': 'Actualmente no está en la lista de embarque.!',
|
||
'SEND_LINK_CHAT_DONATORI': 'Hola %s!\n¡Tu barco por fin está navegando!\nEntra en el Gift Chat haciendo clic aquí: %s',
|
||
'SEND_LINK_CHAT_SOGNATORE': '¡Hola!\n¡Hoy te conviertes en un soñador! 🎊🎊🎊 Entre en el Chat de Regalos de la nave {%s} haciendo clic aquí: %s',
|
||
'ENTRA_GIFT_CHAT': 'Entre en el Chat de Regalos',
|
||
'DATA_PART_NAVE': 'fecha de salida de la nave:',
|
||
'SOGNATORE': 'SOÑADOR',
|
||
'INTERMEDIO': 'Intermedio',
|
||
'MEDIATORE': 'MEDIATOR',
|
||
'DONATORI': 'DONANTES',
|
||
'RITESSITURA': 'RETEJIDO',
|
||
'NAVE COMPLETATA': 'NAVE COMPLETADA',
|
||
'Doni Effettuati': 'Regalos Realizados',
|
||
'Facilitatore che affianchèra il Mediatore': 'Facilitatore de apoyo al Donante',
|
||
'APERTURA_CHIUSURA_GIFT_CHAT': '%s: Apertura del CHAT DE REGALOS\n%s Cierre del CHAT DE REGALOS\nNota: Tienes 3 días desde la apertura para entrar en el Chat y hacer tu Regalo, después de lo cual haremos el reemplazo',
|
||
'SPOSTATO': 'Has sido trasladado a una nueva nave !',
|
||
'Note': 'Notas',
|
||
'TEMPORANEA': 'TEMPORAL',
|
||
'NAVE': 'NAVE',
|
||
'MSG_SEND_FROM': 'Mensaje enviado por',
|
||
'ZOOM_CONFERMATO': '¡Se ha confirmado que ha visto la Video Conferencia de Bienvenida!',
|
||
'RICHIESTA_AMICIZIA': 'Richiesta d\'Amicizia da parte di %s',
|
||
'ACCETTATO_SUL_GRUPPO': 'Sei stato accettato da %s a far parte del Gruppo %s',
|
||
'ACCETTATO_NOTIFICA_ADMINS': 'l\'utente %s è stato accettato a far parte del Gruppo %s (da parte di %s)',
|
||
'RICHIESTA_BLOCCO_GRUPPO': 'Richiesta di bloccare il Gruppo %s da parte di %s',
|
||
},
|
||
enUs: {
|
||
'partecipanti': 'participants',
|
||
'partecipanti a Pranzo': 'partecipanti a Pranzo',
|
||
'partecipanti a Cena': 'partecipanti a Cena',
|
||
'TESTO_ASSISTENZA': 'To enter the Site:\n%s\n\nForgot your password to access the site?\n' +
|
||
'https://freeplanet.app/requestresetpwd\nChat AYNI BOT (this one):\nhttps://t.me/notevoleaynibot\n\n',
|
||
'BENVENUTO': 'Welcome',
|
||
'TUE_NAVI': 'Here are your programmed ships',
|
||
'HAI_I_7_REQUISITI': 'FIRST STEPS OK!\nYou have the First 7 Requirements to Enter the Boarding List!',
|
||
'NON_HAI_I_7_REQUISITI': 'Attention!\nYou still do not have the 7 requirements to enter the boarding list!',
|
||
'INFO_LA_MIA_LAVAGNA': '✨ Step List: ✨ \n',
|
||
'INFO_LAVAGNA_SITO_COMPLETARE': 'To complete all the requirements go to the site:%s\nTo see the status of your Ship and your guests\n👉🏻 <a href="%s">Dashboard</a>\n',
|
||
'INFO_LAVAGNA_SITO': 'To see in detail the status of your ship, on the website, click on the 3 lines at the top left and go to "Blackboard".\n',
|
||
'INFO_LINK_DA_CONDIVIDERE': 'Links to share with your guests to have them register on website:\n\n%s',
|
||
'INFO_LINK_ZOOM': 'Links to share to participate in Zoom (Online Conference):\n%s',
|
||
'ZOOM_CONFERENCE': 'Here you can find the Zoom Conference Planning:',
|
||
'NON_VERIF': 'Not Verified',
|
||
'VERIF': 'Verified',
|
||
'EMAIL': 'Email',
|
||
'BOT': 'BOT',
|
||
'EMAIL_NON_VERIF': 'Email Not Verified\nread your mailbox and find **"Confirm Registration "**<br>and click on the button **"Verify Registration "**.',
|
||
'TELEGRAM_NOT_CONNECTED': 'Telegram not associated with your account!',
|
||
'NESSUN_INVITATO': 'You didn\'t invite anyone',
|
||
'ZOOM_PARTECIPATO': 'Participation in at least 1 Conference (Zoom)',
|
||
'LINEE_GUIDA': 'Guidelines Accepted',
|
||
'VIDEO_INTRO': 'Seen the Video',
|
||
'SCRITTO_SOGNO': 'You wrote your Dream',
|
||
'PAYMENTS': 'Methods of Payment',
|
||
'INVITATI': 'registered people you invited',
|
||
'INVITATI_ATTIVI': 'Guests with the 7 Requirements',
|
||
'NONREG': 'Non-registered Guests',
|
||
'CLICCA_PER_ZOOM': 'TO THE DAY AND TIME INDICATED, TO ENTER THE VIDEO-CONFERENCE, CLICK HERE',
|
||
'CLICCA_ENTRA': 'CLICK HERE TO ENTER !',
|
||
'ZOOM_INIZIATO': 'THIS CONFERENCE HAS BEGUN!',
|
||
'SCEGLI_VOCE': 'choose a menu item:',
|
||
'INVITATI_LISTA': 'Your Guests (in green with at least the first 7 requirements)',
|
||
'CIAO': 'Hi',
|
||
'ADDED_TOLISTAINGRESSO': 'You have been added to the List of people who will enter the Boarding List!',
|
||
'NO_PROG': 'You are not currently on the boarding list.!',
|
||
'SEND_LINK_CHAT_DONATORI': 'Hi %s!\nYour ship is finally sailing!\nEnter the Gift Chat by clicking here: %s',
|
||
'SEND_LINK_CHAT_SOGNATORE': 'Hello %s!\nToday you become a Dreamer! 🎊🎊🎊 Enter the ship\'s Gift Chat {%s} by clicking here: %s',
|
||
'ENTRA_GIFT_CHAT': 'Enter the ship\'s Gift Chat',
|
||
'DATA_PART_NAVE': 'date of departure of the ship:',
|
||
'SOGNATORE': 'DREAMER',
|
||
'INTERMEDIO': 'Intermediate',
|
||
'MEDIATORE': 'MEDIATOR',
|
||
'DONATORI': 'DONOR',
|
||
'RITESSITURA': 'RE-ENTER',
|
||
'NAVE COMPLETATA': 'SHIP COMPLETED',
|
||
'Doni Effettuati': 'Gifts Made',
|
||
'Facilitatore che affianchèra il Mediatore': 'Facilitatore supporting the Mediator',
|
||
'APERTURA_CHIUSURA_GIFT_CHAT': '%s: Opening GIFT CHAT\n%s Closing GIFT CHAT\nNote: You have 3 days from the opening to enter the Chat and make your Gift, after which we will make the replacement.',
|
||
'SPOSTATO': 'You\'ve been moved to a New Ship !',
|
||
'Note': 'Note',
|
||
'TEMPORANEA': 'TEMPORARY',
|
||
'NAVE': 'SHIP',
|
||
'MSG_SEND_FROM': 'Msg sent by',
|
||
'ZOOM_CONFERMATO': 'You have been confirmed to have seen the Welcome Video Conference!',
|
||
'RICHIESTA_AMICIZIA': 'Richiesta d\'Amicizia da parte di %s',
|
||
'ACCETTATO_SUL_GRUPPO': 'Sei stato accettato da %s a far parte del Gruppo %s',
|
||
'ACCETTATO_NOTIFICA_ADMINS': 'l\'utente %s è stato accettato a far parte del Gruppo %s (da parte di %s)',
|
||
'RICHIESTA_BLOCCO_GRUPPO': 'Richiesta di bloccare il Gruppo %s da parte di %s',
|
||
},
|
||
fr: {
|
||
'L\'Email è già stata Verificata': 'Le courrier électronique a déjà été vérifié',
|
||
'Nuova Registrazione': 'Nouvelle inscription',
|
||
'Effettuata una Nuova Registrazione': 'Un nouvel enregistrement a été effectué',
|
||
'partecipanti': 'participants',
|
||
'partecipanti a Pranzo': 'partecipanti a Pranzo',
|
||
'partecipanti a Cena': 'partecipanti a Cena',
|
||
'TESTO_ASSISTENZA': 'Pour entrer sur le site:\n%s\n\n' +
|
||
'Vous avez oublié votre mot de passe pour accéder au site ?\nhttps://ayni.gifteconomy.app/requestresetpwd\n\n',
|
||
'BENVENUTO': 'Bienvenue',
|
||
'TUE_NAVI': 'Voici vos navires programmés',
|
||
'HAI_I_7_REQUISITI': 'PREMIÈRES ÉTAPES OK!\nvous avez les 7 premiers Requis pour Entrer dans la liste d\'embarquement!',
|
||
'NON_HAI_I_7_REQUISITI': '\'Attention!\nVous ne remplissez pas encore les 7 conditions pour figurer sur la liste d\'embarquement!',
|
||
'HAI_I_9_REQUISITI': 'FÉLICITATIONS!\n!Vous avez franchi les 9 étapes de la conduite ! Merci d\'avoir aidé à se développer!',
|
||
'NON_HAI_I_9_REQUISITI': 'N\'oubliez pas que vous pouvez aider le Mouvement à grandir et à se développer en partageant notre voyage avec tout le monde.!',
|
||
'INFO_LA_MIA_LAVAGNA': '✨ Liste des étapes: ✨ \n',
|
||
'INFO_LAVAGNA_SITO_COMPLETARE': 'Pour remplir toutes les conditions, rendez-vous sur le site:\n%s\nPour voir le statut de votre navire et de vos invités\n 👉🏻 <a href="%s">Tableau</a>.\n',
|
||
'INFO_LAVAGNA_SITO': 'Pour voir en détail le statut de votre navire, sur le site, cliquez sur les 3 lignes en haut à gauche et allez sur "Tableau".\n',
|
||
'INFO_LINK_DA_CONDIVIDERE': 'Liens à partager avec vos invités pour qu\'ils s\'inscrivent sur le site web:\n\n%s',
|
||
'INFO_LINK_ZOOM': 'Liens à partager pour participer à Zoom (Conférence en ligne):\n%s',
|
||
'ZOOM_CONFERENCE': 'Vous trouverez ici les dates de programmation sur Zoom:',
|
||
'NON_VERIF': 'Non vérifié',
|
||
'VERIF': 'Vérifié',
|
||
'EMAIL': 'Courriel',
|
||
'BOT': 'BOT',
|
||
'EMAIL_NON_VERIF': 'Courriel non vérifié\nlisez votre boîte aux lettres et trouvez **"Confirmer l\'inscription "**<br>et cliquez sur le bouton **"Vérifier l\'inscription "**.',
|
||
'TELEGRAM_NOT_CONNECTED': 'Télégramme non associé à votre compte!',
|
||
'NESSUN_INVITATO': 'Vous n\'avez invité personne',
|
||
'ZOOM_PARTECIPATO': 'Participation à au moins 1 conférence (Zoom)',
|
||
'LINEE_GUIDA': 'Lignes directrices acceptées',
|
||
'VIDEO_INTRO': 'Voir la vidéo',
|
||
'SCRITTO_SOGNO': 'Vous avez écrit votre rêve',
|
||
'PAYMENTS': 'Modes de paiement',
|
||
'INVITATI': 'personnes inscrites que vous avez invitées',
|
||
'INVITATI_ATTIVI': 'Invité avec les 7 exigences',
|
||
'NONREG': 'Invités non enregistrés',
|
||
'CLICCA_PER_ZOOM': 'AU JOUR ET À L\'HEURE INDIQUÉS, POUR ENTRER DANS LA VIDÉOCONFÉRENCE, CLIQUEZ ICI',
|
||
'CLICCA_ENTRA': 'CLIQUEZ ICI POUR ENTRER !',
|
||
'ZOOM_INIZIATO': 'CETTE CONFÉRENCE A COMMENCÉ!',
|
||
'SCEGLI_VOCE': 'choisir une voix:',
|
||
'INVITATI_LISTA': 'Vos invités (en vert avec au moins les 7 premières exigences)',
|
||
'CIAO': 'Salut',
|
||
'ADDED_TOLISTAINGRESSO': 'Vous avez été ajouté à la liste d\'embarquement !',
|
||
'NO_PROG': 'Vous n\'êtes pas encore sur la liste d\'embarquement.!',
|
||
'SEND_LINK_CHAT_DONATORI': 'Salut %s!\nVotre SHIP prend enfin la mer.!\nEntrez dans le Chat Cadeau en cliquant ici: %s',
|
||
'SEND_LINK_CHAT_SOGNATORE': 'Bonjour %s !\nAujourd\'hui, vous devenez un Rêveur ! 🎊🎊🎊 Entrez dans le chat des cadeaux du navire {%s} en cliquant ici : %s',
|
||
'ENTRA_GIFT_CHAT': 'Entrez dans le chat des cadeaux',
|
||
'DATA_PART_NAVE': 'la date de départ du navire:',
|
||
'SOGNATORE': 'Rêveur',
|
||
'INTERMEDIO': 'Intermediaire',
|
||
'MEDIATORE': 'Médiateur',
|
||
'DONATORI': 'DONATEUR',
|
||
'RITESSITURA': 'RETESSITURA',
|
||
'NAVE COMPLETATA': 'NAVIRE COMPLÉTÉ',
|
||
'Doni Effettuati': 'Don effectués',
|
||
'Facilitatore che affianchèra il Mediatore': 'Le tuteur qui soutient le Mediateur',
|
||
'APERTURA_CHIUSURA_GIFT_CHAT': '%s : Chat d\'ouverture\n%s Clôture du GIFT CHAT\nNote: Vous avez 3 jours à partir de l\'ouverture pour entrer dans le Chat et faire votre Cadeau, après quoi nous ferons le remplacement',
|
||
'SPOSTATO': 'Vous avez été transféré sur un nouveau navire !',
|
||
'Note': 'Notes',
|
||
'TEMPORANEA': 'TEMPORAIRE',
|
||
'NAVE': 'NAVIRE',
|
||
'MSG_SEND_FROM': 'Message envoyé par',
|
||
'ZOOM_CONFERMATO': 'Vous avez été confirmé comme ayant vu la vidéoconférence de bienvenue !',
|
||
'RICHIESTA_AMICIZIA': 'Richiesta d\'Amicizia da parte di %s',
|
||
'ACCETTATO_SUL_GRUPPO': 'Sei stato accettato da %s a far parte del Gruppo %s',
|
||
'ACCETTATO_NOTIFICA_ADMINS': 'l\'utente %s è stato accettato a far parte del Gruppo %s (da parte di %s)',
|
||
'RICHIESTA_BLOCCO_GRUPPO': 'Richiesta di bloccare il Gruppo %s da parte di %s',
|
||
},
|
||
pt: {
|
||
'L\'Email è già stata Verificata': '',
|
||
'Nuova Registrazione': 'Novo Registo',
|
||
'Effettuata una Nuova Registrazione': 'Foi efectuado um novo registo',
|
||
'partecipanti': 'participantes',
|
||
'partecipanti a Pranzo': 'partecipanti a Pranzo',
|
||
'partecipanti a Cena': 'partecipanti a Cena',
|
||
'TESTO_ASSISTENZA': 'Para entrar no site:\n%s\n\n' +
|
||
'Esqueceu sua senha para acessar o site?\nhttps://freeplanet.app/requestresetpwd\n\n',
|
||
'BENVENUTO': 'Bem-vindo',
|
||
'TUE_NAVI': 'Aqui estão os seus navios programados',
|
||
'HAI_I_7_REQUISITI': 'PRIMEIROS PASSOS OK!\nVocê tem os 7 primeiros requisitos para entrar na lista de embarque!',
|
||
'NON_HAI_I_7_REQUISITI': 'Atenção!\nVocê ainda não tem os 7 requisitos para entrar na lista de embarque!',
|
||
'INFO_LA_MIA_LAVAGNA': '✨ Lista de etapas: ✨ \n',
|
||
'INFO_LAVAGNA_SITO_COMPLETARE': 'Para completar todos os requisitos ir para o sitio:\n%s\nPara ver o estado do seu navio e dos seus convidados:\n 👉🏻 <a href="%s">Entre no seu Tablero</a>.\n',
|
||
'INFO_LAVAGNA_SITO': 'Para ver em detalhe o estado do seu navio, no site, clique nas 3 linhas no canto superior esquerdo e vá para "DashBoard"..\n',
|
||
'INFO_LINK_DA_CONDIVIDERE': 'Links para partilhar com os seus convidados para que se registem no website:\n\n%s',
|
||
'INFO_LINK_ZOOM': 'Links para partilhar para participar na Zoom (Conferência Online):\n%s',
|
||
'ZOOM_CONFERENCE': 'Aqui está o programa das Conferências (Zoom) aberto a TODOS:',
|
||
'NON_VERIF': 'Não verificado',
|
||
'VERIF': 'Verificado',
|
||
'EMAIL': 'Email',
|
||
'BOT': 'BOT',
|
||
'EMAIL_NON_VERIF': 'Email Não verificado\nleia a sua caixa de correio e encontre **"Confirmar o registo"**<br>e clique no botão **"Verificação do registo"**',
|
||
'TELEGRAM_NOT_CONNECTED': 'Telegrama não associado à sua conta!',
|
||
'NESSUN_INVITATO': 'Você não convidou ninguém',
|
||
'ZOOM_PARTECIPATO': 'Participação em pelo menos 1 Conferência (Zoom)',
|
||
'LINEE_GUIDA': 'Directrizes Aceites',
|
||
'VIDEO_INTRO': 'Ver o vídeo',
|
||
'SCRITTO_SOGNO': 'Você escreveu o seu sonho',
|
||
'PAYMENTS': 'Formas de pagamento',
|
||
'INVITATI': 'pessoas registadas que convidou',
|
||
'INVITATI_ATTIVI': 'Convidado com os 7 Requisitos',
|
||
'NONREG': 'Convidados não registados',
|
||
'CLICCA_PER_ZOOM': 'PARA O DIA E HORA INDICADOS, PARA ENTRAR NA VÍDEO-CONFERÊNCIA, CLIQUE AQUI',
|
||
'CLICCA_ENTRA': 'CLIQUE AQUI PARA ENTRAR !',
|
||
'ZOOM_INIZIATO': 'ESTA CONFERÊNCIA JÁ COMEÇOU!',
|
||
'SCEGLI_VOCE': 'escolha uma voz:',
|
||
'INVITATI_LISTA': 'Os seus convidados (em verde com, pelo menos, os 7 primeiros requisitos)',
|
||
'CIAO': 'Olá',
|
||
'ADDED_TOLISTAINGRESSO': 'Foi acrescentado à Lista de Embarque !',
|
||
'NO_PROG': 'Actualmente, ainda não consta da lista de embarque.!',
|
||
'SEND_LINK_CHAT_DONATORI': 'Olà %s!\nO seu SHIP está finalmente a zarpar.!\nEntre no Gift Chat, clicando aqui: %s',
|
||
'SEND_LINK_CHAT_SOGNATORE': 'Olá %s!\nHoje você se torna um sonhador! 🎊🎊🎊 Entre no Gift Chat do navio {%s} clicando aqui: %s',
|
||
'ENTRA_GIFT_CHAT': 'Entre no Gift Chat do navio',
|
||
'DATA_PART_NAVE': 'data de partida do navio:',
|
||
'SOGNATORE': 'SONHEIROS',
|
||
'INTERMEDIO': 'Intermediar',
|
||
'MEDIATORE': 'MEDIATOR',
|
||
'DONATORI': 'DONATORES',
|
||
'RITESSITURA': 'ENTRE EM',
|
||
'NAVE COMPLETATA': 'NAVIO COMPLETADO',
|
||
'Doni Effettuati': 'Regalo Feitos',
|
||
'Facilitatore che affianchèra il Mediatore': 'Facilitatore que apoia o Mediator',
|
||
'APERTURA_CHIUSURA_GIFT_CHAT': '%s: Abertura do GIFT CHAT\n%s Fechamento GIFT CHAT\nNota: Você tem 3 dias desde a abertura para entrar no Chat e fazer o seu Presente, depois do qual faremos o substituição.',
|
||
'SPOSTATO': 'Você foi transferido para um novo navio !',
|
||
'Note': 'Notas',
|
||
'TEMPORANEA': 'TEMPORÁRIO',
|
||
'NAVE': 'NAVE',
|
||
'MSG_SEND_FROM': 'Mensagem enviada por',
|
||
'ZOOM_CONFERMATO': 'Foi-lhe confirmado que assistiu à Conferência de Vídeo de Boas-vindas!',
|
||
'RICHIESTA_AMICIZIA': 'Richiesta d\'Amicizia da parte di %s',
|
||
'ACCETTATO_SUL_GRUPPO': 'Sei stato accettato da %s a far parte del Gruppo %s',
|
||
'ACCETTATO_NOTIFICA_ADMINS': 'l\'utente %s è stato accettato a far parte del Gruppo %s (da parte di %s)',
|
||
|
||
'RICHIESTA_BLOCCO_GRUPPO': 'Richiesta di bloccare il Gruppo %s da parte di %s',
|
||
},
|
||
};
|
||
|
||
module.exports = {
|
||
MYAPPS: [],
|
||
INITDB_FIRSTIME: true,
|
||
ACAPO: '\n',
|
||
|
||
ENABLE_CRONTAB: 'CRONTAB',
|
||
UPDATE_GRADUATORIA: 'UPDATE_GRAD',
|
||
|
||
LANGADMIN: 'it',
|
||
|
||
FREEPLANET: '1',
|
||
AYNI: '7',
|
||
CNM: '10',
|
||
RISO: '13',
|
||
FIOREDELLAVITA: '15',
|
||
PIUCHEBUONO: '17',
|
||
|
||
IDAPP_BOTONGROUP: '1000',
|
||
|
||
HELP_CHAT: '',
|
||
TYPECONF_ZOOM: 'zoom',
|
||
TYPECONF_JITSI: 'jitsi',
|
||
|
||
APORTADOR_NONE: '------',
|
||
|
||
SEP: '|',
|
||
|
||
USER_ADMIN_CIRCUITS: 'paoloar77',
|
||
|
||
TYPE_PROJECT: 1,
|
||
TYPE_TODO: 2,
|
||
|
||
TipoMsg: {
|
||
SEND_LINK_CHAT_DONATORI: 1,
|
||
SEND_MSG: 2,
|
||
SEND_MSG_SINGOLO: 3,
|
||
SEND_TO_ALL: 10,
|
||
SEND_MSG_EFFETTUA_IL_DONO: 1000,
|
||
SEND_MSG_SOLLECITO_DONATORI_NO_DONO: 1005,
|
||
SEND_MSG_A_MEDIATORI: 1010,
|
||
SEND_MSG_A_SOGNATORE: 1020,
|
||
SEND_MSG_A_UTENTE_SOSTITUITO: 1030,
|
||
SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE: 1040,
|
||
SEND_MSG_DONO_NON_RICEVUTO: 1050,
|
||
},
|
||
|
||
Perm: {
|
||
PERM_NONE: 0,
|
||
PERM_FRIEND: 1,
|
||
PERM_ALL: 10,
|
||
},
|
||
|
||
Placca: {
|
||
DONATORI: 1,
|
||
TUTTI: 2,
|
||
|
||
STR_SOGNATORE: '<strong>Sognatore</strong>',
|
||
STR_MEDIATORE: '<strong>Mediatore</strong>',
|
||
STR_MEDIATORI: '<strong>Mediatori</strong>',
|
||
STR_DONATORI: '<strong>Donatori</strong>',
|
||
SOGNATORE: 'E1 🌈 ',
|
||
MEDIATORE: 'A1 💦 ',
|
||
SONOFUOCO: 0,
|
||
SONOACQUA: 3,
|
||
SONOTERRA: 2,
|
||
SONOARIA: 1,
|
||
},
|
||
|
||
FieldType: {
|
||
boolean: 1,
|
||
date: 2,
|
||
string: 4,
|
||
binary: 8,
|
||
html: 16,
|
||
select: 32,
|
||
number: 64,
|
||
typeinrec: 128,
|
||
multiselect: 256,
|
||
password: 512,
|
||
listimages: 1024,
|
||
exact: 2048,
|
||
image: 3000,
|
||
image_and_filename: 3100,
|
||
nationality: 4096,
|
||
intcode: 5000,
|
||
multioption: 6000,
|
||
onlydate: 7000,
|
||
hours: 8000,
|
||
crypted: 9000,
|
||
},
|
||
|
||
MAX_PHASES: 5,
|
||
FIRST_PROJ: '__PROJECTS',
|
||
EXECUTE_CALCPROJ: true,
|
||
|
||
gettranslate(text, lang) {
|
||
try {
|
||
return textlang[lang][text];
|
||
} catch (e) {
|
||
return textlang['it'][text];
|
||
}
|
||
},
|
||
|
||
getlangbyres(res) {
|
||
// ++Todo: res estrarre la lingua
|
||
let lang = '';
|
||
try {
|
||
lang = res.lang;
|
||
} catch (e) {
|
||
|
||
}
|
||
if (!lang) {
|
||
lang = 'it';
|
||
}
|
||
return lang;
|
||
},
|
||
|
||
get__(text, lang) {
|
||
try {
|
||
return textlang[lang][text];
|
||
} catch (e) {
|
||
return textlang['it'][text];
|
||
}
|
||
},
|
||
|
||
getres__(text, res) {
|
||
let lang = this.getlangbyres(res);
|
||
try {
|
||
return textlang[lang][text];
|
||
} catch (e) {
|
||
return textlang['it'][text];
|
||
}
|
||
},
|
||
|
||
getHostname: function () {
|
||
return os.hostname();
|
||
},
|
||
testing: function () {
|
||
return (process.env.TESTING_ON === '1');
|
||
},
|
||
|
||
mylog: function (...args) {
|
||
if (!this.testing())
|
||
console.log(args);
|
||
},
|
||
|
||
mylogoff: function (...args) {
|
||
// doing nothing
|
||
},
|
||
|
||
mylogshow: function (...args) {
|
||
console.log(args);
|
||
},
|
||
|
||
mylogserr: function (...args) {
|
||
console.error(args);
|
||
},
|
||
|
||
allfieldSendMsg: function () {
|
||
return [
|
||
'userId',
|
||
'source',
|
||
'dest',
|
||
'message',
|
||
'datemsg',
|
||
'read',
|
||
'deleted',
|
||
'origin',
|
||
'idapp',
|
||
'status',
|
||
'options'];
|
||
},
|
||
|
||
allfieldSendNotif: function () {
|
||
return [
|
||
'type',
|
||
'userId',
|
||
'sender',
|
||
'typedir',
|
||
'typeid',
|
||
'dest',
|
||
'descr',
|
||
'title',
|
||
'openUrl',
|
||
'datenotif',
|
||
'date_updated',
|
||
'read',
|
||
'deleted',
|
||
'idapp',
|
||
'tablerec',
|
||
'extrafield',
|
||
'tag',
|
||
'options',
|
||
'idrec',
|
||
'status'];
|
||
},
|
||
|
||
allfieldTodo: function () {
|
||
return [
|
||
'userId',
|
||
'pos',
|
||
'category',
|
||
'descr',
|
||
'note',
|
||
'priority',
|
||
'statustodo',
|
||
'assignedToUsers',
|
||
'created_at',
|
||
'groupId',
|
||
'modify_at',
|
||
'completed_at',
|
||
'expiring_at',
|
||
'enableExpiring',
|
||
'progress',
|
||
'modified',
|
||
'phase',
|
||
'assigned_to_userId',
|
||
'assignedToUsers',
|
||
'hoursplanned',
|
||
'hoursworked',
|
||
'start_date',
|
||
'themecolor',
|
||
'themebgcolor'];
|
||
},
|
||
|
||
allfieldMyEvent: function () {
|
||
return ['userId'];
|
||
},
|
||
|
||
allfieldTodoWithId: function () {
|
||
return ['_id', ...this.allfieldTodo()];
|
||
},
|
||
|
||
// #TODO Projects++ Add fields ...
|
||
allfieldProject: function () {
|
||
return [
|
||
'idapp',
|
||
'userId',
|
||
'respUsername',
|
||
'viceRespUsername',
|
||
'pos',
|
||
'typeproj',
|
||
'id_main_project',
|
||
'id_parent',
|
||
'descr',
|
||
'longdescr',
|
||
'groupId',
|
||
'hoursplanned',
|
||
'hoursleft',
|
||
'themecolor',
|
||
'themebgcolor',
|
||
'hoursworked',
|
||
'priority',
|
||
'statusproj',
|
||
'created_at',
|
||
'modify_at',
|
||
'completed_at',
|
||
'expiring_at',
|
||
'enableExpiring',
|
||
'progressCalc',
|
||
'modified',
|
||
'live_url',
|
||
'test_url',
|
||
'begin_development',
|
||
'begin_test',
|
||
'totalphases',
|
||
'actualphase',
|
||
'hoursweeky_plannedtowork',
|
||
'endwork_estimate'
|
||
,
|
||
'privacyread',
|
||
'privacywrite',
|
||
'tipovisu',
|
||
'view'];
|
||
},
|
||
|
||
allfieldBooking: function () {
|
||
return [
|
||
'idapp',
|
||
'userId',
|
||
'username',
|
||
'id_bookedevent',
|
||
'tableType',
|
||
'numpeople',
|
||
'numpeopleLunch',
|
||
'numpeopleDinner',
|
||
'numpeopleDinnerShared',
|
||
'msgbooking',
|
||
'modified',
|
||
'infoevent',
|
||
'datebooked',
|
||
'booked'];
|
||
},
|
||
|
||
allfieldBookingChange: function () {
|
||
return [
|
||
'numpeople',
|
||
'numpeopleLunch',
|
||
'numpeopleDinner',
|
||
'numpeopleDinnerShared',
|
||
'msgbooking',
|
||
'modified',
|
||
'infoevent',
|
||
'datebooked',
|
||
'booked'];
|
||
},
|
||
|
||
allfieldProjectWithId: function () {
|
||
return ['_id', ...this.allfieldProject()];
|
||
},
|
||
|
||
jsonCopy(src) {
|
||
return JSON.parse(JSON.stringify(src));
|
||
},
|
||
|
||
CloneRecordToNew(src) {
|
||
const myrec = Object.assign({}, src);
|
||
delete myrec._doc['_id'];
|
||
myrec._id = new ObjectID();
|
||
|
||
return myrec._doc;
|
||
},
|
||
|
||
sendBackNotif: function (subscription, payload) {
|
||
const Subscription = require('../models/subscribers');
|
||
|
||
// console.log('sendBackNotif:', subscription, payload);
|
||
|
||
const pushOptions = {
|
||
vapidDetails: {
|
||
subject: process.env.VAPI_KEY_SUBJECT,
|
||
privateKey: process.env.PRIVATE_VAPI_KEY,
|
||
publicKey: process.env.PUBLIC_VAPI_KEY,
|
||
},
|
||
TTL: payload.ttl,
|
||
headers: {},
|
||
};
|
||
|
||
// Pass object into sendNotification
|
||
return webpush.sendNotification(subscription._doc, 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
|
||
return Subscription.findOneAndRemove({ _id: subscription._id });
|
||
} else {
|
||
console.log('Subscription is no longer valid: ', err);
|
||
}
|
||
}).then((ris) => {
|
||
|
||
}).
|
||
// console.log('sendNotification', ris);
|
||
catch(err => {
|
||
console.error(err);
|
||
});
|
||
},
|
||
|
||
sendNotificationToUser: async function (userId, title, content, openUrl, openUrl2, tag, actions, id) {
|
||
const Subscription = require('../models/subscribers');
|
||
|
||
content = this.convertHTMLtoText(content);
|
||
|
||
content = this.ConvertHTMLToPlainText(content);
|
||
|
||
let payload = {
|
||
actions,
|
||
title: title,
|
||
content,
|
||
url: openUrl,
|
||
url2: openUrl2,
|
||
tag,
|
||
id,
|
||
// ttl: req.body.ttl,
|
||
// icon: req.body.icon,
|
||
// image: req.body.image,
|
||
// badge: req.body.badge,
|
||
// tag: req.body.tag
|
||
};
|
||
|
||
try {
|
||
|
||
return await Subscription.find({ userId }, (err, subscriptions) => {
|
||
if (err) {
|
||
console.error(`Error occurred while getting subscriptions`);
|
||
// res.status(500).json({
|
||
// error: 'Technical error occurred'
|
||
// });
|
||
|
||
//++ Rimuovi questo record !?
|
||
|
||
return false;
|
||
} else {
|
||
let conta = 0;
|
||
let parallelSubscriptionCalls = subscriptions.map((subscription) => {
|
||
const trovati = subscriptions.length;
|
||
return new Promise((resolve, reject) => {
|
||
const pushSubscription = {
|
||
endpoint: subscription.endpoint,
|
||
keys: {
|
||
p256dh: subscription.keys.p256dh,
|
||
auth: subscription.keys.auth,
|
||
},
|
||
};
|
||
|
||
conta++;
|
||
|
||
const parse = require('url-parse');
|
||
const parsedUrl = parse(subscription.endpoint);
|
||
const audience = parsedUrl.protocol + '//' + parsedUrl.hostname;
|
||
|
||
const vapidHeaders = webpush.getVapidHeaders(
|
||
audience,
|
||
process.env.VAPI_KEY_SUBJECT,
|
||
process.env.PUBLIC_VAPI_KEY,
|
||
process.env.PRIVATE_VAPI_KEY,
|
||
'aes128gcm',
|
||
);
|
||
|
||
const pushOptions = {
|
||
vapidDetails: {
|
||
subject: process.env.VAPI_KEY_SUBJECT,
|
||
privateKey: process.env.PRIVATE_VAPI_KEY,
|
||
publicKey: process.env.PUBLIC_VAPI_KEY,
|
||
},
|
||
TTL: payload.ttl,
|
||
headers: vapidHeaders,
|
||
};
|
||
|
||
// console.log('************ INVIO WEBPUSH.SENDNOTIFICATION N° ', conta, '/', trovati, 'A', subscription.browser);
|
||
|
||
const pushPayload = JSON.stringify(payload);
|
||
|
||
webpush.sendNotification(
|
||
pushSubscription,
|
||
pushPayload,
|
||
pushOptions,
|
||
).then((value) => {
|
||
// console.log('Invio Push', value);
|
||
resolve({
|
||
status: true,
|
||
endpoint: subscription.endpoint,
|
||
data: value,
|
||
});
|
||
}).catch(async (err) => {
|
||
console.error('err Push', err.body);
|
||
|
||
if (err.body) {
|
||
// Cancella dal DB la notifica Push, visto che da errore! (sarà scaduto)
|
||
const ris = await Subscription.deleteOne({ _id: subscription._id });
|
||
}
|
||
|
||
reject({
|
||
status: false,
|
||
endpoint: subscription.endpoint,
|
||
data: err,
|
||
});
|
||
});
|
||
}).catch(error => {
|
||
console.log('ERROR: sendNotificationToUser', error.data.body ? error.data.body : error);
|
||
});
|
||
});
|
||
// q.allSettled(parallelSubscriptionCalls).then((pushResults) => {
|
||
// console.info(pushResults);
|
||
// });
|
||
// res.json({
|
||
// data: 'Push triggered'
|
||
// });
|
||
return true;
|
||
}
|
||
});
|
||
} catch (e) {
|
||
console.error('sendNotificationToUser', e.message);
|
||
}
|
||
|
||
},
|
||
|
||
getReqByPar(idapp, usernameOrig, groupOrig) {
|
||
return {
|
||
body: {
|
||
idapp: idapp,
|
||
},
|
||
user: {
|
||
username: usernameOrig,
|
||
groupOrig,
|
||
},
|
||
};
|
||
},
|
||
|
||
sendNotificationByUsername: async function (idapp, username, cmd, telegram, usernameOrig, recObjCreator) {
|
||
|
||
var { User } = require('../models/user');
|
||
const { SendNotif } = require('../models/sendnotif');
|
||
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
const user = await User.findOne({ idapp, username }, { _id: 1, username: 1, lang: 1 }).lean();
|
||
if (!user)
|
||
return;
|
||
|
||
let userId = user._id;
|
||
let lang = user.lang;
|
||
|
||
let sendmynotif = true;
|
||
|
||
let title = this.getNomeAppByIdApp(idapp);
|
||
let descr = '';
|
||
let openUrl = '/';
|
||
let tag = '';
|
||
let actions = [];
|
||
let domanda = '';
|
||
let keyb = null;
|
||
if (cmd) {
|
||
if (cmd === shared_consts.FRIENDSCMD.REQFRIEND) {
|
||
descr = printf(this.get__('RICHIESTA_AMICIZIA', lang), usernameOrig);
|
||
openUrl = '/my/' + usernameOrig;
|
||
tag = 'reqfriends';
|
||
|
||
const userrecDest = await User.getUserShortDataByUsername(idapp, usernameOrig);
|
||
|
||
if (userrecDest) {
|
||
sendmynotif = false; // non lo rimandare 2 volte !
|
||
// SEND TELEGRAM NOTIFICATION
|
||
telegrambot.askConfirmationUserFriend(idapp, shared_consts.CallFunz.RICHIESTA_AMICIZIA, userrecDest, username, usernameOrig);
|
||
}
|
||
|
||
} else if (cmd === shared_consts.FRIENDSCMD.SETHANDSHAKE) {
|
||
const userrecDest = await User.getUserShortDataByUsername(idapp, usernameOrig);
|
||
|
||
const foundIfAlready = await User.isMyHandShake(idapp, username, usernameOrig);
|
||
if (!foundIfAlready) {
|
||
telegrambot.askConfirmationUserFriend(idapp, shared_consts.CallFunz.RICHIESTA_HANDSHAKE, userrecDest, username, usernameOrig);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (userId) {
|
||
// SEND PUSH NOTIFICATION
|
||
await this.sendNotificationToUser(userId, title, descr, openUrl, '', tag, actions);
|
||
}
|
||
|
||
if (telegram && sendmynotif) {
|
||
|
||
const idtelegram = await User.TelegIdByUsername(idapp, username);
|
||
|
||
await telegrambot.sendMsgTelegramByIdTelegram(idapp, idtelegram, descr + domanda, undefined, undefined, true, keyb);
|
||
}
|
||
|
||
},
|
||
|
||
sendMsgTelegramToAdmin: async function (idapp, msg) {
|
||
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
const idtelegram = telegrambot.ADMIN_IDTELEGRAM_SERVER;
|
||
|
||
await telegrambot.sendMsgTelegramByIdTelegram(idapp, idtelegram, msg);
|
||
},
|
||
|
||
sendNotifAndMsgTelegram: async function (idapp, userId, objmsg, telegram, msgextrateleg) {
|
||
|
||
if (userId) {
|
||
await this.sendNotificationToUser(userId, objmsg.title, objmsg.descr, objmsg.openUrl, '', objmsg.tag, objmsg.actions);
|
||
}
|
||
|
||
if (telegram) {
|
||
var { User } = require('../models/user');
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
const idtelegram = await User.TelegIdById(idapp, userId);
|
||
|
||
const msgteleg = objmsg.descr + (msgextrateleg ? '\n' + msgextrateleg : '');
|
||
await telegrambot.sendMsgTelegramByIdTelegram(idapp, idtelegram, msgteleg);
|
||
}
|
||
},
|
||
|
||
sendNotifGroupByUsername: async function (
|
||
cmd, idapp, usernameOrig, usernameDest, username_action, groupname, myrecgroup, isAdmin, username_worked) {
|
||
|
||
const { SendNotif } = require('../models/sendnotif');
|
||
const { User } = require('../models/user');
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
const req = this.getReqByPar(idapp, usernameOrig);
|
||
|
||
const user = await User.findOne({ idapp, username: usernameDest },
|
||
{ _id: 1, lang: 1 });
|
||
if (user) {
|
||
|
||
let lang = user.lang;
|
||
let paramsObj = {
|
||
usernameDest,
|
||
groupnameDest: groupname,
|
||
username_action: username_action,
|
||
singleadmin_username: usernameDest,
|
||
options: 0,
|
||
lang,
|
||
isAdmin,
|
||
username_worked,
|
||
};
|
||
|
||
let sendnotif = true;
|
||
let typedir = shared_consts.TypeNotifs.TYPEDIR_GROUPS;
|
||
let typeid = 0;
|
||
let onlysave = false;
|
||
let numuseringroup = await User.countUsersInGroup(idapp, groupname);
|
||
|
||
if (cmd) {
|
||
if (cmd === shared_consts.GROUPSCMD.SETGROUP) {
|
||
if (myrecgroup && myrecgroup.createdBy === usernameDest && numuseringroup <= 1) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_NEW_REC;
|
||
} else {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_ACCEPTED;
|
||
}
|
||
} else if (cmd === shared_consts.GROUPSCMD.REFUSE_REQ_GROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_REFUSED;
|
||
} else if (cmd === shared_consts.GROUPSCMD.REMOVE_FROM_MYGROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_REMOVED;
|
||
} else if (cmd === shared_consts.GROUPSCMD.REQGROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_REQUEST_TO_ENTER;
|
||
// paramsObj.options = MessageOptions.Notify_OnlyToNotifinApp + MessageOptions.Notify_ByBotTelegram;
|
||
const myuserdata = await User.getUserShortDataByUsername(idapp, username_action);
|
||
telegrambot.askConfirmationUser(idapp, shared_consts.CallFunz.RICHIESTA_GRUPPO, myuserdata, usernameDest, groupname,
|
||
myrecgroup._id);
|
||
onlysave = false;
|
||
} else if (cmd === shared_consts.GROUPSCMD.BLOCK_USER) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_BLOCK_USER;
|
||
} else if (cmd === shared_consts.GROUPSCMD.DELETE_GROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_DELETE_USER;
|
||
} else if (cmd === shared_consts.GROUPSCMD.ADDADMIN_OFMYGROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_ADDED_ADMIN_OFMYGROUP;
|
||
} else if (cmd === shared_consts.GROUPSCMD.REMOVEADMIN_OFMYGROUP) {
|
||
typeid = shared_consts.TypeNotifs.ID_GROUP_REMOVED_ADMIN_OFMYGROUP;
|
||
}
|
||
|
||
}
|
||
|
||
if (sendnotif && typeid > 0) {
|
||
// CREATE NOTIFICATION IN TABLE SENDNOTIF
|
||
await SendNotif.createNewNotifToSingleUser(req, null, paramsObj, onlysave, typedir, typeid);
|
||
}
|
||
}
|
||
|
||
},
|
||
|
||
sendNotifCircuitByUsername: async function (
|
||
cmd, idapp, usernameOrig, groupOrig, usernameDest, groupDest, username_action,
|
||
circuitname, path, myreccircuit, isAdmin, username_worked, extrarec) {
|
||
|
||
const { SendNotif } = require('../models/sendnotif');
|
||
const { User } = require('../models/user');
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
const { MyGroup } = require('../models/mygroup');
|
||
const { Circuit } = require('../models/circuit');
|
||
|
||
const req = this.getReqByPar(idapp, usernameOrig, groupOrig);
|
||
|
||
let arrris = [];
|
||
|
||
const user = await User.findOne({ idapp, username: usernameDest },
|
||
{ _id: 1, lang: 1 });
|
||
|
||
let lang = 'it';
|
||
if (user) {
|
||
lang = user.lang;
|
||
}
|
||
let ris = null;
|
||
|
||
try {
|
||
let paramsObj = {
|
||
usernameDest,
|
||
circuitnameDest: circuitname,
|
||
path,
|
||
username_action: username_action,
|
||
singleadmin_username: usernameDest,
|
||
extrarec,
|
||
options: 0,
|
||
lang,
|
||
isAdmin,
|
||
username_worked,
|
||
};
|
||
|
||
let sendnotif = true;
|
||
let typedir = shared_consts.TypeNotifs.TYPEDIR_CIRCUITS;
|
||
let typeid = 0;
|
||
let onlysave = false;
|
||
let numuserincircuit = await User.countUsersInCircuit(idapp, circuitname);
|
||
const mycircuit = await Circuit.findOne({ name: circuitname }).lean();
|
||
if (mycircuit && extrarec) {
|
||
extrarec.fido_scoperto_default = mycircuit.fido_scoperto_default;
|
||
extrarec.fido_scoperto_default_grp = mycircuit.fido_scoperto_default_grp;
|
||
}
|
||
|
||
if (cmd) {
|
||
if (cmd === shared_consts.CIRCUITCMD.SET) {
|
||
if (myreccircuit && myreccircuit.createdBy === usernameDest && numuserincircuit <= 1) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_NEW_REC;
|
||
} else {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_ACCEPTED;
|
||
}
|
||
} else if (cmd === shared_consts.CIRCUITCMD.REFUSE_REQ) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_REFUSED;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.REMOVE_FROM_MYLIST) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_REMOVED;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.REQ) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_REQUEST_TO_ENTER;
|
||
// paramsObj.options = MessageOptions.Notify_OnlyToNotifinApp + MessageOptions.Notify_ByBotTelegram;
|
||
const myuserdata = await User.getUserShortDataByUsername(idapp, username_action);
|
||
telegrambot.askConfirmationUser(idapp, shared_consts.CallFunz.RICHIESTA_FIDO, myuserdata, usernameDest, circuitname,
|
||
myreccircuit._id, '', extrarec.groupname);
|
||
onlysave = false;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.ADDADMIN) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_ADDED_ADMIN;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SETFIDO) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_SETFIDO;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.REMOVEADMIN) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_REMOVED_ADMIN;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ_SENT) {
|
||
// Crea l'ID di Transazione
|
||
paramsObj.idTransaction = new ObjectId();
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ_SENT;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_ACCEPTED;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT_SENT) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_ACCEPTED_SENT;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_REFUSED;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE_SENT) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_REFUSED_SENT;
|
||
}
|
||
|
||
}
|
||
|
||
if (sendnotif && typeid > 0) {
|
||
const groupDestoContoCom = groupDest ? groupDest : (extrarec && extrarec.contoComDest ? extrarec.contoComDest : '');
|
||
// Check if is group:
|
||
if (groupDestoContoCom && (
|
||
(cmd !== shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT_SENT) &&
|
||
(cmd !== shared_consts.CIRCUITCMD.SENDCOINS_REFUSE_SENT)
|
||
)) {
|
||
|
||
let arrusers = await MyGroup.getListAdminsByGroupName(idapp, groupDestoContoCom);
|
||
if (arrusers.length <= 0)
|
||
arrusers = await Circuit.getListAdminsByCircuitPath(idapp, groupDestoContoCom);
|
||
|
||
let notiftoUpdate = '';
|
||
let findrecnotif = await SendNotif.findOne({ _id: paramsObj.extrarec.notifId }).lean();
|
||
notiftoUpdate = findrecnotif ? findrecnotif.extrarec.notifIdToUpdate : '';
|
||
if (findrecnotif) {
|
||
let arrrec = [];
|
||
|
||
if (notiftoUpdate)
|
||
arrrec = await SendNotif.find({ 'extrarec.notifIdToUpdate': notiftoUpdate });
|
||
|
||
for (let rec of arrrec) {
|
||
paramsObj.usernameDest = rec.dest;
|
||
paramsObj.sender = rec.sender;
|
||
if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
|
||
try {
|
||
paramsObj.extrarec.notifId = rec._id;
|
||
} catch (e) {
|
||
}
|
||
}
|
||
|
||
ris = await SendNotif.createNewNotifToSingleUser(req, null, paramsObj, onlysave, typedir, typeid);
|
||
if (!ris) {
|
||
console.error('Errore createNewNotifToSingleUser! ', paramsObj.usernameDest, "dest ->", groupDestoContoCom)
|
||
} else {
|
||
arrris.push(ris._id);
|
||
}
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
for (let i = 0; i < arrusers.length; i++) {
|
||
paramsObj.usernameDest = arrusers[i].username;
|
||
|
||
ris = await SendNotif.createNewNotifToSingleUser(req, null, paramsObj, onlysave, typedir, typeid);
|
||
if (!ris) {
|
||
console.error('Errore createNewNotifToSingleUser! ', paramsObj.usernameDest, "dest ->", groupDestoContoCom)
|
||
} else {
|
||
arrris.push(ris._id);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
} else {
|
||
// CREATE NOTIFICATION IN TABLE SENDNOTIF
|
||
ris = await SendNotif.createNewNotifToSingleUser(req, null, paramsObj, onlysave, typedir, typeid);
|
||
|
||
if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) ||
|
||
(cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
|
||
|
||
if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_ACCEPTED_SENT;
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE) {
|
||
typeid = shared_consts.TypeNotifs.ID_CIRCUIT_COINS_REFUSED_SENT;
|
||
}
|
||
|
||
let notiftoUpdate = '';
|
||
let findrecnotif = await SendNotif.findOne({ _id: paramsObj.extrarec.notifId }).lean();
|
||
notiftoUpdate = findrecnotif ? findrecnotif.extrarec.notifIdToUpdate : '';
|
||
arrnotiftoUpdate = findrecnotif ? findrecnotif.extrarec.arrnotifIdToUpdate : '';
|
||
if (findrecnotif && notiftoUpdate && arrnotiftoUpdate) {
|
||
|
||
for (let myid of arrnotiftoUpdate) {
|
||
let rec = await SendNotif.findOne({ _id: myid }).lean();
|
||
if (rec && rec.status === 0) {
|
||
paramsObj.usernameDest = rec.dest;
|
||
paramsObj.extrarec.idStatusToSent = rec._id;
|
||
|
||
|
||
ris = await SendNotif.createNewNotifToSingleUser(req, null, paramsObj, onlysave, typedir, typeid);
|
||
if (!ris) {
|
||
console.error('Errore createNewNotifToSingleUser! ', paramsObj.usernameDest, "dest ->", groupDestoContoCom)
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
return { recnotif: ris, arrris };
|
||
} catch (e) {
|
||
console.log(e.message);
|
||
}
|
||
|
||
},
|
||
|
||
sendNotificationByGroupname: async function (idapp, usernameOrig, groupname, cmd, value, telegram, username_action) {
|
||
|
||
const { MyGroup } = require('../models/mygroup');
|
||
const { User } = require('../models/user');
|
||
|
||
const group = await MyGroup.findOne({ idapp, groupname }, { _id: 1, admins: 1, createdBy: 1 }).lean();
|
||
if (!group)
|
||
return;
|
||
|
||
let giainviato = false;
|
||
|
||
try {
|
||
// SEND TO THE ADMINS THE NOTIFICATIONS
|
||
for (const singleadmin of group.admins) {
|
||
try {
|
||
if (singleadmin.username) {
|
||
if (usernameOrig === singleadmin.username)
|
||
giainviato = true;
|
||
|
||
await this.sendNotifGroupByUsername(cmd, idapp, usernameOrig, singleadmin.username, username_action, groupname, group, true);
|
||
}
|
||
} catch (e) {
|
||
console.error('sendNotificationByGroupname', e);
|
||
}
|
||
}
|
||
|
||
if (!giainviato && (cmd !== shared_consts.GROUPSCMD.REQGROUP)) {
|
||
// SEND TO THE USER THE NOTIFICATION
|
||
await this.sendNotifGroupByUsername(cmd, idapp, usernameOrig, usernameOrig, username_action, groupname, null, false);
|
||
}
|
||
|
||
} catch (e) {
|
||
console.error('e', e);
|
||
}
|
||
|
||
},
|
||
|
||
sendNotificationByCircuit: async function (idapp, usernameOrig, circuitname, cmd, value, telegram, username_action, extrarec) {
|
||
|
||
const { Circuit } = require('../models/circuit');
|
||
const { SendNotif } = require('../models/sendnotif');
|
||
|
||
const circuit = await Circuit.findOne({ idapp, name: circuitname }, { _id: 1, admins: 1, createdBy: 1, path: 1 }).lean();
|
||
if (!circuit)
|
||
return;
|
||
|
||
let giainviato = false;
|
||
|
||
try {
|
||
// SEND TO THE ADMINS THE NOTIFICATIONS
|
||
|
||
let ris = false;
|
||
let inviato = false;
|
||
let arrris = [];
|
||
|
||
if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ || cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT || cmd ===
|
||
shared_consts.CIRCUITCMD.SENDCOINS_REFUSE) {
|
||
|
||
groupOrig = extrarec.grouporig
|
||
|
||
let recnotif = null;
|
||
|
||
if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ) {
|
||
// msg al Mittente (o mittenti del 'groupOrig') "Stai inviando X RIS"
|
||
let res = await this.sendNotifCircuitByUsername(shared_consts.CIRCUITCMD.SENDCOINS_REQ_SENT, idapp, extrarec.dest, extrarec.groupdest, usernameOrig, groupOrig,
|
||
username_action, circuitname, circuit.path, null,
|
||
false, '', extrarec);
|
||
|
||
if (res) {
|
||
recnotif = res.recnotif;
|
||
arrris = res.arrris;
|
||
}
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) {
|
||
// msg ai MITTENTI: "X RIS sono stati accettati da Destinatario"
|
||
await this.sendNotifCircuitByUsername(shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT_SENT, idapp, extrarec.dest, extrarec.groupdest, usernameOrig, groupOrig,
|
||
username_action, circuitname, circuit.path, null,
|
||
false, '', extrarec);
|
||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE) {
|
||
await this.sendNotifCircuitByUsername(shared_consts.CIRCUITCMD.SENDCOINS_REFUSE_SENT, idapp, extrarec.dest, extrarec.groupdest, usernameOrig, groupOrig,
|
||
username_action, circuitname, circuit.path, null,
|
||
false, '', extrarec);
|
||
}
|
||
|
||
if (recnotif)
|
||
extrarec.notifIdToUpdate = recnotif._id;
|
||
if (arrris)
|
||
extrarec.arrnotifIdToUpdate = arrris;
|
||
|
||
let usernametoOrigUse = usernameOrig
|
||
if (extrarec.groupname) {
|
||
usernametoOrigUse = ''
|
||
}
|
||
ris = await this.sendNotifCircuitByUsername(cmd, idapp, usernametoOrigUse, groupOrig, extrarec.dest, extrarec.groupdest, username_action, circuitname, circuit.path,
|
||
null, false, '', extrarec);
|
||
|
||
if (arrris && ris && ris.recnotif) {
|
||
for (const rec of arrris) {
|
||
let obj = {
|
||
'extrarec.notifIdToUpdate': ris.recnotif._id
|
||
};
|
||
|
||
await SendNotif.findOneAndUpdate({ _id: rec._id }, { $set: obj }, { new: false });
|
||
}
|
||
}
|
||
|
||
extrarec.notifIdToUpdate = '';
|
||
|
||
if (ris.recnotif)
|
||
inviato = true;
|
||
// ++Todo: Inviare anche agli Admin ?!
|
||
} else {
|
||
|
||
const groupOrig = '' //++Todo: extrarec.groupOrig
|
||
|
||
for (const singleadmin of circuit.admins) {
|
||
try {
|
||
if (singleadmin.username) {
|
||
if (usernameOrig === singleadmin.username)
|
||
giainviato = true;
|
||
|
||
await this.sendNotifCircuitByUsername(cmd, idapp, usernameOrig, groupOrig, singleadmin.username, '', username_action, circuitname,
|
||
circuit.path, circuit, true, '', extrarec);
|
||
inviato = true;
|
||
}
|
||
} catch (e) {
|
||
console.error('sendNotificationByCircuit', e);
|
||
}
|
||
}
|
||
|
||
if (!giainviato && cmd !== shared_consts.CIRCUITCMD.REQ) {
|
||
// SEND TO THE USER DEST THE NOTIFICATION
|
||
ris = await this.sendNotifCircuitByUsername(cmd, idapp, usernameOrig, groupOrig, usernameOrig, '', username_action, circuitname, circuit.path,
|
||
null, false, '', extrarec);
|
||
|
||
if (ris && ris.recnotif)
|
||
inviato = true;
|
||
}
|
||
}
|
||
|
||
|
||
if (inviato) {
|
||
if (arrris && arrris.length > 0) {
|
||
for (const notif of arrris) {
|
||
await SendNotif.updatePendingTransactions(notif);
|
||
}
|
||
} else {
|
||
if (ris) {
|
||
await SendNotif.updatePendingTransactions(ris.recnotif);
|
||
}
|
||
}
|
||
}
|
||
|
||
return { ris: ris.recnotif, inviato };
|
||
|
||
} catch (e) {
|
||
console.error('sendNotificationByCircuit: ', e);
|
||
return { ris: null, inviato: false };
|
||
}
|
||
|
||
},
|
||
|
||
// **********************
|
||
// SORT WITH PREV_ID
|
||
// **********************
|
||
/* mapSort: function (linkedList) {
|
||
let sortedList = [];
|
||
let remainingList = [];
|
||
var map = new Map();
|
||
var currentId = null;
|
||
|
||
// console.log('linkedList', linkedList);
|
||
|
||
// index the linked list by previous_item_id
|
||
for (var i = 0; i < linkedList.length; i++) {
|
||
var item = linkedList[i];
|
||
if (item.id_prev === server_constants.LIST_START) {
|
||
// first item
|
||
currentId = item._id.toString();
|
||
// console.log('currentId', currentId);
|
||
sortedList.push(item);
|
||
} else {
|
||
map.set(item.id_prev.toString(), i);
|
||
}
|
||
}
|
||
|
||
let conta = 0;
|
||
while (conta < linkedList.length) {
|
||
// get the item with a previous item ID referencing the current item
|
||
var nextItem = linkedList[map.get(currentId)];
|
||
if (nextItem === undefined) {
|
||
|
||
} else {
|
||
sortedList.push(nextItem);
|
||
currentId = nextItem._id.toString();
|
||
}
|
||
conta++;
|
||
}
|
||
|
||
if (linkedList.length > sortedList.length) {
|
||
// If are not in the list, I'll put at the bottom of the list
|
||
// console.log('ATTENZIONE !!! ', sortedList.length, linkedList.length);
|
||
for (const itemlinked of linkedList) {
|
||
const elemtrov = sortedList.find((item) => item._id === itemlinked._id);
|
||
if (elemtrov === undefined) {
|
||
sortedList.push(itemlinked);
|
||
}
|
||
}
|
||
}
|
||
|
||
// console.log('DOPO sortedList', sortedList);
|
||
|
||
return sortedList;
|
||
},
|
||
*/
|
||
|
||
sendNotifToAdmin(idapp, alsotelegram, title, msg, tag = '') {
|
||
try {
|
||
const { User } = require('../models/user');
|
||
|
||
const queryadmins = { username: 'paoloar77', idapp };
|
||
|
||
if (idapp === 0)
|
||
idapp = '13';
|
||
|
||
User.find(queryadmins).then(async (arrusers) => {
|
||
if (arrusers !== null) {
|
||
for (const user of arrusers) {
|
||
if (alsotelegram) {
|
||
this.sendMsgTelegramToAdmin(idapp, title + ' ' + msg);
|
||
}
|
||
|
||
await this.sendNotificationToUser(user._id, title, msg, '/', '', tag, []).
|
||
then(ris => {
|
||
if (ris) {
|
||
|
||
} else {
|
||
// already sent the error on calling sendNotificationToUser
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
|
||
},
|
||
|
||
checkUserOk(userpassed, userauth, res) {
|
||
// this.mylog('checkUserOk', userpassed, userauth);
|
||
if (String(userpassed) !== String(userauth)) {
|
||
// I'm trying to write something not mine!
|
||
this.mylog('I\'m trying to write something not mine!: userId = ', userpassed, 'req.user._id', userauth);
|
||
if (!res) {
|
||
return {
|
||
exit: true,
|
||
ret: false,
|
||
};
|
||
} else {
|
||
return {
|
||
exit: true,
|
||
ret: false,
|
||
// ret: res.status(404).
|
||
// send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER }),
|
||
};
|
||
}
|
||
} else {
|
||
return { exit: false, ret: false };
|
||
}
|
||
|
||
},
|
||
|
||
ConvertHTMLToPlainText(strHTML) {
|
||
if (strHTML)
|
||
return strHTML.replace(/<[^>]+>/g, '');
|
||
return '';
|
||
},
|
||
|
||
convertSpaces_ToUScore(mystr) {
|
||
if (mystr)
|
||
return mystr.replace(/\s+/g, '_');
|
||
return '';
|
||
},
|
||
|
||
convertHTMLtoText(myhtml) {
|
||
let msg = myhtml;
|
||
if (msg) {
|
||
msg = msg.replace('"', '"');
|
||
msg = msg.replace(/<strong>/g, '');
|
||
msg = msg.replace(/<\/strong>/g, '');
|
||
msg = msg.replace(/<em>/g, '');
|
||
msg = msg.replace(/<\/em>/g, '');
|
||
msg = msg.replace('>', '>');
|
||
msg = msg.replace('<', '<');
|
||
msg = msg.replace('&', '&');
|
||
msg = msg.replace('<br>', '\n');
|
||
}
|
||
|
||
return msg;
|
||
},
|
||
|
||
htmlToTelegramText(html) {
|
||
|
||
try {
|
||
const withMarkdown = html
|
||
.replace(/<strong>(.*?)<\/strong>/g, '*$1*')
|
||
.replace(/<b>(.*?)<\/b>/g, '*$1*')
|
||
.replace(/<em>(.*?)<\/em>/g, '_$1_')
|
||
.replace(/<u>(.*?)<\/u>/g, '__$1__');
|
||
|
||
// Remove other HTML tags
|
||
const plainText = withMarkdown.replace(/<[^>]*>/g, '');
|
||
|
||
// Replace HTML entities with their equivalent Markdown or plain text representations
|
||
const replacements = [
|
||
{ pattern: /&/g, replacement: '&' },
|
||
{ pattern: /</g, replacement: '<' },
|
||
{ pattern: />/g, replacement: '>' },
|
||
{ pattern: /"/g, replacement: '"' },
|
||
{ pattern: /'/g, replacement: "'" },
|
||
];
|
||
|
||
let telegramText = plainText;
|
||
replacements.forEach((replacement) => {
|
||
telegramText = telegramText.replace(replacement.pattern, replacement.replacement);
|
||
});
|
||
|
||
return telegramText;
|
||
|
||
} catch (e) {
|
||
console.error(e);
|
||
};
|
||
|
||
},
|
||
|
||
htmlToTelegramText(html) {
|
||
|
||
try {
|
||
const withMarkdown = html
|
||
.replace(/<strong>(.*?)<\/strong>/g, '*$1*')
|
||
.replace(/<b>(.*?)<\/b>/g, '*$1*')
|
||
.replace(/<em>(.*?)<\/em>/g, '_$1_')
|
||
.replace(/<u>(.*?)<\/u>/g, '__$1__');
|
||
|
||
// Remove other HTML tags
|
||
const plainText = withMarkdown.replace(/<[^>]*>/g, '');
|
||
|
||
// Replace HTML entities with their equivalent Markdown or plain text representations
|
||
const replacements = [
|
||
{ pattern: /&/g, replacement: '&' },
|
||
{ pattern: /</g, replacement: '<' },
|
||
{ pattern: />/g, replacement: '>' },
|
||
{ pattern: /"/g, replacement: '"' },
|
||
{ pattern: /'/g, replacement: "'" },
|
||
];
|
||
|
||
let telegramText = plainText;
|
||
replacements.forEach((replacement) => {
|
||
telegramText = telegramText.replace(replacement.pattern, replacement.replacement);
|
||
});
|
||
|
||
return telegramText;
|
||
|
||
} catch (e) {
|
||
console.error(e);
|
||
};
|
||
|
||
},
|
||
|
||
convertTexttoHtml(myhtml) {
|
||
// let msg = myhtml;
|
||
// msg = msg.replace('\n', '<br>');
|
||
|
||
// return msg
|
||
|
||
return myhtml;
|
||
},
|
||
|
||
removeSpecialCharForEmail(myhtml) {
|
||
let msg = myhtml;
|
||
msg = msg.replace(/"/g, '\'');
|
||
|
||
return msg;
|
||
},
|
||
|
||
getNomeAppByIdApp: function (idapp) {
|
||
|
||
const myapp = this.MYAPPS.find(item => item.idapp === idapp);
|
||
if (myapp)
|
||
return ((process.env.NODE_ENV === 'test') ? 'Test: ' : '') + myapp.name;
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getTimeExpReg: async function (idapp, username) {
|
||
var { User } = require('../models/user');
|
||
|
||
return await User.createNewReqRegistrationGetLink(idapp, username);
|
||
},
|
||
|
||
getLinkRegByIdAppAndMsgStrutt: function (idapp, msg, rec) {
|
||
|
||
let myapp = this.getHostByIdApp(idapp);
|
||
if (myapp) {
|
||
myapp += '/registrati/' + rec.aportador_solidario + '/' + msg.from.username + '/' + msg.from.id + '/' + rec.regexpire;
|
||
}
|
||
|
||
return myapp;
|
||
},
|
||
|
||
getHostByIdApp: function (idapp) {
|
||
|
||
const myapp = this.MYAPPS.find(item => item.idapp === idapp);
|
||
if (myapp) {
|
||
let siteport = (myapp.portapp && myapp.portapp !== '0') ? (':' +
|
||
myapp.portapp) : '';
|
||
|
||
if (process.env.NODE_ENV === 'test')
|
||
return myapp.host_test + siteport;
|
||
else
|
||
return myapp.host + siteport;
|
||
|
||
} else
|
||
return '';
|
||
},
|
||
|
||
getLinkUserProfile: function (idapp, username) {
|
||
return this.getHostByIdApp(idapp) + '/my/' + username;
|
||
},
|
||
|
||
getLinkUserTelegram: async function (idapp, username, myuser) {
|
||
var { User } = require('../models/user');
|
||
|
||
let u_tg = '';
|
||
if (myuser)
|
||
u_tg = myuser.profile && myuser.profile.hasOwnProperty('username_telegram') ? myuser.profile.username_telegram : usernametelegram;
|
||
|
||
if (!u_tg) {
|
||
u_tg = await User.getUsernameTelegram(idapp, username);
|
||
}
|
||
|
||
if (u_tg)
|
||
return `https://t.me/${u_tg}`;
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getLinkEditUserProfile: function (idapp) {
|
||
return this.getHostByIdApp(idapp) + '/editprofile';
|
||
},
|
||
|
||
getConfSiteOptionEnabledByIdApp: function (idapp, option) {
|
||
|
||
const myapp = this.MYAPPS.find(item => item.idapp === idapp);
|
||
if (myapp) {
|
||
|
||
if (myapp.hasOwnProperty('confsite')) {
|
||
if (myapp.confsite.hasOwnProperty('options')) {
|
||
return this.isBitActive(myapp.confsite.options, option);
|
||
}
|
||
}
|
||
}
|
||
|
||
return false;
|
||
},
|
||
|
||
getConfParamSiteByIdApp: function (idapp, field) {
|
||
|
||
const myapp = this.MYAPPS.find(item => item.idapp === idapp);
|
||
if (myapp) {
|
||
|
||
if (myapp.hasOwnProperty('confsite')) {
|
||
if (myapp.confsite.hasOwnProperty(field)) {
|
||
return myapp.confsite[field];
|
||
}
|
||
}
|
||
}
|
||
|
||
return false;
|
||
},
|
||
|
||
isAbilitaNave: function (idapp) {
|
||
const myapp = this.MYAPPS.find(item => item.idapp === idapp);
|
||
return myapp.abilitanave;
|
||
},
|
||
|
||
removeLastSlashFromPath: function (myString) {
|
||
let regex = /\/$/;
|
||
let result = myString;
|
||
|
||
try {
|
||
if (myString)
|
||
result = myString.replace(regex, "");
|
||
} catch (e) {
|
||
return myString;
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
getdirByIdApp: function (idapp, dirmain = false) {
|
||
|
||
let mypath = '';
|
||
const myapp =
|
||
this.MYAPPS.find(item => item.idapp === idapp);
|
||
if (myapp) {
|
||
if (process.env.NODE_ENV === 'test')
|
||
mypath = (myapp) ? myapp.dir_test : '';
|
||
else
|
||
mypath = (myapp) ? myapp.dir : '';
|
||
|
||
if (dirmain) {
|
||
if (!this.sulServer()) {
|
||
mypath += 'public';
|
||
}
|
||
}
|
||
}
|
||
|
||
return this.removeLastSlashFromPath(mypath);
|
||
},
|
||
|
||
getAdminEmailByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (myapp)
|
||
return myapp.adminemail;
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getreplyToEmailByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (myapp)
|
||
return myapp.replyTo;
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getpathregByIdApp: function (idapp, lang) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (myapp) {
|
||
const addstr = myapp.pathreg_add ? myapp.pathreg_add : '';
|
||
|
||
return 'registration' + addstr + '/' + lang;
|
||
} else {
|
||
return 'registration' + '/' + lang;
|
||
}
|
||
},
|
||
|
||
getAskToVerifyReg: function (idapp) {
|
||
return this.getConfSiteOptionEnabledByIdApp(idapp, shared_consts.ConfSite.Need_Aportador_On_DataReg_To_Verify_Reg);
|
||
},
|
||
|
||
isManagAndAdminDifferent(idapp) {
|
||
const manag = this.getManagerEmailByIdApp(idapp);
|
||
return (manag !== this.getAdminEmailByIdApp(idapp)) && (manag !== '');
|
||
},
|
||
|
||
getManagerEmailByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (myapp)
|
||
return !!myapp.manageremail ? myapp.manageremail : '';
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getEmailByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
return (myapp) ? myapp.email_from : '';
|
||
},
|
||
|
||
getPwdByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
return (myapp) ? this.decryptdata(myapp.email_pwd) : '';
|
||
},
|
||
|
||
|
||
getTelegramBotNameByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'development')
|
||
return (myapp) ? myapp.telegram_bot_name_test : '';
|
||
else
|
||
return (myapp) ? myapp.telegram_bot_name : '';
|
||
},
|
||
|
||
getTelegramSupportChat: function (idapp) {
|
||
try {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
return (myapp && myapp.telegram_support_chat)
|
||
? myapp.telegram_support_chat
|
||
: '';
|
||
} catch (e) {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getTelegramKeyByIdApp: function (idapp) {
|
||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||
if (process.env.NODE_ENV === 'test' || process.env.NODE_ENV === 'development')
|
||
return (myapp) ? myapp.telegram_key_test : '';
|
||
else
|
||
return (myapp) ? myapp.telegram_key : '';
|
||
},
|
||
|
||
getArrTelegramFromSite: function () {
|
||
const myapp = this.MYAPPS;
|
||
let arrteleg = []
|
||
for (const site of myapp) {
|
||
if (site.active) {
|
||
if (process.env.NODE_ENV === 'test') {
|
||
if (site.telegram_bot_name_test)
|
||
arrteleg.push(site.idapp)
|
||
} else {
|
||
if (site.telegram_bot_name)
|
||
arrteleg.push(site.idapp)
|
||
}
|
||
}
|
||
}
|
||
|
||
return arrteleg;
|
||
},
|
||
|
||
getLookupPipeLine(params, proj) {
|
||
|
||
let myquery = [
|
||
{
|
||
$lookup: {
|
||
from: params.lk_tab,
|
||
let: { username: '$' + params.lk_LF, idapp: params.idapp },
|
||
pipeline: [
|
||
{
|
||
$match:
|
||
{
|
||
$expr:
|
||
{
|
||
$and:
|
||
[
|
||
{ $eq: ['$' + params.lk_FF, '$$' + params.lk_FF] },
|
||
{ $eq: ['$idapp', '$$idapp'] },
|
||
],
|
||
},
|
||
},
|
||
},
|
||
],
|
||
as: params.lk_as,
|
||
},
|
||
},
|
||
{ $project: proj },
|
||
];
|
||
|
||
return myquery;
|
||
},
|
||
|
||
getNumTabByTable(table) {
|
||
const myrec = shared_consts.MYTABS.find((rec) => rec.table === table)
|
||
return myrec ? myrec.id : -1
|
||
},
|
||
|
||
getTableByNumTab(numtab) {
|
||
const myrec = shared_consts.MYTABS.find((rec) => rec.id === numtab)
|
||
return myrec ? myrec.table : ''
|
||
},
|
||
|
||
getGroupnameLookupPipeLine(params, proj) {
|
||
|
||
let myquery = [
|
||
{
|
||
$lookup: {
|
||
from: params.lk_tab,
|
||
let: { groupname: '$' + params.lk_LF, idapp: params.idapp },
|
||
pipeline: [
|
||
{
|
||
$match:
|
||
{
|
||
$expr:
|
||
{
|
||
$and:
|
||
[
|
||
{ $eq: ['$' + params.lk_FF, '$$' + params.lk_FF] },
|
||
{ $eq: ['$idapp', '$$idapp'] },
|
||
],
|
||
},
|
||
},
|
||
},
|
||
],
|
||
as: params.lk_as,
|
||
},
|
||
},
|
||
{ $project: proj },
|
||
];
|
||
|
||
return myquery;
|
||
},
|
||
|
||
getLookupStandardPipeline: function (params, num) {
|
||
const query = [];
|
||
|
||
if (!params)
|
||
return;
|
||
|
||
query.push(
|
||
{
|
||
$lookup: {
|
||
from: params.lk_tab,
|
||
let: { searchId: { $toObjectId: "$" + params.lk_LF } },
|
||
pipeline: [
|
||
{
|
||
$match: {
|
||
$expr: {
|
||
$and: [
|
||
{ $eq: ["$" + params.lk_FF, "$$searchId"] },
|
||
],
|
||
},
|
||
},
|
||
},
|
||
{
|
||
$project: params.lk_proj
|
||
},
|
||
],
|
||
as: params.lk_as + num,
|
||
},
|
||
},
|
||
{
|
||
$replaceRoot: {
|
||
newRoot: {
|
||
$mergeObjects: [
|
||
{
|
||
$arrayElemAt: [
|
||
'$' + params.lk_as + num, 0],
|
||
}, '$$ROOT'],
|
||
},
|
||
},
|
||
}
|
||
)
|
||
return query;
|
||
},
|
||
|
||
getLookup: function (params, num, pass_proj, proj_add) {
|
||
const query = [];
|
||
|
||
if (!params)
|
||
return;
|
||
|
||
let mylkLF = params.lk_LF;
|
||
if (params.af_objId_tab) {
|
||
const myobj = {};
|
||
myobj['myId' + num] = { '$toObjectId': '$' + params.lk_LF };
|
||
|
||
if (params.lk_tab === 'users') {
|
||
myobj.namecomplete = {
|
||
$concat: [
|
||
{ $toLower: "$name" },
|
||
{ $toLower: "$surname" },
|
||
{ $toLower: "$username" },
|
||
],
|
||
};
|
||
}
|
||
|
||
query.push(
|
||
{ '$addFields': myobj },
|
||
);
|
||
mylkLF = 'myId' + num;
|
||
} else {
|
||
|
||
}
|
||
|
||
if (params.lk_tab) {
|
||
let proj = params.lk_proj;
|
||
if (!!pass_proj) {
|
||
proj = pass_proj;
|
||
}
|
||
proj = Object.assign({}, proj, proj_add);
|
||
|
||
query.push(
|
||
{
|
||
$lookup: {
|
||
from: params.lk_tab,
|
||
localField: mylkLF, // field in my collection
|
||
foreignField: params.lk_FF, // field in the 'from' collection
|
||
as: params.lk_as,
|
||
},
|
||
});
|
||
if (params.unwind) {
|
||
|
||
query.push({
|
||
$unwind: {
|
||
path: '$' + params.lk_as,
|
||
preserveNullAndEmptyArrays: true,
|
||
}
|
||
})
|
||
}
|
||
|
||
if (!params.noarray) {
|
||
query.push(
|
||
{
|
||
$replaceRoot: {
|
||
newRoot: {
|
||
$mergeObjects: [
|
||
{
|
||
$arrayElemAt: [
|
||
'$' + params.lk_as, 0],
|
||
}, '$$ROOT'],
|
||
},
|
||
},
|
||
});
|
||
}
|
||
|
||
query.push(
|
||
{ $project: proj },
|
||
);
|
||
}
|
||
|
||
return query;
|
||
},
|
||
|
||
getFilterParam: function (filter, fieldsearch) {
|
||
let myregexp = {};
|
||
myregexp = new RegExp(filter.trim().replace(' ', '|'), 'ig');
|
||
|
||
let query = [];
|
||
|
||
const myfilters = [];
|
||
for (const rec of fieldsearch) {
|
||
let data = {};
|
||
if (rec.type === this.FieldType.exact) {
|
||
data[rec.field] = filter.trim();
|
||
} else if (rec.type === this.FieldType.string) {
|
||
data[rec.field] = myregexp;
|
||
if (rec.field === 'profile.username_telegram') {
|
||
myregexp = new RegExp(this.rimuoviAtPrimoCarattere(filter).trim().replace(' ', '|'), 'ig');
|
||
data[rec.field] = myregexp
|
||
}
|
||
} else if ((rec.type === this.FieldType.number) ||
|
||
(rec.type === this.FieldType.hours)) {
|
||
data[rec.field] = parseFloat(filter.trim());
|
||
}
|
||
if (data)
|
||
myfilters.push(data);
|
||
}
|
||
|
||
if (myfilters.length > 0) {
|
||
query = [
|
||
{ $match: { $or: myfilters } },
|
||
];
|
||
}
|
||
|
||
return query;
|
||
},
|
||
|
||
addQueryIdMatch: function (params) {
|
||
|
||
myquery = {};
|
||
|
||
if (shared_consts.TABLES_ID_NUMBER.includes(params.table) || shared_consts.TABLES_ID_STRING.includes(params.table)) {
|
||
myquery = {
|
||
$match: {
|
||
$expr: {
|
||
$eq: ['$_id', params.myid],
|
||
},
|
||
},
|
||
};
|
||
} else if (shared_consts.TABLES_NUM_AS_ID_NUMBER.includes(params.table)) {
|
||
myquery = {
|
||
$match: {
|
||
$expr: {
|
||
$eq: ['$Num', params.myid],
|
||
},
|
||
},
|
||
};
|
||
} else {
|
||
myquery = {
|
||
$match: {
|
||
$expr: {
|
||
$eq: ['$_id', mongoose.Types.ObjectId(params.myid)],
|
||
},
|
||
},
|
||
};
|
||
|
||
}
|
||
|
||
return myquery;
|
||
},
|
||
|
||
contieneIdStatusSkill(filtersearch) {
|
||
for (let i = 0; i < filtersearch.length; i++) {
|
||
const obj = filtersearch[i];
|
||
if (obj.$or) {
|
||
for (let j = 0; j < obj.$or.length; j++) {
|
||
const condition = obj.$or[j];
|
||
if (condition.idStatusSkill) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
|
||
addNumFavoriteAndBookmarkToQuery(idapp, numtab) {
|
||
|
||
let query = [];
|
||
|
||
try {
|
||
/*
|
||
query =
|
||
[
|
||
{
|
||
$lookup: {
|
||
from: "reactions",
|
||
let: {
|
||
tab: numtab,
|
||
id: '$_id',
|
||
},
|
||
pipeline: [
|
||
{
|
||
$match: {
|
||
$expr: {
|
||
$and: [
|
||
{ $eq: ['$idrec', '$$id'] },
|
||
{ $eq: ['$tab', numtab] },
|
||
{ $eq: ['$idapp', idapp] },
|
||
],
|
||
},
|
||
},
|
||
},
|
||
{
|
||
$group: {
|
||
_id: "$idrec",
|
||
numseen: {
|
||
$sum: {
|
||
$cond: {
|
||
if: { $ifNull: ["$seen", false] }, // Check if the field exists and is not null
|
||
then: 1, // Increment count by 1 if the field exists
|
||
else: 0, // Otherwise, keep the count unchanged
|
||
}
|
||
}
|
||
},
|
||
numfav: {
|
||
$sum: {
|
||
$cond: {
|
||
if: { $ifNull: ["$fav", false] }, // Check if the field exists and is not null
|
||
then: 1, // Increment count by 1 if the field exists
|
||
else: 0, // Otherwise, keep the count unchanged
|
||
}
|
||
}
|
||
},
|
||
numbook: {
|
||
$sum: {
|
||
$cond: {
|
||
if: { $ifNull: ["$book", false] }, // Check if the field exists and is not null
|
||
then: 1, // Increment count by 1 if the field exists
|
||
else: 0, // Otherwise, keep the count unchanged
|
||
}
|
||
}
|
||
}
|
||
},
|
||
},
|
||
],
|
||
as: 'myreact',
|
||
},
|
||
},
|
||
|
||
{
|
||
$unwind: {
|
||
path: "$myreact",
|
||
preserveNullAndEmptyArrays: true,
|
||
},
|
||
},
|
||
|
||
];
|
||
|
||
if (true) {
|
||
// RIMUOVI
|
||
// query = {};
|
||
}
|
||
|
||
if (true) {
|
||
// RIMUOVI
|
||
// query = {};
|
||
}
|
||
|
||
if (Object.keys(query).length > 0) {
|
||
const numtabbacheca = this.getNumTabByTable(shared_consts.TABLES_MYBACHECAS);
|
||
if (numtab === numtabbacheca) {
|
||
const queryadd = this.getQueryMyBacheca(idapp);
|
||
query = [...query, ...queryadd];
|
||
}
|
||
}
|
||
*/
|
||
|
||
proj = {
|
||
numseen: 1,
|
||
numfav: 1,
|
||
numbook: 1,
|
||
numattend: 1,
|
||
};
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
|
||
return { query, proj };
|
||
|
||
},
|
||
|
||
getQueryMyBacheca: function (idapp) {
|
||
|
||
const arrquery = [{
|
||
$lookup: {
|
||
from: "bookings",
|
||
let: {
|
||
id: '$_id',
|
||
},
|
||
pipeline: [
|
||
{
|
||
$match: {
|
||
$expr: {
|
||
$and: [
|
||
{ $eq: ['$id_bookedevent', '$$id'] },
|
||
{ $eq: ['$idapp', idapp] },
|
||
],
|
||
},
|
||
},
|
||
},
|
||
{
|
||
$project: {
|
||
id_bookedevent: 1,
|
||
username: 1,
|
||
numpeople: 1,
|
||
numpeopleLunch: 1,
|
||
numpeopleDinner: 1,
|
||
infoevent: 1,
|
||
msgbooking: 1,
|
||
booked: 1,
|
||
datebooked: 1,
|
||
userId: 1,
|
||
}
|
||
},
|
||
],
|
||
as: 'mybookings',
|
||
},
|
||
},
|
||
/**
|
||
{
|
||
$lookup: {
|
||
from: "users",
|
||
localField: "myId1",
|
||
foreignField: "_id",
|
||
as: "user",
|
||
},
|
||
},
|
||
{
|
||
$lookup: {
|
||
from: "users",
|
||
let: {
|
||
myid: { $toObjectId: "$mybookings.userId" },
|
||
},
|
||
pipeline: [
|
||
{
|
||
$match: {
|
||
$expr: {
|
||
$and: [
|
||
{
|
||
$eq: [
|
||
"$_id",
|
||
"$$myid",
|
||
],
|
||
},
|
||
{
|
||
$eq: [
|
||
"$idapp",
|
||
"13",
|
||
],
|
||
},
|
||
],
|
||
},
|
||
},
|
||
},
|
||
{
|
||
$project: { _id: 1, username: 1 },
|
||
}
|
||
],
|
||
|
||
as: "myuser",
|
||
},
|
||
}**/
|
||
|
||
];
|
||
|
||
return arrquery;
|
||
|
||
},
|
||
|
||
getQueryTable: async function (idapp, params, user) {
|
||
|
||
|
||
const { Search } = require('../models/search');
|
||
|
||
if (typeof params.startRow !== 'number') {
|
||
throw new Error('startRow must be number');
|
||
} else if (typeof params.endRow !== 'number') {
|
||
throw new Error('endRow must be number');
|
||
}
|
||
|
||
let newvers = !!params.newvers;
|
||
|
||
let query = [];
|
||
|
||
if (params.filter && params.fieldsearch) {
|
||
const querytemp = this.getFilterParam(params.filter, params.fieldsearch);
|
||
if (querytemp) {
|
||
query = [...query, ...querytemp];
|
||
}
|
||
}
|
||
|
||
let filtriadded = [];
|
||
|
||
// if (params.table === 'extralist') {
|
||
// if (params.filterand.includes(shared_consts.FILTER_EXTRALIST_DELETED))
|
||
// filtriadded.push({ deleted: true });
|
||
// else
|
||
// filtriadded.push({ deleted: { $exists: false } });
|
||
// }
|
||
|
||
if (params.filterand) {
|
||
|
||
if (params.filterand.includes(
|
||
shared_consts.FILTER_EXTRALIST_NOT_REGISTERED))
|
||
filtriadded.push({ registered: false });
|
||
|
||
if (params.filterand.includes(
|
||
shared_consts.FILTER_EXTRALIST_NOT_CONTACTED)) {
|
||
filtriadded.push({ contacted: { $exists: false } });
|
||
}
|
||
if (params.filterand.includes(shared_consts.FILTER_EXTRALIST_WITH_NOTE))
|
||
filtriadded.push({
|
||
'note': { $exists: true },
|
||
'$expr': { '$gt': [{ '$strLenCP': '$note' }, 1] },
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_QUALIFIED))
|
||
filtriadded.push({ 'profile.qualified': true });
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_NO_ZOOM))
|
||
filtriadded.push({ 'profile.saw_zoom_presentation': false });
|
||
if (params.filterand.includes(shared_consts.FILTER_ASK_ZOOM_VISTO))
|
||
filtriadded.push({ 'profile.ask_zoom_partecipato': false });
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_NO_INVITANTE))
|
||
filtriadded.push({
|
||
aportador_solidario: { $exists: false },
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_NO_TELEGRAM_ID))
|
||
filtriadded.push({ 'profile.teleg_id': { $lt: 1 } });
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_SI_TELEGRAM_ID))
|
||
filtriadded.push({ 'profile.teleg_id': { $gt: 1 } });
|
||
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))
|
||
filtriadded.push({ verified_email: false });
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_NO_VERIFIED_APORTADOR))
|
||
filtriadded.push({
|
||
verified_by_aportador: { $exists: false },
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_WITHOUT_USERNAME_TELEGRAM))
|
||
filtriadded.push({
|
||
$or: [
|
||
{ 'profile.username_telegram': { $exists: false } },
|
||
{ 'profile.username_telegram': { $exists: true, $eq: '' } }],
|
||
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_NO_DREAM))
|
||
filtriadded.push({
|
||
'profile.my_dream': {
|
||
$exists: false,
|
||
},
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_TELEGRAM_BLOCKED))
|
||
filtriadded.push({ 'profile.teleg_id_old': { $gt: 1 } });
|
||
if (params.filterand.includes(shared_consts.FILTER_USER_PROVINCE))
|
||
filtriadded.push({ 'profile.resid_province': { $exists: true } });
|
||
if (params.filterand.includes(shared_consts.FILTER_ATTIVI))
|
||
filtriadded.push({
|
||
$or: [
|
||
{ deleted: { $exists: false } },
|
||
{ deleted: { $exists: true, $eq: false } }],
|
||
});
|
||
|
||
// Hours
|
||
if (params.filterand.includes(shared_consts.FILTER_HOURS_ALL))
|
||
filtriadded.push(
|
||
{
|
||
idapp,
|
||
todoId: params.codeId,
|
||
$or: [
|
||
{ deleted: { $exists: false } },
|
||
{ deleted: { $exists: true, $eq: false } }],
|
||
},
|
||
);
|
||
else if (params.filterand.includes(shared_consts.FILTER_HOURS_MYLIST))
|
||
filtriadded.push(
|
||
{
|
||
idapp,
|
||
userId: params.userId,
|
||
todoId: params.codeId,
|
||
$or: [
|
||
{ deleted: { $exists: false } },
|
||
{ deleted: { $exists: true, $eq: false } }],
|
||
},
|
||
);
|
||
|
||
if (params.filterand.includes(shared_consts.FILTER_NASCOSTI))
|
||
filtriadded.push({
|
||
deleted: { $exists: true, $eq: true },
|
||
});
|
||
if (params.filterand.includes(shared_consts.FILTER_NAVI_NON_PRESENTI))
|
||
filtriadded.push({
|
||
navinonpresenti: { $exists: true, $eq: true },
|
||
$or: [
|
||
{ subaccount: { $exists: false } },
|
||
{ subaccount: { $exists: true, $eq: false } }],
|
||
});
|
||
|
||
// Iscritti Conacreis
|
||
if (params.filterand.includes(shared_consts.FILTER_REPORTED))
|
||
filtriadded.push(
|
||
{ reported: { $exists: true, $eq: true } },
|
||
);
|
||
|
||
if (params.filterand.includes(
|
||
shared_consts.FILTER_TO_MAKE_MEMBERSHIP_CARD))
|
||
filtriadded.push({
|
||
$or: [
|
||
{ codiceConacreis: { $exists: false } },
|
||
{ codiceConacreis: { $exists: true, $eq: '' } }],
|
||
});
|
||
|
||
if (params.filterand.includes(shared_consts.FILTER_MEMBERSHIP_CARD_OK))
|
||
filtriadded.push({
|
||
codiceConacreis: { $exists: true },
|
||
'$expr': { '$gt': [{ '$strLenCP': '$codiceConacreis' }, 0] },
|
||
});
|
||
|
||
}
|
||
|
||
if (params.filtercustom) {
|
||
let condition = {};
|
||
for (const myfilter of params.filtercustom) {
|
||
if (myfilter['userId']) {
|
||
myfilter['userId'] = ObjectID(myfilter['userId']);
|
||
}
|
||
if (myfilter['_idOBJ']) {
|
||
filtriadded.push({ _id: ObjectID(myfilter['_idOBJ']) });
|
||
} else if (myfilter['dateTimeStart']) {
|
||
const gte = myfilter['dateTimeStart'].$gte;
|
||
const lte = myfilter['dateTimeStart'].$lte;
|
||
condition = {
|
||
dateTimeStart: {
|
||
$gte: new Date(gte),
|
||
$lte: new Date(lte),
|
||
},
|
||
};
|
||
filtriadded.push(condition);
|
||
} else if (myfilter.hasOwnProperty('pub_to_share')) {
|
||
// non aggiungere niente
|
||
} else {
|
||
filtriadded.push(myfilter);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (params.filter_gte) {
|
||
for (let ind = 0; ind < params.filter_gte.length; ind++) {
|
||
for (const [key, value] of Object.entries(params.filter_gte[ind])) {
|
||
if (value > 0) {
|
||
let condition = {};
|
||
condition[key] = { $gte: value };
|
||
filtriadded.push(condition);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (params.filtersearch) {
|
||
filtriadded.push(...params.filtersearch);
|
||
}
|
||
|
||
if (params.options) {
|
||
if (this.isBitActive(params.options,
|
||
shared_consts.OPTIONS_SEARCH_ONLY_FULL_WORDS)) {
|
||
}
|
||
}
|
||
|
||
|
||
if (params.filterextra) {
|
||
if (params.filterextra.length > 0)
|
||
query = [...query, ...params.filterextra]
|
||
}
|
||
|
||
if (filtriadded) {
|
||
if (filtriadded.length > 0)
|
||
query.push({ $match: { $and: filtriadded } });
|
||
}
|
||
|
||
if (idapp > 0) {
|
||
query.push({ $match: { idapp } });
|
||
}
|
||
|
||
// console.log('QUERYMATCH', query[0].$match.or);
|
||
// console.log('filter', params.filter);
|
||
|
||
let numrowend = params.endRow - params.startRow;
|
||
if (numrowend < 0)
|
||
numrowend = 1;
|
||
|
||
if (params.querytype === shared_consts.QUERYTYPE_MYGROUP || params.querytype === shared_consts.QUERYTYPE_CIRCUIT) {
|
||
|
||
const myq = this.addQueryIdMatch(params);
|
||
if (myq)
|
||
query.push(myq);
|
||
|
||
query.push({ $project: { req_users: 1 } });
|
||
const qa1 = this.getLookup(
|
||
{
|
||
lk_tab: 'users',
|
||
lk_LF: 'req_users.username',
|
||
lk_FF: 'username',
|
||
lk_as: 'user',
|
||
}, 0, {
|
||
'user.idapp': 1,
|
||
'user.username': 1,
|
||
'user.name': 1,
|
||
'user.surname': 1,
|
||
'user.profile.img': 1,
|
||
'user.profile.qualifica': 1,
|
||
});
|
||
if (qa1) query = [...query, ...qa1];
|
||
query.push({ $unwind: '$user' });
|
||
|
||
query.push({
|
||
$match: {
|
||
$and: [
|
||
{ 'user.idapp': params.idapp },
|
||
],
|
||
},
|
||
});
|
||
|
||
|
||
query.push({
|
||
$replaceRoot: {
|
||
newRoot: '$user',
|
||
},
|
||
},
|
||
);
|
||
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_REFUSED_USER_GRP || params.querytype ===
|
||
shared_consts.QUERYTYPE_REFUSED_USER_CIRCUIT) {
|
||
|
||
/*
|
||
const myq = this.addQueryIdMatch(params);
|
||
if (myq)
|
||
query.push(myq);
|
||
*/
|
||
|
||
const myq = this.addQueryIdMatch(params);
|
||
if (myq)
|
||
query.push(myq);
|
||
|
||
query.push({ $project: { refused_users: 1 } });
|
||
query.push({ $unwind: '$refused_users' });
|
||
const qa1 = this.getLookupPipeLine(
|
||
{
|
||
lk_tab: 'users',
|
||
lk_LF: 'refused_users.username',
|
||
lk_FF: 'username',
|
||
lk_as: 'user',
|
||
idapp,
|
||
}, {
|
||
'user.idapp': 1,
|
||
'user.username': 1,
|
||
'user.name': 1,
|
||
'user.surname': 1,
|
||
'user.profile.img': 1,
|
||
'user.profile.qualifica': 1,
|
||
});
|
||
if (qa1) query = [...query, ...qa1];
|
||
query.push({ $unwind: '$user' });
|
||
/*
|
||
query.push({
|
||
$match: {
|
||
$and: [
|
||
{'user.idapp': params.idapp},
|
||
],
|
||
},
|
||
});
|
||
*/
|
||
|
||
query.push({
|
||
$replaceRoot: {
|
||
newRoot: '$user',
|
||
},
|
||
},
|
||
);
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_GROUP_CIRCUIT) {
|
||
|
||
const myq = this.addQueryIdMatch(params);
|
||
if (myq)
|
||
query.push(myq);
|
||
|
||
query.push({ $project: { req_groups: 1 } });
|
||
const qa1 = this.getLookup(
|
||
{
|
||
lk_tab: 'mygroups',
|
||
lk_LF: 'req_groups.groupname',
|
||
lk_FF: 'groupname',
|
||
lk_as: 'group',
|
||
}, 0, {
|
||
'group.idapp': 1,
|
||
'group.groupname': 1,
|
||
'group.photos': 1,
|
||
});
|
||
if (qa1) query = [...query, ...qa1];
|
||
query.push({ $unwind: '$group' });
|
||
|
||
query.push({
|
||
$match: {
|
||
$and: [
|
||
{ 'group.idapp': params.idapp },
|
||
],
|
||
},
|
||
});
|
||
|
||
|
||
query.push({
|
||
$replaceRoot: {
|
||
newRoot: '$group',
|
||
},
|
||
},
|
||
);
|
||
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_REFUSED_GROUP_CIRCUIT) {
|
||
|
||
|
||
const myq = this.addQueryIdMatch(params);
|
||
if (myq)
|
||
query.push(myq);
|
||
|
||
query.push({ $project: { refused_groups: 1 } });
|
||
query.push({ $unwind: '$refused_groups' });
|
||
const qa1 = this.getGroupnameLookupPipeLine(
|
||
{
|
||
lk_tab: 'mygroups',
|
||
lk_LF: 'refused_groups.groupname',
|
||
lk_FF: 'groupname',
|
||
lk_as: 'group',
|
||
idapp,
|
||
}, {
|
||
'group.idapp': 1,
|
||
'group.groupname': 1,
|
||
'group.descr': 1,
|
||
'group.photos': 1,
|
||
});
|
||
if (qa1) query = [...query, ...qa1];
|
||
query.push({ $unwind: '$group' });
|
||
/*
|
||
query.push({
|
||
$match: {
|
||
$and: [
|
||
{'user.idapp': params.idapp},
|
||
],
|
||
},
|
||
});
|
||
*/
|
||
|
||
query.push({
|
||
$replaceRoot: {
|
||
newRoot: '$group',
|
||
},
|
||
},
|
||
);
|
||
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_MOVEMENTS) {
|
||
|
||
const { Movement } = require('../models/movement');
|
||
|
||
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, params.username, '', '', params.myid);
|
||
|
||
query.push(...myquery);
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_MOVEMENTS_GROUPNAME) {
|
||
|
||
const { Movement } = require('../models/movement');
|
||
|
||
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, '', params.groupname, '', params.myid);
|
||
|
||
query.push(...myquery);
|
||
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_MOVEMENTS_CONTOCOM) {
|
||
|
||
const { Movement } = require('../models/movement');
|
||
|
||
const myquery = await Movement.getQueryMovsByCircuitId(params.idapp, '', '', params.contocom, params.myid);
|
||
|
||
query.push(...myquery);
|
||
|
||
} else if (params.querytype === shared_consts.QUERYTYPE_LIST_ALLMOVEMENTS) {
|
||
|
||
const { Movement } = require('../models/movement');
|
||
|
||
const myquery = await Movement.getQueryAllUsersMovsByCircuitId(params.idapp, params.myid);
|
||
|
||
query.push(...myquery);
|
||
|
||
}
|
||
|
||
if (params.filterextra2) {
|
||
if (params.filterextra2.length > 0)
|
||
query = [...query, ...params.filterextra2];
|
||
}
|
||
|
||
if (newvers) {
|
||
// NUOVA VERSIONE
|
||
let proj = params.lookup2 ? params.lookup2.lk_proj : null;
|
||
|
||
if (params.proj0) {
|
||
query.push({ $project: params.proj0 });
|
||
}
|
||
|
||
if (params.unwind0) {
|
||
query.push({ $unwind: params.unwind0 });
|
||
}
|
||
|
||
let objadd = { query: [], proj: {} };
|
||
|
||
let numtab = this.getNumTabByTable(params.table);
|
||
|
||
|
||
const q1 = this.getLookup(params.lookup1, 1, proj, objadd.proj);
|
||
if (q1) query = [...query, ...q1];
|
||
|
||
if (params.unwind1) {
|
||
query.push({ $unwind: params.unwind1 });
|
||
}
|
||
|
||
if (params.lookupPipeline1) {
|
||
const q1p = this.getLookupStandardPipeline(params.lookupPipeline1, 1);
|
||
if (q1p) query = [...query, ...q1p];
|
||
}
|
||
|
||
const q2 = this.getLookup(params.lookup2, 2, proj, objadd.proj);
|
||
if (q2) query = [...query, ...q2];
|
||
|
||
if (params.lookupPipeline2) {
|
||
const q2p = this.getLookupStandardPipeline(params.lookupPipeline2, 2);
|
||
if (q2p) query = [...query, ...q2p];
|
||
}
|
||
|
||
const q3 = this.getLookup(params.lookup3, 3, proj, objadd.proj);
|
||
if (q3) query = [...query, ...q3];
|
||
|
||
const q4 = this.getLookup(params.lookup4, 4, proj, objadd.proj);
|
||
if (q4) query = [...query, ...q4];
|
||
|
||
const q5 = this.getLookup(params.lookup5, 5, proj, objadd.proj);
|
||
if (q5) query = [...query, ...q5];
|
||
|
||
if (params.filtersearch2) {
|
||
if (params.filtersearch2.length > 0) {
|
||
query.push({ $match: { $and: params.filtersearch2 } });
|
||
}
|
||
}
|
||
|
||
|
||
let filteradmin = false;
|
||
if (params.filtercustom) {
|
||
let condition = {};
|
||
for (const myfilter of params.filtercustom) {
|
||
|
||
if (!!myfilter.admins) {
|
||
filteradmin = true;
|
||
}
|
||
|
||
if (myfilter['pub_to_share'] === shared_consts.PUBTOSHARE.ONLY_TABLE_FOLLOW && params.table === 'mygroups') {
|
||
|
||
let arraygroups = [];
|
||
|
||
if (user && user.profile.mygroups) {
|
||
arraygroups = user.profile.mygroups.map(rec => rec.groupname);
|
||
}
|
||
// prendere i gruppi dell'utente
|
||
|
||
// Cerca tra i gruppi di ogni record, se combaciano almeno 1
|
||
condition = {
|
||
'profile.mygroups':
|
||
{
|
||
$elemMatch: {
|
||
groupname: { $in: arraygroups },
|
||
},
|
||
|
||
},
|
||
};
|
||
|
||
query.push({ $match: { $and: [condition] } });
|
||
} else if (myfilter['pub_to_share'] === shared_consts.PUBTOSHARE.ONLY_TABLE_FOLLOW && params.table === 'circuits') {
|
||
|
||
let arraycircuits = [];
|
||
|
||
if (user && user.profile.mycircuits) {
|
||
arraycircuits = user.profile.mycircuits.map(rec => rec.circuitname);
|
||
}
|
||
// prendere i gruppi dell'utente
|
||
|
||
// Cerca tra i gruppi di ogni record, se combaciano almeno 1
|
||
condition = {
|
||
'profile.mycircuits':
|
||
{
|
||
$elemMatch: {
|
||
circuitname: { $in: arraycircuits },
|
||
},
|
||
|
||
},
|
||
};
|
||
|
||
query.push({ $match: { $and: [condition] } });
|
||
} else if (shared_consts.TABLES_ENABLE_GETREC_BYID.includes(params.table)) {
|
||
// Rimuovi dalla query quelli non visibili
|
||
|
||
let arraygroups = [];
|
||
|
||
if (user && user.profile.mygroups) {
|
||
arraygroups = user.profile.mygroups.map(rec => rec.groupname);
|
||
}
|
||
// prendere i gruppi dell'utente
|
||
|
||
// Cerca tra i gruppi di ogni record, se combaciano almeno 1
|
||
condition = {
|
||
'profile.mygroups':
|
||
{
|
||
$elemMatch: {
|
||
groupname: { $in: arraygroups },
|
||
},
|
||
|
||
},
|
||
};
|
||
|
||
query.push(
|
||
{
|
||
$match:
|
||
{
|
||
$or: [
|
||
{
|
||
$and: [condition, { pub_to_share: 1 }],
|
||
},
|
||
{ $or: [{ pub_to_share: { $exists: false } }, { pub_to_share: { $exists: true, $eq: shared_consts.PUBTOSHARE.ALL } }] },
|
||
],
|
||
},
|
||
},
|
||
);
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
if (params.filtersearch3or) {
|
||
if (params.filtersearch3or.length > 0) {
|
||
query.push({ $match: { $or: params.filtersearch3or } });
|
||
}
|
||
}
|
||
|
||
if (params.filtersearch3and) {
|
||
if (params.filtersearch3and.length > 0) {
|
||
// Se c'è statusskill allora glielo metto in OR
|
||
|
||
if (params.table === 'myskills' && params.filtersearch && !this.contieneIdStatusSkill(params.filtersearch)) {
|
||
|
||
query.push({
|
||
$match: {
|
||
$or: [
|
||
{ $and: params.filtersearch3and },
|
||
{ idStatusSkill: { $in: [2] } }
|
||
]
|
||
}
|
||
});
|
||
} else {
|
||
query.push({ $match: { $and: params.filtersearch3and } });
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
if (params.filter && params.fieldsearch_last) {
|
||
const querytemp = this.getFilterParam(params.filter,
|
||
params.fieldsearch_last);
|
||
if (querytemp) {
|
||
query = [...query, ...querytemp];
|
||
}
|
||
|
||
// Save the search:
|
||
if (user._id) {
|
||
const mysearch = new Search({ idapp, userId: user._id, text: params.filter });
|
||
await mysearch.save();
|
||
}
|
||
}
|
||
|
||
if (params.table === 'mygroups' || params.table === 'circuits') {
|
||
// BINARY CHECK (?): const filter = [{ visibility: { $bitsAnyClear: [1] } }];
|
||
// if (!User.isAdmin(req.user.perm)) {
|
||
// not Visibility_Group.HIDDEN
|
||
if (!filteradmin) {
|
||
const filter = [
|
||
{
|
||
$or: [
|
||
{
|
||
visibility: {
|
||
$nin: [shared_consts.Visibility_Group.HIDDEN],
|
||
},
|
||
},
|
||
{
|
||
createdBy: {
|
||
$eq: user.username,
|
||
},
|
||
},
|
||
],
|
||
},
|
||
];
|
||
query.push({ $match: { $and: filter } });
|
||
}
|
||
// }
|
||
}
|
||
|
||
if (params.options && this.isBitActive(params.options,
|
||
shared_consts.OPTIONS_ADD_COUNT_FAVORITE)) {
|
||
// objadd = this.addNumFavoriteAndBookmarkToQuery(idapp, numtab);
|
||
// if (Object.keys(objadd.query).length > 0)
|
||
// query = [...query, ...objadd.query];
|
||
}
|
||
|
||
} else {
|
||
// VECCHIA VERSIONE
|
||
const q1 = this.getLookup(params, 1);
|
||
if (q1) query = [...query, ...q1];
|
||
}
|
||
|
||
if (params.sortBy) {
|
||
// maybe we want to sort by blog title or something
|
||
const mysort = { $sort: params.sortBy };
|
||
// console.log('sortBy', params.sortBy);
|
||
// console.table(mysort);
|
||
query.push(mysort);
|
||
}
|
||
|
||
query.push(
|
||
{
|
||
$group: {
|
||
_id: null,
|
||
// get a count of every result that matches until now
|
||
count: { $sum: 1 },
|
||
// keep our results for the next operation
|
||
results: { $push: '$$ROOT' },
|
||
},
|
||
},
|
||
// and finally trim the results to within the range given by start/endRow
|
||
{
|
||
$project: {
|
||
count: 1,
|
||
rows: { $slice: ['$results', params.startRow, numrowend] },
|
||
},
|
||
},
|
||
);
|
||
|
||
if (this.testing()) {
|
||
console.log('query', query);
|
||
}
|
||
// console.log('query', query);
|
||
|
||
return query;
|
||
|
||
},
|
||
|
||
startTimeLog(name) {
|
||
if (this.testing()) {
|
||
// console.log('inizio', name);
|
||
console.time(name);
|
||
}
|
||
},
|
||
|
||
endTimeLog(name) {
|
||
if (this.testing()) {
|
||
// console.log(' ... fine', name);
|
||
console.timeEnd(name);
|
||
}
|
||
},
|
||
|
||
async executeQueryTable(mythistable, idapp, params, user) {
|
||
let query = await this.getQueryTable(idapp, params, user);
|
||
|
||
try {
|
||
// console.log('query', query);
|
||
this.startTimeLog('Query 1');
|
||
|
||
const [ris] = await mythistable.aggregate(query);
|
||
|
||
if (ris) {
|
||
if (params.table === 'users') {
|
||
for (const myrec of ris.rows) {
|
||
myrec.password = '**********';
|
||
}
|
||
} else if (params.table === 'mygroups') {
|
||
for (const myrec of ris.rows) {
|
||
if (myrec.pwd_cryp)
|
||
myrec.pwd_cryp = '**********';
|
||
}
|
||
}
|
||
|
||
this.endTimeLog('Query 1');
|
||
|
||
// console.table(ris.rows);
|
||
// console.log('ROW ', ris.count);
|
||
return ({ count: ris.count, rows: ris.rows });
|
||
} else {
|
||
return ({ count: 0, rows: [] });
|
||
}
|
||
} catch (e) {
|
||
console.log('error', e);
|
||
}
|
||
|
||
},
|
||
async DuplicateAllRecords(mythistable, idapporig, idappdest) {
|
||
console.log(mythistable.name);
|
||
|
||
const numrec = await mythistable.findAllIdApp(idappdest).then((arrrec) => {
|
||
if (arrrec && arrrec.length > 1) {
|
||
return arrrec.length; // Has Already set
|
||
} else {
|
||
return 0;
|
||
}
|
||
});
|
||
|
||
// Before check if exist more than 1 record in the destination,
|
||
// if Yes don't copy
|
||
if (numrec <= 0) {
|
||
return await mythistable.findAllIdApp(idapporig).then(async (arrrec) => {
|
||
let num = 0;
|
||
|
||
for (let ind = 0; ind < arrrec.length; ind++) {
|
||
let newrec = new mythistable(arrrec[ind]);
|
||
newrec._id = new ObjectID();
|
||
newrec.idapp = idappdest;
|
||
|
||
try {
|
||
await newrec.save((err, rec) => {
|
||
if (rec) {
|
||
num++;
|
||
}
|
||
|
||
});
|
||
} catch (e) {
|
||
console.error('e', e);
|
||
}
|
||
|
||
}
|
||
return num;
|
||
});
|
||
}
|
||
},
|
||
|
||
isBitActive(bit, whattofind) {
|
||
return ((bit & whattofind) === whattofind);
|
||
},
|
||
|
||
isBitAttivoESelez(bit, whattofind, loSono) {
|
||
const abil = this.isBitActive(bit, whattofind);
|
||
|
||
return ((abil && loSono) || !abil);
|
||
},
|
||
|
||
SetBit(myval, bit) {
|
||
let myvalout = myval
|
||
myvalout |= bit
|
||
return myvalout
|
||
},
|
||
|
||
async snooze(ms) {
|
||
return new Promise(resolve => setTimeout(resolve, ms));
|
||
},
|
||
|
||
IncDateNow(secs) {
|
||
let mydate = new Date(new Date().getTime() + secs);
|
||
// console.log('mydate', mydate);
|
||
return mydate;
|
||
},
|
||
|
||
isdiffSecDateLess(mydatediffstr, secs) {
|
||
let mydate = new Date();
|
||
// console.log('mydate', mydate);
|
||
let mydata2 = new Date(mydatediffstr);
|
||
let ris = ((mydate.getTime() - mydata2.getTime()) / 1000);
|
||
return (ris < secs);
|
||
},
|
||
|
||
AddDate(mydate, days) {
|
||
let date = new Date(mydate);
|
||
date.setTime(date.getTime() + days * 86400000);
|
||
return date;
|
||
},
|
||
|
||
isMonToSat() {
|
||
const dayOfWeek = new Date(new Date()).getDay();
|
||
return dayOfWeek >= 1 && dayOfWeek <= 6;
|
||
},
|
||
|
||
isMonToFri() {
|
||
const dayOfWeek = new Date(new Date()).getDay();
|
||
return dayOfWeek >= 1 && dayOfWeek <= 5;
|
||
},
|
||
|
||
// var startTime = '15:10:10';
|
||
// var endTime = '22:30:00';
|
||
isBetweenTwoTime(startTime, endTime) {
|
||
|
||
currentDate = new Date();
|
||
|
||
startDate = new Date(currentDate.getTime());
|
||
startDate.setHours(startTime.split(':')[0]);
|
||
startDate.setMinutes(startTime.split(':')[1]);
|
||
startDate.setSeconds(startTime.split(':')[2]);
|
||
|
||
endDate = new Date(currentDate.getTime());
|
||
endDate.setHours(endTime.split(':')[0]);
|
||
endDate.setMinutes(endTime.split(':')[1]);
|
||
endDate.setSeconds(endTime.split(':')[2]);
|
||
|
||
valid = startDate < currentDate && endDate > currentDate;
|
||
|
||
return valid;
|
||
},
|
||
|
||
getlimiti(mypos) {
|
||
|
||
if (mypos.col < 0) {
|
||
mypos.col = 0;
|
||
}
|
||
|
||
if (mypos.riga < 0) {
|
||
mypos.riga = 0;
|
||
mypos.col = 0;
|
||
}
|
||
|
||
return mypos;
|
||
},
|
||
|
||
getRigaColByPosUp(mypos) {
|
||
if (mypos.numup > 0) {
|
||
mypos.riga = mypos.riga - mypos.numup;
|
||
mypos.col = Math.ceil(mypos.col / (Math.pow(2, mypos.numup)));
|
||
}
|
||
if (mypos.numup < 0) {
|
||
mypos.riga = mypos.riga - mypos.numup;
|
||
mypos.col = Math.ceil(mypos.col * (Math.pow(2, -mypos.numup)));
|
||
}
|
||
if (mypos.riga < 1) {
|
||
mypos.riga = 1;
|
||
}
|
||
if (mypos.col < 1) {
|
||
mypos.col = 1;
|
||
}
|
||
},
|
||
|
||
getRigaColGenerica(idapp, riga, col, numup) {
|
||
mypos = {
|
||
idapp,
|
||
riga,
|
||
col,
|
||
numup,
|
||
};
|
||
|
||
if (idapp === this.AYNI) {
|
||
this.getRigaColByPosUp(mypos);
|
||
ris = this.getlimiti(mypos);
|
||
}
|
||
|
||
return ris;
|
||
},
|
||
|
||
getRigaColSognatoreByDonatore(idapp, riga, col) {
|
||
return this.getRigaColGenerica(idapp, riga, col, 6);
|
||
},
|
||
|
||
getRigaColMediatoreByFuoco(idapp, riga, col) {
|
||
return this.getRigaColGenerica(idapp, riga, col, 3);
|
||
},
|
||
|
||
getRigaColSognatoreByMediatore(idapp, riga, col) {
|
||
return this.getRigaColGenerica(idapp, riga, col, 3);
|
||
},
|
||
|
||
appendLeadingZeroes(n) {
|
||
if (n <= 9) {
|
||
return '0' + n;
|
||
}
|
||
return n;
|
||
},
|
||
|
||
getWeekDayByLangByNumCar(date, lang, num) {
|
||
if (!lang)
|
||
lang = 'it';
|
||
|
||
const dayOfWeek = new Date(date).getDay();
|
||
|
||
const myday = {
|
||
it: [
|
||
'Domenica',
|
||
'Lunedì',
|
||
'Martedì',
|
||
'Mercoledì',
|
||
'Giovedì',
|
||
'Venerdì',
|
||
'Sabato'],
|
||
enUs: [
|
||
'Sunday',
|
||
'Monday',
|
||
'Tuesday',
|
||
'Wednesday',
|
||
'Thursday',
|
||
'Friday',
|
||
'Saturday'],
|
||
fr: [
|
||
'Dimanche',
|
||
'Lundi',
|
||
'Mardi',
|
||
'Mercredi',
|
||
'Jeudi',
|
||
'Vendredi',
|
||
'Samedi'],
|
||
es: [
|
||
'Domingo',
|
||
'Lunes',
|
||
'Martes',
|
||
'Miércoles',
|
||
'Jueves',
|
||
'iernes',
|
||
'Sábado'],
|
||
pt: [
|
||
'Domingo',
|
||
'Segunda',
|
||
'Terça',
|
||
'Quarta',
|
||
'Quinta',
|
||
'Sexta',
|
||
'Sábado'],
|
||
de: [
|
||
'Sonntag',
|
||
'Montag',
|
||
'Dienstag',
|
||
'Mittwoch',
|
||
'Donnerstag',
|
||
'Freitag',
|
||
'Samstag'],
|
||
si: [
|
||
'Nedelja',
|
||
'Ponedeljek',
|
||
'Torek',
|
||
'Sreda',
|
||
'četrtek',
|
||
'Petek',
|
||
'Sobota'],
|
||
};
|
||
|
||
if (num > 0) {
|
||
return isNaN(dayOfWeek) ? '' : myday[lang][dayOfWeek].substring(0, num);
|
||
} else {
|
||
return isNaN(dayOfWeek) ? '' : myday[lang][dayOfWeek];
|
||
}
|
||
},
|
||
|
||
isSunday(mydate) {
|
||
const dayOfWeek = new Date(mydate).getDay();
|
||
return dayOfWeek === 0;
|
||
},
|
||
|
||
isMonday(mydate) {
|
||
const dayOfWeek = new Date(mydate).getDay();
|
||
return dayOfWeek === 1;
|
||
},
|
||
|
||
isSundayDate(mydate) {
|
||
const dayOfWeek = mydate.getDay();
|
||
return dayOfWeek === 0;
|
||
},
|
||
|
||
isMondayDate(mydate) {
|
||
const dayOfWeek = mydate.getDay();
|
||
return dayOfWeek === 1;
|
||
},
|
||
|
||
getWeekDayByLang(date, lang) {
|
||
return this.getWeekDayByLangByNumCar(date, lang, 3);
|
||
},
|
||
|
||
getWeekDayByLangTot(date, lang) {
|
||
return this.getWeekDayByLangByNumCar(date, lang, 0);
|
||
},
|
||
|
||
getWeekDay(date) {
|
||
//Create an array containing each day, starting with Sunday.
|
||
const weekdays = [
|
||
'Domenica',
|
||
'Lunedì',
|
||
'Martedì',
|
||
'Mercoledì',
|
||
'Giovedí',
|
||
'Venerdì',
|
||
'Sabato',
|
||
];
|
||
//Use the getDay() method to get the day.
|
||
const day = date.getDay();
|
||
//Return the element that corresponds to that index.
|
||
return weekdays[day];
|
||
},
|
||
|
||
getstrDateTimeShort(mydate, lang) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return this.getWeekDayByLang(mydate, lang) + ' ' +
|
||
this.appendLeadingZeroes(mydate.getDate()) + '/' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + ' ORE ' +
|
||
this.appendLeadingZeroes(mydate.getHours()) + ':' +
|
||
this.appendLeadingZeroes(mydate.getMinutes());
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrTime(mytimestamp) {
|
||
// Create a Date object with your desired date
|
||
const date = new Date(mytimestamp); // You can replace this with your specific date
|
||
|
||
// Get the hour and minute components from the date
|
||
const hours = date.getHours();
|
||
const minutes = date.getMinutes();
|
||
|
||
// Format the hour and minute components as HH:MM
|
||
const formattedTime = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
|
||
return formattedTime
|
||
},
|
||
|
||
getstrDateShort(mydate, lang) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return this.getWeekDayByLang(mydate, lang).substring(0, 3) + ' ' +
|
||
this.appendLeadingZeroes(mydate.getDate()) + '/' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1);
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrDate_DD_MM_YYYY(mydate) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return this.appendLeadingZeroes(mydate.getDate()) + '/' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + '/' +
|
||
this.appendLeadingZeroes(mydate.getFullYear());
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrDateYYYY_MM_DD(mydate) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return mydate.getFullYear() + '-' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + '-' +
|
||
this.appendLeadingZeroes(mydate.getDate());
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrUTCDateYYYY_MM_DD(mydate) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return mydate.getUTCFullYear() + '-' +
|
||
this.appendLeadingZeroes(mydate.getUTCMonth() + 1) + '-' +
|
||
this.appendLeadingZeroes(mydate.getUTCDate());
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrDateLong(mydate, lang) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return this.getWeekDayByLang(mydate, lang) + ' ' +
|
||
this.appendLeadingZeroes(mydate.getDate()) + '/' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + '/' +
|
||
mydate.getFullYear();
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrDateLongTot(mydate, lang) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return this.getWeekDayByLangTot(mydate, lang) + ' ' +
|
||
this.appendLeadingZeroes(mydate.getDate()) + '/' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + '/' +
|
||
mydate.getFullYear();
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getstrDateLongFile(mydate, lang) {
|
||
if (mydate) {
|
||
// console.log('getstrDate', mytimestamp)
|
||
return mydate.getFullYear() + '-' +
|
||
this.appendLeadingZeroes(mydate.getMonth() + 1) + '-' +
|
||
this.appendLeadingZeroes(mydate.getDate()) + ' (' +
|
||
this.getWeekDayByLang(mydate, lang) + ')';
|
||
} else {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
getlinkzoom(rec) {
|
||
if (rec === null) {
|
||
rec = {
|
||
typeconf: this.TYPECONF_ZOOM,
|
||
id_conf_zoom: '',
|
||
};
|
||
}
|
||
let typeconf = rec.typeconf;
|
||
if (typeconf === '')
|
||
typeconf = this.TYPECONF_ZOOM;
|
||
|
||
let mylink = 'https://zoom.us/j/';
|
||
if (typeconf === this.TYPECONF_JITSI)
|
||
mylink = 'https://meet.jit.si/';
|
||
|
||
if (rec.id_conf_zoom === '') {
|
||
rec.id_conf_zoom = '6668882000';
|
||
}
|
||
|
||
return mylink + rec.id_conf_zoom;
|
||
|
||
},
|
||
|
||
getmd5(mystr) {
|
||
return CryptoJS.MD5(mystr.toLowerCase()).toString();
|
||
},
|
||
|
||
getHash(mystr) {
|
||
return CryptoJS.SHA512(mystr, { outputLength: 256 }).toString();
|
||
},
|
||
|
||
encrypt(msg, pass) {
|
||
var salt = CryptoJS.lib.WordArray.random(128 / 8);
|
||
|
||
var key = CryptoJS.PBKDF2(pass, salt, {
|
||
keySize: keySize / 32,
|
||
iterations: iterations,
|
||
});
|
||
|
||
var iv = CryptoJS.lib.WordArray.random(128 / 8);
|
||
|
||
var encrypted = CryptoJS.AES.encrypt(msg, key, {
|
||
iv: iv,
|
||
padding: CryptoJS.pad.Pkcs7,
|
||
mode: CryptoJS.mode.CBC,
|
||
|
||
});
|
||
|
||
// salt, iv will be hex 32 in length
|
||
// append them to the ciphertext for use in decryption
|
||
var transitmessage = salt.toString() + iv.toString() + encrypted.toString();
|
||
return transitmessage;
|
||
},
|
||
|
||
decrypt(transitmessage, pass) {
|
||
var salt = CryptoJS.enc.Hex.parse(transitmessage.substr(0, 32));
|
||
var iv = CryptoJS.enc.Hex.parse(transitmessage.substr(32, 32));
|
||
var encrypted = transitmessage.substring(64);
|
||
|
||
var key = CryptoJS.PBKDF2(pass, salt, {
|
||
keySize: keySize / 32,
|
||
iterations: iterations,
|
||
});
|
||
|
||
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
|
||
iv: iv,
|
||
padding: CryptoJS.pad.Pkcs7,
|
||
mode: CryptoJS.mode.CBC,
|
||
|
||
});
|
||
return decrypted;
|
||
},
|
||
|
||
cryptdata(mydata) {
|
||
if (mydata === '')
|
||
return '';
|
||
// Encrypt
|
||
//return CryptoJS.AES.encrypt(JSON.stringify(mydata), process.env.SECRK);
|
||
return this.encrypt(mydata, process.env.SECRK);
|
||
},
|
||
|
||
decryptdata(mydatacrypted) {
|
||
if (mydatacrypted === '' || mydatacrypted === undefined)
|
||
return '';
|
||
// Decrypt
|
||
// const bytes = CryptoJS.AES.decrypt(mydatacrypted.toString(), process.env.SECRK);
|
||
// return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
|
||
return this.decrypt(mydatacrypted, process.env.SECRK).
|
||
toString(CryptoJS.enc.Utf8);
|
||
},
|
||
|
||
BoolToInt(mybool) {
|
||
return (mybool) ? -1 : 0;
|
||
},
|
||
|
||
StrToBool(mystr) {
|
||
return (mystr === '-1') ? true : false;
|
||
},
|
||
|
||
writelogfile(mystr, filename) {
|
||
// fs.appendFile(FILELOG, mystr, function (err) {
|
||
// if (err) throw err;
|
||
// console.log('Saved!');
|
||
// });
|
||
try {
|
||
mystr = this.getstrDateTimeShort(new Date(), 'it') + ': ' + mystr;
|
||
|
||
const stream = fs.createWriteStream(filename, { flags: 'a' });
|
||
stream.write('\n' + mystr);
|
||
stream.end();
|
||
} catch (e) {
|
||
|
||
}
|
||
|
||
},
|
||
|
||
readlogfile(idapp, filename) {
|
||
|
||
try {
|
||
return fs.readFileSync(idapp + '/' + filename, 'utf8');
|
||
} catch (e) {
|
||
return '';
|
||
}
|
||
},
|
||
|
||
writelog(mystr) {
|
||
this.writelogfile(mystr, FILELOG);
|
||
},
|
||
|
||
writeEventsLog(mystr) {
|
||
this.writelogfile(mystr, FILEEVENTS);
|
||
},
|
||
|
||
writeManagersLog(mystr) {
|
||
this.writelogfile(mystr, FILEMANAGERS);
|
||
},
|
||
writeTransactionLog(mystr) {
|
||
this.writelogfile(mystr, FILETRANSACTION);
|
||
},
|
||
writeErrorLog(mystr) {
|
||
this.writelogfile(mystr, FILEERRLOGIN);
|
||
},
|
||
|
||
writeSostituzioniLog(mystr) {
|
||
this.writelogfile(mystr, FILESOSTITUZIONI);
|
||
},
|
||
|
||
writeIPToBan(mystr) {
|
||
this.writelogfile(mystr, FILEIP_TO_BAN);
|
||
},
|
||
|
||
writeFlottaLog(idapp, mystr, riga, col) {
|
||
this.mkdirpath(idapp + '/');
|
||
this.writelogfile(mystr, idapp + '/' + riga + '_' + col + '.txt');
|
||
},
|
||
|
||
readFlottaLog(idapp, riga, col) {
|
||
const nomefile = riga + '_' + col + '.txt';
|
||
return this.readlogfile(idapp, nomefile);
|
||
},
|
||
|
||
writeNaveLog(mystr) {
|
||
this.writelogfile(mystr, FILENAVE);
|
||
},
|
||
|
||
move(oldPath, newPath, callback) {
|
||
|
||
fs.rename(oldPath, newPath, function (err) {
|
||
if (err) {
|
||
if (err.code === 'EXDEV') {
|
||
copy();
|
||
} else {
|
||
callback(err);
|
||
}
|
||
return;
|
||
} else {
|
||
console.log(' ... File Rinominato', oldPath, 'in:', newPath);
|
||
}
|
||
|
||
callback();
|
||
});
|
||
|
||
function copy() {
|
||
const readStream = fs.createReadStream(oldPath);
|
||
const writeStream = fs.createWriteStream(newPath);
|
||
|
||
readStream.on('error', callback);
|
||
writeStream.on('error', callback);
|
||
|
||
readStream.on('close', function () {
|
||
console.log('cancella file già copiato', oldPath);
|
||
fs.unlink(oldPath, callback);
|
||
});
|
||
|
||
readStream.pipe(writeStream);
|
||
}
|
||
},
|
||
|
||
copy(oldPath, newPath, callback) {
|
||
|
||
fs.copyFile(oldPath, newPath, (err) => {
|
||
if (err) throw err;
|
||
// console.log('source.txt was copied to destination.txt');
|
||
});
|
||
},
|
||
|
||
extractFileName: function (filename) {
|
||
return path.basename(filename);
|
||
},
|
||
|
||
extractFilePath: function (filename) {
|
||
return path.dirname(filename);
|
||
},
|
||
|
||
delete(mypath, alsothumb, callback) {
|
||
|
||
fs.unlink(mypath, function (err) {
|
||
if (alsothumb) {
|
||
try {
|
||
let img_small = path.dirname(mypath) + '/' +
|
||
server_constants.PREFIX_IMG_SMALL + path.basename(mypath);
|
||
fs.unlink(img_small, function (err) {
|
||
if (err)
|
||
console.log('Errore durante la Cancellazione del file', mypath);
|
||
else
|
||
console.log('deleted file', mypath);
|
||
});
|
||
|
||
} catch (e) {
|
||
console.error(err);
|
||
}
|
||
}
|
||
if (err) {
|
||
console.error(err);
|
||
callback(err);
|
||
return;
|
||
}
|
||
callback();
|
||
});
|
||
},
|
||
|
||
mkdirpath(dirPath) {
|
||
if (!fs.existsSync(dirPath)) {
|
||
try {
|
||
fs.mkdirSync(dirPath, { recursive: true });
|
||
} catch (e) {
|
||
if (dirPath !== path.dirname(dirPath)) {
|
||
const myname = path.dirname(dirPath);
|
||
this.mkdirpath(myname);
|
||
// this.mkdirpath(dirPath);
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
extractNameAndSurnameByComplete(name_complete) {
|
||
const suffissoCognome = ['Del', 'La', 'De', 'Lo'];
|
||
|
||
let campi = name_complete.split(' ');
|
||
let namesurname = {
|
||
name: '',
|
||
surname: '',
|
||
};
|
||
|
||
if (campi.length === 2) {
|
||
namesurname.name = campi[0];
|
||
namesurname.surname = campi[1];
|
||
} else if (campi.length === 3) {
|
||
if (suffissoCognome.includes(campi[1])) {
|
||
namesurname.name = campi[0];
|
||
namesurname.surname = campi[1] + ' ' + campi[2];
|
||
} else {
|
||
namesurname.name = campi[0] + ' ' + campi[1];
|
||
namesurname.surname = campi[2];
|
||
}
|
||
} else if (campi.length === 4) {
|
||
namesurname.name = campi[0] + ' ' + campi[1];
|
||
namesurname.surname = campi[2] + ' ' + campi[3];
|
||
} else if (campi.length > 4) {
|
||
namesurname.name = campi[0] + ' ' + campi[1];
|
||
namesurname.surname = ' ' + campi[2];
|
||
for (let ind = 3; ind < campi.length; ind++) {
|
||
namesurname.surname += ' ' + campi[ind];
|
||
}
|
||
}
|
||
|
||
return namesurname;
|
||
},
|
||
|
||
isFileExists(filename) {
|
||
return fs.existsSync(filename);
|
||
},
|
||
|
||
getiPAddressUser(req) {
|
||
try {
|
||
const striniziale = '::ffff:';
|
||
if (req.ip.indexOf(striniziale) >= 0) {
|
||
return req.ip.substring(striniziale.length);
|
||
} else {
|
||
return req.ip; // Express
|
||
}
|
||
|
||
} catch (e) {
|
||
return '';
|
||
}
|
||
},
|
||
removespaces(mystr) {
|
||
return mystr.replace(/\s+/g, '');
|
||
},
|
||
|
||
ModificheConsentite(table, fieldsvalue, idrec, user) {
|
||
if (table === 'sharewithus') {
|
||
return true;
|
||
}
|
||
if (table === 'hours') {
|
||
return true;
|
||
}
|
||
if (table === 'users') {
|
||
if ('aportador_solidario' in fieldsvalue) {
|
||
return true;
|
||
}
|
||
if ('ALL' in fieldsvalue) {
|
||
//++Todo: Cancellalo solo se sono io il creatore dell'utente ... o se posso!
|
||
return true;
|
||
}
|
||
}
|
||
|
||
if (shared_consts.TABLES_PERM_CHANGE_FOR_USERS.includes(table)) {
|
||
return true;
|
||
}
|
||
if (shared_consts.TABLES_PERM_NEWREC.includes(table)) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
},
|
||
|
||
NotifyIfDelRecord(table) {
|
||
if ((table === 'users') || (table === 'extralist') ||
|
||
(table === 'groups') || (table === 'graduatorias')) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
},
|
||
|
||
getFirstWord(mystr) {
|
||
const myarr = mystr.split(' ');
|
||
if (myarr.length > 0)
|
||
return myarr[0];
|
||
else
|
||
return mystr;
|
||
},
|
||
|
||
getFirst2Car(mystr) {
|
||
if (!!mystr)
|
||
return mystr.substring(0, 2) + '.';
|
||
else
|
||
return '';
|
||
},
|
||
|
||
getmaxcol(riga) {
|
||
return Math.pow(2, riga - 1);
|
||
},
|
||
|
||
getPrimoFuocoByIndCol(col) {
|
||
// let ris = Math.ceil(col - (col % 8)) + 1;
|
||
let ris = ((Math.ceil(col / 8) - 1) * 8) + 1;
|
||
if (ris <= 0)
|
||
ris = 1;
|
||
return ris;
|
||
},
|
||
|
||
getPrimaColFlotta(col) {
|
||
// let ris = Math.ceil(col - (col % 8)) + 1;
|
||
let ris = ((Math.ceil(col / 64) - 1) * 64) + 1;
|
||
if (ris <= 0)
|
||
ris = 1;
|
||
return ris;
|
||
},
|
||
|
||
getStrMsgByTipoMsg(tipomsg) {
|
||
|
||
let mystr = '';
|
||
|
||
if (tipomsg === this.TipoMsg.SEND_MSG_EFFETTUA_IL_DONO)
|
||
mystr = 'Inviato Messaggio per Effettuare il Dono a Tutta la Flotta';
|
||
else if (tipomsg === this.TipoMsg.SEND_MSG_SOLLECITO_DONATORI_NO_DONO)
|
||
mystr = 'Inviato Messaggio per RICORDARE di Effettuare il Dono a chi ancora non l\'ha fatto';
|
||
else if (tipomsg === this.TipoMsg.SEND_MSG_A_MEDIATORI)
|
||
mystr = 'Inviato Messaggio ai Mediatori';
|
||
else if (tipomsg === this.TipoMsg.SEND_MSG_A_SOGNATORE)
|
||
mystr = 'Inviato Messaggio al Sognatore';
|
||
else if (tipomsg === this.TipoMsg.SEND_MSG_A_UTENTE_SOSTITUITO)
|
||
mystr = 'Inviato Messaggio all\'utente Sostituito';
|
||
else if (tipomsg === this.TipoMsg.SEND_MSG_DONO_RICEVUTO_CORRETTAMENTE)
|
||
mystr = 'Inviato Messaggio Dono Ricevuto Correttamente';
|
||
|
||
return mystr;
|
||
},
|
||
|
||
getflagtelegrambyLang(lang) {
|
||
if (lang === 'it')
|
||
return '🇮🇹';
|
||
else if (lang === 'si')
|
||
return '🇸🇮';
|
||
else if (lang === 'es')
|
||
return '🇪🇸';
|
||
else if (lang === 'enUs')
|
||
return '🇬🇧';
|
||
else if (lang === 'uk')
|
||
return '🇬🇧';
|
||
else if (lang === 'fr')
|
||
return '🇫🇷';
|
||
},
|
||
|
||
blockwords(mystr) {
|
||
const arrwords = [
|
||
'http',
|
||
'Http',
|
||
'Asasfasfas',
|
||
'://',
|
||
'mrbit',
|
||
'admin',
|
||
'superuser'];
|
||
try {
|
||
for (const myword of arrwords) {
|
||
if (mystr) {
|
||
if (mystr.includes(myword)) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {
|
||
|
||
}
|
||
|
||
return false;
|
||
},
|
||
|
||
isAlphaNumeric(str) {
|
||
let code, i, len;
|
||
|
||
for (i = 0, len = str.length; i < len; i++) {
|
||
code = str.charCodeAt(i);
|
||
if (!(code > 47 && code < 58) && // numeric (0-9)
|
||
!(code > 64 && code < 91) && // upper alpha (A-Z)
|
||
!(code > 96 && code < 123)) { // lower alpha (a-z)
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
},
|
||
|
||
isAlphaNumericAndSpecialCharacter(str) {
|
||
let code, i, len;
|
||
|
||
for (i = 0, len = str.length; i < len; i++) {
|
||
code = str.charCodeAt(i);
|
||
if (!(code > 47 && code < 58) && // numeric (0-9)
|
||
!(code > 63 && code < 91) && // upper alpha (A-Z) // e @
|
||
(code !== 46) && // . (punto)
|
||
(code !== 95) && // _
|
||
(code !== 45) && // -
|
||
!(code > 96 && code < 123)) { // lower alpha (a-z)
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
},
|
||
|
||
categorizeQueryString(queryObj) {
|
||
let query = {};
|
||
let order = {};
|
||
//extract query, order, filter value
|
||
for (const i in queryObj) {
|
||
if (queryObj[i]) {
|
||
// extract order
|
||
if (i === 'order') {
|
||
order['sort'] = queryObj[i];
|
||
continue;
|
||
}
|
||
// extract range
|
||
if (i === 'range') {
|
||
let range_arr = [];
|
||
let query_arr = [];
|
||
// multi ranges
|
||
if (queryObj[i].constructor === Array) {
|
||
for (const r of queryObj[i]) {
|
||
range_arr = r.split('-');
|
||
query_arr.push({
|
||
price: { $gt: range_arr[0], $lt: range_arr[1] },
|
||
});
|
||
}
|
||
}
|
||
// one range
|
||
if (queryObj[i].constructor === String) {
|
||
range_arr = queryObj[i].split('-');
|
||
query_arr.push({
|
||
price: { $gt: range_arr[0], $lt: range_arr[1] },
|
||
});
|
||
}
|
||
Object.assign(query, { $or: query_arr });
|
||
delete query[i];
|
||
continue;
|
||
}
|
||
query[i] = queryObj[i];
|
||
}
|
||
}
|
||
return { query, order };
|
||
},
|
||
|
||
dateToEpoch(thedate) {
|
||
const time = new Date(thedate).getTime();
|
||
return time - (time % 86400000);
|
||
},
|
||
|
||
dateToEpochStr(thedate) {
|
||
const time = new Date(thedate).getTime();
|
||
return new Date(time - (time % 86400000));
|
||
},
|
||
|
||
async loadApps() {
|
||
const Site = require('../models/site');
|
||
|
||
try {
|
||
this.MYAPPS = await Site.findAll(0);
|
||
// console.log('this.MYAPPS', this.MYAPPS);
|
||
} catch (e) {
|
||
console.error('loadApps', e);
|
||
}
|
||
},
|
||
|
||
async getApps() {
|
||
if (this.MYAPPS.length <= 0)
|
||
await this.loadApps();
|
||
|
||
return this.MYAPPS;
|
||
},
|
||
|
||
getPaymentTypesById(idmetodo) {
|
||
return shared_consts.PaymentTypes[idmetodo];
|
||
},
|
||
|
||
getVersionint(versionstr) {
|
||
let versionarr = versionstr.split('.');
|
||
let version = 0;
|
||
|
||
versionarr = versionarr.reverse();
|
||
|
||
for (let i = 0; i < versionarr.length; i++) {
|
||
version += versionarr[i] * Math.pow(10, i * 2);
|
||
}
|
||
|
||
return parseInt(version);
|
||
},
|
||
|
||
invertescapeslash(mystr) {
|
||
return mystr.replace(/Ç/g, '/');
|
||
},
|
||
|
||
isNumber(n) {
|
||
return typeof (n) != 'boolean' && !isNaN(n) && n;
|
||
},
|
||
getNumObj(obj) {
|
||
let count = 0;
|
||
for (let properties in obj) {
|
||
count = count + 1;
|
||
}
|
||
return count;
|
||
},
|
||
|
||
getNomeCognomeEUserNameByUser(user) {
|
||
let nome = `${user.name} ${user.surname} (${user.username})`;
|
||
if (!user.name) {
|
||
nome = user.username;
|
||
}
|
||
|
||
return nome;
|
||
},
|
||
|
||
sulServer() {
|
||
return process.env.LOCALE !== '1';
|
||
},
|
||
|
||
refreshAllTablesInMem(idapp, table, updatebot, username) {
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
if (table === shared_consts.TAB_BOTS || updatebot) {
|
||
telegrambot.reloadMenuBot(idapp);
|
||
}
|
||
|
||
if (table === shared_consts.TAB_USERS) {
|
||
telegrambot.deleteRecInMemByUsername(idapp, username);
|
||
} else if (table === shared_consts.TAB_SITES) {
|
||
telegrambot.reloadSites();
|
||
}
|
||
|
||
},
|
||
|
||
downloadImage(url, filepath) {
|
||
const download = require('image-downloader');
|
||
|
||
try {
|
||
return download.image({
|
||
url,
|
||
dest: filepath,
|
||
});
|
||
} catch (e) {
|
||
console.error('Err download image', e);
|
||
return false;
|
||
}
|
||
|
||
},
|
||
|
||
async checkStr(msg, mystr, user, cmd) {
|
||
if (msg.includes(mystr)) {
|
||
if (cmd === 1) {
|
||
msg = msg.replace(mystr, await this.getTimeExpReg(user.idapp, user.username));
|
||
}
|
||
}
|
||
return msg;
|
||
},
|
||
|
||
getUnsubsribeUrl(mylocalsconf) {
|
||
|
||
if (mylocalsconf) {
|
||
const baseurl = this.getHostByIdApp(mylocalsconf.idapp);
|
||
const urlunsibscribe = baseurl + '/unsubscribe?em=' + mylocalsconf.hashemail + '&mc=' + mylocalsconf.dataemail.mailchimpactive +
|
||
'&email=' + mylocalsconf.emailto;
|
||
return urlunsibscribe;
|
||
}
|
||
return '';
|
||
},
|
||
|
||
getUnsubsribeUrl_User(user) {
|
||
|
||
if (user && user.email) {
|
||
const hash = this.getHash(user.email + user.username);
|
||
return this.getHostByIdApp(user.idapp) + '/unsubscribe_user?em=' + hash + '&email=' + user.email;
|
||
}
|
||
return '';
|
||
},
|
||
|
||
async convertSpecialTags(user, msg) {
|
||
try {
|
||
if (!msg)
|
||
return msg;
|
||
|
||
|
||
if (!!user) {
|
||
if (msg.includes('{host}')) {
|
||
msg = msg.replace('{host}', this.getHostByIdApp(user.idapp));
|
||
}
|
||
if (msg.includes('{appname}'))
|
||
msg = msg.replace('{appname}', this.getNomeAppByIdApp(user.idapp));
|
||
msg = msg.replace('{username}', user.username);
|
||
msg = await this.checkStr(msg, '{time_exp_reg}', user, 1);
|
||
msg = msg.replace('{name}', user.name ? user.name : user.username);
|
||
msg = msg.replace('{surname}', user.surname ? user.surname : '');
|
||
|
||
msg = msg.replace('{urlunsubscribe_user}', this.getUnsubsribeUrl_User(user));
|
||
|
||
msg = msg.replace('{aportador_solidario}', user.aportador_solidario ? user.aportador_solidario : '');
|
||
if (!!user.profile.link_payment)
|
||
msg = msg.replace('{link_paypalme}', user.profile.link_payment);
|
||
if (!!user.profile.revolut)
|
||
msg = msg.replace('{revolut}', user.profile.revolut);
|
||
if (!!user.profile.payeer_id)
|
||
msg = msg.replace('{payeer_id}', user.profile.payeer_id);
|
||
if (!!user.profile.advcash_id)
|
||
msg = msg.replace('{advcash_id}', user.profile.advcash_id);
|
||
if (!!user.profile.email_paypal)
|
||
msg = msg.replace('{email_paypal}', user.profile.email_paypal);
|
||
if (!!user.profile.note_payment)
|
||
msg = msg.replace('{note_payment}', user.profile.note_payment);
|
||
}
|
||
|
||
// const cl = getclTelegByidapp(user.idapp);
|
||
msg = msg.replace('{link_chathelp}', this.HELP_CHAT);
|
||
|
||
} catch (e) {
|
||
console.log(e);
|
||
}
|
||
|
||
return msg;
|
||
},
|
||
|
||
getUserInfoMsg: function (idapp, myuser, usernametelegram = '', name_telegram = '',
|
||
surname_telegram = '') {
|
||
|
||
let msg = '';
|
||
try {
|
||
const name = myuser.username +
|
||
(myuser.name ? ` (${myuser.name} ${myuser.surname})` : '');
|
||
const linkuserprof = this.getHostByIdApp(idapp) + '/my/' +
|
||
myuser.username;
|
||
|
||
msg = `<br>👉🏻 <a href="${linkuserprof}">${name}</a><br>email: ${myuser.email}`;
|
||
|
||
let u_tg = myuser.profile && myuser.profile.hasOwnProperty('username_telegram') ? myuser.profile.username_telegram : usernametelegram;
|
||
let name_tg = myuser.profile && myuser.profile.hasOwnProperty('firstname_telegram')
|
||
? myuser.profile.firstname_telegram
|
||
: name_telegram;
|
||
let surname_tg = myuser.profile && myuser.profile.hasOwnProperty('lastname_telegram')
|
||
? myuser.profile.lastname_telegram
|
||
: surname_telegram;
|
||
|
||
let namesurnametg = '';
|
||
if (name_tg || surname_tg)
|
||
namesurnametg = ` [${name_tg} ${surname_tg}]`;;
|
||
|
||
if (u_tg) {
|
||
msg += `<br><br>Apri chat 👉🏻 https://t.me/${u_tg}`;
|
||
}
|
||
} catch (e) {
|
||
console.error('getUserInfoMsg', e);
|
||
}
|
||
|
||
return msg;
|
||
},
|
||
|
||
getUserShortInfoMsg: function (idapp, myuser, usernametelegram = '', name_telegram = '',
|
||
surname_telegram = '') {
|
||
|
||
let msg = '';
|
||
try {
|
||
const name = myuser.username +
|
||
(myuser.name ? ` (${myuser.name} ${myuser.surname})` : '');
|
||
const linkuserprof = this.getLinkUserProfile(idapp, myuser.username);
|
||
|
||
let u_tg = myuser.profile && myuser.profile.hasOwnProperty('username_telegram') ? myuser.profile.username_telegram : usernametelegram;
|
||
|
||
msg = `<br>Vedi Profilo sulla APP di <a href="${linkuserprof}">${name}</a>`;
|
||
msg += `<br>Telegram: @${u_tg}`;
|
||
|
||
} catch (e) {
|
||
console.error('getUserInfoMsg', e);
|
||
}
|
||
|
||
return msg;
|
||
},
|
||
|
||
getlinkRelativeRequestNewPassword: function (idapp, email, tokenforgot) {
|
||
const strlinkreg = process.env.LINK_UPDATE_PASSWORD +
|
||
`?idapp=${idapp}&email=${email}&tokenforgot=${tokenforgot}`;
|
||
return strlinkreg;
|
||
},
|
||
|
||
getlinkRequestNewPassword: function (idapp, email, tokenforgot) {
|
||
const strlinkreg = this.getHostByIdApp(idapp) + this.getlinkRelativeRequestNewPassword(idapp, email, tokenforgot);
|
||
return strlinkreg;
|
||
},
|
||
|
||
execScript: function (idapp, msg, script, testo) {
|
||
const { exec } = require('child_process');
|
||
const telegrambot = require('../telegram/telegrambot');
|
||
|
||
const idchat = msg.chat.id;
|
||
|
||
console.log(testo + ' (' + script + ')');
|
||
telegrambot.local_sendMsgTelegramByIdTelegram(idapp, idchat, testo);
|
||
|
||
exec(script, (error, stdout, stderr) => {
|
||
if (error) {
|
||
telegrambot.local_sendMsgTelegramByIdTelegram(idapp, idchat, 'ERROR: ' + error.message);
|
||
console.log(`error: ${error.message}`);
|
||
return;
|
||
}
|
||
if (stderr) {
|
||
telegrambot.local_sendMsgTelegramByIdTelegram(idapp, idchat, 'ERROR: ' + stderr);
|
||
console.log(`stderr: ${stderr}`);
|
||
return;
|
||
}
|
||
|
||
// console.log(` ... stdout: ${stdout}`);
|
||
telegrambot.local_sendMsgTelegramByIdTelegram(idapp, idchat, stdout);
|
||
});
|
||
},
|
||
|
||
capitalize(value) {
|
||
if (!value) {
|
||
return '';
|
||
}
|
||
const myval = value.toString();
|
||
return myval.charAt(0).toUpperCase() + myval.slice(1);
|
||
},
|
||
|
||
firstchars(value, numchars = 200, continua, link) {
|
||
if (!value) {
|
||
return '';
|
||
}
|
||
try {
|
||
let truncatedValue = value;
|
||
// Controllo se la lunghezza della stringa è maggiore di numchars
|
||
if (value.length > numchars) {
|
||
// Tronca la stringa alla lunghezza specificata, mantenendo i tag HTML
|
||
const tags = [];
|
||
let openTag = false;
|
||
for (let i = 0, count = 0; i < value.length && count < numchars; i++) {
|
||
if (value[i] === '<') {
|
||
openTag = true;
|
||
} else if (value[i] === '>') {
|
||
openTag = false;
|
||
}
|
||
if (!openTag) {
|
||
count++;
|
||
}
|
||
truncatedValue = value.substring(0, i + 1);
|
||
}
|
||
// Aggiungi il testo aggiuntivo per indicare il troncamento
|
||
if (continua) {
|
||
if (link) {
|
||
truncatedValue += `<em> (... <a href="${link}">continua sulla App</a>)</em>`;
|
||
} else {
|
||
truncatedValue += `<em> (... continua sulla App)</em>`;
|
||
}
|
||
} else {
|
||
truncatedValue += ' ...';
|
||
}
|
||
}
|
||
return truncatedValue;
|
||
} catch (e) {
|
||
return value;
|
||
}
|
||
},
|
||
|
||
removeAtChar(mystr) {
|
||
if (mystr && mystr[0] === '@') {
|
||
return mystr = mystr.substring(1);
|
||
}
|
||
|
||
return mystr;
|
||
},
|
||
|
||
updateQueryStringParameter(uri, key, value) {
|
||
if (uri === '' || !uri)
|
||
return '';
|
||
var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
|
||
var separator = uri.indexOf('?') !== -1 ? '&' : '?';
|
||
if (uri.match(re)) {
|
||
return uri.replace(re, '$1' + key + '=' + value + '$2');
|
||
} else {
|
||
return uri + separator + key + '=' + value;
|
||
}
|
||
},
|
||
|
||
isArray(val) {
|
||
return Array.isArray(val);
|
||
},
|
||
|
||
getContentByTypeMsg(typemsg) {
|
||
|
||
},
|
||
|
||
getContentNotifByParams(params, content, typesend) {
|
||
if (typesend === shared_consts.TypeSend.TELEGRAM) {
|
||
|
||
let myhost = this.getHostByIdApp(params.idapp);
|
||
|
||
if (params.textaddTelegram) {
|
||
content = content + '\n' + params.textaddTelegram;
|
||
}
|
||
|
||
if (params.linkaddTelegram) {
|
||
if (params.openUrl)
|
||
content = content + '\n' + '<a href="' + myhost + params.openUrl + '">' + params.linkaddTelegram + '</a>';
|
||
}
|
||
|
||
|
||
/*if (params.openUrl)
|
||
content = content + '\n' + '<a href="' + myhost + params.openUrl + '">' + i18n.__('OPEN PAGE') + '</a>';
|
||
|
||
*/
|
||
}
|
||
|
||
return content;
|
||
},
|
||
|
||
getAhref(username, link) {
|
||
return `<a href='${link}'>${username}</a>`;
|
||
},
|
||
|
||
replaceStringAtEnd(inputString, searchString, replacement) {
|
||
// Create a regular expression that matches the searchString at the end of the inputString
|
||
const regex = new RegExp(searchString + '$');
|
||
|
||
// Use the replace method with the regular expression to replace the string
|
||
const result = inputString.replace(regex, replacement);
|
||
|
||
return result;
|
||
},
|
||
|
||
getstrDateTimeEvent(myevent) {
|
||
let mystr = '';
|
||
|
||
// is same day?
|
||
if (this.getstrDateShort(myevent.dateTimeStart) === this.getstrDateShort(myevent.dateTimeEnd)) {
|
||
mystr = i18n.__('DATEDAYONLY', this.getstrDateLong(myevent.dateTimeStart), this.getstrTime(myevent.dateTimeStart),
|
||
this.getstrTime(myevent.dateTimeEnd))
|
||
} else {
|
||
mystr = i18n.__('DATE_2DAYS', this.getstrDateLong(myevent.dateTimeStart), this.getstrTime(myevent.dateTimeStart),
|
||
this.getstrDateLong(myevent.dateTimeEnd), this.getstrTime(myevent.dateTimeEnd))
|
||
}
|
||
|
||
return '🗓 ' + mystr;
|
||
},
|
||
|
||
getDoveStrByEvent(myrec) {
|
||
let dove = '🏠 ';
|
||
if (myrec.mycities && myrec.mycities.length > 0) {
|
||
dove += myrec.mycities[0].comune + ' (' + myrec.mycities[0].prov + ')'
|
||
}
|
||
return dove;
|
||
},
|
||
|
||
async getDescrEstesaStrByEvent(myrec) {
|
||
let mystr = '';
|
||
|
||
mystr = await this.firstchars(this.replaceStringAtEnd(myrec.note, '</div>', ''), 800);
|
||
if (mystr)
|
||
mystr = 'ℹ️ ' + mystr
|
||
return mystr;
|
||
},
|
||
|
||
|
||
async getEventForTelegram(myrec, mydescr, userorig) {
|
||
try {
|
||
let datastr = this.getstrDateTimeEvent(myrec);
|
||
let dovestr = this.getDoveStrByEvent(myrec);
|
||
let descrestesa = await this.getDescrEstesaStrByEvent(myrec);
|
||
let organizedby = myrec.organisedBy;
|
||
let contributo = myrec.contribstr;
|
||
|
||
let newdescr = i18n.__('NEW_EVENT', userorig, datastr, mydescr, dovestr);
|
||
let newdescrtelegram = i18n.__('NEW_EVENT_TELEGRAM', datastr, mydescr, dovestr, descrestesa, userorig);
|
||
if (organizedby) {
|
||
newdescrtelegram += i18n.__('ORGANIZED_BY', organizedby);
|
||
}
|
||
if (contributo) {
|
||
newdescrtelegram += i18n.__('CONTRIB', contributo);
|
||
}
|
||
newdescrtelegram += i18n.__('EVENT_ADDED_FROM', userorig);
|
||
|
||
return { newdescr, newdescrtelegram }
|
||
} catch (e) {
|
||
console.error('Error', e);
|
||
}
|
||
|
||
},
|
||
|
||
addRowTelegram(icon, title, content, acapo, islink) {
|
||
let mystr = '';
|
||
|
||
let descrcontent = content;
|
||
if (islink) {
|
||
title = `<a href="${content}">${title}</a>`;
|
||
descrcontent = '';
|
||
}
|
||
|
||
mystr += `${icon} <strong>${title}</strong> ${icon}\n`;
|
||
if (descrcontent) {
|
||
mystr += `${descrcontent}\n`;
|
||
|
||
if (acapo) {
|
||
mystr += `\n`;
|
||
}
|
||
}
|
||
|
||
return mystr;
|
||
},
|
||
|
||
async getInCambioDiByRec(myrec) {
|
||
const { Contribtype } = require('../models/contribtype');
|
||
|
||
const contribtype = await Contribtype.findAllIdApp(idapp);
|
||
|
||
try {
|
||
let mystr = '';
|
||
for (const contribId of myrec.idContribType) {
|
||
const reccontr = contribtype.find((rec) => rec._id.toString() === contribId);
|
||
if (reccontr) {
|
||
if (mystr) {
|
||
mystr += ', ';
|
||
}
|
||
mystr += reccontr.label;
|
||
}
|
||
}
|
||
return mystr;
|
||
} catch (e) {
|
||
|
||
}
|
||
},
|
||
|
||
async getStatusSkillByRec(myrec, onlyifNoDiPersona) {
|
||
const { StatusSkill } = require('../models/statusSkill');
|
||
|
||
const statusskill = await StatusSkill.findAllIdApp(idapp);
|
||
|
||
try {
|
||
let mystr = '';
|
||
if (onlyifNoDiPersona) {
|
||
if ((myrec.idStatusSkill.length === 1) && (myrec.idStatusSkill[0] === shared_consts.STATUSSKILL_DI_PERSONA))
|
||
return ''
|
||
}
|
||
for (const status of myrec.idStatusSkill) {
|
||
const reccontr = statusskill.find((rec) => rec._id === status);
|
||
if (reccontr) {
|
||
if (mystr) {
|
||
mystr += ' e ';
|
||
}
|
||
mystr += reccontr.descr;
|
||
}
|
||
}
|
||
return mystr;
|
||
} catch (e) {
|
||
|
||
}
|
||
},
|
||
|
||
getIconByAdType(adType) {
|
||
if (adType === shared_consts.AdType.OFFRO)
|
||
return '🟢';
|
||
else if (adType === shared_consts.AdType.CERCO)
|
||
return '🔴';
|
||
|
||
return '';
|
||
},
|
||
|
||
async getCategoriaSkillByRec(myrec) {
|
||
const { Skill } = require('../models/skill');
|
||
const { Sector } = require('../models/sector');
|
||
|
||
const skillrec = await Skill.findAllIdApp(idapp);
|
||
const sectorrec = await Sector.findAllIdApp(idapp);
|
||
|
||
try {
|
||
let mystr = '';
|
||
const recsec = sectorrec.find((rec) => rec._id === myrec.idSector);
|
||
if (recsec) {
|
||
mystr += recsec.descr;
|
||
}
|
||
const rec = skillrec.find((rec) => rec._id === myrec.idSkill);
|
||
if (rec) {
|
||
mystr += ' 👉🏻 ' + rec.descr;
|
||
}
|
||
return mystr;
|
||
} catch (e) {
|
||
|
||
}
|
||
},
|
||
async getCategoriaGoodByRec(myrec) {
|
||
const { SectorGood } = require('../models/sectorgood');
|
||
// const { Good } = require('../models/good');
|
||
|
||
// const goodrec = await Good.findAllIdApp(idapp);
|
||
const secgoodrec = await SectorGood.findAllIdApp(idapp);
|
||
|
||
try {
|
||
let mystr = '';
|
||
const rec = secgoodrec.find((rec) => rec._id === myrec.idSectorGood);
|
||
// const rec = goodrec.find((rec) => rec._id === myrec.idSectorGood);
|
||
if (rec) {
|
||
mystr += rec.descr;
|
||
}
|
||
return mystr;
|
||
} catch (e) {
|
||
|
||
}
|
||
},
|
||
|
||
getComuniEProvinceByRec(myrec) {
|
||
try {
|
||
let mystr = '';
|
||
if (myrec.hasOwnProperty('mycities')) {
|
||
let ind = 0;
|
||
for (const city of myrec.mycities) {
|
||
if (ind > 0)
|
||
mystr += ', '
|
||
mystr += city.comune + ' (' + city.prov + ')';
|
||
ind++;
|
||
}
|
||
}
|
||
return mystr;
|
||
} catch (e) {
|
||
|
||
}
|
||
},
|
||
|
||
convertHTMLTagsToText(input) {
|
||
const tagMap = {
|
||
"<ul>": "",
|
||
"<ol>": "1. ",
|
||
"<li>": "\n- ",
|
||
"</ul>": "",
|
||
"</ol>": "",
|
||
"</li>": ""
|
||
};
|
||
|
||
// Replace supported HTML tags with their corresponding text representations
|
||
let output = input.replace(/<ul>|<ol>|<li>|<\/ul>|<\/ol>|<\/li>/g, (match) => {
|
||
return tagMap[match];
|
||
});
|
||
|
||
return output;
|
||
},
|
||
|
||
async getAnnuncioForTelegram(myrec, tablerec, mydescr, userorig, nuovo) {
|
||
try {
|
||
|
||
let newdescr = '';
|
||
|
||
let out = '';
|
||
|
||
let tiposcambio = ''
|
||
let iconascambio = '🟢';
|
||
|
||
let datastr = '';
|
||
let dovestr = '';
|
||
let organizedby = '';
|
||
let contributo = '';
|
||
|
||
if ((tablerec === shared_consts.TABLES_MYGOODS) || (tablerec === shared_consts.TABLES_MYSKILLS)) {
|
||
iconascambio = this.getIconByAdType(myrec.adType);
|
||
if (myrec.adType === shared_consts.AdType.OFFRO)
|
||
tiposcambio = 'Offro';
|
||
else if (myrec.adType === shared_consts.AdType.CERCO)
|
||
tiposcambio = 'Cerco';
|
||
} else if (tablerec === shared_consts.TABLES_MYHOSPS) {
|
||
tiposcambio = 'Offro ';
|
||
if (myrec.typeHosp === shared_consts.TYPEHOSP_OSPITALITA)
|
||
tiposcambio += 'Ospitalità';
|
||
else if (myrec.typeHosp === shared_consts.TYPEHOSP_SCAMBIOCASA)
|
||
tiposcambio += 'Scambio Casa';
|
||
} else if (tablerec === shared_consts.TABLES_MYBACHECAS) {
|
||
datastr = this.getstrDateTimeEvent(myrec);
|
||
organizedby = myrec.organisedBy;
|
||
contributo = myrec.contribstr;
|
||
}
|
||
|
||
if (nuovo) {
|
||
if (tablerec === shared_consts.TABLES_MYGOODS) {
|
||
newdescr = i18n.__('NEW_GOOD', userorig, mydescr);
|
||
} else if (tablerec === shared_consts.TABLES_MYSKILLS) {
|
||
newdescr = i18n.__('NEW_SERVICE', userorig, mydescr);
|
||
} else if (tablerec === shared_consts.TABLES_MYHOSPS) {
|
||
newdescr = i18n.__('NEW_HOSP', userorig, mydescr);
|
||
}
|
||
} else {
|
||
if (tablerec === shared_consts.TABLES_MYGOODS) {
|
||
newdescr = i18n.__('Good', userorig, mydescr);
|
||
} else if (tablerec === shared_consts.TABLES_MYSKILLS) {
|
||
newdescr = i18n.__('Service', userorig, mydescr);
|
||
} else if (tablerec === shared_consts.TABLES_MYHOSPS) {
|
||
newdescr = i18n.__('Hosp', userorig, mydescr);
|
||
}
|
||
}
|
||
let cat = '';
|
||
let status = '';
|
||
let online = false;
|
||
let solo_online = false;
|
||
if (tablerec === shared_consts.TABLES_MYGOODS) {
|
||
cat = await this.getCategoriaGoodByRec(myrec)
|
||
} else if (tablerec === shared_consts.TABLES_MYSKILLS) {
|
||
cat = await this.getCategoriaSkillByRec(myrec)
|
||
online = myrec.idStatusSkill.findIndex((id) => id === shared_consts.STATUSSKILL_ONLINE) >= 0
|
||
solo_online = online && myrec.idStatusSkill.length === 1
|
||
status = await this.getStatusSkillByRec(myrec, true);
|
||
if (status) {
|
||
status = ' ' + status;
|
||
}
|
||
} else if (tablerec === shared_consts.TABLES_MYHOSPS) {
|
||
cat = '';
|
||
}
|
||
// let out = i18n.__('NEW_ANNUNCIO_TELEGRAM', mydescr, dovestr, descrestesa, userorig);
|
||
|
||
if (tiposcambio)
|
||
out += this.addRowTelegram(iconascambio, tiposcambio + status, '', false);
|
||
|
||
const url = this.getHostByIdApp(myrec.idapp) + shared_consts.getDirectoryByTable(tablerec, true) + myrec._id;
|
||
|
||
out += `<strong>${myrec.descr}</strong>\n\n`;
|
||
|
||
if (datastr)
|
||
out += this.addRowTelegram('🗓', 'Data Evento', datastr, true);
|
||
|
||
if (cat)
|
||
out += this.addRowTelegram('⭐️', 'Categoria', cat, true);
|
||
|
||
let note = this.convertHTMLTagsToText(myrec.note)
|
||
|
||
let descrcontent = this.firstchars(this.removeLastSpaceAndACapo(note), 175, true, url);
|
||
|
||
if (descrcontent)
|
||
out += this.addRowTelegram('📝', 'Descrizione ' + newdescr, descrcontent, true);
|
||
|
||
const localita = this.getComuniEProvinceByRec(myrec);
|
||
|
||
if (!solo_online)
|
||
out += this.addRowTelegram('🏠', 'Località', localita, true);
|
||
|
||
const incambiodi = await this.getInCambioDiByRec(myrec);
|
||
if (incambiodi)
|
||
out += this.addRowTelegram('⚖️', 'In cambio di', incambiodi, true);
|
||
|
||
if (contributo)
|
||
out += this.addRowTelegram('💰', 'Contributo', contributo, true);
|
||
|
||
let contatto = userorig;
|
||
try {
|
||
let username_telegram = myrec.profile.username_telegram;
|
||
|
||
if (username_telegram)
|
||
contatto = `@${username_telegram}`;
|
||
} catch (e) {
|
||
}
|
||
|
||
out += this.addRowTelegram('👤', 'Contatto', contatto, true);
|
||
|
||
out += this.addRowTelegram('', `👉🏻 Vedi Annuncio completo su RISO`, url, true, true);
|
||
|
||
// out += i18n.__('ADDED_FROM', );
|
||
|
||
return { newdescr, newdescrtelegram: out }
|
||
} catch (e) {
|
||
console.error('Error', e);
|
||
}
|
||
|
||
},
|
||
|
||
generateVapiKey() {
|
||
const webpush = require('web-push');
|
||
|
||
const vapidKeys = webpush.generateVAPIDKeys();
|
||
|
||
const msg1 = 'VAPID Public Key:' + vapidKeys.publicKey;
|
||
const msg2 = 'VAPID Private Key:' + vapidKeys.privateKey;
|
||
|
||
|
||
console.log(msg1);
|
||
console.log(msg2);
|
||
return { msg: msg1 + ' ' + msg2 };
|
||
},
|
||
|
||
differentObjects(obj1, obj2) {
|
||
try {
|
||
const fieldsUpdated = [];
|
||
const obj1Fields = obj1 ? Object.keys(obj1) : [];
|
||
const obj2Fields = obj2 ? Object.keys(obj2) : [];
|
||
|
||
const commonFields = obj1Fields.filter(field => obj2Fields.includes(field));
|
||
|
||
|
||
commonFields.forEach((field) => {
|
||
if (obj1 && obj2 && obj1 && obj2 && ((obj1[field] && obj1[field].toString()) !== (obj2[field] && obj2[field].toString()))) {
|
||
fieldsUpdated.push(field);
|
||
}
|
||
});
|
||
return fieldsUpdated
|
||
} catch (e) {
|
||
console.error('Err:', e);
|
||
}
|
||
},
|
||
|
||
isObjectEmpty(obj) {
|
||
return Object.keys(obj).length === 0;
|
||
},
|
||
|
||
getUnitsMeasure(unit, short) {
|
||
const unitrec = shared_consts.Units_Of_Measure_ListBox.find((rec) => rec.value === unit)
|
||
return unitrec ? (short ? unitrec.short : unitrec.label) : ''
|
||
},
|
||
|
||
getIdUnitsByText(unitstr) {
|
||
const unitrec = shared_consts.Units_Of_Measure_ListBox.find((rec) => rec.short === unitstr)
|
||
return unitrec ? unitrec.value : 0
|
||
},
|
||
|
||
getWeightAndUnitByText(text) {
|
||
const result = [];
|
||
|
||
text = text.replace(",", ".");
|
||
const regex = /^(\d+\.?\d*)\s*(ml|gr|l|kg|uova)\s*$/; // Aggiunto un punto dopo \d+ per accettare anche i numeri con la virgola
|
||
|
||
const match = regex.exec(text);
|
||
if (match) {
|
||
let peso = parseFloat(match[1]); // Cambiato da parseInt a parseFloat per gestire i numeri con la virgola
|
||
let unita = match[2];
|
||
if (unita === 'gr')
|
||
unita = 'g'
|
||
const unit = this.getIdUnitsByText(unita);
|
||
|
||
return { weight: peso, unit };
|
||
}
|
||
|
||
return { weight: 0, unit: 0 };
|
||
|
||
},
|
||
|
||
async isManagerByReq(req) {
|
||
try {
|
||
var { User } = require('../models/user');
|
||
|
||
const idapp = req.body.idapp;
|
||
let userId = '';
|
||
if (req.body)
|
||
userId = req.body.userId;
|
||
|
||
const myuser = await User.getUserById(idapp, userId);
|
||
let ismanager = false;
|
||
if (myuser && myuser.perm) {
|
||
ismanager = User.isManager(myuser.perm);
|
||
}
|
||
|
||
return ismanager;
|
||
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
},
|
||
|
||
addslashes(str) {
|
||
return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0')
|
||
},
|
||
|
||
removeescape(inputString) {
|
||
// return inputString.replace(/\\/g, '').replace(/"/g, '');
|
||
if (inputString)
|
||
return inputString.replace(/\\/g, '').replace(/"/g, '');
|
||
else
|
||
return '';
|
||
},
|
||
|
||
escapeQuotes(stringa) {
|
||
if (stringa)
|
||
return stringa.replace(/"/g, '\\"');
|
||
else
|
||
return '';
|
||
},
|
||
|
||
replaceQuotesWithSingleQuotes(jsonString) {
|
||
if (jsonString)
|
||
return jsonString.replace(/"/g, "'");
|
||
else
|
||
return '';
|
||
},
|
||
|
||
ripulisciCampo(stringa) {
|
||
let mystr = this.replaceQuotesWithSingleQuotes(stringa);
|
||
return mystr;
|
||
},
|
||
|
||
convertToNumeroVirgola(valstr) {
|
||
|
||
if (valstr === '' || valstr === undefined)
|
||
valstr = '0';
|
||
|
||
valstr = valstr + '';
|
||
valstr = valstr.replace(',', '.');
|
||
|
||
return parseFloat(valstr);
|
||
},
|
||
|
||
convertPriceEurToValue(inputString) {
|
||
inputString = this.removeescape(this.addslashes(inputString))
|
||
if (inputString === '')
|
||
return '0';
|
||
// Rimuovi il simbolo della valuta (€) e sostituisci la virgola con un punto
|
||
return inputString.replace(/[^\d.,]/g, '').replace(',', '.');
|
||
},
|
||
|
||
removeLastSpaceAndACapo(miastr) {
|
||
miastr = miastr.trimRight().replace(/[\n\r]+$/, '');
|
||
// Rimuove eventuali '<br>' in fondo alla stringa
|
||
// Rimuove eventuali '<div><br></div>' in fondo alla stringa
|
||
miastr = miastr.replace(/<\/div>$/, '');
|
||
miastr = miastr.replace(/<\/div>$/, '');
|
||
miastr = miastr.replace(/<br>$/, '');
|
||
miastr = miastr.replace(/<div><br><\/div>$/, '');
|
||
miastr = miastr.replace(/<br>$/, '');
|
||
miastr = miastr.trimRight().replace(/[\n\r]+$/, '');
|
||
miastr = miastr.replace(/<div><br><\/div>$/, '');
|
||
miastr = miastr.replace(/<div>$/, '');
|
||
miastr = miastr.replace(/<br>$/, '');
|
||
miastr = miastr.replace(/<br>$/, '');
|
||
|
||
return miastr;
|
||
},
|
||
|
||
rimuoviAtPrimoCarattere(stringa) {
|
||
if (stringa.charAt(0) === '@') {
|
||
return stringa.slice(1);
|
||
} else {
|
||
return stringa;
|
||
}
|
||
},
|
||
|
||
};
|