Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a9e012de0 | ||
|
|
0973fc8757 | ||
|
|
7dac44e0ff | ||
|
|
6289a2e2d2 | ||
|
|
5cca1ed2fa | ||
|
|
ce51c87365 | ||
|
|
ca519baad4 | ||
|
|
73cf28ebc2 | ||
|
|
9985793fcc | ||
|
|
dcc2a0ec08 | ||
|
|
f25e1f3992 | ||
|
|
13322a7e0b | ||
|
|
fe4a67c9f1 | ||
|
|
45f601bd26 | ||
|
|
d527f49c5e | ||
|
|
21862f87a1 | ||
|
|
017ac82d8b | ||
|
|
76c34dbbe0 | ||
|
|
1c7b89a55b | ||
|
|
c3cc344b9f | ||
|
|
8dbdad1e02 | ||
|
|
b6c6330872 | ||
|
|
de6066031a | ||
|
|
ef9d7436b2 | ||
|
|
1b7a08f14b | ||
|
|
ae2298f21a | ||
|
|
b9927d8973 |
@@ -38,4 +38,9 @@ FTPSERVER_HOST=139.162.166.31
|
||||
FTPSERVER_PORT=21
|
||||
FTPSERVER_USER=ftpusrsrv_
|
||||
FTPSERVER_PWD=ftpmypwd@1A_
|
||||
AUTH_NEW_SITES=123123123
|
||||
AUTH_NEW_SITES=123123123
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
MIAB_HOST=box.lamiaposta.org
|
||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||
@@ -38,4 +38,6 @@ FTPSERVER_HOST=139.162.166.31
|
||||
FTPSERVER_PORT=21
|
||||
FTPSERVER_USER=ftpusrsrv_
|
||||
FTPSERVER_PWD=ftpmypwd@1A_
|
||||
AUTH_NEW_SITES=123123123
|
||||
AUTH_NEW_SITES=123123123
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
@@ -38,4 +38,6 @@ FTPSERVER_HOST=139.162.166.31
|
||||
FTPSERVER_PORT=21
|
||||
FTPSERVER_USER=ftpusrsrv_
|
||||
FTPSERVER_PWD=ftpmypwd@1A_
|
||||
AUTH_NEW_SITES=123123123
|
||||
AUTH_NEW_SITES=123123123
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
@@ -7,8 +7,8 @@ PORT=3000
|
||||
appTelegram_TEST=["17","18"]
|
||||
appTelegram=["17","18"]
|
||||
ENABLE_PUSHNOTIFICATION=1
|
||||
DIRECTORY_SERVER=freeplanet_serverside
|
||||
SERVERDIR_WEBSITE=www.freeplanet_server
|
||||
DIRECTORY_SERVER=/var/www/www.freeplanet_server
|
||||
SERVERDIR_WEBSITE=
|
||||
PORT_APP1="0"
|
||||
DOMAIN=mongodb://localhost:32001/
|
||||
AUTH_MONGODB=1
|
||||
@@ -26,10 +26,16 @@ PATH_CERT_KEY=key.pem
|
||||
PATH_SERVER_CRT=cert.pem
|
||||
PATH_SSL_ROOT_PEM=root.pem
|
||||
PATH_SSL_CHAIN_PEM=chain.pem
|
||||
PROD=0
|
||||
PROD=1
|
||||
PROJECT_DESCR_MAIN='__PROJECTS'
|
||||
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
|
||||
SECRTK=jAxKm02emx5SeJvz2IGmtRf6YqCgope
|
||||
TOKEN_LIFE=2h
|
||||
REFRESH_TOKEN_LIFE=14d
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
|
||||
DOMAINS=[{"hostname":"piuchebuono.app","port":"3000"},{"hostname":"gruppomacro.app","port":"3010"}]
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
MIAB_HOST=box.lamiaposta.org
|
||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||
@@ -7,8 +7,8 @@ PORT=3001
|
||||
appTelegram_TEST=["17","18"]
|
||||
appTelegram=["17","18"]
|
||||
ENABLE_PUSHNOTIFICATION=1
|
||||
DIRECTORY_SERVER=freeplanet_serverside
|
||||
SERVERDIR_WEBSITE=test.freeplanet_server
|
||||
DIRECTORY_SERVER=/var/www/nodejs_test.piuchebuono_server
|
||||
SERVERDIR_WEBSITE=test.piuchebuono.app
|
||||
PORT_APP1="0"
|
||||
DOMAIN=mongodb://localhost:32002/
|
||||
AUTH_MONGODB=1
|
||||
@@ -31,4 +31,10 @@ PROJECT_DESCR_MAIN='__PROJECTS'
|
||||
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
|
||||
TOKEN_LIFE=2h
|
||||
REFRESH_TOKEN_LIFE=14d
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
|
||||
DOMAINS=[{"hostname":"piuchebuono.app","port":"3001"},{"hostname":"gruppomacro.app","port":"3011"}]
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
MIAB_HOST=box.lamiaposta.org
|
||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||
@@ -4,10 +4,10 @@ PDB=suerteFreePlanet@1A
|
||||
SEND_EMAIL=1
|
||||
PORT=3001
|
||||
ENABLE_PUSHNOTIFICATION=1
|
||||
DIRECTORY_SERVER=/var/www/testriso.freeplanet_serverside
|
||||
SERVERDIR_WEBSITE=testriso.piuchebuono.app
|
||||
DIRECTORY_SERVER=/var/www/nodejs_test.riso_server
|
||||
SERVERDIR_WEBSITE=test.riso.app
|
||||
PORT_APP1="0"
|
||||
DOMAIN=mongodb://localhost:32002/
|
||||
DOMAIN=mongodb://localhost:32012/
|
||||
AUTH_MONGODB=1
|
||||
MONGODB_USER=admin
|
||||
MONGODB_PWD=mypwadmin@1A
|
||||
@@ -28,4 +28,10 @@ PROJECT_DESCR_MAIN='__PROJECTS'
|
||||
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
|
||||
TOKEN_LIFE=2h
|
||||
REFRESH_TOKEN_LIFE=14d
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
|
||||
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
|
||||
DOMAINS=[{"hostname":"abitaregliiblei.it","port":"3021"},{"hostname":"riso.app","port":"3005"}]
|
||||
SCRIPTS_DIR=admin_scripts
|
||||
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
|
||||
MIAB_HOST=box.lamiaposta.org
|
||||
MIAB_ADMIN_EMAIL=admin@lamiaposta.org
|
||||
MIAB_ADMIN_PASSWORD=passpao1pabox@1A
|
||||
18
admin_scripts/1_GENERALE/inputTest.sh
Executable file
18
admin_scripts/1_GENERALE/inputTest.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Input Test
|
||||
#DATA|DESCRIZ|Input Test
|
||||
#DATA|SOCK|true
|
||||
|
||||
echo "Inizio dello Script... "
|
||||
echo ".............................................."
|
||||
|
||||
|
||||
if [ "$1" = "" ]; then
|
||||
read -p "Inserisci il parametro 1 " PARAM1
|
||||
else
|
||||
PARAM1=$1
|
||||
fi
|
||||
|
||||
echo "Il parametro 1 è " $PARAM1
|
||||
|
||||
echo "FINEEEE!"
|
||||
5
admin_scripts/1_GENERALE/showLog.sh
Executable file
5
admin_scripts/1_GENERALE/showLog.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Mostra i log
|
||||
#DATA|DESCRIZ|Mostra i log della cartella principale
|
||||
|
||||
tail -400f logs/combined*.log
|
||||
7
admin_scripts/1_GENERALE/testScript.sh
Executable file
7
admin_scripts/1_GENERALE/testScript.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|lista directory
|
||||
#DATA|DESCRIZ|Mostra la lista della directory
|
||||
|
||||
sleep 1
|
||||
|
||||
ls -l
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Definizione delle variabili
|
||||
FILEZIP="exp_db_test.tar.gz"
|
||||
DATABASEIN="FreePlanet"
|
||||
DATABASEOUT="test_FreePlanet"
|
||||
FILEMONGODBIN="export_database_$DATABASEIN"
|
||||
FILEMONGODBOUT="export_database_$DATABASEOUT"
|
||||
MYDOCKER="mongodbtest"
|
||||
DIR_OUT="/home/test/"
|
||||
BACKUP_DIR="/home/pcbuser/backups/temp/"
|
||||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
|
||||
# Carica le configurazioni
|
||||
source ~/batch/.my_cfg.ini
|
||||
|
||||
echo "Attenzione: Questo script creerà un backup del database esistente $DATABASEOUT"
|
||||
echo "e lo sovrascriverà con i dati dal file $FILEZIP."
|
||||
echo "Vuoi procedere? (Si/No)"
|
||||
read -r risposta
|
||||
|
||||
if [[ ! $risposta =~ ^[Ss][iI]$ ]]; then
|
||||
echo "Operazione annullata dall'utente."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Inizio del processo di importazione del database"
|
||||
echo "------------------------------------------------"
|
||||
|
||||
# Verifica l'esistenza del file .tar.gz
|
||||
if [ ! -f "/home/pcbuser/$FILEZIP" ]; then
|
||||
echo "ERRORE: Il file $FILEZIP non esiste nella directory /home/pcbuser/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Backup del database esistente
|
||||
echo "Creazione di un backup del database esistente...$DATABASEOUT"
|
||||
if docker exec "$MYDOCKER" mongodump --username admin --password "$PWDDB_TEST" --authenticationDatabase admin --db "$DATABASEOUT" --out "$BACKUP_DIR$DATABASEOUT_$TIMESTAMP"; then
|
||||
echo "Backup del database esistente completato con successo in $BACKUP_DIR$DATABASEOUT_$TIMESTAMP"
|
||||
else
|
||||
echo "ERRORE: Impossibile creare il backup del database esistente $DATABASEOUT."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Copiando $FILEZIP nel container $MYDOCKER..."
|
||||
if docker cp "/home/pcbuser/$FILEZIP" "$MYDOCKER:$DIR_OUT"; then
|
||||
echo "File copiato con successo."
|
||||
else
|
||||
echo "ERRORE: Impossibile copiare il file nel container."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Estraendo $FILEZIP in $DIR_OUT all'interno del container..."
|
||||
if docker exec "$MYDOCKER" tar -xvzf "$DIR_OUT$FILEZIP" -C "$DIR_OUT"; then
|
||||
echo "Estrazione completata con successo."
|
||||
else
|
||||
echo "ERRORE: Impossibile estrarre il file nel container."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Rinominando la directory del database da $FILEMONGODBIN a $FILEMONGODBOUT..."
|
||||
if docker exec "$MYDOCKER" mv "$DIR_OUT$FILEMONGODBIN" "$DIR_OUT$FILEMONGODBOUT"; then
|
||||
echo "Directory rinominata con successo."
|
||||
else
|
||||
echo "ERRORE: Impossibile rinominare la directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Ripristinando il database MongoDB dal dump..."
|
||||
if docker exec "$MYDOCKER" mongorestore --username admin --password "$PWDDB_TEST" --authenticationDatabase admin --nsFrom="$DATABASEIN.*" --nsTo="$DATABASEOUT.*" "$DIR_OUT$FILEMONGODBOUT"; then
|
||||
echo "Database ripristinato con successo."
|
||||
else
|
||||
echo "ERRORE: Impossibile ripristinare il database."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "------------------------------------------------"
|
||||
echo "Processo di importazione del database completato"
|
||||
361
admin_scripts/3_DATABASE/dati.txt.js
Normal file
361
admin_scripts/3_DATABASE/dati.txt.js
Normal file
@@ -0,0 +1,361 @@
|
||||
db.myelems.insertMany([
|
||||
{
|
||||
"_id": ObjectId("669fbf9dc9d625d0628eb12f"),
|
||||
"order": 20,
|
||||
"active": true,
|
||||
"type": 20,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"containerHtml": "<div style=\"text-align: center;\"><b><font size=\"4\">Abitare Gli Iblei</font></b></div>",
|
||||
"anim": {
|
||||
"_id": ObjectId("66e456981e0719a1012121c0"),
|
||||
"name": "",
|
||||
"clduration": "",
|
||||
"cldelay": "",
|
||||
"timingtype": "ease-in-out"
|
||||
}
|
||||
}, {
|
||||
"_id": ObjectId("669fbfc3c9d625d0628eb131"),
|
||||
"order": 100,
|
||||
"active": true,
|
||||
"type": 145,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0
|
||||
}, {
|
||||
"_id": ObjectId("66db2a45054b3b09f85e6983"),
|
||||
"order": 26,
|
||||
"active": true,
|
||||
"type": 35,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"image": "logo.jpg",
|
||||
"anim": {
|
||||
"_id": ObjectId("66db34215740efc77547a93a"),
|
||||
"name": "",
|
||||
"clduration": "",
|
||||
"cldelay": "",
|
||||
"timingtype": "ease-in-out"
|
||||
},
|
||||
"widthimg": "250px",
|
||||
"align": 2
|
||||
}
|
||||
, {
|
||||
"_id": ObjectId("66db38a77e24f4509eef655b"),
|
||||
"order": 26,
|
||||
"active": true,
|
||||
"type": 20,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"containerHtml": "<style>\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n padding: 20px;\n background-color: #f0f0f0;\n color: #333;\n}\n\nh1 {\n color: #0056b3;\n text-align: center;\n}\n\n\np, li {\n line-height: 1.6;\n}\n\n\nul {\n list-style-type: none;\n padding: 0;\n}\n\n\nli {\n background-color: #fff !important;\n margin-bottom: 10px !important;\n padding: 10px !important;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important; \n}\n\n\na {\n color: #007bff;\n text-decoration: none;\n}\n\n\na:hover {\n text-decoration: underline;\n}\n\n\n.container {\n max-width: 800px;\n margin: 0 auto;\n background-color: #fff;\n padding: 20px;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n}\n\n\n.strong {\n font-weight: bold;\n}\n</style>\n\n\n<p><strong>“Abitare gli Iblei”</strong> è una rete aperta che ha lo scopo di riunire tutte quelle persone che vogliono valorizzare e qualificare la vita nel territorio degli Iblei. </p>\n \n <p>Chi aderisce alla rete si riconosce in una <strong>Carta dei valori comuni</strong> e usa la rete per scambiare conoscenze, esperienze, risorse e prodotti sviluppati nell’ambito delle proprie iniziative (profit e non profit) individuali o collettive.</p>\n\n\n <p>L’area territoriale di questa rete è quella dei <strong>Monti Iblei orientali e occidentali</strong> (Noto, Avola, Canicattini, Siracusa, Palazzolo, Buccheri, Ferla, Modica, …).</p>\n\n\n <p>La rete <strong>“Abitare gli Iblei”</strong> offre i seguenti servizi utili per il territorio ed i suoi abitanti, frutto di una costruzione collettiva:</p>\n \n <ul>\n <li><strong>1. Mappa delle attività virtuose:</strong> permette di identificare attività pubbliche e private nel territorio che possono essere utili nella vita quotidiana. Queste attività possono riguardare artigiani, produttori o fornitori di servizi di cui almeno un membro della rete conosca la qualità e l’affidabilità (agricoltori, falegnami, fabbri, idraulici, imprese edili, strutture ricettive, …). Altre informazioni utili possono riguardare associazioni/istituzioni operanti in vari settori. – <strong>Accesso pubblico</strong></li>\n <li><strong>2. Calendario:</strong> permette di accedere ad annunci di eventi utili alla crescita culturale del territorio. La pubblicazione di eventi è riservata ai soli membri della rete che possono presentare iniziative anche di altri organizzatori. – <strong>Accesso pubblico</strong></li>\n <li><strong>3. Scambi di servizi, prodotti e ospitalità:</strong> questa funzione è riservata ai soli membri della rete e si realizza attraverso la Rete italiana di scambi orizzontali (RISO). – <strong>Accesso riservato</strong></li>\n <li><strong>4. Segnalazione di pericoli per il territorio:</strong> attraverso questa mappa è possibile segnalare incendi, immondizia abbandonata, discariche abusive, fonti di inquinamento per corsi d’acqua e spiagge, presenza di inquinamento nell’aria, … – <strong>Accesso riservato</strong></li>\n </ul>\n \n <p>Se vuoi aderire alla rete puoi richiederne la registrazione utilizzando questo Link <a href=\"#\"><strong>(Pagina in Costruzione)</strong></a>.</p>\n\n",
|
||||
"anim": {
|
||||
"_id": ObjectId("66db393e3b885ccdfaed28d6"),
|
||||
"name": "",
|
||||
"clduration": "",
|
||||
"cldelay": "",
|
||||
"timingtype": "ease-in-out"
|
||||
}
|
||||
}
|
||||
, {
|
||||
"_id": ObjectId("66e41cff78c8d880eebfbf1c"),
|
||||
"order": 32.5,
|
||||
"active": true,
|
||||
"type": 20,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"containerHtml": "ORAAAA",
|
||||
"anim": {
|
||||
"_id": ObjectId("66e459421e0719a1012123ad"),
|
||||
"name": "",
|
||||
"clduration": "",
|
||||
"cldelay": "",
|
||||
"timingtype": "ease-in-out"
|
||||
}
|
||||
}
|
||||
,
|
||||
{
|
||||
"_id": ObjectId("66e4270d78c8d880eebfbf24"),
|
||||
"order": 40,
|
||||
"active": true,
|
||||
"type": 20,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"containerHtml": "BBB",
|
||||
"anim": {
|
||||
"_id": ObjectId("66e4568d1e0719a1012121a6"),
|
||||
"name": "",
|
||||
"clduration": "",
|
||||
"cldelay": "",
|
||||
"timingtype": "ease-in-out"
|
||||
}
|
||||
}, {
|
||||
"_id": ObjectId("66e45b0c78c8d880eebfbf45"),
|
||||
"order": 70,
|
||||
"active": true,
|
||||
"type": 20,
|
||||
"path": "home",
|
||||
"container": "",
|
||||
"idapp": "19",
|
||||
"elemsText": [],
|
||||
"listcards": [],
|
||||
"list": [],
|
||||
"__v": 0,
|
||||
"containerHtml": "AAAA"
|
||||
}]);
|
||||
|
||||
|
||||
db.sites.insert(
|
||||
/* 1 */
|
||||
{
|
||||
"_id": ObjectId("669fbef7fc704b8912263af9"),
|
||||
"confpages": {
|
||||
"font": "",
|
||||
"col_toolbar": "",
|
||||
"col_bgfooter": "",
|
||||
"show_darkopt": false,
|
||||
"showButtHome": true,
|
||||
"showProfile": false,
|
||||
"showUserMenu": true,
|
||||
"showiscrittiMenu": true,
|
||||
"showRegButton": true,
|
||||
"enableReg": false,
|
||||
"showNL": false,
|
||||
"sendNewsletter": true,
|
||||
"showMsgs": false,
|
||||
"showNotif": true,
|
||||
"showCoins": false,
|
||||
"showRIS": false,
|
||||
"showMenuCoins": false,
|
||||
"showNameSurname": true,
|
||||
"showCompetenze": true,
|
||||
"showConnected": false,
|
||||
"bookingEvents": false,
|
||||
"enableEcommerce": false,
|
||||
"enableAI": false,
|
||||
"enableGroups": true,
|
||||
"enableCircuits": false,
|
||||
"enableProj": false,
|
||||
"enableTodos": false,
|
||||
"enableRegByBot": false,
|
||||
"enableRegMultiChoice": false,
|
||||
"enableTokenExpired": true,
|
||||
"enableDebugOn": false,
|
||||
"enabledRegNeedTelegram": false,
|
||||
"showViewEventi": false,
|
||||
"showViewGroups": false,
|
||||
"showViewCircuits": false,
|
||||
"showViewUsers": false,
|
||||
"showViewBooking": false,
|
||||
"showViewProfile": true,
|
||||
"showViewCart": false,
|
||||
"showViewOrders": false,
|
||||
"enablePwa": true,
|
||||
"lang": 0,
|
||||
"videoPromo": "",
|
||||
"PDFPromo": ""
|
||||
},
|
||||
"confsite": {
|
||||
"options": 64
|
||||
},
|
||||
"policy": {
|
||||
"show": false
|
||||
},
|
||||
"contacts": {
|
||||
"facebook": "",
|
||||
"instagram": "",
|
||||
"whatsapp": "",
|
||||
"whatsapp_home": false,
|
||||
"telegram": "",
|
||||
"youtube": "",
|
||||
"email": "",
|
||||
"address": "",
|
||||
"map": "",
|
||||
"info2": "",
|
||||
"cell": ""
|
||||
},
|
||||
"ecomm": {
|
||||
"enablePreOrders": false,
|
||||
"NoteExtraOnCart": ""
|
||||
},
|
||||
"name": "Abitare Gli Iblei",
|
||||
"host": "https://abitaregliiblei.it",
|
||||
"active": true,
|
||||
"idapp": "19",
|
||||
"adminemail": "surya@riso.app",
|
||||
"__v": 0,
|
||||
"dir": "/Users/suryapaolo/myproject/newfreeplanet/",
|
||||
"dir_test": "/Users/suryapaolo/myproject/newfreeplanet/",
|
||||
"host_test": "https://test.abitaregliiblei.it",
|
||||
"host_ip": "65.108.222.97",
|
||||
"host_api_ip": "65.108.222.97",
|
||||
"host_api": "https://api.abitaregliiblei.it",
|
||||
"host_testapi": "https://testapi.abitaregliiblei.it",
|
||||
"host_testapi_ip": "65.108.222.97",
|
||||
"host_test_ip": "65.108.222.97",
|
||||
"cf_token": "M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0",
|
||||
"cf_zoneId": "cd7447660fcc6534ca7ce4c135df1e54",
|
||||
"enable_servermail_this_domain": "true",
|
||||
"servermail": "box.lamiaposta.org",
|
||||
"servermailip": "65.21.63.147",
|
||||
"enable_servermail": true,
|
||||
"dkim": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv++u/ysGgAGfOaSCLmNkfnczedXXDRdJUi+M+gZTVk7XfGZLlLWh00xXgOIj1lU4jRgFnQx39SSbsS9foPLMrCXnPcSnPPCUpDbmkKtGlWPZDncOUGIZVpNpFMOBul+p+SckUW7gomayV1dluFw72oNLlc/Y0CVWT5Le0OL66FG7D0",
|
||||
"manageremail": "reg@abitaregliiblei.it",
|
||||
"idMyGroup": "AbitareGliIblei"
|
||||
}
|
||||
)
|
||||
|
||||
db.users.insert(
|
||||
{
|
||||
"_id": ObjectId("669fbef7c9d625d0628eb12d"),
|
||||
"profile": {
|
||||
"paymenttypes": [],
|
||||
"notif_idCities": [],
|
||||
"notif_provinces": [],
|
||||
"notif_regions": [],
|
||||
"notif_sectors": [],
|
||||
"notif_sector_goods": [],
|
||||
"img": "",
|
||||
"nationality": "",
|
||||
"intcode_cell": "",
|
||||
"cell": "",
|
||||
"dateofbirth": null,
|
||||
"sex": 0,
|
||||
"country_pay": "",
|
||||
"email_paypal": "",
|
||||
"payeer_id": "",
|
||||
"advcash_id": "",
|
||||
"revolut": "",
|
||||
"link_payment": "",
|
||||
"note_payment": "",
|
||||
"username_telegram": "",
|
||||
"teleg_id": 0,
|
||||
"teleg_checkcode": 0,
|
||||
"my_dream": "",
|
||||
"manage_telegram": false,
|
||||
"admin_telegram": false,
|
||||
"saw_zoom_presentation": false,
|
||||
"ask_zoom_partecipato": false,
|
||||
"saw_and_accepted": 0,
|
||||
"socio": false,
|
||||
"socioresidente": false,
|
||||
"qualified": false,
|
||||
"qualified_2invitati": false,
|
||||
"myshares": [],
|
||||
"friends": [],
|
||||
"req_friends": [],
|
||||
"handshake": [],
|
||||
"mygroups": [],
|
||||
"mycircuits": [],
|
||||
"last_circuitpath": "",
|
||||
"notifs": [
|
||||
{
|
||||
"dir": 1,
|
||||
"value": 88
|
||||
},
|
||||
{
|
||||
"dir": 2,
|
||||
"value": 4
|
||||
},
|
||||
{
|
||||
"dir": 3,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 4,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 5,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 11,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 12,
|
||||
"value": 1
|
||||
}
|
||||
],
|
||||
"stepTutorial": 0,
|
||||
"noNameSurname": false,
|
||||
"noCircuit": false,
|
||||
"noCircIta": false,
|
||||
"noFoto": false,
|
||||
"resid_province": "",
|
||||
"resid_card": "",
|
||||
"seen": [],
|
||||
"bookmark": [],
|
||||
"favorite": [],
|
||||
"attend": [],
|
||||
"version": 10060
|
||||
},
|
||||
"ipaddr": "::1",
|
||||
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJ2aW5jZW56b2Zhenppbm81OEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6IkVuem8iLCJpYXQiOjE3MjY0MTM2NTh9.YlgziPXK2ZeWe_buExvHnelMMc",
|
||||
"lasttimeonline": ISODate("2024-09-15T20:09:41.378Z"),
|
||||
"date_reg": ISODate("2024-09-15T15:20:58.743Z"),
|
||||
"aportador_iniziale": "------",
|
||||
"idMyGroup": "abitaregliiblei",
|
||||
"useragent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"email": "surya@riso.app",
|
||||
"username": "admin",
|
||||
"password": "$2a$12$Dr58jMRtbt6Y3y6MYFopCO07hBo20TlmdzJW.lVvRIhNy7yFFizT2",
|
||||
"name": "admin",
|
||||
"index": 1,
|
||||
"surname": "",
|
||||
"lang": "it",
|
||||
"verified_email": true,
|
||||
"verified_by_aportador": true,
|
||||
"perm": 3,
|
||||
"retry_pwd": 0,
|
||||
"deleted": false,
|
||||
"lang": "it",
|
||||
"aportador_solidario": "------",
|
||||
"tokens": [
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
|
||||
"_id": ObjectId("66e6fcf1ac95a84fd0e11b2c"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.127 Mobile Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
|
||||
"date_login": ISODate("2024-09-15T15:27:45.368Z")
|
||||
},
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
|
||||
"_id": ObjectId("66e73f04ac95a84fd0e122ae"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",
|
||||
"date_login": ISODate("2024-09-15T20:09:40.212Z")
|
||||
}
|
||||
],
|
||||
});
|
||||
92
admin_scripts/3_DATABASE/dati_attivitas.js
Normal file
92
admin_scripts/3_DATABASE/dati_attivitas.js
Normal file
@@ -0,0 +1,92 @@
|
||||
db.attivitas.insertMany([
|
||||
{
|
||||
"_id": "66db5bd1c76639f8b2c67e55",
|
||||
"coordinate_gps": {
|
||||
"address": "Via Roma, Gaggio Montano, Unione dell'Appennino Bolognese, Bologna, Emilia-Romagna, 40041, Italia",
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
10.953268,
|
||||
44.190335
|
||||
]
|
||||
},
|
||||
"idSkill": 0,
|
||||
"idCity": [
|
||||
744
|
||||
],
|
||||
"userId": "66db21115281b23462d496d2",
|
||||
"idapp": "19",
|
||||
"descr": "Esempio di Attività",
|
||||
"idSector": 2,
|
||||
"note": "Descrizione dell'attività",
|
||||
"tipodiAttivita": 2,
|
||||
"createdBy": "paoloar77",
|
||||
"date_updated": ISODate("2024-09-06T19:45:21.527Z"),
|
||||
"photos": [],
|
||||
"date_created": ISODate("2024-09-06T19:45:21.530Z"),
|
||||
"__v": 0,
|
||||
"numattend": 0,
|
||||
"numbook": 0,
|
||||
"numfav": 0,
|
||||
"numseen": 2
|
||||
},
|
||||
{
|
||||
"_id": "66e2ec7c475c299010b76fe7",
|
||||
"coordinate_gps": {
|
||||
"address": "14, Corso Vittorio Emanuele, Noto, Siracusa, Sicilia, 96017, Italia",
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
15.070645,
|
||||
36.890886
|
||||
]
|
||||
},
|
||||
"idSkill": 0,
|
||||
"idCity": [
|
||||
6908
|
||||
],
|
||||
"userId": "66e2ead3ee075227efd521ad",
|
||||
"idapp": "19",
|
||||
"tipodiAttivita": 1,
|
||||
"descr": "Esempio 2",
|
||||
"idSector": 2,
|
||||
"note": "Descrizione dell'Attività....",
|
||||
"createdBy": "Paolo7",
|
||||
"date_updated": ISODate("2024-09-12T13:28:28.593Z"),
|
||||
"photos": [],
|
||||
"date_created": ISODate("2024-09-12T13:28:28.597Z"),
|
||||
"__v": 0,
|
||||
"numattend": 0,
|
||||
"numbook": 0,
|
||||
"numfav": 0,
|
||||
"numseen": 2
|
||||
},
|
||||
{
|
||||
"_id": "66e31772d0acc6ce435a868b",
|
||||
"coordinate_gps": {
|
||||
"address": "Via Roma, Anzio, Anzio Colonia, Anzio, Roma, Lazio, 00042, Italia",
|
||||
"type": "Point",
|
||||
"coordinates": [
|
||||
12.626422,
|
||||
41.448654
|
||||
]
|
||||
},
|
||||
"idSkill": 1,
|
||||
"idCity": [
|
||||
5903
|
||||
],
|
||||
"userId": "66db21115281b23462d496d2",
|
||||
"idapp": "19",
|
||||
"descr": "prova3",
|
||||
"tipodiAttivita": 1,
|
||||
"idSector": 1,
|
||||
"note": "asdasd",
|
||||
"createdBy": "paoloar77",
|
||||
"date_updated": ISODate("2024-09-12T16:31:46.361Z"),
|
||||
"photos": [],
|
||||
"date_created": ISODate("2024-09-12T16:31:46.364Z"),
|
||||
"__v": 0,
|
||||
"numattend": 0,
|
||||
"numbook": 0,
|
||||
"numfav": 0,
|
||||
"numseen": 1
|
||||
}
|
||||
]);
|
||||
36
admin_scripts/3_DATABASE/dati_mygroups.js
Normal file
36
admin_scripts/3_DATABASE/dati_mygroups.js
Normal file
@@ -0,0 +1,36 @@
|
||||
db.mygroups.insert(
|
||||
{
|
||||
"_id": "66e2e6273eff2ca4e7b2ef92",
|
||||
"idCity": [
|
||||
6908,
|
||||
5634
|
||||
],
|
||||
"note": "Descrizione...",
|
||||
"visibility": [
|
||||
0
|
||||
],
|
||||
"deleted": false,
|
||||
"groupname": "abitaregliiblei",
|
||||
"photos": [],
|
||||
"admins": [
|
||||
{
|
||||
"_id": ObjectId("66e2e6276b502b07f1e89571"),
|
||||
"username": "paoloar77"
|
||||
}
|
||||
],
|
||||
"req_users": [],
|
||||
"blocked": false,
|
||||
"website": "",
|
||||
"link_telegram": "",
|
||||
"userId": "66db21115281b23462d496d2",
|
||||
"idapp": "19",
|
||||
"title": "Abitare Gli Iblei",
|
||||
"descr": "Abitare Gli Iblei",
|
||||
"idCatGrp": 14,
|
||||
"createdBy": "paoloar77",
|
||||
"date_updated": ISODate("2024-09-12T13:01:27.954Z"),
|
||||
"refused_users": [],
|
||||
"mycircuits": [],
|
||||
"date_created": ISODate("2024-09-12T13:01:27.960Z"),
|
||||
"__v": 0
|
||||
});
|
||||
27
admin_scripts/3_DATABASE/dati_mypages.js
Normal file
27
admin_scripts/3_DATABASE/dati_mypages.js
Normal file
@@ -0,0 +1,27 @@
|
||||
db.mypages.insertMany([
|
||||
{
|
||||
"_id": ObjectId("66db21118009ea4503bb6a01"),
|
||||
"order": 10,
|
||||
"idapp": "19",
|
||||
"path": "home",
|
||||
"active": true,
|
||||
"title": "Home",
|
||||
},
|
||||
{
|
||||
"_id": ObjectId("66db21118009ea4503bb6a03"),
|
||||
"order": 10,
|
||||
"idapp": "19",
|
||||
"path": "home_logout",
|
||||
"active": true,
|
||||
"title": "Home NoLoggato",
|
||||
},
|
||||
{
|
||||
"_id": ObjectId("66e322dd5a6360e3b3c71c5a"),
|
||||
"order": 40,
|
||||
"idapp": "19",
|
||||
"path": "presentazione",
|
||||
"active": true,
|
||||
"title": "Presentazione",
|
||||
"inmenu": true,
|
||||
"icon": "fas fa-info"
|
||||
}]);
|
||||
334
admin_scripts/3_DATABASE/dati_users.js
Normal file
334
admin_scripts/3_DATABASE/dati_users.js
Normal file
@@ -0,0 +1,334 @@
|
||||
db.users.insertMany([
|
||||
{
|
||||
"_id": ObjectId("66db21115281b23462d496d2"),
|
||||
"profile": {
|
||||
"paymenttypes": [],
|
||||
"notif_idCities": [],
|
||||
"notif_provinces": [],
|
||||
"notif_regions": [],
|
||||
"notif_sectors": [],
|
||||
"notif_sector_goods": [],
|
||||
"myshares": [],
|
||||
"friends": [],
|
||||
"req_friends": [],
|
||||
"handshake": [],
|
||||
"mygroups": [
|
||||
{
|
||||
"groupname": "abitaregliiblei",
|
||||
"date": ISODate("2024-09-12T13:01:27.975Z")
|
||||
}
|
||||
],
|
||||
"mycircuits": [],
|
||||
"notifs": [
|
||||
{
|
||||
"dir": 1,
|
||||
"value": 88
|
||||
},
|
||||
{
|
||||
"dir": 2,
|
||||
"value": 4
|
||||
},
|
||||
{
|
||||
"dir": 3,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 4,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 5,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 11,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 12,
|
||||
"value": 1
|
||||
}
|
||||
],
|
||||
"seen": [],
|
||||
"bookmark": [],
|
||||
"favorite": [],
|
||||
"attend": [],
|
||||
"special_req": true,
|
||||
"nationality": "IT",
|
||||
"manage_telegram": true,
|
||||
"admin_telegram": true,
|
||||
"teleg_id": 12429864,
|
||||
"username_telegram": "surya1977",
|
||||
"version": 10060
|
||||
},
|
||||
"retry_pwd": 0,
|
||||
"deleted": false,
|
||||
"tokens": [
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3Mjc3MjI0NjV9.EOvF89kswT1eqVJCSwVMMI-jB4kokP-aQVhi7xSUods",
|
||||
"_id": ObjectId("66e87ee1bbe2ce0f77adf6b8"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3MjY1MjAwNjV9.ESvyTWmXhfAQ0i-wwjxZR1A1Y5Bwixb60uG_UcOPQ5Y",
|
||||
"date_login": ISODate("2024-09-16T18:54:25.147Z")
|
||||
}
|
||||
],
|
||||
"idapp": "19",
|
||||
"email": "paolo@riso.app",
|
||||
"username": "paoloar77",
|
||||
"password": "$2a$12$rhq.rkdMWP4cE1MOweztiOPeAmwHYVCW9q5vyH4LVGelEssUFRl8C",
|
||||
"name": "paoloar77",
|
||||
"index": 1,
|
||||
"surname": "",
|
||||
"lang": "it",
|
||||
"verified_email": true,
|
||||
"verified_by_aportador": true,
|
||||
"perm": 3,
|
||||
"lasttimeonline": ISODate("2024-09-16T18:55:22.278Z"),
|
||||
"date_reg": ISODate("2024-09-06T15:34:41.673Z"),
|
||||
"__v": 13,
|
||||
"useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
|
||||
},
|
||||
{
|
||||
"_id": ObjectId("66e49515d18d313a144ead56"),
|
||||
"profile": {
|
||||
"paymenttypes": [],
|
||||
"notif_idCities": [],
|
||||
"notif_provinces": [],
|
||||
"notif_regions": [],
|
||||
"notif_sectors": [],
|
||||
"notif_sector_goods": [],
|
||||
"img": "",
|
||||
"nationality": "",
|
||||
"intcode_cell": "",
|
||||
"cell": "",
|
||||
"dateofbirth": null,
|
||||
"sex": 0,
|
||||
"country_pay": "",
|
||||
"email_paypal": "",
|
||||
"payeer_id": "",
|
||||
"advcash_id": "",
|
||||
"revolut": "",
|
||||
"link_payment": "",
|
||||
"note_payment": "",
|
||||
"username_telegram": "",
|
||||
"teleg_id": 0,
|
||||
"teleg_checkcode": 0,
|
||||
"my_dream": "",
|
||||
"manage_telegram": false,
|
||||
"admin_telegram": false,
|
||||
"saw_zoom_presentation": false,
|
||||
"ask_zoom_partecipato": false,
|
||||
"saw_and_accepted": 0,
|
||||
"socio": false,
|
||||
"socioresidente": false,
|
||||
"qualified": false,
|
||||
"qualified_2invitati": false,
|
||||
"myshares": [],
|
||||
"friends": [],
|
||||
"req_friends": [],
|
||||
"handshake": [],
|
||||
"mygroups": [],
|
||||
"mycircuits": [],
|
||||
"last_circuitpath": "",
|
||||
"notifs": [
|
||||
{
|
||||
"dir": 1,
|
||||
"value": 88
|
||||
},
|
||||
{
|
||||
"dir": 2,
|
||||
"value": 4
|
||||
},
|
||||
{
|
||||
"dir": 3,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 4,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 5,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 11,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 12,
|
||||
"value": 1
|
||||
}
|
||||
],
|
||||
"stepTutorial": 0,
|
||||
"noNameSurname": false,
|
||||
"noCircuit": false,
|
||||
"noCircIta": false,
|
||||
"noFoto": false,
|
||||
"resid_province": "",
|
||||
"resid_card": "",
|
||||
"seen": [],
|
||||
"bookmark": [],
|
||||
"favorite": [],
|
||||
"attend": [],
|
||||
"version": 10060
|
||||
},
|
||||
"retry_pwd": 0,
|
||||
"deleted": false,
|
||||
"email": "paolo@freeplanet.app",
|
||||
"password": "$2a$12$qX5DRHDm9BW/ZTgPvTmP/u7VdaEd5ybfFAmEfqEK2VUAhQGt6DFcO",
|
||||
"username": "paolotest",
|
||||
"name": "Paolo",
|
||||
"surname": "Test",
|
||||
"idapp": "19",
|
||||
"lang": "it",
|
||||
"aportador_solidario": "------",
|
||||
"tokens": [
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3Mjc1NTY5MTV9.NHnFUXOL0MbjRs9F6HrQsEBRGXG89AsBYP7jU9m8icY",
|
||||
"_id": ObjectId("66e5f83392c9540e18f89730"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3MjYzNTQ1MTV9.HTr1kNMhBU_38R2Tfy6m22XCbiRh5IsBKC3fl0ipIgM",
|
||||
"date_login": ISODate("2024-09-14T20:55:15.500Z")
|
||||
}
|
||||
],
|
||||
"ipaddr": "::1",
|
||||
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJwYW9sb0BmcmVlcGxhbmV0LmFwcCIsInVzZXJuYW1lIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MjU2NDA1fQ.SoIGdtkoBwJvUtfWdDLpY__cdtkq",
|
||||
"verified_email": true,
|
||||
"lasttimeonline": ISODate("2024-09-14T20:55:15.502Z"),
|
||||
"date_reg": ISODate("2024-09-13T19:40:05.188Z"),
|
||||
"aportador_iniziale": "------",
|
||||
"verified_by_aportador": true,
|
||||
"idMyGroup": "abitaregliiblei",
|
||||
"index": 2,
|
||||
"__v": 3,
|
||||
"perm": 16
|
||||
},
|
||||
{
|
||||
"_id": ObjectId("66e6fb5aac95a84fd0e11881"),
|
||||
"profile": {
|
||||
"paymenttypes": [],
|
||||
"notif_idCities": [],
|
||||
"notif_provinces": [],
|
||||
"notif_regions": [],
|
||||
"notif_sectors": [],
|
||||
"notif_sector_goods": [],
|
||||
"img": "",
|
||||
"nationality": "",
|
||||
"intcode_cell": "",
|
||||
"cell": "",
|
||||
"dateofbirth": null,
|
||||
"sex": 0,
|
||||
"country_pay": "",
|
||||
"email_paypal": "",
|
||||
"payeer_id": "",
|
||||
"advcash_id": "",
|
||||
"revolut": "",
|
||||
"link_payment": "",
|
||||
"note_payment": "",
|
||||
"username_telegram": "",
|
||||
"teleg_id": 0,
|
||||
"teleg_checkcode": 0,
|
||||
"my_dream": "",
|
||||
"manage_telegram": false,
|
||||
"admin_telegram": false,
|
||||
"saw_zoom_presentation": false,
|
||||
"ask_zoom_partecipato": false,
|
||||
"saw_and_accepted": 0,
|
||||
"socio": false,
|
||||
"socioresidente": false,
|
||||
"qualified": false,
|
||||
"qualified_2invitati": false,
|
||||
"myshares": [],
|
||||
"friends": [],
|
||||
"req_friends": [],
|
||||
"handshake": [],
|
||||
"mygroups": [],
|
||||
"mycircuits": [],
|
||||
"last_circuitpath": "",
|
||||
"notifs": [
|
||||
{
|
||||
"dir": 1,
|
||||
"value": 88
|
||||
},
|
||||
{
|
||||
"dir": 2,
|
||||
"value": 4
|
||||
},
|
||||
{
|
||||
"dir": 3,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 4,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 5,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 11,
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"dir": 12,
|
||||
"value": 1
|
||||
}
|
||||
],
|
||||
"stepTutorial": 0,
|
||||
"noNameSurname": false,
|
||||
"noCircuit": false,
|
||||
"noCircIta": false,
|
||||
"noFoto": false,
|
||||
"resid_province": "",
|
||||
"resid_card": "",
|
||||
"seen": [],
|
||||
"bookmark": [],
|
||||
"favorite": [],
|
||||
"attend": [],
|
||||
"version": 10060
|
||||
},
|
||||
"retry_pwd": 0,
|
||||
"deleted": false,
|
||||
"email": "vincenzofazzino58@gmail.com",
|
||||
"password": "$2a$12$z7Xg8QUmTsp8Jcj4SpoCsOVUsj5H7aLiKWS.IP2c/OkApnCUhARzK",
|
||||
"username": "Enzo",
|
||||
"name": "Enzo",
|
||||
"surname": "Fazzino",
|
||||
"idapp": "19",
|
||||
"lang": "it",
|
||||
"aportador_solidario": "------",
|
||||
"tokens": [
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
|
||||
"_id": ObjectId("66e6fcf1ac95a84fd0e11b2c"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.127 Mobile Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
|
||||
"date_login": ISODate("2024-09-15T15:27:45.368Z")
|
||||
},
|
||||
{
|
||||
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
|
||||
"_id": ObjectId("66e73f04ac95a84fd0e122ae"),
|
||||
"access": "auth",
|
||||
"browser": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",
|
||||
"date_login": ISODate("2024-09-15T20:09:40.212Z")
|
||||
}
|
||||
],
|
||||
"ipaddr": "::1",
|
||||
"linkreg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGFwcCI6IjE5IiwiZW1haWwiOiJ2aW5jZW56b2Zhenppbm81OEBnbWFpbC5jb20iLCJ1c2VybmFtZSI6IkVuem8iLCJpYXQiOjE3MjY0MTM2NTh9.YlgziPXK2ZeWe_buExvHnelMMc",
|
||||
"verified_email": true,
|
||||
"lasttimeonline": ISODate("2024-09-15T20:09:41.378Z"),
|
||||
"date_reg": ISODate("2024-09-15T15:20:58.743Z"),
|
||||
"aportador_iniziale": "------",
|
||||
"verified_by_aportador": true,
|
||||
"idMyGroup": "abitaregliiblei",
|
||||
"index": 3,
|
||||
"__v": 5,
|
||||
"useragent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
]);
|
||||
16
admin_scripts/5_UPGRADE/01_export_FreePlanet_to_pcb.sh
Normal file
16
admin_scripts/5_UPGRADE/01_export_FreePlanet_to_pcb.sh
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Esporta FreePlanet sul Server PCB
|
||||
#DATA|DESCRIZ|Esporta FreePlanet in "exp_db_test.tar.gz" e lo invia sul Server PCB
|
||||
#DATA|SOCK|false
|
||||
|
||||
DATABASE="FreePlanet"
|
||||
FILEMONGODB="export_database_$DATABASE"
|
||||
FILEZIP="exp_db_test.tar.gz"
|
||||
|
||||
source .my_cfg.ini
|
||||
|
||||
mongodump --db $DATABASE --authenticationDatabase admin -u admin -p $PWDDB --out $FILEMONGODB
|
||||
|
||||
tar cvfz $FILEZIP $FILEMONGODB
|
||||
|
||||
scp -P 8822 $FILEZIP pcbuser@pcb:~
|
||||
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Importa FreePlanet su test_FreePlanet
|
||||
#DATA|DESCRIZ|Importa FreePlanet (su test_FreePlanet) dal file inviato dal server mail.freeplanet.app
|
||||
#DATA|SOCK|false
|
||||
|
||||
FILEZIP="exp_db_test.tar.gz"
|
||||
DATABASEIN="FreePlanet"
|
||||
DATABASEOUT="test_FreePlanet"
|
||||
FILEMONGODBIN="export_database_$DATABASEIN"
|
||||
FILEMONGODBOUT="export_database_$DATABASEOUT"
|
||||
|
||||
source .my_cfg.ini
|
||||
|
||||
# Copia il file .tar.gz nel container
|
||||
docker cp /home/pcbuser/$FILEZIP mongodbtest:/home/test/
|
||||
|
||||
# Notifica l'intenzione di estrarre il contenuto del file tar.gz
|
||||
echo "Estrazione di $FILEZIP in /home/test/ all'interno del container..."
|
||||
echo ""
|
||||
|
||||
# Estrai il contenuto del file tar.gz nel container
|
||||
docker exec -it mongodbtest tar -xvzf /home/test/$FILEZIP -C /home/test/
|
||||
|
||||
# Rinomina la directory contenente il database esportato
|
||||
docker exec -i mongodbtest mv /home/test/$FILEMONGODBIN /home/test/$FILEMONGODBOUT
|
||||
|
||||
# Ripristina il database MongoDB dal dump
|
||||
docker exec -i mongodbtest mongorestore --username admin --password $PWDDB_TEST --authenticationDatabase admin --nsFrom='FreePlanet.*' --nsTo='test_FreePlanet.*' /home/test/>
|
||||
30
admin_scripts/5_UPGRADE/backup_sito_web.sh
Normal file
30
admin_scripts/5_UPGRADE/backup_sito_web.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Copia sito Web
|
||||
#DATA|DESCRIZ|Fai una copia di Backup del sito web
|
||||
#DATA|SOCK|false
|
||||
|
||||
if [ "$1" = "" ]; then
|
||||
read -p "Inserisci il Sito Web (pippo.it)" WEBSITE
|
||||
else
|
||||
WEBSITE=$1
|
||||
fi
|
||||
|
||||
FILEBACKUP_SITE="BACKUP_$WEBSITE_$(date +"%Y-%m-%d").tar.gz"
|
||||
|
||||
echo "********************************"
|
||||
|
||||
msg="*** COPIA SITO WEB di $WEBSITE (Y/N) ? "
|
||||
|
||||
if [ "$1" = "" ]; then
|
||||
read -p "$msg" risposta
|
||||
else
|
||||
echo $msg
|
||||
risposta=$1
|
||||
fi
|
||||
|
||||
if [[ $risposta == "Y" || $risposta == "y" ]]; then
|
||||
tar cvfz $FILEBACKUP_SITE /var/www/$WEBSITE/
|
||||
|
||||
echo "*** COPIA TERMINATA ***
|
||||
echo "***********************"
|
||||
fi
|
||||
20
admin_scripts/6_CERTIFICATI/create_new_cert.sh
Executable file
20
admin_scripts/6_CERTIFICATI/create_new_cert.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
#DATA|TITLE|Creazione Certificato
|
||||
#DATA|DESCRIZ|Crea un Certificato utilizzando cloudflare per dominio e *.dominio
|
||||
#DATA|SOCK|true
|
||||
|
||||
if [ "$1" = "" ]; then
|
||||
read -p "Inserisci il nome del Dominio " DOMINIO
|
||||
else
|
||||
DOMINIO=$1
|
||||
fi
|
||||
|
||||
echo sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
|
||||
|
||||
read -p "CONTINUARE ed Eseguirlo ? (Y/N) ? " risposta
|
||||
|
||||
if [[ $risposta == "Y" || $risposta == "y" ]]; then
|
||||
|
||||
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
|
||||
|
||||
fi
|
||||
3
admin_scripts/listaScript.sh
Executable file
3
admin_scripts/listaScript.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
ls admin_scripts
|
||||
@@ -2,17 +2,63 @@
|
||||
|
||||
source ./.env.prod.pcb
|
||||
|
||||
echo "Sincronizzazione in corso PCB PRODUZIONE ... /var/www/$SERVERDIR_WEBSITE/"
|
||||
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
|
||||
echo ""
|
||||
|
||||
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' .env.prod.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/.env.production
|
||||
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/package.json
|
||||
#!/bin/bash
|
||||
|
||||
# Configurazione
|
||||
REMOTE_USER="pcbuser"
|
||||
REMOTE_HOST="pcb"
|
||||
REMOTE_PORT="8822"
|
||||
REMOTE_DIR="$DIRECTORY_SERVER"
|
||||
SSH_OPTIONS="-p $REMOTE_PORT"
|
||||
|
||||
# Array di cartelle e file da sincronizzare
|
||||
SYNC_ITEMS=(
|
||||
"css"
|
||||
"docs"
|
||||
"emails"
|
||||
"plugins"
|
||||
"admin_scripts"
|
||||
"sass"
|
||||
"src"
|
||||
)
|
||||
|
||||
echo $REMOTE_DIR
|
||||
|
||||
echo ""
|
||||
echo "*** Copia Cartelle ... "
|
||||
|
||||
|
||||
# Esegui rsync per le cartelle
|
||||
rsync -avz --delete \
|
||||
--exclude='src/server/router/upload/' \
|
||||
-e "ssh $SSH_OPTIONS" \
|
||||
"${SYNC_ITEMS[@]}" \
|
||||
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file .env.production ... "
|
||||
|
||||
# Sincronizza i file specifici
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
.env.prod.pcb "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/.env.production"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file package.json ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file ecosystem.config.js ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
ecosystem.config.pcb.js "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
|
||||
|
||||
# Verifica il risultato
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Sincronizzazione completata con successo. SERVER PCB! "
|
||||
else
|
||||
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
|
||||
fi
|
||||
|
||||
echo "Sincronizzazione TERMINATA! - SERVER PCB!"
|
||||
|
||||
@@ -2,18 +2,63 @@
|
||||
|
||||
source ./.env.test.pcb
|
||||
|
||||
echo "Sincronizzazione in corso PCB TEST ... /var/www/$SERVERDIR_WEBSITE/"
|
||||
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
|
||||
echo ""
|
||||
|
||||
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/.env.test
|
||||
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/package.json
|
||||
#!/bin/bash
|
||||
|
||||
# Configurazione
|
||||
REMOTE_USER="pcbuser"
|
||||
REMOTE_HOST="pcb"
|
||||
REMOTE_PORT="8822"
|
||||
REMOTE_DIR="$DIRECTORY_SERVER"
|
||||
SSH_OPTIONS="-p $REMOTE_PORT"
|
||||
|
||||
# Array di cartelle e file da sincronizzare
|
||||
SYNC_ITEMS=(
|
||||
"css"
|
||||
"docs"
|
||||
"emails"
|
||||
"plugins"
|
||||
"admin_scripts"
|
||||
"sass"
|
||||
"src"
|
||||
)
|
||||
|
||||
echo $REMOTE_DIR
|
||||
|
||||
echo ""
|
||||
echo "*** Copia Cartelle ... "
|
||||
|
||||
|
||||
# Esegui rsync per le cartelle
|
||||
rsync -avz --delete \
|
||||
--exclude='src/server/router/upload/' \
|
||||
-e "ssh $SSH_OPTIONS" \
|
||||
"${SYNC_ITEMS[@]}" \
|
||||
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file .env.test ... "
|
||||
|
||||
# Sincronizza i file specifici
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
.env.test.pcb "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/.env.test"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file package.json ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file ecosystem.config.testpcb.js in ecosystem.config.js ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
ecosystem.config.testpcb.js "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
|
||||
|
||||
# Verifica il risultato
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Sincronizzazione completata con successo. SERVER PCB TEST! "
|
||||
else
|
||||
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
|
||||
fi
|
||||
|
||||
echo "Sincronizzazione TERMINATA! - SERVER PCB!"
|
||||
|
||||
@@ -2,20 +2,69 @@
|
||||
|
||||
source ./.env.test.risosrv
|
||||
|
||||
echo "Sincronizzazione in corso... $DIRECTORY_SERVER"
|
||||
rsync -avz -e 'scp -p 8822' .env.test.risosrv pcbuser@pcb:$DIRECTORY_SERVER/.env.test
|
||||
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
|
||||
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' src --exclude 'server/router/upload' pcbuser@pcb:$DIRECTORY_SERVER/
|
||||
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
|
||||
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:$DIRECTORY_SERVER/package.json
|
||||
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
|
||||
echo ""
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
# Configurazione
|
||||
REMOTE_USER="pcbuser"
|
||||
REMOTE_HOST="pcb"
|
||||
REMOTE_PORT="8822"
|
||||
REMOTE_DIR="$DIRECTORY_SERVER"
|
||||
SSH_OPTIONS="-p $REMOTE_PORT"
|
||||
CONFIG_JS="ecosystem.config.testriso.js"
|
||||
ENV_FILE=".env.test.risosrv"
|
||||
ENV_OUT=".env.test"
|
||||
|
||||
#ENV_FILE=".env.prod.pcb"
|
||||
#ENV_OUT=".env.production"
|
||||
|
||||
# Array di cartelle e file da sincronizzare
|
||||
SYNC_ITEMS=(
|
||||
"css"
|
||||
"docs"
|
||||
"emails"
|
||||
"plugins"
|
||||
"sass"
|
||||
"admin_scripts"
|
||||
"src"
|
||||
)
|
||||
|
||||
echo $REMOTE_DIR
|
||||
|
||||
echo ""
|
||||
echo "*** Copia Cartelle ... "
|
||||
|
||||
|
||||
# Esegui rsync per le cartelle
|
||||
rsync -avz --delete \
|
||||
--exclude='src/server/router/upload/' \
|
||||
-e "ssh $SSH_OPTIONS" \
|
||||
"${SYNC_ITEMS[@]}" \
|
||||
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file $ENV_FILE su $ENV_OUT ... "
|
||||
|
||||
# Sincronizza i file specifici
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file package.json ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
|
||||
|
||||
echo ""
|
||||
echo "*** Copia del file ecosystem.config.js ... "
|
||||
rsync -avz -e "ssh $SSH_OPTIONS" \
|
||||
"$CONFIG_JS" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
|
||||
|
||||
# Verifica il risultato
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Sincronizzazione completata con successo. SERVER $REMOTE_DIR! "
|
||||
else
|
||||
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
|
||||
fi
|
||||
|
||||
echo "**************************"
|
||||
echo "Sincronizzazione TERMINATA! - TESTSRISO.FREEPLANET_SERVER!"
|
||||
echo "https://testriso.piuchebuono.app"
|
||||
echo "**************************"
|
||||
|
||||
26
docs/apache2/riso.app-le.ssl.conf
Normal file
26
docs/apache2/riso.app-le.ssl.conf
Normal file
@@ -0,0 +1,26 @@
|
||||
<VirtualHost 89.36.222.238:443>
|
||||
SuexecUserGroup "#1008" "#1008"
|
||||
ServerName riso.app
|
||||
ServerAlias www.riso.app
|
||||
DocumentRoot /var/www/riso.app
|
||||
|
||||
ErrorLog /var/www/riso.app/logs//error.log
|
||||
CustomLog /var/www/riso.app/logs/access.log combined
|
||||
|
||||
<Directory /var/www/riso.app/>
|
||||
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
|
||||
allow from all
|
||||
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
<If "%{HTTP_HOST} == 'www.riso.app'">
|
||||
Redirect permanent / https://riso.app/
|
||||
</If>
|
||||
|
||||
RewriteEngine on
|
||||
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||
SSLCertificateFile /etc/letsencrypt/live/riso.app/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/riso.app/privkey.pem
|
||||
</VirtualHost>
|
||||
</IfModule>
|
||||
@@ -0,0 +1,39 @@
|
||||
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
|
||||
|
||||
# Configurazione per HTTP
|
||||
<VirtualHost 65.108.222.97:80>
|
||||
ServerName ${MIODOMINIO_COMPLETO}
|
||||
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
|
||||
|
||||
RewriteEngine on
|
||||
# Redirigi tutto il traffico HTTP verso HTTPS
|
||||
RewriteCond %{SERVER_NAME} =${MIODOMINIO_COMPLETO} [OR]
|
||||
RewriteCond %{SERVER_NAME} =www.${MIODOMINIO_COMPLETO}
|
||||
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
|
||||
|
||||
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
|
||||
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
|
||||
</VirtualHost>
|
||||
|
||||
|
||||
# Configurazione per HTTPS
|
||||
<IfModule mod_ssl.c>
|
||||
<VirtualHost 65.108.222.97:443>
|
||||
ServerName ${MIODOMINIO_COMPLETO}
|
||||
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
|
||||
|
||||
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
|
||||
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
|
||||
|
||||
<Directory /var/www/${MIODOMINIO_COMPLETO}/>
|
||||
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
RewriteEngine on
|
||||
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
|
||||
</VirtualHost>
|
||||
</IfModule>
|
||||
@@ -0,0 +1,4 @@
|
||||
Define MIODOMINIO piuchebuono.app
|
||||
Define MIODOMINIO_COMPLETO piuchebuono.app
|
||||
Define MIOURL_API api.piuchebuono.app
|
||||
Define PORTA 3000
|
||||
@@ -0,0 +1,4 @@
|
||||
Define MIODOMINIO abitaregliiblei.it
|
||||
Define MIODOMINIO_COMPLETO test.abitaregliiblei.it
|
||||
Define MIOURL_API testapi.abitaregliiblei.it
|
||||
Define PORTA 3021
|
||||
@@ -0,0 +1,4 @@
|
||||
Define MIODOMINIO riso.app
|
||||
Define MIODOMINIO_COMPLETO test.riso.app
|
||||
Define MIOURL_API testapi.riso.app
|
||||
Define PORTA 3005
|
||||
@@ -0,0 +1,3 @@
|
||||
Include /etc/apache2/sites-available/dominioinclude_piuchebuono.app.conf
|
||||
|
||||
Include /etc/apache2/sites-available/nodejs_virtualhost_ssl_http_https.conf
|
||||
@@ -0,0 +1,47 @@
|
||||
# Configurazione per HTTP
|
||||
<VirtualHost 65.108.222.97:80>
|
||||
ServerName ${MIOURL_API}
|
||||
|
||||
RewriteEngine on
|
||||
# Redirigi tutto il traffico HTTP verso HTTPS
|
||||
RewriteCond %{SERVER_NAME} =${MIOURL_API} [OR]
|
||||
RewriteCond %{SERVER_NAME} =www.${MIOURL_API}
|
||||
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
|
||||
|
||||
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
|
||||
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost 65.108.222.97:443>
|
||||
ServerName ${MIOURL_API}
|
||||
ServerAdmin surya@riso.app
|
||||
|
||||
SSLEngine On
|
||||
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
|
||||
SSLCompression Off
|
||||
SSLHonorCipherOrder off
|
||||
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:E>
|
||||
SSLVerifyDepth 10
|
||||
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/cert.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
|
||||
|
||||
ProxyPreserveHost On
|
||||
SSLProxyEngine On
|
||||
SSLProxyVerify None
|
||||
SSLProxyCheckPeerCN Off
|
||||
SSLProxyCheckPeerName Off
|
||||
ProxyPass / https://localhost:${PORTA}/ retry=0 timeout=5 connectiontimeout=2
|
||||
ProxyPassReverse / https://localhost:${PORTA}/
|
||||
|
||||
ProxyTimeout 5
|
||||
|
||||
LogLevel warn
|
||||
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
|
||||
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
|
||||
|
||||
<Location />
|
||||
ProxyPassReverse /
|
||||
SetEnv force-proxy-request-1.0 1
|
||||
SetEnv proxy-nokeepalive 1
|
||||
</Location>
|
||||
</VirtualHost>
|
||||
@@ -0,0 +1,3 @@
|
||||
Include /etc/apache2/sites-available/dominioinclude_piuchebuono.app.conf
|
||||
|
||||
Include /etc/apache2/sites-available/websites_ssl_virtualhost.conf
|
||||
@@ -0,0 +1,3 @@
|
||||
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
|
||||
|
||||
Include /etc/apache2/sites-available/websites_ssl_virtualhost.conf
|
||||
30
docs/apache2/sites-available/websites_ssl_virtualhost.conf
Normal file
30
docs/apache2/sites-available/websites_ssl_virtualhost.conf
Normal file
@@ -0,0 +1,30 @@
|
||||
<VirtualHost 65.108.222.97:80>
|
||||
ServerName ${MIODOMINIO_COMPLETO}
|
||||
RewriteEngine On
|
||||
|
||||
# Forza la connessione HTTPS
|
||||
RewriteCond %{HTTPS} off
|
||||
RewriteRule ^ https://${MIODOMINIO_COMPLETO}%{REQUEST_URI} [L,R=301]
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost 65.108.222.97:443>
|
||||
ServerName ${MIODOMINIO_COMPLETO}
|
||||
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
|
||||
ServerAdmin surya@riso.app
|
||||
SSLEngine On
|
||||
SSLProtocol -ALL +TLSv1.2
|
||||
SSLCompression Off
|
||||
SSLHonorCipherOrder off
|
||||
SSLCipherSuite ECDH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS:!DH:!AES128
|
||||
SSLVerifyDepth 10
|
||||
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/cert.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
|
||||
<Directory /var/www/${MIODOMINIO_COMPLETO}/>
|
||||
CGIPassAuth On
|
||||
Require all granted
|
||||
AllowOverride All
|
||||
</Directory>
|
||||
LogLevel warn
|
||||
ErrorLog "/var/www/${MIODOMINIO_COMPLETO}/logs/error.log"
|
||||
CustomLog "/var/www/${MIODOMINIO_COMPLETO}/logs/access.log" combined
|
||||
</VirtualHost>
|
||||
24
docs/gitlab/aggiungere_a_gitlab.rb.txt
Normal file
24
docs/gitlab/aggiungere_a_gitlab.rb.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
docker exec -it gitlab /bin/bash
|
||||
|
||||
apt-get update
|
||||
apt-get install nano
|
||||
|
||||
nano /etc/gitlab/gitlab.rb
|
||||
|
||||
|
||||
gitlab_rails['smtp_address'] = "smtp.example.com"
|
||||
gitlab_rails['smtp_port'] = 587
|
||||
gitlab_rails['smtp_user_name'] = "tuo_username"
|
||||
gitlab_rails['smtp_password'] = "tuo_password"
|
||||
gitlab_rails['smtp_domain'] = "example.com"
|
||||
gitlab_rails['smtp_enable_starttls_auto'] = true
|
||||
gitlab_rails['smtp_tls'] = true
|
||||
|
||||
|
||||
gitlab_rails['smtp_address'] = "box.lamiaposta.org"
|
||||
gitlab_rails['smtp_port'] = 465
|
||||
gitlab_rails['smtp_user_name'] = "gitlab@riso.app"
|
||||
gitlab_rails['smtp_password'] = "MYPRISO_1290_1977@!"
|
||||
gitlab_rails['smtp_domain'] = "lamiaposta.org"
|
||||
gitlab_rails['smtp_enable_starttls_auto'] = true
|
||||
gitlab_rails['smtp_tls'] = true
|
||||
839
docs/precserver.js
Normal file
839
docs/precserver.js
Normal file
@@ -0,0 +1,839 @@
|
||||
require('./config/config');
|
||||
require('./config/config');
|
||||
|
||||
// console.log(" lodash");
|
||||
|
||||
console.log(process.versions);
|
||||
|
||||
const _ = require('lodash');
|
||||
// console.log(" cors");
|
||||
const cors = require('cors');
|
||||
|
||||
// console.log(" 2) fs");
|
||||
const fs = require('fs');
|
||||
|
||||
var https = require('https');
|
||||
|
||||
const NUOVO_METODO_TEST = true;
|
||||
|
||||
const server_constants = require('./tools/server_constants');
|
||||
|
||||
//const throttle = require('express-throttle-bandwidth');
|
||||
// app.use(throttle(1024 * 128)) // throttling bandwidth
|
||||
|
||||
const port = process.env.PORT;
|
||||
|
||||
// var cookieParser = require('cookie-parser')
|
||||
// var csrf = require('csurf')
|
||||
const express = require('express');
|
||||
const bodyParser = require('body-parser');
|
||||
const path = require('path');
|
||||
|
||||
const cron = require('node-cron');
|
||||
console.log('Starting mongoose...');
|
||||
|
||||
const tls = require('tls');
|
||||
|
||||
require('./db/mongoose');
|
||||
|
||||
// console.log('Starting pem...');
|
||||
|
||||
// const pem = require('pem')
|
||||
|
||||
const { Settings } = require('./models/settings');
|
||||
|
||||
const Site = require('./models/site');
|
||||
|
||||
// test
|
||||
|
||||
const i18n = require('i18n');
|
||||
|
||||
let credentials = null;
|
||||
|
||||
// OBTAIN
|
||||
// https://www.psclistens.com/insight/blog/enabling-a-nodejs-ssl-webserver-using-let-s-encrypt-pem-certificates/
|
||||
|
||||
|
||||
if ((process.env.NODE_ENV === 'production')) {
|
||||
console.log('*** AMBIENTE DI PRODUZIONE (Aprile 2024) !!!!')
|
||||
} else if (process.env.NODE_ENV === 'test') {
|
||||
console.log('*** ### AMBIENTE DI TEST ')
|
||||
}
|
||||
|
||||
|
||||
console.log('DB: ' + process.env.DATABASE);
|
||||
// console.log("PORT: " + port);
|
||||
// console.log("MONGODB_URI: " + process.env.MONGODB_URI);
|
||||
|
||||
var app = express();
|
||||
|
||||
|
||||
let telegrambot = null;
|
||||
|
||||
const tools = require('./tools/general');
|
||||
|
||||
const shared_consts = require('./tools/shared_nodejs');
|
||||
|
||||
var mongoose = require('mongoose').set('debug', false);
|
||||
|
||||
mongoose.set('debug', false);
|
||||
|
||||
const { CfgServer } = require('./models/cfgserver');
|
||||
const { ObjectID } = require('mongodb');
|
||||
|
||||
const populate = require('./populate/populate');
|
||||
const { Circuit } = require('./models/circuit');
|
||||
|
||||
const printf = require('util').format;
|
||||
|
||||
myLoad().then(ris => {
|
||||
|
||||
const { User } = require('./models/user');
|
||||
|
||||
require('./models/todo');
|
||||
require('./models/project');
|
||||
require('./models/subscribers');
|
||||
require('./models/booking');
|
||||
require('./models/sendmsg');
|
||||
require('./models/sendnotif');
|
||||
require('./models/mailinglist');
|
||||
require('./models/newstosent');
|
||||
require('./models/mypage');
|
||||
require('./models/myelem');
|
||||
require('./models/bot');
|
||||
require('./models/calzoom');
|
||||
const mysql_func = require('./mysql/mysql_func');
|
||||
|
||||
const index_router = require('./router/index_router');
|
||||
const push_router = require('./router/push_router');
|
||||
const newsletter_router = require('./router/newsletter_router');
|
||||
const booking_router = require('./router/booking_router');
|
||||
const dashboard_router = require('./router/dashboard_router');
|
||||
const myevent_router = require('./router/myevent_router');
|
||||
const subscribe_router = require('./router/subscribe_router');
|
||||
const sendmsg_router = require('./router/sendmsg_router');
|
||||
const sendnotif_router = require('./router/sendnotif_router');
|
||||
const email_router = require('./router/email_router');
|
||||
const todos_router = require('./router/todos_router');
|
||||
const test_router = require('./router/test_router');
|
||||
const projects_router = require('./router/projects_router');
|
||||
const report_router = require('./router/report_router');
|
||||
const users_router = require('./router/users_router');
|
||||
const reactions_router = require('./router/reactions_router');
|
||||
const mygroups_router = require('./router/mygroups_router');
|
||||
const circuits_router = require('./router/circuits_router');
|
||||
const accounts_router = require('./router/accounts_router');
|
||||
const iscrittiConacreis_router = require('./router/iscrittiConacreis_router');
|
||||
const iscrittiArcadei_router = require('./router/iscrittiArcadei_router');
|
||||
const site_router = require('./router/site_router');
|
||||
const admin_router = require('./router/admin_router');
|
||||
const products_router = require('./router/products_router');
|
||||
const cart_router = require('./router/cart_router');
|
||||
const orders_router = require('./router/orders_router');
|
||||
const city_router = require('./router/city_router');
|
||||
const myskills_router = require('./router/myskills_router');
|
||||
const mygoods_router = require('./router/mygoods_router');
|
||||
const mygen_router = require('./router/mygen_router');
|
||||
const aitools_router = require('./router/aitools_router');
|
||||
|
||||
const { MyEvent } = require('./models/myevent');
|
||||
|
||||
app.use(bodyParser.json({ limit: '50mb' }));
|
||||
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
|
||||
|
||||
app.use(express.static('views'));
|
||||
|
||||
// app.use(express.static(path.join(__dirname, 'client')));
|
||||
|
||||
app.use(bodyParser.json());
|
||||
|
||||
// app.set('view engine', 'pug');
|
||||
|
||||
// Set static folder
|
||||
// app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
i18n.configure({
|
||||
locales: ['it', 'enUs', 'es', 'fr', 'pt', 'si'],
|
||||
defaultLocale: 'it',
|
||||
// cookie: 'cook',
|
||||
directory: __dirname + '/locales',
|
||||
api: {
|
||||
'__': 'translate',
|
||||
'__n': 'translateN'
|
||||
},
|
||||
});
|
||||
|
||||
app.use(cors({
|
||||
exposedHeaders: ['x-auth', 'x-refrtok'],
|
||||
}));
|
||||
|
||||
app.use(bodyParser.json());
|
||||
|
||||
// app.use(express.cookieParser());
|
||||
app.use(i18n.init);
|
||||
|
||||
console.log('Use Routes \...');
|
||||
|
||||
|
||||
// Use Routes
|
||||
app.use('/', index_router);
|
||||
app.use('/subscribe', subscribe_router);
|
||||
app.use('/sendmsg', sendmsg_router);
|
||||
app.use('/sendnotif', sendnotif_router);
|
||||
app.use('/push', push_router);
|
||||
app.use('/news', newsletter_router);
|
||||
app.use('/booking', booking_router);
|
||||
app.use('/dashboard', dashboard_router);
|
||||
app.use('/event', myevent_router);
|
||||
app.use('/email', email_router);
|
||||
app.use('/todos', todos_router);
|
||||
app.use('/test', test_router);
|
||||
app.use('/projects', projects_router);
|
||||
app.use('/users', users_router);
|
||||
app.use('/reactions', reactions_router);
|
||||
app.use('/mygroup', mygroups_router);
|
||||
app.use('/circuit', circuits_router);
|
||||
app.use('/account', accounts_router);
|
||||
app.use('/iscritti_conacreis', iscrittiConacreis_router);
|
||||
app.use('/iscritti_arcadei', iscrittiArcadei_router);
|
||||
app.use('/report', report_router);
|
||||
app.use('/site', site_router);
|
||||
app.use('/admin', admin_router);
|
||||
app.use('/products', products_router);
|
||||
app.use('/cart', cart_router);
|
||||
app.use('/orders', orders_router);
|
||||
app.use('/city', city_router);
|
||||
app.use('/myskills', myskills_router);
|
||||
app.use('/mygoods', mygoods_router);
|
||||
app.use('/mygen', mygen_router);
|
||||
app.use('/aitools', aitools_router);
|
||||
|
||||
// catch 404 and forward to error handler
|
||||
// app.use(function (req, res, next) {
|
||||
// var err = new Error('Not Found');
|
||||
// err.status = 404;
|
||||
// next(err);
|
||||
// });
|
||||
|
||||
// app.set('views', path.join(__dirname, 'views'));
|
||||
// app.set('view engine', 'pug');
|
||||
|
||||
// development error handler
|
||||
// will print stacktrace
|
||||
if (app.get('env') === 'development') {
|
||||
|
||||
app.use(function (err, req, res, next) {
|
||||
console.log('Server Error: ', err.message);
|
||||
// console.trace();
|
||||
res.status(err.status || 500).send({ error: err.message });
|
||||
// res.render('error', {
|
||||
// message: err.message,
|
||||
// error: err
|
||||
// });
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// require('./telegram/telegrambot');
|
||||
|
||||
// *** DB CONNECTIONS ***
|
||||
// mysql_func.mySqlConn_Shen.connect((err) => {
|
||||
// if (!err)
|
||||
// console.log('DB connection to Shen Database succeded.');
|
||||
// else
|
||||
// console.log('DB connection to Shen Database FAILED \n Error: ' + JSON.stringify(err, undefined, 2));
|
||||
// });
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
console.log('*** PRODUCTION! ');
|
||||
}
|
||||
|
||||
if ((process.env.NODE_ENV === 'production') ||
|
||||
(process.env.NODE_ENV === 'test')) {
|
||||
|
||||
const keyStream = path.resolve(`./${process.env.PATH_CERT_KEY}`);
|
||||
const certificateStream = path.resolve(`./${process.env.PATH_SERVER_CRT}`);
|
||||
|
||||
let privateKey = fs.readFileSync(keyStream, "utf8");
|
||||
let certificate = fs.readFileSync(certificateStream, "utf8");
|
||||
|
||||
let credentials = null;
|
||||
|
||||
|
||||
// arrSecureContext = ['piuchebuono.app', 'gruppomacro.app'];
|
||||
arrSecureContext = ['freeplanet.app', 'riso.app', 'comunitanuovomondo.app'];
|
||||
|
||||
let secureContext = {};
|
||||
|
||||
for (let i = 0; i < arrSecureContext.length; i++) {
|
||||
try {
|
||||
secureContext = {
|
||||
...secureContext,
|
||||
[arrSecureContext[i]]: tls.createSecureContext({
|
||||
key: fs.readFileSync('/etc/letsencrypt/live/' + arrSecureContext[i] + '/privkey.pem'),
|
||||
cert: fs.readFileSync('/etc/letsencrypt/live/' + arrSecureContext[i] + '/fullchain.pem')
|
||||
// ca: fs.readFileSync('../path_to_certificate_authority_bundle.ca-bundle1', 'utf8'), // this ca property is optional
|
||||
})
|
||||
}
|
||||
|
||||
credentials = {
|
||||
SNICallback: function (domain, cb) {
|
||||
if (secureContext) {
|
||||
if (cb) {
|
||||
cb(null, secureContext);
|
||||
} else {
|
||||
// compatibility for older versions of node
|
||||
return secureContext;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.log('Error: ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
let secureContext = {
|
||||
'piuchebuono.app': tls.createSecureContext({
|
||||
key: fs.readFileSync('/etc/letsencrypt/live/piuchebuono.app/privkey.pem'),
|
||||
cert: fs.readFileSync('/etc/letsencrypt/live/piuchebuono.app/fullchain.pem')
|
||||
// ca: fs.readFileSync('../path_to_certificate_authority_bundle.ca-bundle1', 'utf8'), // this ca property is optional
|
||||
}),
|
||||
'gruppomacro.app': tls.createSecureContext({
|
||||
key: fs.readFileSync('/etc/letsencrypt/live/gruppomacro.app/privkey.pem'),
|
||||
cert: fs.readFileSync('/etc/letsencrypt/live/gruppomacro.app/fullchain.pem')
|
||||
// ca: fs.readFileSync('../path_to_certificate_authority_bundle.ca-bundle1', 'utf8'), // this ca property is optional
|
||||
}),
|
||||
}*/
|
||||
|
||||
console.log('secureContext', secureContext);
|
||||
|
||||
if (NUOVO_METODO_TEST) {
|
||||
credentials = {
|
||||
SNICallback: function (domain, cb) {
|
||||
if (secureContext[domain]) {
|
||||
if (cb) {
|
||||
cb(null, secureContext[domain]);
|
||||
} else {
|
||||
// compatibility for older versions of node
|
||||
return secureContext[domain];
|
||||
}
|
||||
} else {
|
||||
throw new Error('No keys/certificates for domain requested');
|
||||
}
|
||||
},
|
||||
// must list a default key and cert because required by tls.createServer()
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
}
|
||||
|
||||
/*} else {
|
||||
// NON USATO !
|
||||
credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
ca: [
|
||||
fs.readFileSync(process.env.PATH_SSL_ROOT_PEM, 'utf8'),
|
||||
fs.readFileSync(process.env.PATH_SSL_CHAIN_PEM, 'utf8'),
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
/*} else {
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.HTTPS_LOCALHOST === "true") {
|
||||
privateKey = fs.readFileSync(process.env.PATH_CERT_KEY, 'utf8');
|
||||
certificate = fs.readFileSync(process.env.PATH_SERVER_CRT, 'utf8');
|
||||
credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384',
|
||||
honorCipherOrder: true,
|
||||
secureProtocol: 'TLSv1_2_method',
|
||||
};
|
||||
|
||||
} else {
|
||||
var http = require('http');
|
||||
}
|
||||
|
||||
if ((process.env.NODE_ENV === 'production') ||
|
||||
(process.env.NODE_ENV === 'test') || process.env.HTTPS_LOCALHOST === "true") {
|
||||
|
||||
const httpsServer = https.createServer(credentials, app);
|
||||
|
||||
console.log('httpsServer: port ', port);
|
||||
httpsServer.listen(port);
|
||||
} else {
|
||||
console.log('httpServer: port ', port);
|
||||
const httpServer = http.createServer(app);
|
||||
httpServer.listen(port);
|
||||
}
|
||||
|
||||
mystart();
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
// app.use(throttle(1024 * 128)); // throttling bandwidth
|
||||
|
||||
// app.use((req, res, next) => {
|
||||
// res.header('Access-Control-Allow-Origin', '*')
|
||||
// res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
|
||||
// next()
|
||||
// });
|
||||
|
||||
async function myLoad() {
|
||||
|
||||
return tools.loadApps();
|
||||
}
|
||||
|
||||
async function mystart() {
|
||||
|
||||
// await estraiTutteLeImmagini();
|
||||
|
||||
await tools.getApps();
|
||||
|
||||
if (process.env.PROD !== 1) {
|
||||
|
||||
testmsgwebpush();
|
||||
|
||||
// tools.sendNotifToAdmin('Riparti', 'Riparti');
|
||||
|
||||
let miapass = '';
|
||||
|
||||
if (miapass !== '') {
|
||||
let crypt = tools.cryptdata(miapass);
|
||||
let decrypt = tools.decryptdata(crypt);
|
||||
|
||||
console.log('crypted:', crypt);
|
||||
console.log('decrypted:', decrypt);
|
||||
}
|
||||
|
||||
mycron();
|
||||
if (!process.env.DEBUG) {
|
||||
mycron();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
telegrambot = require('./telegram/telegrambot');
|
||||
|
||||
await inizia();
|
||||
|
||||
await resetProcessingJob();
|
||||
|
||||
populate.popolaTabelleNuove();
|
||||
|
||||
faitest();
|
||||
|
||||
// ----------------- MAILCHIMP -----
|
||||
const querystring = require('querystring');
|
||||
const mailchimpClientId = 'xxxxxxxxxxxxxxxx';
|
||||
|
||||
app.get('/mailchimp/auth/authorize', function (req, res) {
|
||||
res.redirect('https://login.mailchimp.com/oauth2/authorize?' +
|
||||
querystring.stringify({
|
||||
'response_type': 'code',
|
||||
'client_id': mailchimpClientId,
|
||||
'redirect_uri': 'http://127.0.0.1:3000/mailchimp/auth/callback',
|
||||
}));
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// -----------------
|
||||
|
||||
function populateDBadmin() {
|
||||
const cfgserv = [
|
||||
{
|
||||
_id: new ObjectID(),
|
||||
idapp: '9',
|
||||
chiave: 'vers',
|
||||
userId: 'ALL',
|
||||
valore: '0.1.2',
|
||||
}];
|
||||
|
||||
let cfg = new CfgServer(cfgserv[0]).save();
|
||||
}
|
||||
|
||||
async function mycron() {
|
||||
|
||||
try {
|
||||
const sendemail = require('./sendemail');
|
||||
|
||||
const arr = await tools.getApps();
|
||||
|
||||
for (const app of arr) {
|
||||
sendemail.checkifPendingNewsletter(app.idapp);
|
||||
sendemail.checkifSentNewsletter(app.idapp);
|
||||
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Err mycron', e);
|
||||
}
|
||||
}
|
||||
|
||||
async function mycron_30min() {
|
||||
for (const app of await tools.getApps()) {
|
||||
let enablecrontab = false;
|
||||
|
||||
enablecrontab = await Settings.getValDbSettings(app.idapp,
|
||||
tools.ENABLE_CRONTAB, false);
|
||||
|
||||
if (enablecrontab) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function mycron_everyday() {
|
||||
try {
|
||||
|
||||
const { User } = require('./models/user');
|
||||
|
||||
const arrapps = await tools.getApps();
|
||||
for (const app of arrapps) {
|
||||
|
||||
// Azzera le richieste di password:
|
||||
const usersblocked = await User.find({ idapp: app.idapp, retry_pwd: { $exists: true, $gte: 29 } }).lean();
|
||||
for (const user of usersblocked) {
|
||||
await User.findOneAndUpdate({ _id: user._id }, { $set: { retry_pwd: 20 } });
|
||||
let text = `⚠️⚠️⚠️ L\'utente ${user.username} (${user.name} ${user.surname}) viene sbloccato dal numero massimo di tentativi di richiesta password!\nTelerlo d\'occhio !\n@${user.profile.username_telegram}`;
|
||||
await telegrambot.sendMsgTelegramToTheAdminAllSites(text, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Crea un file con all'interno il nome del dominio per ogni app:
|
||||
await tools.createFileWithDomainName();
|
||||
|
||||
} catch (e) {
|
||||
console.error('mycron_everyday: ', e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function testmsgwebpush() {
|
||||
const { User } = require('./models/user');
|
||||
|
||||
// console.log('nomeapp 1: ' , tools.getNomeAppByIdApp(1));
|
||||
// console.log('nomeapp 2: ' , tools.getNomeAppByIdApp(2));
|
||||
|
||||
User.find({ username: 'paoloar77', idapp: '1' }).then(async (arrusers) => {
|
||||
if (arrusers !== null) {
|
||||
for (const user of arrusers) {
|
||||
await tools.sendNotificationToUser(user._id, 'Server',
|
||||
'Il Server è Ripartito', '/', '', 'server', []).then(ris => {
|
||||
if (ris) {
|
||||
|
||||
} else {
|
||||
// already sent the error on calling sendNotificationToUser
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// Cron every X minutes
|
||||
cron.schedule('*/1 * * * *', () => {
|
||||
// console.log('Running Cron Job');
|
||||
// if (!process.env.DEBUG) {
|
||||
mycron();
|
||||
// }
|
||||
});
|
||||
|
||||
// Cron every X minutes
|
||||
cron.schedule('*/60 * * * *', async () => {
|
||||
if (!process.env.DEBUG) {
|
||||
mycron_30min();
|
||||
}
|
||||
});
|
||||
|
||||
// Cron every 21:00 (1 volta al giorno)
|
||||
cron.schedule('0 21 * * *', async () => {
|
||||
mycron_everyday();
|
||||
});
|
||||
|
||||
// mycron_30min();
|
||||
|
||||
// tools.writelogfile('test', 'prova.txt');
|
||||
|
||||
async function resetProcessingJob() {
|
||||
|
||||
const { Newstosent } = require('./models/newstosent');
|
||||
|
||||
arrrec = await Newstosent.find({});
|
||||
|
||||
for (const rec of arrrec) {
|
||||
rec.processing_job = false;
|
||||
await Newstosent.findOneAndUpdate({ _id: rec.id }, { $set: rec }, { new: false }).
|
||||
then((item) => {
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//app.listen(port, () => {
|
||||
// console.log(`Server started at port ${port}`);
|
||||
//});
|
||||
|
||||
async function inizia() {
|
||||
|
||||
try {
|
||||
if (true) {
|
||||
const url = 'https://raw.githubusercontent.com/matteocontrini/comuni-json/master/comuni.json';
|
||||
const outputPath = './comuni_italia_geojson.json';
|
||||
downloadGeoJSON(url, outputPath);
|
||||
}
|
||||
|
||||
mycron_everyday();
|
||||
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
await telegrambot.sendMsgTelegram(tools.FREEPLANET,
|
||||
telegrambot.ADMIN_USER_SERVER,
|
||||
`Ciao ${telegrambot.ADMIN_USER_NAME_SERVER}!`);
|
||||
|
||||
await telegrambot.sendMsgTelegramByIdTelegram(tools.FREEPLANET,
|
||||
telegrambot.ADMIN_IDTELEGRAM_SERVER,
|
||||
`Ciao ${telegrambot.ADMIN_USER_NAME_SERVER}\n` +
|
||||
`🔅 Il Server ${process.env.DATABASE} è appena ripartito!`);
|
||||
|
||||
} else {
|
||||
|
||||
await telegrambot.sendMsgTelegramToTheAdminAllSites(`Ciao Admin\n` + `🔅🔅🔅 Il Server col BOT di {appname} è appena ripartito!`, false);
|
||||
|
||||
}
|
||||
|
||||
await Site.createFirstUserAdmin();
|
||||
|
||||
/*const {Circuit} = require('./models/circuit');
|
||||
|
||||
await Circuit.setDeperimentoOff();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
// telegrambot.sendMsgTelegramToTheManagers('7', 'PROVAAA!');
|
||||
|
||||
// if (process.env.PROD !== 1) {
|
||||
// const reg = require('./reg/registration');
|
||||
// const link = reg.getlinkregByEmail('7', 'tomasihelen@dasdasgmail.comAAAA' , 'HelenTomasidasdasd');
|
||||
// const link2 = reg.getlinkregByEmail('7', 'tomasihelen@gmail.com' , 'HelenTomasi');
|
||||
// //const link2 = reg.getlinkregByEmail('7', 'elenaliubicich@gmail.com' , 'Elenaliu');
|
||||
//
|
||||
// console.log(link);
|
||||
// console.log(link2);
|
||||
// }
|
||||
|
||||
async function estraiImmagini(table) {
|
||||
const { User } = require('./models/user');
|
||||
|
||||
let idapp = '13';
|
||||
|
||||
let arrlist;
|
||||
|
||||
const globalTables = require('./tools/globalTables');
|
||||
|
||||
|
||||
const mytable = globalTables.getTableByTableName(table);
|
||||
if (!mytable)
|
||||
return;
|
||||
|
||||
console.log('INIZIO - estraiImmagini', table);
|
||||
|
||||
arrlist = await mytable.find({ idapp }).lean();
|
||||
|
||||
let file = '';
|
||||
let filetocheck = '';
|
||||
let dirmain = '';
|
||||
let filefrom = '';
|
||||
let filefrom2 = '';
|
||||
let dir = tools.getdirByIdApp(idapp) + dirmain + '/upload/';
|
||||
|
||||
try {
|
||||
if (!tools.sulServer()) {
|
||||
dirmain = '/public';
|
||||
}
|
||||
|
||||
for (const rec of arrlist) {
|
||||
const myuser = await User.findOne({ idapp, _id: rec.userId }).lean();
|
||||
if (myuser) {
|
||||
const myphotos = rec.photos;
|
||||
|
||||
if (myphotos.length > 0) {
|
||||
let folderprof = dir + 'profile/' + myuser.username;
|
||||
|
||||
try {
|
||||
// console.log('checkdir', folderprof);
|
||||
if (!fs.existsSync(folderprof)) {
|
||||
console.log('*** Creadir', folderprof);
|
||||
fs.mkdirSync(folderprof);
|
||||
}
|
||||
|
||||
folderprof = dir + 'profile/' + myuser.username + '/' + table;
|
||||
// console.log('checkdir', folderprof);
|
||||
if (!fs.existsSync(folderprof)) {
|
||||
console.log('creadir', folderprof);
|
||||
fs.mkdirSync(folderprof);
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (const photo of myphotos) {
|
||||
|
||||
if (photo.imagefile) {
|
||||
file = dir + 'profile/' + myuser.username + '/' + table + '/' +
|
||||
photo.imagefile;
|
||||
filefrom = dir + 'profile/undefined/' + table + '/' + photo.imagefile;
|
||||
filefrom2 = dir + 'profile/' + myuser.username + '/' + photo.imagefile;
|
||||
|
||||
// console.log('file', file);
|
||||
// console.log('filefrom', filefrom);
|
||||
|
||||
if (!tools.isFileExists(file)) {
|
||||
// non esiste
|
||||
console.log('non esiste', file);
|
||||
console.log(' filefrom', filefrom);
|
||||
console.log(' filefrom2', filefrom2);
|
||||
}
|
||||
|
||||
if (!tools.isFileExists(file) && tools.isFileExists(filefrom)) {
|
||||
console.log('@@@@@@ copia file:', filefrom, 'a', file);
|
||||
tools.copy(filefrom, file);
|
||||
}
|
||||
if (!tools.isFileExists(file) && tools.isFileExists(filefrom2)) {
|
||||
console.log('@@@@@@ copia file 2:', filefrom2, 'a', file);
|
||||
tools.copy(filefrom2, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('FINE - estraiImmagini', table);
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
}
|
||||
}
|
||||
|
||||
async function estraiTutteLeImmagini() {
|
||||
|
||||
await estraiImmagini('myskills');
|
||||
await estraiImmagini('mygoods');
|
||||
await estraiImmagini('mybachecas');
|
||||
}
|
||||
|
||||
async function faitest() {
|
||||
// console.log('Fai Test:')
|
||||
|
||||
const testfind = false;
|
||||
|
||||
// const $vers = tools.getVersionint('1.92.45');
|
||||
|
||||
if (true) {
|
||||
// tools.execScript("ls -la");
|
||||
}
|
||||
|
||||
if (false) {
|
||||
prova = tools.removeAtChar('@prova');
|
||||
}
|
||||
|
||||
if (false) {
|
||||
const prova = tools.getConfSiteOptionEnabledByIdApp('13', shared_consts.ConfSite.Notif_Reg_Push_Admin);
|
||||
console.log('prova', prova);
|
||||
}
|
||||
|
||||
if (testfind) {
|
||||
const { City } = require('./models/city');
|
||||
|
||||
let miacity = 'roma';
|
||||
const ris = await City.findByCity(miacity);
|
||||
|
||||
console.log('ris', ris);
|
||||
}
|
||||
|
||||
const { User } = require('./models/user');
|
||||
|
||||
if (false) {
|
||||
let myuser = await User.findOne({
|
||||
idapp: '1',
|
||||
username: 'paoloar77',
|
||||
});
|
||||
const langdest = 'it';
|
||||
|
||||
telegrambot.askConfirmationUser(myuser.idapp, shared_consts.CallFunz.REGISTRATION, myuser);
|
||||
|
||||
}
|
||||
|
||||
if (false) {
|
||||
|
||||
const user = await User.findOne({
|
||||
idapp: 12,
|
||||
username: 'paolotest1',
|
||||
});
|
||||
|
||||
await sendemail.sendEmail_Registration('it', 'paolo@arcodiluce.it', user,
|
||||
'12', '');
|
||||
|
||||
}
|
||||
|
||||
if (false) {
|
||||
|
||||
const { User } = require('./models/user');
|
||||
|
||||
const idapp = tools.FREEPLANET;
|
||||
const idreg = 0;
|
||||
|
||||
try {
|
||||
|
||||
const user = await User.findOne({
|
||||
idapp,
|
||||
username: 'paoloar773',
|
||||
});
|
||||
|
||||
user.aportador_solidario = 'paoloar77';
|
||||
|
||||
let mylocalsconf = {
|
||||
idapp,
|
||||
dataemail: null,
|
||||
locale: user.lang,
|
||||
nomeapp: tools.getNomeAppByIdApp(idapp),
|
||||
strlinksito: tools.getHostByIdApp(idapp),
|
||||
strlinkreg: '',
|
||||
username: user.username,
|
||||
name: user.name,
|
||||
surname: user.surname,
|
||||
forgetpwd: tools.getHostByIdApp(idapp) + '/requestresetpwd',
|
||||
emailto: '',
|
||||
user,
|
||||
};
|
||||
|
||||
await telegrambot.notifyToTelegram(telegrambot.phase.REGISTRATION,
|
||||
mylocalsconf);
|
||||
} catch (e) {
|
||||
console.log('error ' + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { app };
|
||||
|
||||
0
docs/router/admin_router
Normal file
0
docs/router/admin_router
Normal file
44879
docs/test.js
Normal file
44879
docs/test.js
Normal file
File diff suppressed because one or more lines are too long
@@ -9,15 +9,12 @@ module.exports = {
|
||||
//autorestart: true,
|
||||
instances: 1,
|
||||
env: {
|
||||
"PORT": 3000,
|
||||
"NODE_ENV": "development",
|
||||
},
|
||||
env_test: {
|
||||
"PORT": 3001,
|
||||
"NODE_ENV": "test",
|
||||
},
|
||||
env_production: {
|
||||
"PORT": 3000,
|
||||
"NODE_ENV": "production",
|
||||
},
|
||||
log_file: "logs/combined.outerr.log",
|
||||
|
||||
21
ecosystem.config.pcb.js
Executable file
21
ecosystem.config.pcb.js
Executable file
@@ -0,0 +1,21 @@
|
||||
module.exports = {
|
||||
apps: [
|
||||
{
|
||||
name: "PRODUZIONE PiuCheBuono_ServerSide",
|
||||
script: "/var/www/www.freeplanet_server/src/server/server.js",
|
||||
ignore_watch: ["node_modules", "logs"],
|
||||
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
|
||||
//autorestart: true,
|
||||
instances: 1,
|
||||
watch: false,
|
||||
env: {
|
||||
"NODE_ENV": "production"
|
||||
},
|
||||
log_file: "logs/combined.test.outerr.log",
|
||||
error_file: "logs/errtest.log",
|
||||
out_file: "logs/outtest.log",
|
||||
merge_logs: true,
|
||||
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
|
||||
}
|
||||
]
|
||||
};
|
||||
22
ecosystem.config.testpcb.js
Executable file
22
ecosystem.config.testpcb.js
Executable file
@@ -0,0 +1,22 @@
|
||||
module.exports = {
|
||||
apps: [
|
||||
{
|
||||
name: "TEST PiuCheBuono_ServerSide",
|
||||
script: "/var/www/nodejs_test.piuchebuono_server/src/server/server.js",
|
||||
ignore_watch: ["node_modules", "logs"],
|
||||
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
|
||||
//autorestart: true,
|
||||
instances: 1,
|
||||
watch: false,
|
||||
env: {
|
||||
"PORT": 0,
|
||||
"NODE_ENV": "test"
|
||||
},
|
||||
log_file: "logs/combined.test.outerr.log",
|
||||
error_file: "logs/errtest.log",
|
||||
out_file: "logs/outtest.log",
|
||||
merge_logs: true,
|
||||
log_date_format: "YYYY-MM-DD HH:mm:ss.SSSS Z"
|
||||
}
|
||||
]
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
module.exports = {
|
||||
apps : [
|
||||
apps: [
|
||||
{
|
||||
name: "TESTRISO2 FreePlanetServerSide",
|
||||
script: "./src/server/server.js",
|
||||
ignore_watch : ["node_modules"],
|
||||
ignore_watch: ["node_modules", "logs"],
|
||||
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
|
||||
watch: false,
|
||||
//autorestart: true,
|
||||
|
||||
@@ -14,6 +14,8 @@ span Cellulare:
|
||||
strong #{user.profile.intcode_cell} #{user.profile.cell}<br>
|
||||
span Nazionalità:
|
||||
strong #{user.profile.nationality}<br>
|
||||
span Gruppo:
|
||||
strong #{idMyGroup}<br>
|
||||
p <br>Saluti
|
||||
|
||||
style(type="text/css").
|
||||
|
||||
@@ -6,7 +6,7 @@ span hai dimenticato la Password? :
|
||||
strong <a href=#{forgetpwd} target="_blank">Trovala qui</a><br>
|
||||
span Email:
|
||||
strong #{emailto}<br>
|
||||
p Per confermare la registrazione clicca sul bottone, oppure qui: #{strlinkreg}:
|
||||
p Per confermare la registrazione clicca sul bottone, oppure su questo link: #{strlinkreg}
|
||||
div.divbtn <a href=#{strlinkreg} target="_blank">
|
||||
button.btn.btn-lg Verifica Registrazione</a>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ span hai dimenticato la Password? :
|
||||
strong <a href=#{forgetpwd} target="_blank">Trovala qui</a><br>
|
||||
span Email:
|
||||
strong #{emailto}<br>
|
||||
p Per confermare la registrazione clicca sul bottone oppure clicca qui #{strlinkreg}:
|
||||
p Per confermare la registrazione clicca sul bottone, oppure <a href=#{strlinkreg} target="_blank">CLICCA QUI</a>
|
||||
div.divbtn <a href=#{strlinkreg} target="_blank">
|
||||
button.btn.btn-lg Verifica Registrazione</a>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ span hai dimenticato la Password? :
|
||||
strong <a href=#{forgetpwd} target="_blank">Trovala qui</a><br>
|
||||
span Email:
|
||||
strong #{emailto}<br>
|
||||
p Per confermare la registrazione clicca sul bottone, oppure qui: #{strlinkreg}:
|
||||
p Per confermare la registrazione clicca sul bottone, oppure <a href=#{strlinkreg} target="_blank">CLICCA QUI</a>
|
||||
div.divbtn <a href=#{strlinkreg} target="_blank">
|
||||
button.btn.btn-lg Verifica Registrazione</a>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ span hai dimenticato la Password? :
|
||||
strong <a href=#{forgetpwd} target="_blank">Trovala qui</a><br>
|
||||
span Email:
|
||||
strong #{emailto}<br>
|
||||
p Per confermare la registrazione clicca sul bottone, oppure qui: #{strlinkreg}:
|
||||
p Per confermare la registrazione clicca sul bottone, oppure <a href=#{strlinkreg} target="_blank">CLICCA QUI</a>
|
||||
div.divbtn <a href=#{strlinkreg} target="_blank">
|
||||
button.btn.btn-lg Verifica Registrazione</a>
|
||||
|
||||
|
||||
26
emails/risricevuti/it/html.pug
Executable file
26
emails/risricevuti/it/html.pug
Executable file
@@ -0,0 +1,26 @@
|
||||
p Ciao #{name},
|
||||
p Hai ricevuto
|
||||
strong #{qty} #{symbol}
|
||||
| da parte di #{mittente} sul
|
||||
strong #{nomecircuito} !
|
||||
p <br>
|
||||
p Apri #{nomeapp} per vedere il tuo nuovo saldo.
|
||||
p <br>
|
||||
p Cordiali Saluti
|
||||
p Supporto #{nomeapp}
|
||||
|
||||
style(type="text/css").
|
||||
html, body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 4px; /* Imposta il margine a 0 per i paragrafi */
|
||||
}
|
||||
|
||||
.grande {
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
1
emails/risricevuti/it/subject.pug
Executable file
1
emails/risricevuti/it/subject.pug
Executable file
@@ -0,0 +1 @@
|
||||
=`Hai ricevuto ${qty} ${symbol} da ${mittente} sul ${nomecircuito}`
|
||||
@@ -166,3 +166,5 @@ https://t.me/riso_canale/739
|
||||
|
||||
in attesa di riscontri, salutiamo! 🍚💚
|
||||
il gruppo dei facilitatori territoriali riso
|
||||
|
||||
Mer 03/07 ORE 13:13: USER [paoloar77]: ciao
|
||||
|
||||
924
logs/myobj.json
Normal file
924
logs/myobj.json
Normal file
@@ -0,0 +1,924 @@
|
||||
Titolo Autore Editore Variazione Prezzo Scontato Prezzo Precedente Prezzo Intero Sconto (%)
|
||||
0 TEST Meraviglia del Silenzio - QUADERNO ascolta Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
1 TEST Meraviglia del Silenzio - QUADERNO assapora Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
2 TEST Meraviglia del Silenzio - QUADERNO accarezza Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
3 TEST Meraviglia del Silenzio - QUADERNO respira Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
4 TEST Nel buio... la luce Luigi Marcello Monsellato Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
5 TEST Avanti nel Passato Vadim,Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
6 TEST Cambia la tua vita con la fisica quantistica Chiara,Zagonel Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
7 TEST Succhi Freschi di Frutta e Verdura Norman,Walker Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
8 TEST Il Potere dell'Ashtanga Yoga Kino,MacGregor Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
9 TEST Il Grande Libro della Yoga Terapia Remo,Rittiner Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
10 TEST Prevenzione antinfettiva e oncologica secondo la medicina basata sull’evidenza Giuseppe,Di Bella Macro Edizioni nuovo 25.5 28.5 30 15%
|
||||
11 TEST Ricomincio da me Giovanna Garbuio Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
12 TEST Ho'oponopono e EFT Bruno,Zanaboni Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
13 TEST La Saggezza dei colori: il grande manuale Samya Ilaria Di Donato Macro Edizioni nuovo 17 19 20 15%
|
||||
14 TEST Gli Algoritmi di Elia Tropeano Daniela Cristina Napoletano Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
15 TEST Nel buio...la luce Luigi Marcello Monsellato Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
16 TEST I Virus: figli di un dio minore Luigi Marcello Monsellato Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
17 TEST Oltre la fisica di Einstein - Istituto di Fisica Biettiva Amrit Srecko,Sorli Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
18 TEST Aura Goran,Tasic Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
19 TEST Programma la tua realtà quantica Riccardo Tristano Tuis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
20 TEST NATO per Uccidere Filippo Rossi Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
21 TEST Gesuiti Riccardo Tristano Tuis Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
22 TEST Curare le malattie del cervello con metodi naturali Paolo,Giordo Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
23 TEST Scacco a Big Pharma Marcello Pamio Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
24 TEST Numerologia Intuitiva Alessandro,Valli Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
25 TEST L'inganno della Croce Laura Fezia Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
26 TEST I Geni manipolati di Adamo Pietro Buffa Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
27 TEST Il piccolo libro del lasciar andare Samya Ilaria Di Donato Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
28 TEST Bambino interiore - Guarire con i colori Samya Ilaria Di Donato Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
29 TEST Incensi: un viaggio tra le antiche tradizioni Susanne,Berk Macro Edizioni nuovo 9.27 10.36 10.9 15%
|
||||
30 TEST Il Caso Majorana Pelizza Rino,Di Stefano Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
31 TEST Mamma, perché abbiamo le mestruazioni? Laura Capossele Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
32 TEST L’Equilibratore dentale Samuele Cova Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
33 TEST L'Antico Codice dei Colori Samya Ilaria Di Donato Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
34 TEST Tutto è Possibile Erika,Scotton Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
35 TEST Scienza sacra del divino Dr.,Rebis Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
36 TEST La Mente Magica Vincenzo,Fanelli Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
37 TEST Il Codice della Guarigione | The Healing Code Alexander,Loyd Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
38 TEST La Dea delle origini Stefania Tosi Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
39 TEST IPSOS-93 L'esoterismo di una nuova era Carlo,Dorofatti Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
40 TEST Manuale Clinico di Agopuntura Veterinaria Francesco Longo Macro Edizioni nuovo 102 114 120 15%
|
||||
41 TEST Programmazione Neurosonica Riccardo Tristano Tuis Macro Edizioni nuovo 32.73 36.58 38.5 15%
|
||||
42 TEST La dieta comica Mirna,Visentini Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
43 TEST Potenzia il Tuo Cervello Quantico Sergio Audasso Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
44 TEST La Malattia di Lyme: La pandemia sconosciuta Roberta Raffelli Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
45 TEST Transurfing in 78 giorni NE Vadim Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
46 TEST Fervìda - Fermenti di vita Stefano Abbruzzese Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
47 TEST 400 Anni d'Inganni Anatolij T.,Fomenko Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
48 TEST I Pericoli del Fluoro Giorgio,Petrucci Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
49 TEST Gua Sha viso Clive,Witham Macro Edizioni nuovo 13.6 15.2 16 15%
|
||||
50 TEST Zenix Riccardo Tristano Tuis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
51 TEST Comunicazione in Cerchio Antonio Graziano Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
52 TEST 432 Hertz: la Rivoluzione Musicale Riccardo Tristano Tuis Macro Edizioni nuovo 17 19 20 15%
|
||||
53 TEST Evolvi il tuo cervello Joe,Dispenza Macro Edizioni nuovo 24.57 27.46 28.9 15%
|
||||
54 TEST Vago - Il Mio Nervo più Importante Stanley,Rosenberg Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
55 TEST Amen la Nuova Umanità Elena Sanda,Chira Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
56 TEST Effetto Luna di Miele Bruce H.,Lipton Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
57 TEST Il Potere Creativo dell'Immaginazione Neville,Goddard Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
58 TEST PSOAS - Il Mio Muscolo più Importante Jo Ann,Staugaard-Jones Macro Edizioni nuovo 18.28 20.43 21.5 15%
|
||||
59 TEST La Fine del Diabete Joel,Fuhrman Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
60 TEST The miracle morning Hal,Elrod Macro Edizioni nuovo 17 19 20 15%
|
||||
61 TEST L'invenzione del Padre - In Nome del Padre e della Madre Vol.1 Antonio,Bertoli Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
62 TEST Arricchisci te stesso! Napoleon,Hill Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
63 TEST The Miracle Joe,Vitale Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
64 TEST Biologia delle Credenze - 4D Bruce H.,Lipton Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
65 TEST Il Grande Libro di Rudolf Steiner Alex,Burkart Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
66 TEST Guarire il Fegato e la Cistifellea con il Lavaggio Epatico Andreas,Moritz Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
67 TEST Nora Weeks racconta Edward Bach Nora,Weeks Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
68 TEST Quaderni Animali Guida - LUPO Cristina,Cicognani Macro Edizioni nuovo 4.17 4.66 4.9 15%
|
||||
69 TEST Rigenera il tuo ciclo mestruale Lara,Briden Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
70 TEST Artemisia Annua Barbara,Simonsohn Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
71 TEST Matthew, Parlami del Paradiso Suzanne,Ward Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
72 TEST 50 Racconti per Meditare e da Regalare Ramiro A. Calle Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
73 TEST La Luce Divina non Viene mai Meno Michael,George Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
74 TEST The Miracle Morning: il tuo diario quotidiano Hal,Elrod Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
75 TEST La Via del Grande Dao Chen,Kaiguo Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
76 TEST Anima Umana - Kryon Monica,Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
77 TEST Preghiera segreta Joe,Vitale Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
78 TEST Le CARTE dello Spirito degli Alberi Lucilla,Satanassi Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
79 TEST Le Carte dei Fiori di Bach Lucilla,Satanassi Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
80 TEST Il tuo corpo in equilibrio Maria Noel,Groves Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
81 TEST Sei Come Pensi di Essere James Allen Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
82 TEST Salva Te Stesso. La Creazione dell'Universo Arcadij,Petrov Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
83 TEST Pranayama Swami,Kuvalayananda Macro Edizioni nuovo 17 19 20 15%
|
||||
84 TEST Potere di Realizzazione della Preghiera e della Meditazione Ernest,Holmes Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
85 TEST Kundalini Yoga e la Meditazione Guru,Rattana Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
86 TEST Il Quinto Vangelo - Il Vangelo di Tommaso Mario Pincherle Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
87 TEST Ho'oponopono - La pace comincia da te Saya, Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
88 TEST Food Forest Gardening Tomas,Remiarz Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
89 TEST Il Segreto della Vita Quantica Frank,Kinslow Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
90 TEST Anelli temporali e torsioni spaziali Fred Alan,Wolf Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
91 TEST Buono e bene a volte avviene Alberto,Laffranchi MGE- Nuova Ipsa nuovo 17 19 20 15%
|
||||
92 TEST Le Quattro Rivelazioni Sciamaniche Alberto,Villoldo Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
93 TEST Il Magico Potere di Sbattersene il Ca**o Sarah Knight Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
94 TEST Guarire con i Numeri Petra,Neumayer Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
95 TEST Il potere e la magia della gratitudine Ivan Nossa Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
96 TEST Bambini adolescenti e Fiori di Bach Claudia Castellani MGE- Nuova Ipsa nuovo 14.37 16.06 16.9 15%
|
||||
97 TEST Il Potere di Guarigione degli Angeli Isabelle,Von Fallois Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
98 TEST Cervello Intestino: un Legame Indissolubile Stefano,Manera Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
99 TEST Gli Arcangeli Isabelle,Von Fallois Macro Edizioni nuovo 17 19 20 15%
|
||||
100 TEST Traumi e Shock Emotivi Peter A., Levine Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
101 TEST La Rivoluzione del Cervello Shigeo,Haruyama Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
102 TEST Vincere la sclerosi multipla Emilie,Venesson Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
103 TEST Il tuo corpo implora acqua Fereydoon,Batmanghelidj Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
104 TEST Il grande libro degli oli essenziali e dell’aromaterapia Valerie Ann,Worwood Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
105 TEST Concepimento Consapevole Frederick,Baker Macro Edizioni nuovo 17 19 20 15%
|
||||
106 TEST Il Potere dei Condizionamenti David R.,Hawkins Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
107 TEST Entanglement Massimo,Teodorani Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
108 TEST Ayurveda scientifico vol 1 Gianantonio,Grosso MGE- Nuova Ipsa nuovo 68 76 80 15%
|
||||
109 TEST Enneagramma - I Nove Abitanti della Terra Luca,Giorgetti Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
110 TEST Manuale di cosmesi naturale Lucia,Cuffaro Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
111 TEST Fondamenti di agro-omeopatia Radko,Tichavsky Macro Edizioni nuovo 34 38 40 15%
|
||||
112 TEST L' Orologio degli Organi Li,Wu Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
113 TEST L'Atomo e le Particelle Elementari Massimo,Teodorani Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
114 TEST L'Apprendista Macrobiotico 4D Dealma,Franceschetti Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
115 TEST Atlante Generale dei Muscoli Chris,Jarmey Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
116 TEST I Funghi per la salute Stefania Cazzavillan MGE- Nuova Ipsa nuovo 38.17 42.66 44.9 15%
|
||||
117 TEST Cofanetto Carte Yoga Le Sequenze Mark,Stephens Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
118 TEST Risparmia 700 Euro in 7 Giorni Lucia,Cuffaro Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
119 TEST Luna rossa madre e figlia Miranda,Gray Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
120 TEST Grande Libro del Respiro Donna,Farhi Macro Edizioni nuovo 31.2 34.87 36.7 15%
|
||||
121 TEST Astrologia Archetipica Simone,Bongiovanni Macro Edizioni nuovo 36.47 40.76 42.9 15%
|
||||
122 TEST Mantra Yoga Giorgio Lombardi Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
123 TEST Guarigione Sciamanica Giosuè,Stavros Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
124 TEST Miracoli Stuart,Wilde Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
125 TEST La Guida Completa allo Yin Yoga Bernie,Clark Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
126 TEST Introduzione a Un Corso in Miracoli Kenneth,Wapnick Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
127 TEST La Forza Stuart,Wilde Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
128 TEST Che Cosa mi Vuoi Dire? Stefano,Cattinelli Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
129 TEST I Segreti degli Sciamani Hank,Wesselman Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
130 TEST Il cane sempre giovane Karen,Shaw Becker Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
131 TEST Sei Nato Ricco Bob Proctor Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
132 TEST Manuale per Salvare i Semi dell'Orto e la Biodiversità Jude,Fanton Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
133 TEST Sciamanesimo Huna Giosuè,Stavros Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
134 TEST Traumi e Malattie. Guida alla Risoluzione dei Conflitti a Partire dal Metodo Hamer Alessandro,Spreafichi Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
135 TEST Risveglio e la rivelazione dell'intelligenza organica Giuliana,Conforto Macro Edizioni nuovo 32.3 36.1 38 15%
|
||||
136 TEST I Sali minerali del dott. Schüssler Friedrick,Kopsche MGE- Nuova Ipsa nuovo 26.78 29.93 31.5 15%
|
||||
137 TEST Neuro-quantistica Ermanno Paolelli MGE- Nuova Ipsa nuovo 15.81 17.67 18.6 15%
|
||||
138 TEST Manuale della terapia dei Trigger Point Amber,Davies Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
139 TEST Yoga della felicità John,Kraijenbrink Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
140 TEST Sincronicità Massimo,Teodorani Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
141 TEST Earthing Camminare a Piedi Nudi Clinton,Ober Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
142 TEST Salute! Cibo permettendo Alessandra,Borelli Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
143 TEST Donne di Lemuria Monika Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
144 TEST Benattia Francesco,Oliviero Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
145 TEST Fai spazio alla felicità Giulia,Greco Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
146 TEST Saponi e Shampoo Solidi Naturali Liliana,Paoletti Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
147 TEST Il libro perduto del Dio Enki Zecharia Sitchin Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
148 TEST Un Corso in Miracoli Foundation for Inner Peace Macro Edizioni nuovo 49.22 55.01 57.9 15%
|
||||
149 TEST Il Metodo Bates - Manuale Pratico - 4D Loredana,De Michelis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
150 TEST Ho'Oponopono la Forza del Perdono Ulrich Emil,Duprèe Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
151 TEST Guida Completa alla Vita Sciamanica Sandra,Ingerman Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
152 TEST Evoluzione Spontanea Bruce H.,Lipton Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
153 TEST Scienza Perduta della Preghiera Gregg,Braden Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
154 TEST La Lettera della Maddalena Isabelle,Von Fallois Macro Edizioni nuovo 24.57 27.46 28.9 15%
|
||||
155 TEST David Bohm Massimo,Teodorani Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
156 TEST La Chiave Suprema Charles F.,Haanel Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
157 TEST La Fisica dei Miracoli Richard,Bartlett Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
158 TEST Riflessologia Plantare Claudio,Santoro Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
159 TEST Prana Prani Pranayama - Nuova Edizione Harijot,Kaur Khalsa Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
160 TEST La Medicina del Futuro Stefano,Fais Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
161 TEST Manuale Pratico di Digitopressione Gerard,Edde Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
162 TEST Lasciati Guidare dai Numeri Shiv Charan,Singh Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
163 TEST Il Segreto della guarigione quantica Frank,Kinslow Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
164 TEST Il Nuovo Grande Libro dell'Autosufficienza John Seymour Macro Edizioni nuovo 33.15 37.05 39 15%
|
||||
165 TEST Il Doppio Eterico Arthur E.,Powell Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
166 TEST Il Corpo Causale Arthur E.,Powell Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
167 TEST Il Corpo Astrale Arthur E.,Powell Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
168 TEST Conosci i tuoi Chakra David,Pond Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
169 TEST L'Insegnante di Yoga - 1° Volume Mark,Stephens Macro Edizioni nuovo 29.75 33.25 35 15%
|
||||
170 TEST La Salute nella Ciotola Alessandro,Prota Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
171 TEST Yoga della Mente e il Viaggio nel Tempo Fred Alan,Wolf Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
172 TEST Niacina: le meravigliose proprietà curative della Vitamina B3 Abram Hoffer Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
173 TEST La Vita Segreta degli Alberi Peter,Wohlleben Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
174 TEST Viaggio verso Casa Lee,Carroll Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
175 TEST Il Tuo Latte Vegetale Fatto in Casa Antxon,Monforte Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
176 TEST Il Tuo Grande Libro dei Cibi Fermentati Shannon,Stonger Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
177 TEST La Scelta Antitumore 4D Giuseppe,Di Bella Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
178 TEST Il Lato Nascosto delle Cose Charles Webster,Leadbeater Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
179 TEST Insegnamenti Spirituali ,Adyashanti Macro Edizioni nuovo 8.42 9.41 9.9 15%
|
||||
180 TEST Il Potere della Focalizzazione Jack,Canfield Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
181 TEST Akasha Umana - Kryon Monica,Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
182 TEST I 12 Strati del DNA Lee,Carroll Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
183 TEST Yoga - Correggere con il Tocco le Posizioni Mark,Stephens Macro Edizioni nuovo 29.75 33.25 35 15%
|
||||
184 TEST Yoga Le Sequenze - 2° volume Mark,Stephens Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
185 TEST La Vertigine di scoprirsi Dio Vittorio,Marchi Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
186 TEST Il tuo Jin Shin Jyutsu Tina,Stümpfig-Rüdisser Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
187 TEST The Miracle Morning Hal,Elrod Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
188 TEST Terapia antiacida per la Cura dei Tumori Stefano,Fais Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
189 TEST Tantra e meditazione Elmar e Michaela,Zadra Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
190 TEST Smetto di avere paura Emmanuel,Ballet de Coquereaumont Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
191 TEST Orologio degli Organi per Animali Li,Wu Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
192 TEST Nessun Incontro è un Caso Kay,Pollak Macro Edizioni nuovo 10.12 11.31 11.9 15%
|
||||
193 TEST Mia Verità sulla Memoria dell'Acqua Jacques,Benveniste Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
194 TEST Linguaggio Segreto della Danza del Ventre 4D Maria Strova Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
195 TEST L'Effetto Isaia Gregg,Braden Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
196 TEST Innamorati di Te Genitori e educatori Tiberio,Faraci Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
197 TEST Innamorati del presente Tiberio,Faraci Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
198 TEST Il Fruscio Delle Stelle del Mattino Vadim Zeland Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
199 TEST Fiori di Bach 38 rimedi per l'anima Nayaka Giacomo,Magi Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
200 TEST Fare l'Amore Barry,Long Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
201 TEST Far l'amore con la vita - libro 4D Ornella Lucilla,Marini Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
202 TEST Einstein non Credeva a Darwin Christian,Peluffo Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
203 TEST La Dieta Chetogenica con Ricette Senza Carne e Latte Will,Cole Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
204 TEST Diario di Adamo ed Eva Mark,Twain Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
205 TEST Depurare e Curare il Fegato con i Rimedi Naturali Roberto,Marrocchesi Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
206 TEST Il Corpo Sottile Cyndi,Dale Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
207 TEST Conosci la tua mente per uscire dall'addomesticamento Fiorella,Rustici Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
208 TEST Comprendi la tua Malattia con le Scoperte del Dottor Hamer Michel,Henrard Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
209 TEST Le carte danzanti Maria Strova Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
210 TEST Buono senza sale Cecilie e Christophe Berg Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
211 TEST Anima Gemella 4d Selene,Calloni Williams Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
212 TEST Amare è Lasciare Andare la Paura Gerald,Jampolsky Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
213 TEST Amante Tantrico Jacques,Ferber Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
214 TEST Agenda Donna di Luna Sajeeva,Hurtado Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
215 TEST 50 Modi per Vincere la Fame Nervosa Susan,Albers Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
216 TEST 100 anni di salute David,Wolfe Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
217 TEST Yoga con la sedia Willem,Wittstamm Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
218 TEST Metapolitica Daniel,Estulin Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
219 TEST Magia dei cristalli Enrica,Ercolani Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
220 TEST Luna Rossa, l'Oracolo degli Animali Sacri Miranda,Gray Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
221 TEST Dea respira Sajeeva,Hurtado Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
222 TEST Biotipi a 4 zampe Alessandro,Prota Macro Edizioni nuovo 26.27 29.36 30.9 15%
|
||||
223 TEST Yoga per le quattro Stagioni Chantal,Hermans Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
224 TEST Yoga per gli occhi Andrea,Christiansen Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
225 TEST Vegan Street Food Eduardo,Ferrante Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
226 TEST Sfere di Luce Massimo,Teodorani Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
227 TEST Il Sesto Senso Stuart,Wilde Macro Edizioni nuovo 21.17 17.43 24.9 15%
|
||||
228 TEST Risveglia lo Sciamano che è in te José Luis,Stevens Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
229 TEST Il Potere Terapeutico del Suono Lucia,Cavallari Macro Edizioni nuovo 17 19 20 15%
|
||||
230 TEST Il Potere di Guarigione della Paura Lissa,Rankin Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
231 TEST Il Manuale della Vita Naturale Alain,Saury Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
232 TEST Jin Shin Jyutsu Waltraud Riegger Krause Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
233 TEST Io Resto Bio 4D Patrizia,Poggiali Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
234 TEST Innamorati di Te Tiberio,Faraci Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
235 TEST Guida Pratica al Compost Nicky,Scott Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
236 TEST Gemmoterapia Stéphane,Boistard Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
237 TEST Enoch. Il Primo libro del mondo - Vol. 2 Mario Pincherle Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
238 TEST Enoch. Il Primo libro del mondo - Vol. 1 Mario Pincherle Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
239 TEST Dolci Buoni e Sani 4D Dealma,Franceschetti Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
240 TEST Dodici Guaritori Edward,Bach Macro Edizioni nuovo 8.42 9.41 9.9 15%
|
||||
241 TEST Diario della Prima Mestruazione Nicole,Schaufler Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
242 TEST Coerenza Cardiaca 365 David,O'Hare Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
243 TEST Biotransenergetica 4D Pier Luigi,Lattuada Macro Edizioni nuovo 27.12 30.31 31.9 15%
|
||||
244 TEST Lo Spazio delle Varianti - Reality Transurfing Vadim Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
245 TEST Spaghetti Vegetali dall'Antipasto al Dolce Francesca,Piu Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
246 TEST Smettila di Far Mangiare Schifezze a Tuo Figlio Deborah,Colson Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
247 TEST La Saggezza dell'Asino Mirzakarim,Norbekov Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
248 TEST Fatto in Casa Lucia,Cuffaro Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
249 TEST Curare la Candida con Terapie Naturali Vincenzo,Valesi Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
250 TEST Curare i Reumatismi con Metodi Naturali Paolo,Giordo Macro Edizioni nuovo 5.02 5.61 5.9 15%
|
||||
251 TEST Con-Vivere - L'Allevamento del Futuro Carla,De Benedictis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
252 TEST Batteri intestinali Anne Katherina,Zschocke Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
253 TEST Yoga per la Fertilità Kerstin,Leppert Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
254 TEST Lo Yoga oltre lo Yoga 4D Marco,Mandrino Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
255 TEST Yoga in azienda Vittorio Demetrio,Mascherpa Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
256 TEST Yoga delle Mani - Le Carte Cain,Carroll Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
257 TEST Wild power Alexandra,Pope Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
258 TEST La Via dello Psiconauta - Vol 1 Stanislav,Grof Macro Edizioni nuovo 33.15 37.05 39 15%
|
||||
259 TEST I Tarocchi dello Yoga Ratna Cristina,Bonanomi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
260 TEST Super Succhi - 100 Ricette Julie,Morris Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
261 TEST Stop ai Virus e al Covid-19 Patrick,Holford Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
262 TEST Spezie, Cacao e Tè Carlo,Martini Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
263 TEST La Scimmia Yoga - Il Diario della Pratica John,Kraijenbrink Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
264 TEST Rinascere dopo il lutto Amanda,Castello Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
265 TEST Paura Thich Nhat Hanh Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
266 TEST Ottimisti ! Franck,Martin Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
267 TEST Oracolo Madre Carlotta,Giunchedi Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
268 TEST Oracolo degli Angeli Guaritori - 50 CARTE+LIBRO Carolin,Stern Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
269 TEST Occhio all'Etichetta Elena,Tioli Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
270 TEST I Nostri Amici Batteri Anne Katherina,Zschocke Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
271 TEST Metodo Bates per una Vista Perfetta Senza Occhiali Loredana,De Michelis Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
272 TEST Il Metodo antiacido per la prevenzione e cura delle malattie Rocco,Palmisano Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
273 TEST Metodo Acido Base Hervé,Grosgogeat Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
274 TEST Menu della Salute Giusi,De Francesco Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
275 TEST La Mente Quantica - 4D Vincenzo,Fanelli Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
276 TEST Meditazioni sciamaniche 4D Pier Luigi,Lattuada Macro Edizioni nuovo 21.68 24.23 25.5 15%
|
||||
277 TEST Matrix Energetics Richard,Bartlett Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
278 TEST Manuale delle Serre Polytunnel Andy,McKee Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
279 TEST Kintsugi Gioacchino,Allasia Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
280 TEST Insegno Yoga Donna,Farhi Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
281 TEST Il Potere della Programmazione Quantica Vincenzo,Fanelli Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
282 TEST Il Codice della Vita ,AA.VV. Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
283 TEST Guida alla Cospirazione Globale David,Icke Macro Edizioni nuovo 39.02 43.61 45.9 15%
|
||||
284 TEST Il Grande libro dell'Argento Colloidale Josef,Pies Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
285 TEST Giocando con gli Angeli Hania,Czajkowski Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
286 TEST Felicità fa i Soldi Davide Francesco,Sada Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
287 TEST Evolution Cards astrid,Gortan Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
288 TEST Le Eccezionali Proprietà Curative della Noce di Cocco Bruce,Fife Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
289 TEST Dog Fitness Carmen,Mayer Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
290 TEST Dionidream Tutta l'Energia della Natura Riccardo,Lautizi Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
291 TEST Diabete - 4D Domenico,Battaglia Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
292 TEST Curare l'Infertilità con Metodi Naturali Amelia,Sagliano Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
293 TEST Cura il tuo diabete 4D Gabriel,Cousens Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
294 TEST Un Corso in Miracoli Parla di Sé Patrizia,Terreno Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
295 TEST Corpo di Luce Reindjen,Anselmi Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
296 TEST China Study 4D - Edizione Aggiornata e Ampliata T. Colin Campbell Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
297 TEST Le Chiavi del Sapere Pier Francesco,Grasselli Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
298 TEST Aumakua Jeanne,Ruland Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
299 TEST Atlante dei Chakra Kalashatra,Govinda Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
300 TEST Ascoltando la pelle Antonio,Dal Sorbo Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
301 TEST L'Amara verità sullo zucchero André,Marette Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
302 TEST Addio Sensi di Colpa Gerald,Jampolsky Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
303 TEST Abbondanza Miracolosa Charles,Hervé-Gruyer Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
304 TEST Zen e l'Arte di Imbrogliare la Mente Alan,Watts Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
305 TEST Yoga per Tutti Meta,Chaya Hirschl Macro Edizioni nuovo 17.85 16.8 21 15%
|
||||
306 TEST Yoga per Te Tara,Fraser Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
307 TEST Yoga per Donne Shakta Kaur,Khalsa Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
308 TEST Yoga per chi Viaggia Jennifer,J. Ellinghaus Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
309 TEST Yoga e Chakra Anodea,Judith Macro Edizioni nuovo 31.37 35.06 36.9 15%
|
||||
310 TEST Yoga delle Mani Andrea,Christiansen Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
311 TEST Whole - Vegetale e Integrale T. Colin Campbell Macro Edizioni nuovo 15.73 17.58 18.5 15%
|
||||
312 TEST Vivo Senza Auto Linda,Maggiori Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
313 TEST Vitamine nell'Aria Earl,Mindell Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
314 TEST Verità sul Cancro Ty,Bollinger Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
315 TEST La Verità Nascosta Gregg,Braden Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
316 TEST Transurfing Vivo _ Oltre i Confini della Matrix Vadim Zeland Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
317 TEST Tinte Naturali per i Capelli Gwendoline,Clergeaud Macro Edizioni nuovo 14.88 16.63 17.5 15%
|
||||
318 TEST Tesla- Lampo di Genio Massimo,Teodorani Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
319 TEST Tè e Tisane Curative Jürgen,Klitzner Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
320 TEST Tachipirina Paracetamolo Sì o No? Antonietta,Gatti Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
321 TEST Storia Proibita J. Douglas,Kenyon Macro Edizioni nuovo 24.23 27.08 28.5 15%
|
||||
322 TEST Sequenze Numeriche per Rigenerare e Guarire il tuo Corpo Vol.1 Grigorij Grabovoj Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
323 TEST I Sentieri del Potere Sciamanico José Luis,Stevens Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
324 TEST Il Segreto delle Ere N.E. Piero,Magaletti Ragone Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
325 TEST Sedendo Quietamente Pietro,Thea Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
326 TEST La Scienza del Cuore Carmen,Di Muro Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
327 TEST Scegli la felicità con Ho'oponopono ,AA.VV. Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
328 TEST Scardinare il Sistema Tecnogeno Vadim Zeland Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
329 TEST Sangue degli Illuminati Diego,Marin Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
330 TEST Sane abitudini per invecchiare bene Maurizio,Di Massimo Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
331 TEST Salute di Cani e Gatti con l'Aloe Vera Roberto,Setti Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
332 TEST Il Risveglio Spirituale nella Vita Quotidiana Jeff,Foster Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
333 TEST Il Risveglio del Leone David,Icke Macro Edizioni nuovo 33.58 37.53 39.5 15%
|
||||
334 TEST Rinasci e Risveglia il tuo Potere Interiore Derek,Rydall Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
335 TEST Ricomincia da Te Tiberio,Faraci Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
336 TEST Ricette per Vivere Sani fino a 100 Anni Catalina,Muraru Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
337 TEST Resilienza con il Cuore Gregg,Braden Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
338 TEST Reinventare il Corpo, Risvegliare l'Anima Deepak,Chopra Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
339 TEST Le Regole dello Specchio Transurfing Vadim Zeland Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
340 TEST Rebirthing Evolutivo Cristiano,Baraghini Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
341 TEST Reality Transurfing La Trilogia Vadim Zeland Macro Edizioni nuovo 35.7 39.9 42 15%
|
||||
342 TEST Quando la Giraffa Balla col Lupo Serena,Rust Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
343 TEST Punto G Elmar e Michaela,Zadra Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
344 TEST Proprietà e benefici della Vitamina A Simone,Grazioli Schagerl Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
345 TEST Il Proiettore - Reality Transurfing Vadim Zeland Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
346 TEST Primo Soccorso Omeopatico per Cani e Gatti Daniela,Montesion Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
347 TEST Prenditi Cura della Vista del tuo Bambino Vania,Galbucci Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
348 TEST Più Ricette Sane, Meno Ricette Mediche Federica,Gif Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
349 TEST I più bei Mandala per Tutte le Stagioni ,AA.VV. Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
350 TEST Piccolo Manuale dello Shinrin Yoku Bettina,Lemke Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
351 TEST Piatto Sano Quotidiano Federica,Gif Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
352 TEST Piacere della tavola nella cucina antica e oggi Pietro,Leemann Macro Edizioni nuovo 21.25 23.75 25 15%
|
||||
353 TEST Pet Therapy N.E. Alberto,Dal Negro Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
354 TEST La Permacultura secondo Sepp Holzer Sepp,Holzer Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
355 TEST L'Orologio della Natura Peter,Wohlleben Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
356 TEST Nutrizione Ayurvedica Swami,Joythimayananda Macro Edizioni nuovo 22.87 25.56 26.9 15%
|
||||
357 TEST La Nuova Umanità - Kryon Lee,Carroll Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
358 TEST Neuroschiavi - 5° Ed. Aggiornata Marco,Della Luna Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
359 TEST Nel Cuore dello Sciamano Alberto,Villoldo Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
360 TEST Muovi il tuo DNA Katy,Bowman Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
361 TEST Il Monaco Urbano Pedram,Shojai Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
362 TEST Miracle Morning per le Famiglie Hal,Elrod Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
363 TEST Il mio Sangue Cura Zulma,Moreyra Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
364 TEST Il Mio Erbario Maurice,Mességué Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
365 TEST Il Minimalista - Meno Cose = Più Felicità Francine,Jay Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
366 TEST La mia Cosmesi Fai da Te Gabriela,Nedoma Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
367 TEST Mente Supera la Medicina Lissa,Rankin Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
368 TEST Meditazione per Scettici Ulrich,Ott Macro Edizioni nuovo 6.72 7.51 7.9 15%
|
||||
369 TEST La Matrix Divina Gregg,Braden Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
370 TEST Manuale Pratico del Corpo Sottile Cyndi,Dale Macro Edizioni nuovo 24.23 27.08 28.5 15%
|
||||
371 TEST Manuale di Autotrattamento craniosacrale Gioacchino,Allasia Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
372 TEST Il Manuale dell'Argilla Giuseppe Ferraro Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
373 TEST Mangio Crudo e Vivo Meglio Brenda,Davis Macro Edizioni nuovo 19.13 21.38 22.5 15%
|
||||
374 TEST Mangiar Sano e Naturale con Alimenti Vegetali Integrali Michele,Riefoli Macro Edizioni nuovo 22.1 24.7 26 15%
|
||||
375 TEST Magico Potere del Cibo Peter and Beryn,Daniel Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
376 TEST Luna Rossa Miranda,Gray Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
377 TEST Luna Rossa in Ufficio Miranda,Gray Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
378 TEST Luminous Life Jacob,Liberman Macro Edizioni nuovo 19.13 21.38 22.5 15%
|
||||
379 TEST Il Libro Nero dei Veterinari Jutta,Ziegler Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
380 TEST Il Libro della Medicina Orientale Clive,Witham Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
381 TEST Lettere da Casa Lee,Carroll Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
382 TEST L'Imbroglio della Realtà David,Icke Macro Edizioni nuovo 37.83 42.28 44.5 15%
|
||||
383 TEST Kundalini Yoga Satya,Singh Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
384 TEST Kundalini Energia Divina Cyndi,Dale Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
385 TEST Karma e Reincarnazione Elizabeth Clare,Prophet Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
386 TEST Io Non Mi Ammalo! Joseph,Mercola Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
387 TEST I Poteri Curativi della Vitamina D Soram,Khalsa Macro Edizioni nuovo 10.63 11.88 12.5 15%
|
||||
388 TEST Ho'Oponopono tutte le Strade portano all'Amore ,Josaya Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
389 TEST Guida Alla Sopravvivenza Guido,Dalla Casa Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
390 TEST Guarire con la Vitamina C Stefano,Pravato Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
391 TEST Guarire con il Cibo Giusi,De Francesco Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
392 TEST La Guarigione Spontanea delle Credenze Gregg,Braden Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
393 TEST La Grande Piramide e lo Zed Mario Pincherle Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
394 TEST Il Grande Manuale dell’Ayurveda Kiran,Vyas Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
395 TEST Il Grande Libro della Yoga Terapia Remo,Rittiner Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
396 TEST Il Grande Libro dei Cinque Tibetani Jean-Louis,Abrassart Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
397 TEST La Grande Equazione Vittorio,Marchi Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
398 TEST Fenomeno Vitale tra Scienza e Coscienza Aldo,Cehic Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
399 TEST Il Fattore Enzima Hiromi,Shinya Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
400 TEST L'Enigma Quantico Bruce,Rosenblum Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
401 TEST Effetto Gaia - Kryon Monica,Muranyi Macro Edizioni nuovo 15.73 17.58 18.5 15%
|
||||
402 TEST Effetto Biofilia Clemens G.,Arvay Macro Edizioni nuovo 13.18 14.73 15.5 15%
|
||||
403 TEST Echinacea Corinna,Hembd Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
404 TEST Disintossicati e recupera la Salute in 11 giorni Bernard,Jensen Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
405 TEST Dieta Vegan per lo Sport Eduardo,Ferrante Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
406 TEST La Dieta Barf per Cuccioli di Cane Swanie,Simon Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
407 TEST la Dieta Barf per Cani Anziani o Malati Swanie,Simon Macro Edizioni nuovo 10.63 11.88 12.5 15%
|
||||
408 TEST La Dieta Barf per Cani Swanie,Simon Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
409 TEST Cura Naturale delle Malattie Cardiache Dean,Ornish Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
410 TEST La Cura del Limone Werner,Meidinger Macro Edizioni nuovo 7.99 8.93 9.4 15%
|
||||
411 TEST Cucinare a Colori Jessica,Callegaro Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
412 TEST Cucina Crudista Alcalina Elena,Dal Forno Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
413 TEST Cosmetici Naturali per Viso, Corpo e Capelli Anna,Simone Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
414 TEST Corso di Esistenza Fosco,Del Nero Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
415 TEST Consigli per Vivere Sani Fino a 100 Anni Roberto Antonio,Bianchi Macro Edizioni nuovo 6.72 7.51 7.9 15%
|
||||
416 TEST Un Coniglio per Amico Cinzia,Ciarmatori Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
417 TEST La Comunicazione Intuitiva con gli Animali Andrea,Contri Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
418 TEST Come Trasformare il Deserto in Paradiso Sepp,Holzer Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
419 TEST Come Sono Guarito dalla Miopia David,De Angelis Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
420 TEST Coltivare Bio con Successo Jean-Martin,Fortier Macro Edizioni nuovo 15.3 17.1 18 15%
|
||||
421 TEST Il Codice dell'Amore Alexander,Loyd Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
422 TEST Circondati da Psicopatici Bärbel,Mechler Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
423 TEST Il Cioccolato che fa Bene ,Shazzie Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
424 TEST Il Cibo Sia la Mia Medicina Alessandra,Borelli Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
425 TEST Cibo per la Tiroide Simone,Grazioli Schagerl Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
426 TEST Cibo per la mente Jo Anne,Miller Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
427 TEST Le Chiavi Genetiche Richard Rudd Macro Edizioni nuovo 35.7 39.9 42 15%
|
||||
428 TEST Che Bleep ne sai? B.,Chasse Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
429 TEST Il Cervello Quantico Jeffrey,Satinover Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
430 TEST Le Case in Paglia Athena,Swentzell Steen Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
431 TEST Cambio Pelle in 7 Passi Lucia,Cuffaro Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
432 TEST Buona Cacca a Tutti ! Adrian,Schulte Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
433 TEST Blue Mind - Mente e Acqua Wallace J.,Nichols Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
434 TEST Bellezza Sciamanica Lumira Macro Edizioni nuovo 14.88 16.63 17.5 15%
|
||||
435 TEST Basta Poco Sukey ed Elizabeth Novogratz Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
436 TEST I Bambini Indaco Jan,Tober Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
437 TEST Ayurvegan Barbara,Bianchi Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
438 TEST Ayurveda - Vita, Salute e Longevità Robert,Svoboda Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
439 TEST Avanti nel Passato Vadim Zeland Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
440 TEST Attacco all'Asma ... e non Solo Fiamma,Ferraro Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
441 TEST Ashtanga Yoga Gian Renato,Marchisio Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
442 TEST Asana Swami,Kuvalayananda Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
443 TEST Archetipi Mario Pincherle Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
444 TEST Apicoltura - Il Manuale Pratico Illustrato Henri,Clément Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
445 TEST Apandemia Stefano,Scoglio Macro Edizioni nuovo 23.8 26.6 28 15%
|
||||
446 TEST Animali Specchio dell'Anima Irmgard,Baumgartner Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
447 TEST Anemia Domenico,Battaglia Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
448 TEST Aloe Vera Alice,Beringer Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
449 TEST Allergie nei Cani e nei Gatti Maria,Cuteri Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
450 TEST Alla Scoperta della Particella di Dio Massimo,Corbucci Macro Edizioni nuovo 9.18 10.26 10.8 15%
|
||||
451 TEST Aiuto, ho le mie Cose! Barbara,Monti Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
452 TEST Addestrare Senza Parole Liane,Rauch Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
453 TEST Acque Aromatizzate Francesca,Piu Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
454 TEST 7 Passi del Perdono Daniel,Lumera Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
455 TEST 20 Domande per Capire la Fisica Antonella,Ravizza Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
456 TEST Prevenire e Guarire con lo Yoga Christine,Campagnac Morette Macro Edizioni nuovo 33.58 37.53 39.5 15%
|
||||
|
||||
|
||||
|
||||
Autore Editore Variazione Prezzo Scontato Prezzo Precedente Prezzo Intero Sconto (%)
|
||||
0 TEST Il Sesto Senso Stuart,Wilde Macro Edizioni nuovo 23.66 17.43 24.9 5%
|
||||
1 TEST Yoga per Tutti Meta,Chaya Hirschl Macro Edizioni nuovo 19.95 16.8 21 5%
|
||||
|
||||
|
||||
Titolo Autore Editore Variazione Prezzo Scontato Prezzo Precedente Prezzo Intero Sconto (%)
|
||||
0 ESEGUITO Meraviglia del Silenzio - QUADERNO ascolta Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
1 ESEGUITO Meraviglia del Silenzio - QUADERNO assapora Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
2 ESEGUITO Meraviglia del Silenzio - QUADERNO accarezza Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
3 ESEGUITO Meraviglia del Silenzio - QUADERNO respira Claudia,Masioli Macro Edizioni nuovo 2.47 2.76 2.9 15%
|
||||
4 ESEGUITO Nel buio... la luce Luigi Marcello Monsellato Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
5 ESEGUITO Avanti nel Passato Vadim,Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
6 ESEGUITO Cambia la tua vita con la fisica quantistica Chiara,Zagonel Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
7 ESEGUITO Succhi Freschi di Frutta e Verdura Norman,Walker Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
8 ESEGUITO Il Potere dell'Ashtanga Yoga Kino,MacGregor Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
9 ESEGUITO Il Grande Libro della Yoga Terapia Remo,Rittiner Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
10 ESEGUITO Prevenzione antinfettiva e oncologica secondo la medicina basata sull’evidenza Giuseppe,Di Bella Macro Edizioni nuovo 25.5 28.5 30 15%
|
||||
11 ESEGUITO Ricomincio da me Giovanna Garbuio Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
12 ESEGUITO Ho'oponopono e EFT Bruno,Zanaboni Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
13 ESEGUITO La Saggezza dei colori: il grande manuale Samya Ilaria Di Donato Macro Edizioni nuovo 17 19 20 15%
|
||||
14 ESEGUITO Gli Algoritmi di Elia Tropeano Daniela Cristina Napoletano Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
15 ESEGUITO Nel buio...la luce Luigi Marcello Monsellato Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
16 ESEGUITO I Virus: figli di un dio minore Luigi Marcello Monsellato Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
17 ESEGUITO Oltre la fisica di Einstein - Istituto di Fisica Biettiva Amrit Srecko,Sorli Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
18 ESEGUITO Aura Goran,Tasic Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
19 ESEGUITO Programma la tua realtà quantica Riccardo Tristano Tuis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
20 ESEGUITO NATO per Uccidere Filippo Rossi Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
21 ESEGUITO Gesuiti Riccardo Tristano Tuis Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
22 ESEGUITO Curare le malattie del cervello con metodi naturali Paolo,Giordo Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
23 ESEGUITO Scacco a Big Pharma Marcello Pamio Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
24 ESEGUITO Numerologia Intuitiva Alessandro,Valli Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
25 ESEGUITO L'inganno della Croce Laura Fezia Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
26 ESEGUITO I Geni manipolati di Adamo Pietro Buffa Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
27 ESEGUITO Il piccolo libro del lasciar andare Samya Ilaria Di Donato Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
28 ESEGUITO Bambino interiore - Guarire con i colori Samya Ilaria Di Donato Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
29 ESEGUITO Incensi: un viaggio tra le antiche tradizioni Susanne,Berk Macro Edizioni nuovo 9.27 10.36 10.9 15%
|
||||
30 ESEGUITO Il Caso Majorana Pelizza Rino,Di Stefano Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
31 ESEGUITO Mamma, perché abbiamo le mestruazioni? Laura Capossele Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
32 ESEGUITO L’Equilibratore dentale Samuele Cova Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
33 ESEGUITO L'Antico Codice dei Colori Samya Ilaria Di Donato Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
34 ESEGUITO Tutto è Possibile Erika,Scotton Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
35 ESEGUITO Scienza sacra del divino Dr.,Rebis Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
36 ESEGUITO La Mente Magica Vincenzo,Fanelli Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
37 ESEGUITO Il Codice della Guarigione | The Healing Code Alexander,Loyd Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
38 ESEGUITO La Dea delle origini Stefania Tosi Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
39 ESEGUITO IPSOS-93 L'esoterismo di una nuova era Carlo,Dorofatti Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
40 ESEGUITO Manuale Clinico di Agopuntura Veterinaria Francesco Longo Macro Edizioni nuovo 102 114 120 15%
|
||||
41 ESEGUITO Programmazione Neurosonica Riccardo Tristano Tuis Macro Edizioni nuovo 32.73 36.58 38.5 15%
|
||||
42 ESEGUITO La dieta comica Mirna,Visentini Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
43 ESEGUITO Potenzia il Tuo Cervello Quantico Sergio Audasso Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
44 ESEGUITO La Malattia di Lyme: La pandemia sconosciuta Roberta Raffelli Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
45 ESEGUITO Transurfing in 78 giorni NE Vadim Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
46 ESEGUITO Fervìda - Fermenti di vita Stefano Abbruzzese Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
47 ESEGUITO 400 Anni d'Inganni Anatolij T.,Fomenko Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
48 ESEGUITO I Pericoli del Fluoro Giorgio,Petrucci Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
49 ESEGUITO Gua Sha viso Clive,Witham Macro Edizioni nuovo 13.6 15.2 16 15%
|
||||
50 ESEGUITO Zenix Riccardo Tristano Tuis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
51 ESEGUITO Comunicazione in Cerchio Antonio Graziano Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
52 ESEGUITO 432 Hertz: la Rivoluzione Musicale Riccardo Tristano Tuis Macro Edizioni nuovo 17 19 20 15%
|
||||
53 ESEGUITO Evolvi il tuo cervello Joe,Dispenza Macro Edizioni nuovo 24.57 27.46 28.9 15%
|
||||
54 ESEGUITO Vago - Il Mio Nervo più Importante Stanley,Rosenberg Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
55 ESEGUITO Amen la Nuova Umanità Elena Sanda,Chira Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
56 ESEGUITO Effetto Luna di Miele Bruce H.,Lipton Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
57 ESEGUITO Il Potere Creativo dell'Immaginazione Neville,Goddard Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
58 ESEGUITO PSOAS - Il Mio Muscolo più Importante Jo Ann,Staugaard-Jones Macro Edizioni nuovo 18.28 20.43 21.5 15%
|
||||
59 ESEGUITO La Fine del Diabete Joel,Fuhrman Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
60 ESEGUITO The miracle morning Hal,Elrod Macro Edizioni nuovo 17 19 20 15%
|
||||
61 ESEGUITO L'invenzione del Padre - In Nome del Padre e della Madre Vol.1 Antonio,Bertoli Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
62 ESEGUITO Arricchisci te stesso! Napoleon,Hill Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
63 ESEGUITO The Miracle Joe,Vitale Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
64 ESEGUITO Biologia delle Credenze - 4D Bruce H.,Lipton Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
65 ESEGUITO Il Grande Libro di Rudolf Steiner Alex,Burkart Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
66 ESEGUITO Guarire il Fegato e la Cistifellea con il Lavaggio Epatico Andreas,Moritz Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
67 ESEGUITO Nora Weeks racconta Edward Bach Nora,Weeks Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
68 ESEGUITO Quaderni Animali Guida - LUPO Cristina,Cicognani Macro Edizioni nuovo 4.17 4.66 4.9 15%
|
||||
69 ESEGUITO Rigenera il tuo ciclo mestruale Lara,Briden Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
70 ESEGUITO Artemisia Annua Barbara,Simonsohn Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
71 ESEGUITO Matthew, Parlami del Paradiso Suzanne,Ward Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
72 ESEGUITO 50 Racconti per Meditare e da Regalare Ramiro A. Calle Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
73 ESEGUITO La Luce Divina non Viene mai Meno Michael,George Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
74 ESEGUITO The Miracle Morning: il tuo diario quotidiano Hal,Elrod Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
75 ESEGUITO La Via del Grande Dao Chen,Kaiguo Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
76 ESEGUITO Anima Umana - Kryon Monica,Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
77 ESEGUITO Preghiera segreta Joe,Vitale Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
78 ESEGUITO Le CARTE dello Spirito degli Alberi Lucilla,Satanassi Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
79 ESEGUITO Le Carte dei Fiori di Bach Lucilla,Satanassi Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
80 ESEGUITO Il tuo corpo in equilibrio Maria Noel,Groves Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
81 ESEGUITO Sei Come Pensi di Essere James Allen Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
82 ESEGUITO Salva Te Stesso. La Creazione dell'Universo Arcadij,Petrov Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
83 ESEGUITO Pranayama Swami,Kuvalayananda Macro Edizioni nuovo 17 19 20 15%
|
||||
84 ESEGUITO Potere di Realizzazione della Preghiera e della Meditazione Ernest,Holmes Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
85 ESEGUITO Kundalini Yoga e la Meditazione Guru,Rattana Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
86 ESEGUITO Il Quinto Vangelo - Il Vangelo di Tommaso Mario Pincherle Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
87 ESEGUITO Ho'oponopono - La pace comincia da te Saya, Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
88 ESEGUITO Food Forest Gardening Tomas,Remiarz Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
89 ESEGUITO Il Segreto della Vita Quantica Frank,Kinslow Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
90 ESEGUITO Anelli temporali e torsioni spaziali Fred Alan,Wolf Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
91 ESEGUITO Buono e bene a volte avviene Alberto,Laffranchi MGE- Nuova Ipsa nuovo 17 19 20 15%
|
||||
92 ESEGUITO Le Quattro Rivelazioni Sciamaniche Alberto,Villoldo Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
93 ESEGUITO Il Magico Potere di Sbattersene il Ca**o Sarah Knight Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
94 ESEGUITO Guarire con i Numeri Petra,Neumayer Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
95 ESEGUITO Il potere e la magia della gratitudine Ivan Nossa Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
96 ESEGUITO Bambini adolescenti e Fiori di Bach Claudia Castellani MGE- Nuova Ipsa nuovo 14.37 16.06 16.9 15%
|
||||
97 ESEGUITO Il Potere di Guarigione degli Angeli Isabelle,Von Fallois Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
98 ESEGUITO Cervello Intestino: un Legame Indissolubile Stefano,Manera Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
99 ESEGUITO Gli Arcangeli Isabelle,Von Fallois Macro Edizioni nuovo 17 19 20 15%
|
||||
100 ESEGUITO Traumi e Shock Emotivi Peter A., Levine Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
101 ESEGUITO La Rivoluzione del Cervello Shigeo,Haruyama Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
102 ESEGUITO Vincere la sclerosi multipla Emilie,Venesson Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
103 ESEGUITO Il tuo corpo implora acqua Fereydoon,Batmanghelidj Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
104 ESEGUITO Il grande libro degli oli essenziali e dell’aromaterapia Valerie Ann,Worwood Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
105 ESEGUITO Concepimento Consapevole Frederick,Baker Macro Edizioni nuovo 17 19 20 15%
|
||||
106 ESEGUITO Il Potere dei Condizionamenti David R.,Hawkins Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
107 ESEGUITO Entanglement Massimo,Teodorani Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
108 ESEGUITO Ayurveda scientifico vol 1 Gianantonio,Grosso MGE- Nuova Ipsa nuovo 68 76 80 15%
|
||||
109 ESEGUITO Enneagramma - I Nove Abitanti della Terra Luca,Giorgetti Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
110 ESEGUITO Manuale di cosmesi naturale Lucia,Cuffaro Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
111 ESEGUITO Fondamenti di agro-omeopatia Radko,Tichavsky Macro Edizioni nuovo 34 38 40 15%
|
||||
112 ESEGUITO L' Orologio degli Organi Li,Wu Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
113 ESEGUITO L'Atomo e le Particelle Elementari Massimo,Teodorani Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
114 ESEGUITO L'Apprendista Macrobiotico 4D Dealma,Franceschetti Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
115 ESEGUITO Atlante Generale dei Muscoli Chris,Jarmey Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
116 ESEGUITO I Funghi per la salute Stefania Cazzavillan MGE- Nuova Ipsa nuovo 38.17 42.66 44.9 15%
|
||||
117 ESEGUITO Cofanetto Carte Yoga Le Sequenze Mark,Stephens Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
118 ESEGUITO Risparmia 700 Euro in 7 Giorni Lucia,Cuffaro Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
119 ESEGUITO Luna rossa madre e figlia Miranda,Gray Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
120 ESEGUITO Grande Libro del Respiro Donna,Farhi Macro Edizioni nuovo 31.2 34.87 36.7 15%
|
||||
121 ESEGUITO Astrologia Archetipica Simone,Bongiovanni Macro Edizioni nuovo 36.47 40.76 42.9 15%
|
||||
122 ESEGUITO Mantra Yoga Giorgio Lombardi Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
123 ESEGUITO Guarigione Sciamanica Giosuè,Stavros Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
124 ESEGUITO Miracoli Stuart,Wilde Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
125 ESEGUITO La Guida Completa allo Yin Yoga Bernie,Clark Macro Edizioni nuovo 28.82 32.21 33.9 15%
|
||||
126 ESEGUITO Introduzione a Un Corso in Miracoli Kenneth,Wapnick Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
127 ESEGUITO La Forza Stuart,Wilde Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
128 ESEGUITO Che Cosa mi Vuoi Dire? Stefano,Cattinelli Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
129 ESEGUITO I Segreti degli Sciamani Hank,Wesselman Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
130 ESEGUITO Il cane sempre giovane Karen,Shaw Becker Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
131 ESEGUITO Sei Nato Ricco Bob Proctor Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
132 ESEGUITO Manuale per Salvare i Semi dell'Orto e la Biodiversità Jude,Fanton Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
133 ESEGUITO Sciamanesimo Huna Giosuè,Stavros Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
134 ESEGUITO Traumi e Malattie. Guida alla Risoluzione dei Conflitti a Partire dal Metodo Hamer Alessandro,Spreafichi Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
135 ESEGUITO Risveglio e la rivelazione dell'intelligenza organica Giuliana,Conforto Macro Edizioni nuovo 32.3 36.1 38 15%
|
||||
136 ESEGUITO I Sali minerali del dott. Schüssler Friedrick,Kopsche MGE- Nuova Ipsa nuovo 26.78 29.93 31.5 15%
|
||||
137 ESEGUITO Neuro-quantistica Ermanno Paolelli MGE- Nuova Ipsa nuovo 15.81 17.67 18.6 15%
|
||||
138 ESEGUITO Manuale della terapia dei Trigger Point Amber,Davies Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
139 ESEGUITO Yoga della felicità John,Kraijenbrink Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
140 ESEGUITO Sincronicità Massimo,Teodorani Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
141 ESEGUITO Earthing Camminare a Piedi Nudi Clinton,Ober Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
142 ESEGUITO Salute! Cibo permettendo Alessandra,Borelli Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
143 ESEGUITO Donne di Lemuria Monika Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
144 ESEGUITO Benattia Francesco,Oliviero Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
145 ESEGUITO Fai spazio alla felicità Giulia,Greco Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
146 ESEGUITO Saponi e Shampoo Solidi Naturali Liliana,Paoletti Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
147 ESEGUITO Il libro perduto del Dio Enki Zecharia Sitchin Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
148 ESEGUITO Un Corso in Miracoli Foundation for Inner Peace Macro Edizioni nuovo 49.22 55.01 57.9 15%
|
||||
149 ESEGUITO Il Metodo Bates - Manuale Pratico - 4D Loredana,De Michelis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
150 ESEGUITO Ho'Oponopono la Forza del Perdono Ulrich Emil,Duprèe Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
151 ESEGUITO Guida Completa alla Vita Sciamanica Sandra,Ingerman Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
152 ESEGUITO Evoluzione Spontanea Bruce H.,Lipton Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
153 ESEGUITO Scienza Perduta della Preghiera Gregg,Braden Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
154 ESEGUITO La Lettera della Maddalena Isabelle,Von Fallois Macro Edizioni nuovo 24.57 27.46 28.9 15%
|
||||
155 ESEGUITO David Bohm Massimo,Teodorani Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
156 ESEGUITO La Chiave Suprema Charles F.,Haanel Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
157 ESEGUITO La Fisica dei Miracoli Richard,Bartlett Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
158 ESEGUITO Riflessologia Plantare Claudio,Santoro Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
159 ESEGUITO Prana Prani Pranayama - Nuova Edizione Harijot,Kaur Khalsa Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
160 ESEGUITO La Medicina del Futuro Stefano,Fais Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
161 ESEGUITO Manuale Pratico di Digitopressione Gerard,Edde Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
162 ESEGUITO Lasciati Guidare dai Numeri Shiv Charan,Singh Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
163 ESEGUITO Il Segreto della guarigione quantica Frank,Kinslow Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
164 ESEGUITO Il Nuovo Grande Libro dell'Autosufficienza John Seymour Macro Edizioni nuovo 33.15 37.05 39 15%
|
||||
165 ESEGUITO Il Doppio Eterico Arthur E.,Powell Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
166 ESEGUITO Il Corpo Causale Arthur E.,Powell Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
167 ESEGUITO Il Corpo Astrale Arthur E.,Powell Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
168 ESEGUITO Conosci i tuoi Chakra David,Pond Macro Edizioni nuovo 11.82 13.21 13.9 15%
|
||||
169 ESEGUITO L'Insegnante di Yoga - 1° Volume Mark,Stephens Macro Edizioni nuovo 29.75 33.25 35 15%
|
||||
170 ESEGUITO La Salute nella Ciotola Alessandro,Prota Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
171 ESEGUITO Yoga della Mente e il Viaggio nel Tempo Fred Alan,Wolf Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
172 ESEGUITO Niacina: le meravigliose proprietà curative della Vitamina B3 Abram Hoffer Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
173 ESEGUITO La Vita Segreta degli Alberi Peter,Wohlleben Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
174 ESEGUITO Viaggio verso Casa Lee,Carroll Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
175 ESEGUITO Il Tuo Latte Vegetale Fatto in Casa Antxon,Monforte Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
176 ESEGUITO Il Tuo Grande Libro dei Cibi Fermentati Shannon,Stonger Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
177 ESEGUITO La Scelta Antitumore 4D Giuseppe,Di Bella Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
178 ESEGUITO Il Lato Nascosto delle Cose Charles Webster,Leadbeater Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
179 ESEGUITO Insegnamenti Spirituali ,Adyashanti Macro Edizioni nuovo 8.42 9.41 9.9 15%
|
||||
180 ESEGUITO Il Potere della Focalizzazione Jack,Canfield Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
181 ESEGUITO Akasha Umana - Kryon Monica,Muranyi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
182 ESEGUITO I 12 Strati del DNA Lee,Carroll Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
183 ESEGUITO Yoga - Correggere con il Tocco le Posizioni Mark,Stephens Macro Edizioni nuovo 29.75 33.25 35 15%
|
||||
184 ESEGUITO Yoga Le Sequenze - 2° volume Mark,Stephens Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
185 ESEGUITO La Vertigine di scoprirsi Dio Vittorio,Marchi Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
186 ESEGUITO Il tuo Jin Shin Jyutsu Tina,Stümpfig-Rüdisser Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
187 ESEGUITO The Miracle Morning Hal,Elrod Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
188 ESEGUITO Terapia antiacida per la Cura dei Tumori Stefano,Fais Macro Edizioni nuovo 22.02 24.61 25.9 15%
|
||||
189 ESEGUITO Tantra e meditazione Elmar e Michaela,Zadra Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
190 ESEGUITO Smetto di avere paura Emmanuel,Ballet de Coquereaumont Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
191 ESEGUITO Orologio degli Organi per Animali Li,Wu Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
192 ESEGUITO Nessun Incontro è un Caso Kay,Pollak Macro Edizioni nuovo 10.12 11.31 11.9 15%
|
||||
193 ESEGUITO Mia Verità sulla Memoria dell'Acqua Jacques,Benveniste Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
194 ESEGUITO Linguaggio Segreto della Danza del Ventre 4D Maria Strova Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
195 ESEGUITO L'Effetto Isaia Gregg,Braden Macro Edizioni nuovo 20.32 22.71 23.9 15%
|
||||
196 ESEGUITO Innamorati di Te Genitori e educatori Tiberio,Faraci Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
197 ESEGUITO Innamorati del presente Tiberio,Faraci Macro Edizioni nuovo 13.52 15.11 15.9 15%
|
||||
198 ESEGUITO Il Fruscio Delle Stelle del Mattino Vadim Zeland Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
199 ESEGUITO Fiori di Bach 38 rimedi per l'anima Nayaka Giacomo,Magi Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
200 ESEGUITO Fare l'Amore Barry,Long Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
201 ESEGUITO Far l'amore con la vita - libro 4D Ornella Lucilla,Marini Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
202 ESEGUITO Einstein non Credeva a Darwin Christian,Peluffo Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
203 ESEGUITO La Dieta Chetogenica con Ricette Senza Carne e Latte Will,Cole Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
204 ESEGUITO Diario di Adamo ed Eva Mark,Twain Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
205 ESEGUITO Depurare e Curare il Fegato con i Rimedi Naturali Roberto,Marrocchesi Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
206 ESEGUITO Il Corpo Sottile Cyndi,Dale Macro Edizioni nuovo 32.22 36.01 37.9 15%
|
||||
207 ESEGUITO Conosci la tua mente per uscire dall'addomesticamento Fiorella,Rustici Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
208 ESEGUITO Comprendi la tua Malattia con le Scoperte del Dottor Hamer Michel,Henrard Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
209 ESEGUITO Le carte danzanti Maria Strova Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
210 ESEGUITO Buono senza sale Cecilie e Christophe Berg Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
211 ESEGUITO Anima Gemella 4d Selene,Calloni Williams Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
212 ESEGUITO Amare è Lasciare Andare la Paura Gerald,Jampolsky Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
213 ESEGUITO Amante Tantrico Jacques,Ferber Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
214 ESEGUITO Agenda Donna di Luna Sajeeva,Hurtado Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
215 ESEGUITO 50 Modi per Vincere la Fame Nervosa Susan,Albers Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
216 ESEGUITO 100 anni di salute David,Wolfe Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
217 ESEGUITO Yoga con la sedia Willem,Wittstamm Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
218 ESEGUITO Metapolitica Daniel,Estulin Macro Edizioni nuovo 19.47 21.76 22.9 15%
|
||||
219 ESEGUITO Magia dei cristalli Enrica,Ercolani Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
220 ESEGUITO Luna Rossa, l'Oracolo degli Animali Sacri Miranda,Gray Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
221 ESEGUITO Dea respira Sajeeva,Hurtado Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
222 ESEGUITO Biotipi a 4 zampe Alessandro,Prota Macro Edizioni nuovo 26.27 29.36 30.9 15%
|
||||
223 ESEGUITO Yoga per le quattro Stagioni Chantal,Hermans Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
224 ESEGUITO Yoga per gli occhi Andrea,Christiansen Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
225 ESEGUITO Vegan Street Food Eduardo,Ferrante Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
226 ESEGUITO Sfere di Luce Massimo,Teodorani Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
227 ESEGUITO Il Sesto Senso Stuart,Wilde Macro Edizioni nuovo 21.17 17.43 24.9 15%
|
||||
228 ESEGUITO Risveglia lo Sciamano che è in te José Luis,Stevens Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
229 ESEGUITO Il Potere Terapeutico del Suono Lucia,Cavallari Macro Edizioni nuovo 17 19 20 15%
|
||||
230 ESEGUITO Il Potere di Guarigione della Paura Lissa,Rankin Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
231 ESEGUITO Il Manuale della Vita Naturale Alain,Saury Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
232 ESEGUITO Jin Shin Jyutsu Waltraud Riegger Krause Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
233 ESEGUITO Io Resto Bio 4D Patrizia,Poggiali Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
234 ESEGUITO Innamorati di Te Tiberio,Faraci Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
235 ESEGUITO Guida Pratica al Compost Nicky,Scott Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
236 ESEGUITO Gemmoterapia Stéphane,Boistard Macro Edizioni nuovo 25.42 28.41 29.9 15%
|
||||
237 ESEGUITO Enoch. Il Primo libro del mondo - Vol. 2 Mario Pincherle Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
238 ESEGUITO Enoch. Il Primo libro del mondo - Vol. 1 Mario Pincherle Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
239 ESEGUITO Dolci Buoni e Sani 4D Dealma,Franceschetti Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
240 ESEGUITO Dodici Guaritori Edward,Bach Macro Edizioni nuovo 8.42 9.41 9.9 15%
|
||||
241 ESEGUITO Diario della Prima Mestruazione Nicole,Schaufler Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
242 ESEGUITO Coerenza Cardiaca 365 David,O'Hare Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
243 ESEGUITO Biotransenergetica 4D Pier Luigi,Lattuada Macro Edizioni nuovo 27.12 30.31 31.9 15%
|
||||
244 ESEGUITO Lo Spazio delle Varianti - Reality Transurfing Vadim Zeland Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
245 ESEGUITO Spaghetti Vegetali dall'Antipasto al Dolce Francesca,Piu Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
246 ESEGUITO Smettila di Far Mangiare Schifezze a Tuo Figlio Deborah,Colson Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
247 ESEGUITO La Saggezza dell'Asino Mirzakarim,Norbekov Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
248 ESEGUITO Fatto in Casa Lucia,Cuffaro Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
249 ESEGUITO Curare la Candida con Terapie Naturali Vincenzo,Valesi Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
250 ESEGUITO Curare i Reumatismi con Metodi Naturali Paolo,Giordo Macro Edizioni nuovo 5.02 5.61 5.9 15%
|
||||
251 ESEGUITO Con-Vivere - L'Allevamento del Futuro Carla,De Benedictis Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
252 ESEGUITO Batteri intestinali Anne Katherina,Zschocke Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
253 ESEGUITO Yoga per la Fertilità Kerstin,Leppert Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
254 ESEGUITO Lo Yoga oltre lo Yoga 4D Marco,Mandrino Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
255 ESEGUITO Yoga in azienda Vittorio Demetrio,Mascherpa Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
256 ESEGUITO Yoga delle Mani - Le Carte Cain,Carroll Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
257 ESEGUITO Wild power Alexandra,Pope Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
258 ESEGUITO La Via dello Psiconauta - Vol 1 Stanislav,Grof Macro Edizioni nuovo 33.15 37.05 39 15%
|
||||
259 ESEGUITO I Tarocchi dello Yoga Ratna Cristina,Bonanomi Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
260 ESEGUITO Super Succhi - 100 Ricette Julie,Morris Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
261 ESEGUITO Stop ai Virus e al Covid-19 Patrick,Holford Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
262 ESEGUITO Spezie, Cacao e Tè Carlo,Martini Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
263 ESEGUITO La Scimmia Yoga - Il Diario della Pratica John,Kraijenbrink Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
264 ESEGUITO Rinascere dopo il lutto Amanda,Castello Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
265 ESEGUITO Paura Thich Nhat Hanh Macro Edizioni nuovo 15.22 17.01 17.9 15%
|
||||
266 ESEGUITO Ottimisti ! Franck,Martin Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
267 ESEGUITO Oracolo Madre Carlotta,Giunchedi Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
268 ESEGUITO Oracolo degli Angeli Guaritori - 50 CARTE+LIBRO Carolin,Stern Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
269 ESEGUITO Occhio all'Etichetta Elena,Tioli Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
270 ESEGUITO I Nostri Amici Batteri Anne Katherina,Zschocke Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
271 ESEGUITO Metodo Bates per una Vista Perfetta Senza Occhiali Loredana,De Michelis Macro Edizioni nuovo 16.92 18.91 19.9 15%
|
||||
272 ESEGUITO Il Metodo antiacido per la prevenzione e cura delle malattie Rocco,Palmisano Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
273 ESEGUITO Metodo Acido Base Hervé,Grosgogeat Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
274 ESEGUITO Menu della Salute Giusi,De Francesco Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
275 ESEGUITO La Mente Quantica - 4D Vincenzo,Fanelli Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
276 ESEGUITO Meditazioni sciamaniche 4D Pier Luigi,Lattuada Macro Edizioni nuovo 21.68 24.23 25.5 15%
|
||||
277 ESEGUITO Matrix Energetics Richard,Bartlett Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
278 ESEGUITO Manuale delle Serre Polytunnel Andy,McKee Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
279 ESEGUITO Kintsugi Gioacchino,Allasia Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
280 ESEGUITO Insegno Yoga Donna,Farhi Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
281 ESEGUITO Il Potere della Programmazione Quantica Vincenzo,Fanelli Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
282 ESEGUITO Il Codice della Vita ,AA.VV. Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
283 ESEGUITO Guida alla Cospirazione Globale David,Icke Macro Edizioni nuovo 39.02 43.61 45.9 15%
|
||||
284 ESEGUITO Il Grande libro dell'Argento Colloidale Josef,Pies Macro Edizioni nuovo 18.62 20.81 21.9 15%
|
||||
285 ESEGUITO Giocando con gli Angeli Hania,Czajkowski Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
286 ESEGUITO Felicità fa i Soldi Davide Francesco,Sada Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
287 ESEGUITO Evolution Cards astrid,Gortan Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
288 ESEGUITO Le Eccezionali Proprietà Curative della Noce di Cocco Bruce,Fife Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
289 ESEGUITO Dog Fitness Carmen,Mayer Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
290 ESEGUITO Dionidream Tutta l'Energia della Natura Riccardo,Lautizi Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
291 ESEGUITO Diabete - 4D Domenico,Battaglia Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
292 ESEGUITO Curare l'Infertilità con Metodi Naturali Amelia,Sagliano Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
293 ESEGUITO Cura il tuo diabete 4D Gabriel,Cousens Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
294 ESEGUITO Un Corso in Miracoli Parla di Sé Patrizia,Terreno Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
295 ESEGUITO Corpo di Luce Reindjen,Anselmi Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
296 ESEGUITO China Study 4D - Edizione Aggiornata e Ampliata T. Colin Campbell Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
297 ESEGUITO Le Chiavi del Sapere Pier Francesco,Grasselli Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
298 ESEGUITO Aumakua Jeanne,Ruland Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
299 ESEGUITO Atlante dei Chakra Kalashatra,Govinda Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
300 ESEGUITO Ascoltando la pelle Antonio,Dal Sorbo Macro Edizioni nuovo 29.67 33.16 34.9 15%
|
||||
301 ESEGUITO L'Amara verità sullo zucchero André,Marette Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
302 ESEGUITO Addio Sensi di Colpa Gerald,Jampolsky Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
303 ESEGUITO Abbondanza Miracolosa Charles,Hervé-Gruyer Macro Edizioni nuovo 23.72 26.51 27.9 15%
|
||||
304 ESEGUITO Zen e l'Arte di Imbrogliare la Mente Alan,Watts Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
305 ESEGUITO Yoga per Tutti Meta,Chaya Hirschl Macro Edizioni nuovo 17.85 16.8 21 15%
|
||||
306 ESEGUITO Yoga per Te Tara,Fraser Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
307 ESEGUITO Yoga per Donne Shakta Kaur,Khalsa Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
308 ESEGUITO Yoga per chi Viaggia Jennifer,J. Ellinghaus Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
309 ESEGUITO Yoga e Chakra Anodea,Judith Macro Edizioni nuovo 31.37 35.06 36.9 15%
|
||||
310 ESEGUITO Yoga delle Mani Andrea,Christiansen Macro Edizioni nuovo 14.37 16.06 16.9 15%
|
||||
311 ESEGUITO Whole - Vegetale e Integrale T. Colin Campbell Macro Edizioni nuovo 15.73 17.58 18.5 15%
|
||||
312 ESEGUITO Vivo Senza Auto Linda,Maggiori Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
313 ESEGUITO Vitamine nell'Aria Earl,Mindell Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
314 ESEGUITO Verità sul Cancro Ty,Bollinger Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
315 ESEGUITO La Verità Nascosta Gregg,Braden Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
316 ESEGUITO Transurfing Vivo _ Oltre i Confini della Matrix Vadim Zeland Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
317 ESEGUITO Tinte Naturali per i Capelli Gwendoline,Clergeaud Macro Edizioni nuovo 14.88 16.63 17.5 15%
|
||||
318 ESEGUITO Tesla- Lampo di Genio Massimo,Teodorani Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
319 ESEGUITO Tè e Tisane Curative Jürgen,Klitzner Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
320 ESEGUITO Tachipirina Paracetamolo Sì o No? Antonietta,Gatti Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
321 ESEGUITO Storia Proibita J. Douglas,Kenyon Macro Edizioni nuovo 24.23 27.08 28.5 15%
|
||||
322 ESEGUITO Sequenze Numeriche per Rigenerare e Guarire il tuo Corpo Vol.1 Grigorij Grabovoj Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
323 ESEGUITO I Sentieri del Potere Sciamanico José Luis,Stevens Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
324 ESEGUITO Il Segreto delle Ere N.E. Piero,Magaletti Ragone Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
325 ESEGUITO Sedendo Quietamente Pietro,Thea Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
326 ESEGUITO La Scienza del Cuore Carmen,Di Muro Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
327 ESEGUITO Scegli la felicità con Ho'oponopono ,AA.VV. Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
328 ESEGUITO Scardinare il Sistema Tecnogeno Vadim Zeland Macro Edizioni nuovo 22.53 25.18 26.5 15%
|
||||
329 ESEGUITO Sangue degli Illuminati Diego,Marin Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
330 ESEGUITO Sane abitudini per invecchiare bene Maurizio,Di Massimo Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
331 ESEGUITO Salute di Cani e Gatti con l'Aloe Vera Roberto,Setti Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
332 ESEGUITO Il Risveglio Spirituale nella Vita Quotidiana Jeff,Foster Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
333 ESEGUITO Il Risveglio del Leone David,Icke Macro Edizioni nuovo 33.58 37.53 39.5 15%
|
||||
334 ESEGUITO Rinasci e Risveglia il tuo Potere Interiore Derek,Rydall Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
335 ESEGUITO Ricomincia da Te Tiberio,Faraci Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
336 ESEGUITO Ricette per Vivere Sani fino a 100 Anni Catalina,Muraru Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
337 ESEGUITO Resilienza con il Cuore Gregg,Braden Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
338 ESEGUITO Reinventare il Corpo, Risvegliare l'Anima Deepak,Chopra Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
339 ESEGUITO Le Regole dello Specchio Transurfing Vadim Zeland Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
340 ESEGUITO Rebirthing Evolutivo Cristiano,Baraghini Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
341 ESEGUITO Reality Transurfing La Trilogia Vadim Zeland Macro Edizioni nuovo 35.7 39.9 42 15%
|
||||
342 ESEGUITO Quando la Giraffa Balla col Lupo Serena,Rust Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
343 ESEGUITO Punto G Elmar e Michaela,Zadra Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
344 ESEGUITO Proprietà e benefici della Vitamina A Simone,Grazioli Schagerl Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
345 ESEGUITO Il Proiettore - Reality Transurfing Vadim Zeland Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
346 ESEGUITO Primo Soccorso Omeopatico per Cani e Gatti Daniela,Montesion Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
347 ESEGUITO Prenditi Cura della Vista del tuo Bambino Vania,Galbucci Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
348 ESEGUITO Più Ricette Sane, Meno Ricette Mediche Federica,Gif Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
349 ESEGUITO I più bei Mandala per Tutte le Stagioni ,AA.VV. Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
350 ESEGUITO Piccolo Manuale dello Shinrin Yoku Bettina,Lemke Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
351 ESEGUITO Piatto Sano Quotidiano Federica,Gif Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
352 ESEGUITO Piacere della tavola nella cucina antica e oggi Pietro,Leemann Macro Edizioni nuovo 21.25 23.75 25 15%
|
||||
353 ESEGUITO Pet Therapy N.E. Alberto,Dal Negro Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
354 ESEGUITO La Permacultura secondo Sepp Holzer Sepp,Holzer Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
355 ESEGUITO L'Orologio della Natura Peter,Wohlleben Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
356 ESEGUITO Nutrizione Ayurvedica Swami,Joythimayananda Macro Edizioni nuovo 22.87 25.56 26.9 15%
|
||||
357 ESEGUITO La Nuova Umanità - Kryon Lee,Carroll Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
358 ESEGUITO Neuroschiavi - 5° Ed. Aggiornata Marco,Della Luna Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
359 ESEGUITO Nel Cuore dello Sciamano Alberto,Villoldo Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
360 ESEGUITO Muovi il tuo DNA Katy,Bowman Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
361 ESEGUITO Il Monaco Urbano Pedram,Shojai Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
362 ESEGUITO Miracle Morning per le Famiglie Hal,Elrod Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
363 ESEGUITO Il mio Sangue Cura Zulma,Moreyra Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
364 ESEGUITO Il Mio Erbario Maurice,Mességué Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
365 ESEGUITO Il Minimalista - Meno Cose = Più Felicità Francine,Jay Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
366 ESEGUITO La mia Cosmesi Fai da Te Gabriela,Nedoma Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
367 ESEGUITO Mente Supera la Medicina Lissa,Rankin Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
368 ESEGUITO Meditazione per Scettici Ulrich,Ott Macro Edizioni nuovo 6.72 7.51 7.9 15%
|
||||
369 ESEGUITO La Matrix Divina Gregg,Braden Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
370 ESEGUITO Manuale Pratico del Corpo Sottile Cyndi,Dale Macro Edizioni nuovo 24.23 27.08 28.5 15%
|
||||
371 ESEGUITO Manuale di Autotrattamento craniosacrale Gioacchino,Allasia Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
372 ESEGUITO Il Manuale dell'Argilla Giuseppe Ferraro Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
373 ESEGUITO Mangio Crudo e Vivo Meglio Brenda,Davis Macro Edizioni nuovo 19.13 21.38 22.5 15%
|
||||
374 ESEGUITO Mangiar Sano e Naturale con Alimenti Vegetali Integrali Michele,Riefoli Macro Edizioni nuovo 22.1 24.7 26 15%
|
||||
375 ESEGUITO Magico Potere del Cibo Peter and Beryn,Daniel Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
376 ESEGUITO Luna Rossa Miranda,Gray Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
377 ESEGUITO Luna Rossa in Ufficio Miranda,Gray Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
378 ESEGUITO Luminous Life Jacob,Liberman Macro Edizioni nuovo 19.13 21.38 22.5 15%
|
||||
379 ESEGUITO Il Libro Nero dei Veterinari Jutta,Ziegler Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
380 ESEGUITO Il Libro della Medicina Orientale Clive,Witham Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
381 ESEGUITO Lettere da Casa Lee,Carroll Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
382 ESEGUITO L'Imbroglio della Realtà David,Icke Macro Edizioni nuovo 37.83 42.28 44.5 15%
|
||||
383 ESEGUITO Kundalini Yoga Satya,Singh Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
384 ESEGUITO Kundalini Energia Divina Cyndi,Dale Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
385 ESEGUITO Karma e Reincarnazione Elizabeth Clare,Prophet Macro Edizioni nuovo 12.67 14.16 14.9 15%
|
||||
386 ESEGUITO Io Non Mi Ammalo! Joseph,Mercola Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
387 ESEGUITO I Poteri Curativi della Vitamina D Soram,Khalsa Macro Edizioni nuovo 10.63 11.88 12.5 15%
|
||||
388 ESEGUITO Ho'Oponopono tutte le Strade portano all'Amore ,Josaya Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
389 ESEGUITO Guida Alla Sopravvivenza Guido,Dalla Casa Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
390 ESEGUITO Guarire con la Vitamina C Stefano,Pravato Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
391 ESEGUITO Guarire con il Cibo Giusi,De Francesco Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
392 ESEGUITO La Guarigione Spontanea delle Credenze Gregg,Braden Macro Edizioni nuovo 21.17 23.66 24.9 15%
|
||||
393 ESEGUITO La Grande Piramide e lo Zed Mario Pincherle Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
394 ESEGUITO Il Grande Manuale dell’Ayurveda Kiran,Vyas Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
395 ESEGUITO Il Grande Libro della Yoga Terapia Remo,Rittiner Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
396 ESEGUITO Il Grande Libro dei Cinque Tibetani Jean-Louis,Abrassart Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
397 ESEGUITO La Grande Equazione Vittorio,Marchi Macro Edizioni nuovo 25.08 28.03 29.5 15%
|
||||
398 ESEGUITO Fenomeno Vitale tra Scienza e Coscienza Aldo,Cehic Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
399 ESEGUITO Il Fattore Enzima Hiromi,Shinya Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
400 ESEGUITO L'Enigma Quantico Bruce,Rosenblum Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
401 ESEGUITO Effetto Gaia - Kryon Monica,Muranyi Macro Edizioni nuovo 15.73 17.58 18.5 15%
|
||||
402 ESEGUITO Effetto Biofilia Clemens G.,Arvay Macro Edizioni nuovo 13.18 14.73 15.5 15%
|
||||
403 ESEGUITO Echinacea Corinna,Hembd Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
404 ESEGUITO Disintossicati e recupera la Salute in 11 giorni Bernard,Jensen Macro Edizioni nuovo 8.93 9.98 10.5 15%
|
||||
405 ESEGUITO Dieta Vegan per lo Sport Eduardo,Ferrante Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
406 ESEGUITO La Dieta Barf per Cuccioli di Cane Swanie,Simon Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
407 ESEGUITO la Dieta Barf per Cani Anziani o Malati Swanie,Simon Macro Edizioni nuovo 10.63 11.88 12.5 15%
|
||||
408 ESEGUITO La Dieta Barf per Cani Swanie,Simon Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
409 ESEGUITO Cura Naturale delle Malattie Cardiache Dean,Ornish Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
410 ESEGUITO La Cura del Limone Werner,Meidinger Macro Edizioni nuovo 7.99 8.93 9.4 15%
|
||||
411 ESEGUITO Cucinare a Colori Jessica,Callegaro Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
412 ESEGUITO Cucina Crudista Alcalina Elena,Dal Forno Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
413 ESEGUITO Cosmetici Naturali per Viso, Corpo e Capelli Anna,Simone Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
414 ESEGUITO Corso di Esistenza Fosco,Del Nero Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
415 ESEGUITO Consigli per Vivere Sani Fino a 100 Anni Roberto Antonio,Bianchi Macro Edizioni nuovo 6.72 7.51 7.9 15%
|
||||
416 ESEGUITO Un Coniglio per Amico Cinzia,Ciarmatori Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
417 ESEGUITO La Comunicazione Intuitiva con gli Animali Andrea,Contri Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
418 ESEGUITO Come Trasformare il Deserto in Paradiso Sepp,Holzer Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
419 ESEGUITO Come Sono Guarito dalla Miopia David,De Angelis Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
420 ESEGUITO Coltivare Bio con Successo Jean-Martin,Fortier Macro Edizioni nuovo 15.3 17.1 18 15%
|
||||
421 ESEGUITO Il Codice dell'Amore Alexander,Loyd Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
422 ESEGUITO Circondati da Psicopatici Bärbel,Mechler Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
423 ESEGUITO Il Cioccolato che fa Bene ,Shazzie Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
424 ESEGUITO Il Cibo Sia la Mia Medicina Alessandra,Borelli Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
425 ESEGUITO Cibo per la Tiroide Simone,Grazioli Schagerl Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
426 ESEGUITO Cibo per la mente Jo Anne,Miller Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
427 ESEGUITO Le Chiavi Genetiche Richard Rudd Macro Edizioni nuovo 35.7 39.9 42 15%
|
||||
428 ESEGUITO Che Bleep ne sai? B.,Chasse Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
429 ESEGUITO Il Cervello Quantico Jeffrey,Satinover Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
430 ESEGUITO Le Case in Paglia Athena,Swentzell Steen Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
431 ESEGUITO Cambio Pelle in 7 Passi Lucia,Cuffaro Macro Edizioni nuovo 14.03 15.68 16.5 15%
|
||||
432 ESEGUITO Buona Cacca a Tutti ! Adrian,Schulte Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
433 ESEGUITO Blue Mind - Mente e Acqua Wallace J.,Nichols Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
434 ESEGUITO Bellezza Sciamanica Lumira Macro Edizioni nuovo 14.88 16.63 17.5 15%
|
||||
435 ESEGUITO Basta Poco Sukey ed Elizabeth Novogratz Macro Edizioni nuovo 16.07 17.96 18.9 15%
|
||||
436 ESEGUITO I Bambini Indaco Jan,Tober Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
437 ESEGUITO Ayurvegan Barbara,Bianchi Macro Edizioni nuovo 19.98 22.33 23.5 15%
|
||||
438 ESEGUITO Ayurveda - Vita, Salute e Longevità Robert,Svoboda Macro Edizioni nuovo 17.77 19.86 20.9 15%
|
||||
439 ESEGUITO Avanti nel Passato Vadim Zeland Macro Edizioni nuovo 16.58 18.53 19.5 15%
|
||||
440 ESEGUITO Attacco all'Asma ... e non Solo Fiamma,Ferraro Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
441 ESEGUITO Ashtanga Yoga Gian Renato,Marchisio Macro Edizioni nuovo 26.78 29.93 31.5 15%
|
||||
442 ESEGUITO Asana Swami,Kuvalayananda Macro Edizioni nuovo 10.97 12.26 12.9 15%
|
||||
443 ESEGUITO Archetipi Mario Pincherle Macro Edizioni nuovo 17.85 19.95 21 15%
|
||||
444 ESEGUITO Apicoltura - Il Manuale Pratico Illustrato Henri,Clément Macro Edizioni nuovo 20.83 23.28 24.5 15%
|
||||
445 ESEGUITO Apandemia Stefano,Scoglio Macro Edizioni nuovo 23.8 26.6 28 15%
|
||||
446 ESEGUITO Animali Specchio dell'Anima Irmgard,Baumgartner Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
447 ESEGUITO Anemia Domenico,Battaglia Macro Edizioni nuovo 9.78 10.93 11.5 15%
|
||||
448 ESEGUITO Aloe Vera Alice,Beringer Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
449 ESEGUITO Allergie nei Cani e nei Gatti Maria,Cuteri Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
450 ESEGUITO Alla Scoperta della Particella di Dio Massimo,Corbucci Macro Edizioni nuovo 9.18 10.26 10.8 15%
|
||||
451 ESEGUITO Aiuto, ho le mie Cose! Barbara,Monti Macro Edizioni nuovo 12.33 13.78 14.5 15%
|
||||
452 ESEGUITO Addestrare Senza Parole Liane,Rauch Macro Edizioni nuovo 11.48 12.83 13.5 15%
|
||||
453 ESEGUITO Acque Aromatizzate Francesca,Piu Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
454 ESEGUITO 7 Passi del Perdono Daniel,Lumera Macro Edizioni nuovo 15.81 17.67 18.6 15%
|
||||
455 ESEGUITO 20 Domande per Capire la Fisica Antonella,Ravizza Macro Edizioni nuovo 8.33 9.31 9.8 15%
|
||||
456 ESEGUITO Prevenire e Guarire con lo Yoga Christine,Campagnac Morette Macro Edizioni nuovo 33.58 37.53 39.5
|
||||
110
logtrans.txt
110
logtrans.txt
@@ -196,4 +196,112 @@ Giovannifruttadisicilia: 222.50 RIS]
|
||||
Mar 28/05 ORE 16:51: [<b>Circuito RIS Italia</b>]: Inviate Monete da ElenaEspx a Giovannifruttadisicilia 28 RIS [causale: Acquisto arance 30genn24 RisoBologna 1]
|
||||
Saldi:
|
||||
ElenaEspx: -60.10 RIS]
|
||||
Giovannifruttadisicilia: 250.50 RIS]
|
||||
Giovannifruttadisicilia: 250.50 RIS]
|
||||
Ven 31/05 ORE 11:12: [<b>Circuito RIS Rimini</b>]: Inviate Monete da paoloar77 a dsadas1 1 RIS [causale: aaa]
|
||||
Saldi:
|
||||
paoloar77: -2.00 RIS]
|
||||
dsadas1: 1.00 RIS]
|
||||
Ven 31/05 ORE 11:59: [<b>Circuito RIS Rimini</b>]: Inviate Monete da paoloar77 a dsadas1 2 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: -4.00 RIS]
|
||||
dsadas1: 3.00 RIS]
|
||||
Mer 03/07 ORE 12:44: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 35.00 RIS]
|
||||
SuryaArena: 1.00 RIS]
|
||||
Mer 03/07 ORE 12:53: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 34.00 RIS]
|
||||
SuryaArena: 2.00 RIS]
|
||||
Mer 03/07 ORE 12:53: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 33.00 RIS]
|
||||
SuryaArena: 3.00 RIS]
|
||||
Mer 03/07 ORE 12:59: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 30.00 RIS]
|
||||
SuryaArena: 6.00 RIS]
|
||||
Mer 03/07 ORE 13:01: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 29.00 RIS]
|
||||
SuryaArena: 7.00 RIS]
|
||||
Mer 03/07 ORE 13:09: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 28.00 RIS]
|
||||
SuryaArena: 8.00 RIS]
|
||||
Mer 03/07 ORE 13:13: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 27.00 RIS]
|
||||
SuryaArena: 9.00 RIS]
|
||||
Mer 03/07 ORE 13:14: [<b>Circuito RIS Bologna</b>]: Inviate Monete da paoloar77 a SuryaArena 5 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: 22.00 RIS]
|
||||
SuryaArena: 14.00 RIS]
|
||||
Mer 03/07 ORE 13:16: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (paoloar77) a SuryaArena 1 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (paoloar77): -346.00 RIS]
|
||||
SuryaArena: 15.00 RIS]
|
||||
Mer 03/07 ORE 13:20: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (paoloar77) a SuryaArena 3 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (paoloar77): -349.00 RIS]
|
||||
SuryaArena: 18.00 RIS]
|
||||
Mer 18/09 ORE 15:38: [<b>Circuito RIS Rimini</b>]: Inviate Monete da paoloar77 a TestTransazPao 1 RIS [causale: ]
|
||||
Saldi:
|
||||
paoloar77: -2.00 RIS]
|
||||
TestTransazPao: 1.00 RIS]
|
||||
Mer 18/09 ORE 15:41: [<b>Circuito RIS Rimini</b>]: Inviate Monete da marco.bi a TestTransazPao 5 RIS [causale: ]
|
||||
Saldi:
|
||||
marco.bi: -5.00 RIS]
|
||||
TestTransazPao: 6.00 RIS]
|
||||
Mer 18/09 ORE 15:43: [<b>Circuito RIS Rimini</b>]: Inviate Monete da marco.bi a TestTransazPao 2 RIS [causale: ]
|
||||
Saldi:
|
||||
marco.bi: -7.00 RIS]
|
||||
TestTransazPao: 8.00 RIS]
|
||||
Dom 29/09 ORE 17:32: [<b>Circuito RIS Bologna</b>]: Inviate Monete da Sincronicit4 a Didonemma 30 RIS [causale: Sistemazione per evento]
|
||||
Saldi:
|
||||
Sincronicit4: 70.00 RIS]
|
||||
Didonemma: 58.00 RIS]
|
||||
Dom 29/09 ORE 19:08: [<b>Circuito RIS Bologna</b>]: Inviate Monete da Sincronicit4 a Didonemma 60 RIS [causale: ]
|
||||
Saldi:
|
||||
Sincronicit4: 10.00 RIS]
|
||||
Didonemma: 118.00 RIS]
|
||||
Dom 29/09 ORE 19:10: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (Anna50823) a Didonemma 15 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (Anna50823): -364.00 RIS]
|
||||
Didonemma: 133.00 RIS]
|
||||
Dom 29/09 ORE 19:24: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (Anna50823) a Didonemma 15 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (Anna50823): -379.00 RIS]
|
||||
Didonemma: 148.00 RIS]
|
||||
Dom 29/09 ORE 23:10: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (ElenaEspx) a Anna50823 3 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (ElenaEspx): -382.00 RIS]
|
||||
Anna50823: -84.00 RIS]
|
||||
Dom 29/09 ORE 23:12: [<b>Circuito RIS Viterbo</b>]: Inviate Monete da L"ORTOINFESTACSAdiViterbo (Fulvio_F) a ArietteMorano 50 RIS [causale: Compenso prime 10 ore attività OrtoInfesta 2024]
|
||||
Saldi:
|
||||
L"ORTOINFESTACSAdiViterbo (Fulvio_F): 229.50 RIS]
|
||||
ArietteMorano: 50.00 RIS]
|
||||
Dom 29/09 ORE 23:17: [<b>Circuito RIS Bologna</b>]: Inviate Monete da nonsiemaisoli a Tonygraziano 21 RIS [causale: Da Natalia per libro. Grazie!!]
|
||||
Saldi:
|
||||
nonsiemaisoli: -33.50 RIS]
|
||||
Tonygraziano: 93.00 RIS]
|
||||
Dom 29/09 ORE 23:20: [<b>Circuito RIS Bologna</b>]: Inviate Monete da doulagiuliar a Tonygraziano 2 RIS [causale: Grazie Arcoiris per la tua arte]
|
||||
Saldi:
|
||||
doulagiuliar: -32.00 RIS]
|
||||
Tonygraziano: 95.00 RIS]
|
||||
Dom 29/09 ORE 23:21: [<b>Circuito RIS Bologna</b>]: Inviate Monete da SaraRiflePla a RosEle70 10 RIS [causale: Contributo gratitudine giro felice di vita]
|
||||
Saldi:
|
||||
SaraRiflePla: -30.00 RIS]
|
||||
RosEle70: 10.00 RIS]
|
||||
Dom 29/09 ORE 23:23: [<b>Circuito RIS Viterbo</b>]: Inviate Monete da sergiomazzanti a Annarosa 5 RIS [causale: ]
|
||||
Saldi:
|
||||
sergiomazzanti: -11.50 RIS]
|
||||
Annarosa: -15.00 RIS]
|
||||
Dom 29/09 ORE 23:24: [<b>Circuito RIS Italia</b>]: Inviate Monete da vasantayoga a BlediMakeru 25 RIS [causale: Consulenza legale]
|
||||
Saldi:
|
||||
vasantayoga: -25.00 RIS]
|
||||
BlediMakeru: 25.00 RIS]
|
||||
Dom 29/09 ORE 23:24: [<b>Circuito RIS Bologna</b>]: Inviate Monete da pontiUmani (Anna50823) a franz12090 15 RIS [causale: ]
|
||||
Saldi:
|
||||
pontiUmani (Anna50823): -397.00 RIS]
|
||||
franz12090: 20.00 RIS]
|
||||
@@ -1,354 +0,0 @@
|
||||
// MongoDB Playground
|
||||
// To disable this template go to Settings | MongoDB | Use Default Template For Playground.
|
||||
// Make sure you are connected to enable completions and to be able to run a playground.
|
||||
// Use Ctrl+Space inside a snippet or a string literal to trigger completions.
|
||||
|
||||
// Select the database to use.
|
||||
use('test_FreePlanet');
|
||||
|
||||
let aggregation = [
|
||||
{
|
||||
$match: {
|
||||
idapp: "13",
|
||||
},
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
date_updated: -1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
myId1: {
|
||||
$toObjectId: "$userId",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "users",
|
||||
localField: "myId1",
|
||||
foreignField: "_id",
|
||||
as: "user",
|
||||
},
|
||||
},
|
||||
{
|
||||
$replaceRoot: {
|
||||
newRoot: {
|
||||
$mergeObjects: [
|
||||
{
|
||||
$arrayElemAt: [
|
||||
"$user",
|
||||
0,
|
||||
],
|
||||
},
|
||||
"$$ROOT",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
recGood: 1,
|
||||
sectorGood: 1,
|
||||
idSectorGood: 1,
|
||||
idGood: 1,
|
||||
mygood: 1,
|
||||
idStatusSkill: 1,
|
||||
idContribType: 1,
|
||||
"profile.username_telegram": 1,
|
||||
"profile.favorite": 1,
|
||||
"profile.bookmark": 1,
|
||||
idCity: 1,
|
||||
pub_to_share: 1,
|
||||
numLevel: 1,
|
||||
adType: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
website: 1,
|
||||
descr: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
userId: 1,
|
||||
username: 1,
|
||||
name: 1,
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
comune: 1,
|
||||
mycities: 1,
|
||||
"profile.img": 1,
|
||||
"profile.mygroups": 1,
|
||||
"profile.qualifica": 1,
|
||||
"profile.resid_province": 1,
|
||||
"profile.resid_card": 1,
|
||||
reported: 1,
|
||||
date_report: 1,
|
||||
username_who_report: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "goods",
|
||||
localField: "idGood",
|
||||
foreignField: "_id",
|
||||
as: "recGood",
|
||||
},
|
||||
},
|
||||
{
|
||||
$replaceRoot: {
|
||||
newRoot: {
|
||||
$mergeObjects: [
|
||||
{
|
||||
$arrayElemAt: [
|
||||
"$recGood",
|
||||
0,
|
||||
],
|
||||
},
|
||||
"$$ROOT",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
recGood: 1,
|
||||
sectorGood: 1,
|
||||
idSectorGood: 1,
|
||||
idGood: 1,
|
||||
mygood: 1,
|
||||
idStatusSkill: 1,
|
||||
idContribType: 1,
|
||||
"profile.username_telegram": 1,
|
||||
"profile.favorite": 1,
|
||||
"profile.bookmark": 1,
|
||||
idCity: 1,
|
||||
pub_to_share: 1,
|
||||
numLevel: 1,
|
||||
adType: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
website: 1,
|
||||
descr: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
userId: 1,
|
||||
username: 1,
|
||||
name: 1,
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
comune: 1,
|
||||
mycities: 1,
|
||||
"profile.img": 1,
|
||||
"profile.mygroups": 1,
|
||||
"profile.qualifica": 1,
|
||||
"profile.resid_province": 1,
|
||||
"profile.resid_card": 1,
|
||||
reported: 1,
|
||||
date_report: 1,
|
||||
username_who_report: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "sectorgoods",
|
||||
localField: "idSectorGood",
|
||||
foreignField: "_id",
|
||||
as: "sectorGood",
|
||||
},
|
||||
},
|
||||
{
|
||||
$replaceRoot: {
|
||||
newRoot: {
|
||||
$mergeObjects: [
|
||||
{
|
||||
$arrayElemAt: [
|
||||
"$sectorGood",
|
||||
0,
|
||||
],
|
||||
},
|
||||
"$$ROOT",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
recGood: 1,
|
||||
sectorGood: 1,
|
||||
idSectorGood: 1,
|
||||
idGood: 1,
|
||||
mygood: 1,
|
||||
idStatusSkill: 1,
|
||||
idContribType: 1,
|
||||
"profile.username_telegram": 1,
|
||||
"profile.favorite": 1,
|
||||
"profile.bookmark": 1,
|
||||
idCity: 1,
|
||||
pub_to_share: 1,
|
||||
numLevel: 1,
|
||||
adType: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
website: 1,
|
||||
descr: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
userId: 1,
|
||||
username: 1,
|
||||
name: 1,
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
comune: 1,
|
||||
mycities: 1,
|
||||
"profile.img": 1,
|
||||
"profile.mygroups": 1,
|
||||
"profile.qualifica": 1,
|
||||
"profile.resid_province": 1,
|
||||
reported: 1,
|
||||
date_report: 1,
|
||||
username_who_report: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: "cities",
|
||||
localField: "idCity",
|
||||
foreignField: "_id",
|
||||
as: "mycities",
|
||||
},
|
||||
},
|
||||
{
|
||||
$replaceRoot: {
|
||||
newRoot: {
|
||||
$mergeObjects: [
|
||||
{
|
||||
$arrayElemAt: [
|
||||
"$mycities",
|
||||
0,
|
||||
],
|
||||
},
|
||||
"$$ROOT",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
recGood: 1,
|
||||
sectorGood: 1,
|
||||
idSectorGood: 1,
|
||||
idGood: 1,
|
||||
mygood: 1,
|
||||
idStatusSkill: 1,
|
||||
idContribType: 1,
|
||||
"profile.username_telegram": 1,
|
||||
"profile.favorite": 1,
|
||||
"profile.bookmark": 1,
|
||||
idCity: 1,
|
||||
pub_to_share: 1,
|
||||
numLevel: 1,
|
||||
adType: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
website: 1,
|
||||
descr: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
userId: 1,
|
||||
username: 1,
|
||||
name: 1,
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
comune: 1,
|
||||
mycities: 1,
|
||||
"profile.img": 1,
|
||||
"profile.mygroups": 1,
|
||||
"profile.qualifica": 1,
|
||||
"profile.resid_province": 1,
|
||||
reported: 1,
|
||||
date_report: 1,
|
||||
username_who_report: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
$match: {
|
||||
$or: [
|
||||
{
|
||||
$and: [
|
||||
{
|
||||
"profile.mygroups": {
|
||||
$elemMatch: {
|
||||
groupname: {
|
||||
$in: [
|
||||
"000017",
|
||||
"risoprova",
|
||||
"VillaggiamoItalia",
|
||||
"Terraw",
|
||||
"RisoBenevento",
|
||||
"111",
|
||||
"gruppodefaultriso",
|
||||
"pontiUmani",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
pub_to_share: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
$or: [
|
||||
{
|
||||
pub_to_share: {
|
||||
$exists: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
pub_to_share: {
|
||||
$exists: true,
|
||||
$eq: 0,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
$match: {
|
||||
$and: [
|
||||
{
|
||||
"mycities.reg": "EMR",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
$group: {
|
||||
_id: null,
|
||||
count: {
|
||||
$sum: 1,
|
||||
},
|
||||
results: {
|
||||
$push: "$$ROOT",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: {
|
||||
count: 1,
|
||||
rows: {
|
||||
$slice: [
|
||||
"$results",
|
||||
0,
|
||||
10,
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
db.myskills.aggregate(aggregation);
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"node-emoji": "^1.11.0",
|
||||
"node-image-resizer": "^1.0.0",
|
||||
"node-pre-gyp": "^0.14.0",
|
||||
"node-pty": "^1.0.0",
|
||||
"node-telegram-bot-api": "^0.65.1",
|
||||
"nodemailer": "^6.7.8",
|
||||
"npm-check-updates": "^16.14.18",
|
||||
@@ -61,6 +62,7 @@
|
||||
"superagent": "^8.0.0",
|
||||
"url-parse": "^1.5.10",
|
||||
"validator": "^13.7.0",
|
||||
"vhost": "^3.0.2",
|
||||
"web-push": "^3.6.7",
|
||||
"xoauth2": "^1.2.0"
|
||||
},
|
||||
|
||||
10
pcb_agg_server.js.sh
Executable file
10
pcb_agg_server.js.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
source ./.env.prod.pcb
|
||||
|
||||
echo "Sincronizzazione in corso PCB PRODUZIONE ... /var/www/$SERVERDIR_WEBSITE/"
|
||||
echo ""
|
||||
|
||||
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
|
||||
|
||||
echo "Sincronizzazione TERMINATA! - SERVER PCB!"
|
||||
30
scripts/docker_copia_da_a.sh
Normal file
30
scripts/docker_copia_da_a.sh
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Ensure two arguments are provided
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Usage: $0 <source_directory> <destination_directory>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DIR_ORIG=$1
|
||||
DIR_DEST=$2
|
||||
|
||||
# Check if the source directory exists
|
||||
if [ ! -d "$DIR_ORIG" ]; then
|
||||
echo "Error: Source directory '$DIR_ORIG' does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create the destination directory if it doesn't exist
|
||||
#mkdir -p "$DIR_DEST"
|
||||
|
||||
# Run the Docker command to copy files
|
||||
docker run --rm -v "$DIR_ORIG":/from -v "$DIR_DEST":/to alpine ash -c "cp -av /from/. /to"
|
||||
|
||||
# Check if the Docker command was successful
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Files copied successfully from '$DIR_ORIG' to '$DIR_DEST'."
|
||||
else
|
||||
echo "Error: Failed to copy files."
|
||||
exit 1
|
||||
fi
|
||||
@@ -85,16 +85,16 @@
|
||||
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_USER": "il conto %s '%s' (%s) sta inviando <strong>%s %s</strong> a %s sul '%s'.",
|
||||
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_YOU": "il conto %s '%s' (%s) ti sta inviando <strong>%s %s</strong> sul '%s'",
|
||||
"CIRCUIT_SENDCOINSREQ_FROM_GROUP_TO_GROUP": "il conto %s '%s' (%s) sta inviando <strong>%s %s</strong> al conto %s '%s' sul '%s'.",
|
||||
"CIRCUIT_SENDCOINSREQ_TO_ME": "Stai inviando <strong>%s %s</strong> a %s sul '%s'. \nIl destinatario deve accettare la transazione.",
|
||||
"CIRCUIT_SENDCOINSREQ_TO_GROUP": "Stai inviando <strong>%s %s</strong> al Conto %s '%s' sul '%s'. \nIl destinatario deve accettare la transazione.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_YOU": "<strong>%s %s</strong> accettati dal Conto %s '%s' sul '%s' (%s) .",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_GROUP": "il conto %s '%s' (%s) ha accettato <strong>%s %s</strong> dal conto %s '%s' sul '%s' (%s).",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_GROUP": "il conto %s '%s' (%s) ha accettato <strong>%s %s</strong> da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_YOU": "<strong>%s %s</strong> accettati da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED": "<strong>%s %s</strong> accettati da %s sul '%s'.",
|
||||
"CIRCUIT_SENDCOINSREQ_TO_ME": "Stai inviando <strong>%s %s</strong> a %s sul '%s'.",
|
||||
"CIRCUIT_SENDCOINSREQ_TO_GROUP": "Stai inviando <strong>%s %s</strong> al Conto %s '%s' sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_YOU": "Hai ricevuto <strong>%s %s</strong> dal Conto %s '%s' sul '%s' (%s) .",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_GROUP": "il conto %s '%s' (%s) ha ricevuto <strong>%s %s</strong> dal conto %s '%s' sul '%s' (%s).",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_GROUP": "il conto %s '%s' (%s) ha ricevuto <strong>%s %s</strong> da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_FROM_ME_TO_YOU": "Hai ricevuto <strong>%s %s</strong> da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED": "<strong>%s %s</strong> ricevuti da %s sul '%s'.",
|
||||
"SALDO_UPDATE": "[Saldo <strong>%s %s</strong> sul '%s']",
|
||||
"SALDO_UPDATE_WHO": "[Saldo %s <strong>%s %s</strong> sul '%s']",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_TO_ME": "<strong>%s %s</strong> sono stati accettati da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_ACCEPTED_TO_ME": "Hai inviato <strong>%s %s</strong> a %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_REFUSED": "%s %s rifiutati da %s sul '%s'.",
|
||||
"ID_CIRCUIT_COINS_REFUSED_TO_ME": "%s %s rifiutati da %s sul '%s'.",
|
||||
"CIRCUIT_AMOUNT_EXCEED_FIDO": "L'importo supera la quantità massima concessa per %s",
|
||||
|
||||
395
src/server/models/attivita.js
Executable file
395
src/server/models/attivita.js
Executable file
@@ -0,0 +1,395 @@
|
||||
const mongoose = require('mongoose').set('debug', false);
|
||||
const Schema = mongoose.Schema;
|
||||
|
||||
mongoose.Promise = global.Promise;
|
||||
mongoose.level = 'F';
|
||||
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { Reaction } = require('./reaction');
|
||||
const { MyGroup } = require('./mygroup');
|
||||
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
const { ObjectID } = require('mongodb');
|
||||
|
||||
// Resolving error Unknown modifier: $pushAll
|
||||
mongoose.plugin(schema => {
|
||||
schema.options.usePushEach = true;
|
||||
});
|
||||
|
||||
const AttivitaSchema = new Schema(
|
||||
{
|
||||
...{
|
||||
_id: {
|
||||
type: String,
|
||||
default: function () {
|
||||
return new ObjectID().toString();
|
||||
},
|
||||
},
|
||||
idapp: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
// userId: { type: Schema.Types.ObjectId, ref: 'User' },
|
||||
idSector: {
|
||||
type: Number,
|
||||
},
|
||||
idSkill: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
idCity: [
|
||||
{
|
||||
type: Number,
|
||||
}],
|
||||
logo:
|
||||
{
|
||||
imagefile: {
|
||||
type: String,
|
||||
},
|
||||
alt: {
|
||||
type: String,
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
photos: [
|
||||
{
|
||||
imagefile: {
|
||||
type: String,
|
||||
},
|
||||
alt: {
|
||||
type: String,
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
},
|
||||
}],
|
||||
note: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
website: {
|
||||
type: String,
|
||||
},
|
||||
date_created: {
|
||||
type: Date,
|
||||
},
|
||||
date_updated: {
|
||||
type: Date,
|
||||
},
|
||||
|
||||
tipodiAttivita: {
|
||||
type: Number,
|
||||
},
|
||||
|
||||
descr: {
|
||||
type: String,
|
||||
},
|
||||
note: {
|
||||
type: String,
|
||||
},
|
||||
|
||||
coordinate_gps: {
|
||||
address: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
enum: ['Point'], // Specifica il tipo, in questo caso solo 'Point'
|
||||
required: false,
|
||||
},
|
||||
coordinates: {
|
||||
type: [Number], // L'array dovrebbe contenere lon e lat
|
||||
required: false,
|
||||
index: '2dsphere' // Indice geospaziale [lng, lat]
|
||||
},
|
||||
},
|
||||
|
||||
email: {
|
||||
type: String,
|
||||
},
|
||||
telegram_username: {
|
||||
type: String,
|
||||
},
|
||||
cell_phone: {
|
||||
type: String,
|
||||
},
|
||||
whatsapp: {
|
||||
type: String,
|
||||
},
|
||||
createdBy: { // Username del creatore (proponente)
|
||||
type: String,
|
||||
},
|
||||
|
||||
|
||||
//**ADDFIELD_ATTIVITA
|
||||
},
|
||||
...Reaction.getFieldsForReactions(),
|
||||
...MyGroup.getFieldsForAnnunci()
|
||||
}, { strict: false });
|
||||
|
||||
AttivitaSchema.index({ 'idapp': 1 });
|
||||
|
||||
|
||||
AttivitaSchema.pre('save', async function (next) {
|
||||
if (this.isNew) {
|
||||
if (!this.date_created)
|
||||
this.date_created = new Date();
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
AttivitaSchema.statics.findAllIdApp = async function (idapp) {
|
||||
const Attivita = this;
|
||||
|
||||
const query = [
|
||||
{ $match: { idapp } },
|
||||
{ $sort: { descr: 1 } },
|
||||
];
|
||||
|
||||
return await Attivita.aggregate(query).then((arrrec) => {
|
||||
return arrrec;
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
AttivitaSchema.statics.getFieldsForSearch = function () {
|
||||
return [];
|
||||
};
|
||||
|
||||
AttivitaSchema.statics.getFieldsLastForSearch = function () {
|
||||
return [
|
||||
{ field: 'note', type: tools.FieldType.string },
|
||||
{ field: 'descr', type: tools.FieldType.string },
|
||||
{ field: 'recSkill.descr', type: tools.FieldType.string },
|
||||
{ field: 'attivita.descr', type: tools.FieldType.string },
|
||||
];
|
||||
};
|
||||
|
||||
AttivitaSchema.statics.executeQueryTable = function (idapp, params, user) {
|
||||
params.fieldsearch = this.getFieldsForSearch();
|
||||
params.fieldsearch_last = this.getFieldsLastForSearch();
|
||||
|
||||
const otherparams = {
|
||||
lookup1: {
|
||||
lk_tab: 'users',
|
||||
lk_LF: 'userId',
|
||||
lk_FF: '_id',
|
||||
lk_as: 'user',
|
||||
af_objId_tab: 'myId',
|
||||
lk_proj: this.getProject(),
|
||||
},
|
||||
};
|
||||
|
||||
params = { ...params, ...otherparams };
|
||||
|
||||
return tools.executeQueryTable(this, idapp, params, user);
|
||||
};
|
||||
|
||||
AttivitaSchema.statics.getMyRecById = function (idapp, idSkill) {
|
||||
const Attivita = this;
|
||||
|
||||
let query = [
|
||||
{
|
||||
'$match': {
|
||||
'_id': idSkill, idapp
|
||||
},
|
||||
},
|
||||
{
|
||||
'$sort': {
|
||||
'desc': 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
'$addFields': {
|
||||
'myId1': {
|
||||
'$toObjectId': '$userId',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
'$lookup': {
|
||||
'from': 'users',
|
||||
'localField': 'myId1',
|
||||
'foreignField': '_id',
|
||||
'as': 'user',
|
||||
},
|
||||
},
|
||||
{
|
||||
'$replaceRoot': {
|
||||
'newRoot': {
|
||||
'$mergeObjects': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$user',
|
||||
0,
|
||||
],
|
||||
},
|
||||
'$$ROOT',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: this.getProject(),
|
||||
},
|
||||
{
|
||||
'$lookup': {
|
||||
'from': 'skills',
|
||||
'localField': 'idSkill',
|
||||
'foreignField': '_id',
|
||||
'as': 'recSkill',
|
||||
},
|
||||
},
|
||||
{
|
||||
'$replaceRoot': {
|
||||
'newRoot': {
|
||||
'$mergeObjects': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$recSkill',
|
||||
0,
|
||||
],
|
||||
},
|
||||
'$$ROOT',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: this.getProject(),
|
||||
},
|
||||
{
|
||||
'$lookup': {
|
||||
'from': 'sectors',
|
||||
'localField': 'idSector',
|
||||
'foreignField': '_id',
|
||||
'as': 'sector',
|
||||
},
|
||||
},
|
||||
{
|
||||
'$replaceRoot': {
|
||||
'newRoot': {
|
||||
'$mergeObjects': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$sector',
|
||||
0,
|
||||
],
|
||||
},
|
||||
'$$ROOT',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: this.getProject(),
|
||||
},
|
||||
{
|
||||
'$replaceRoot': {
|
||||
'newRoot': {
|
||||
'$mergeObjects': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$attivita',
|
||||
0,
|
||||
],
|
||||
},
|
||||
'$$ROOT',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$project: this.getProject(),
|
||||
},
|
||||
{
|
||||
'$lookup': {
|
||||
'from': 'cities',
|
||||
'localField': 'idCity',
|
||||
'foreignField': '_id',
|
||||
'as': 'mycities',
|
||||
},
|
||||
},
|
||||
{
|
||||
'$replaceRoot': {
|
||||
'newRoot': {
|
||||
'$mergeObjects': [
|
||||
{
|
||||
'$arrayElemAt': [
|
||||
'$mycities',
|
||||
0,
|
||||
],
|
||||
},
|
||||
'$$ROOT',
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
let numtab = tools.getNumTabByTable(shared_consts.TABLES_ATTIVITAS);
|
||||
|
||||
const objadd = tools.addNumFavoriteAndBookmarkToQuery(idapp, numtab);
|
||||
query = [...query, ...objadd.query];
|
||||
|
||||
const toadd = {
|
||||
$project: this.getProject(objadd.proj),
|
||||
};
|
||||
|
||||
query = [...query, { ...toadd }];
|
||||
|
||||
return Attivita.aggregate(query).then((rec) => {
|
||||
return rec ? rec[0] : null;
|
||||
});
|
||||
};
|
||||
|
||||
AttivitaSchema.statics.getProject = function (proj_add2) {
|
||||
let proj = {
|
||||
recSkill: 1,
|
||||
sector: 1,
|
||||
idSector: 1,
|
||||
idSkill: 1,
|
||||
idCity: 1,
|
||||
logo: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
descr: 1,
|
||||
website: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
tipodiAttivita: 1,
|
||||
coordinate_gps: 1,
|
||||
email: 1,
|
||||
telegram_username: 1,
|
||||
cell_phone: 1,
|
||||
whatsapp: 1,
|
||||
createdBy: 1,
|
||||
//**ADDFIELD_ATTIVITA
|
||||
};
|
||||
|
||||
const proj_add = shared_consts.getProjectForAll(proj_add2)
|
||||
|
||||
return Object.assign({}, proj, proj_add);
|
||||
|
||||
}
|
||||
|
||||
AttivitaSchema.statics.getCompleteRecord = function (idapp, id) {
|
||||
const Attivita = this;
|
||||
|
||||
return Attivita.getMyRecById(idapp, id);
|
||||
|
||||
};
|
||||
|
||||
const Attivita = mongoose.model('Attivita', AttivitaSchema);
|
||||
|
||||
Attivita.createIndexes((err) => {
|
||||
if (err) throw err;
|
||||
});
|
||||
|
||||
module.exports = { Attivita };
|
||||
@@ -14,6 +14,7 @@ const { Account } = require('../models/account');
|
||||
const { Province } = require('../models/province');
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
|
||||
const i18n = require('i18n');
|
||||
|
||||
// Resolving error Unknown modifier: $pushAll
|
||||
@@ -663,6 +664,8 @@ CircuitSchema.statics.sendCoins = async function (onlycheck, idapp, usernameOrig
|
||||
|
||||
const { User } = require('../models/user');
|
||||
|
||||
const sendemail = require('../sendemail');
|
||||
|
||||
let ris = {
|
||||
result: false,
|
||||
cansend: true,
|
||||
@@ -766,6 +769,33 @@ CircuitSchema.statics.sendCoins = async function (onlycheck, idapp, usernameOrig
|
||||
|
||||
tools.sendMsgTelegramToAdmin(idapp, msg);
|
||||
|
||||
let mittente = orig;
|
||||
|
||||
try {
|
||||
if (extrarec.dest) {
|
||||
let myuserDest = await User.getUserByUsername(idapp, extrarec.dest);
|
||||
|
||||
// Invia una email al destinatario !
|
||||
await sendemail.sendEmail_RisRicevuti(myuserDest.lang, myuserDest, myuserDest.email, idapp, { mittente, nomecircuito: circuittable.name, symbol: circuittable.symbol, qty: myqty });
|
||||
|
||||
} else if (extrarec.groupdest || extrarec.contoComDest) {
|
||||
let arrusers = await MyGroup.getListAdminsByGroupName(idapp, groupDestoContoCom);
|
||||
if (arrusers.length <= 0)
|
||||
arrusers = await Circuit.getListAdminsByCircuitPath(idapp, groupDestoContoCom);
|
||||
|
||||
for (let i = 0; i < arrusers.length; i++) {
|
||||
|
||||
let myuserDest = await User.getUserByUsername(idapp, arrusers[i].username);
|
||||
|
||||
// Invia una email al destinatario !
|
||||
await sendemail.sendEmail_RisRicevuti(myuserDest.lang, myuserDest, myuserDest.email, idapp, { mittente, nomecircuito: circuittable.name, symbol: circuittable.symbol, qty: myqty });
|
||||
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Err Email sendCoins', e);
|
||||
}
|
||||
|
||||
} else {
|
||||
// console.log('NON Inviate Monete da', usernameOrig, extrarec.grouporig, extrarec.dest, extrarec.groupdest, myqty, extrarec.causal);
|
||||
}
|
||||
@@ -1597,7 +1627,7 @@ CircuitSchema.statics.replaceAllCircuitNames = async function (idapp) {
|
||||
newname = 'Circuito RIS Roma Nord';
|
||||
} else if (circuit.name == 'Circuito RIS Benevento' || circuit.name == 'Circuito RIS Campania') {
|
||||
newname = 'Circuito RIS Campania';
|
||||
path = 'riscampania';
|
||||
path = 'riscampania';
|
||||
} else if (circuit.name == 'Circuito RIS Milano Est') {
|
||||
newname = 'Circuito RIS Milano Est';
|
||||
} else if (circuit.name == 'Circuito RIS Repubblica di San Marino') {
|
||||
@@ -1637,6 +1667,34 @@ CircuitSchema.statics.replaceAllCircuitNames = async function (idapp) {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CircuitSchema.statics.getnumCircuits = async function (idapp) {
|
||||
const Circuit = this;
|
||||
|
||||
const numcirc = await Circuit.countDocuments(
|
||||
{
|
||||
idapp,
|
||||
transactionsEnabled: true,
|
||||
});
|
||||
|
||||
return numcirc;
|
||||
|
||||
};
|
||||
|
||||
CircuitSchema.statics.getnumActiveCircuits = async function (idapp) {
|
||||
const Circuit = this;
|
||||
|
||||
const numcirc = await Circuit.countDocuments(
|
||||
{
|
||||
idapp,
|
||||
transactionsEnabled: true,
|
||||
totTransato: { $gt: 1 },
|
||||
});
|
||||
|
||||
return numcirc;
|
||||
|
||||
};
|
||||
|
||||
CircuitSchema.statics.addMovementByOrdersCart = async function (ordersCart, usernameDest, groupDest) {
|
||||
|
||||
const { User } = require('../models/user');
|
||||
|
||||
@@ -213,7 +213,7 @@ MovementSchema.statics.getQueryMovsByCircuitId = async function (idapp, username
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
$lookup: {
|
||||
from: 'circuits',
|
||||
@@ -671,6 +671,48 @@ MovementSchema.statics.getQueryAllUsersMovsByCircuitId = async function (idapp,
|
||||
return [];
|
||||
};
|
||||
|
||||
MovementSchema.statics.getTotal_Transactions = async function (idapp) {
|
||||
const MyMovement = this;
|
||||
|
||||
const numtransac = await MyMovement.countDocuments(
|
||||
{
|
||||
idapp,
|
||||
});
|
||||
|
||||
return numtransac;
|
||||
|
||||
};
|
||||
|
||||
MovementSchema.statics.getTot_RIS_Transati = async function (idapp) {
|
||||
const MyMovement = this;
|
||||
|
||||
// Utilizza l'aggregazione per sommare tutti gli 'amount' per un dato 'idapp'
|
||||
const numtot = await MyMovement.aggregate([
|
||||
{
|
||||
$match: { idapp } // Filtra i documenti per 'idapp'
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
transactionDate: -1,
|
||||
}
|
||||
},
|
||||
{
|
||||
$group: {
|
||||
_id: null,
|
||||
totalAmount: { $sum: "$amount" } // Somma tutti gli 'amount'
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
try {
|
||||
return numtot.length > 0 ? numtot[0].totalAmount : 0;
|
||||
} catch (e) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
MovementSchema.statics.getMovsByCircuitId = async function (idapp, username, circuitId) {
|
||||
const MyMovement = this;
|
||||
|
||||
@@ -699,6 +741,284 @@ MovementSchema.statics.checkIfCoinsAlreadySent = async function (notifId) {
|
||||
|
||||
};
|
||||
|
||||
MovementSchema.statics.getLastN_Transactions = async function (idapp, numtransaz = 10) {
|
||||
const MyMovement = this;
|
||||
|
||||
// get last "numtransaz" transactions
|
||||
|
||||
|
||||
let aggr1 = [
|
||||
{
|
||||
$match: {
|
||||
idapp,
|
||||
},
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
transactionDate: -1,
|
||||
}
|
||||
},
|
||||
{ $limit: numtransaz },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'accounts',
|
||||
localField: 'accountFromId',
|
||||
foreignField: '_id',
|
||||
as: 'accfrom',
|
||||
},
|
||||
},
|
||||
{ $unwind: '$accfrom' },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'users',
|
||||
let: { username: '$accfrom.username', idapp: '$accfrom.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$username', '$username'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'userfrom',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$userfrom',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'mygroups',
|
||||
let: { groupname: '$accfrom.groupname', idapp: '$accfrom.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$groupname', '$groupname'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'groupfrom',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$groupfrom',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
$lookup: {
|
||||
from: 'circuits',
|
||||
let: { contocom: '$accfrom.contocom', idapp: '$accfrom.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$contocom', '$path'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'contocomfrom',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$contocomfrom',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'accounts',
|
||||
localField: 'accountToId',
|
||||
foreignField: '_id',
|
||||
as: 'accto',
|
||||
},
|
||||
},
|
||||
{ $unwind: '$accto' },
|
||||
{
|
||||
$lookup: {
|
||||
from: 'circuits',
|
||||
localField: 'accfrom.circuitId',
|
||||
foreignField: '_id',
|
||||
as: 'circuitfrom',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: '$circuitfrom',
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'circuits',
|
||||
localField: 'accto.circuitId',
|
||||
foreignField: '_id',
|
||||
as: 'circuitto',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: '$circuitto',
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'users',
|
||||
let: { username: '$accto.username', idapp: '$accto.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$username', '$username'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'userto',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$userto',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'mygroups',
|
||||
let: { groupname: '$accto.groupname', idapp: '$accto.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$groupname', '$groupname'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'groupto',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$groupto',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'circuits',
|
||||
let: { contocom: '$accto.contocom', idapp: '$accto.idapp' },
|
||||
pipeline: [
|
||||
{
|
||||
$match:
|
||||
{
|
||||
$expr:
|
||||
{
|
||||
$and:
|
||||
[
|
||||
{ $eq: ['$$contocom', '$path'] },
|
||||
{ $eq: ['$$idapp', '$idapp'] },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
as: 'contocomto',
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$contocomto',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$project:
|
||||
{
|
||||
transactionDate: 1,
|
||||
amount: 1,
|
||||
causal: 1,
|
||||
notifId: 1,
|
||||
'circuitfrom.symbol': 1,
|
||||
'circuitfrom.name': 1,
|
||||
'circuitto.symbol': 1,
|
||||
'circuitto.name': 1,
|
||||
'userfrom.verified_by_aportador': 1,
|
||||
'userfrom.username': 1,
|
||||
'userfrom.profile.img': 1,
|
||||
'userto.username': 1,
|
||||
'userto.profile.img': 1,
|
||||
'userto.verified_by_aportador': 1,
|
||||
'groupfrom.groupname': 1,
|
||||
'groupfrom.verified_by_aportador': 1,
|
||||
'groupfrom.title': 1,
|
||||
'groupfrom.photos': 1,
|
||||
'groupto.groupname': 1,
|
||||
'groupto.title': 1,
|
||||
'groupto.photos': 1,
|
||||
'groupto.verified_by_aportador': 1,
|
||||
'contocomfrom.path': 1,
|
||||
'contocomfrom.name': 1,
|
||||
'contocomto.path': 1,
|
||||
'contocomto.name': 1,
|
||||
},
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
const lastNtransac = await MyMovement.aggregate(aggr1);
|
||||
|
||||
/*
|
||||
transacDate: Date
|
||||
mitt_username: string
|
||||
mitt_group: string
|
||||
dest_username: string
|
||||
dest_group: string
|
||||
circuito: string
|
||||
amount: number
|
||||
causale: string
|
||||
|
||||
*/
|
||||
|
||||
|
||||
return lastNtransac;
|
||||
};
|
||||
|
||||
const Movement = mongoose.model('Movement', MovementSchema);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ const { ObjectID } = require('mongodb');
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
const { Reaction } = require('./reaction');
|
||||
const { MyGroup } = require('./mygroup');
|
||||
|
||||
const tableModel = shared_consts.TABLES_MYBACHECAS;
|
||||
|
||||
@@ -118,7 +119,8 @@ const MyBachecaSchema = new Schema({
|
||||
type: Date,
|
||||
},
|
||||
},
|
||||
...Reaction.getFieldsForReactions()
|
||||
...Reaction.getFieldsForReactions(),
|
||||
...MyGroup.getFieldsForAnnunci()
|
||||
});
|
||||
|
||||
MyBachecaSchema.pre('save', async function (next) {
|
||||
|
||||
@@ -16,6 +16,7 @@ mongoose.plugin(schema => {
|
||||
const myCard = new Schema(
|
||||
{
|
||||
imagefile: String,
|
||||
vers_img: Number,
|
||||
alt: String,
|
||||
description: String,
|
||||
style: String,
|
||||
@@ -23,6 +24,7 @@ const myCard = new Schema(
|
||||
color: String,
|
||||
content: String,
|
||||
colorsub: String,
|
||||
link: String,
|
||||
}
|
||||
)
|
||||
const animation = new Schema(
|
||||
@@ -44,13 +46,19 @@ const elemText = new Schema(
|
||||
}
|
||||
);
|
||||
|
||||
const catalogo = new Schema(
|
||||
{
|
||||
//++AddCATALOGO_FIELDS
|
||||
productTypes: [{ type: Number }],
|
||||
excludeproductTypes: [{ type: Number }],
|
||||
Editore: [{ type: String }],
|
||||
pdf: { type: Boolean },
|
||||
// formato: [{ type: String, default: '' }],
|
||||
// categoria: [{ type: String, default: '' }],
|
||||
}
|
||||
);
|
||||
|
||||
const MyElemSchema = new Schema({
|
||||
_id: {
|
||||
type: ObjectId,
|
||||
default: function () {
|
||||
return new ObjectId();
|
||||
},
|
||||
},
|
||||
idapp: {
|
||||
type: String,
|
||||
},
|
||||
@@ -163,12 +171,21 @@ const MyElemSchema = new Schema({
|
||||
image: {
|
||||
type: String,
|
||||
},
|
||||
vers_img: {
|
||||
type: Number,
|
||||
},
|
||||
titleBanner: String,
|
||||
classBanner: String,
|
||||
listcards: [myCard],
|
||||
catalogo: catalogo,
|
||||
list: [
|
||||
{
|
||||
imagefile: {
|
||||
type: String
|
||||
},
|
||||
vers_img: {
|
||||
type: Number,
|
||||
},
|
||||
order: {
|
||||
type: Number
|
||||
},
|
||||
|
||||
@@ -7,6 +7,7 @@ mongoose.level = 'F';
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { Reaction } = require('./reaction');
|
||||
const { MyGroup } = require('./mygroup');
|
||||
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
@@ -90,7 +91,8 @@ const MyGoodSchema = new Schema({
|
||||
type: Date,
|
||||
},
|
||||
},
|
||||
...Reaction.getFieldsForReactions()
|
||||
...Reaction.getFieldsForReactions(),
|
||||
...MyGroup.getFieldsForAnnunci()
|
||||
});
|
||||
|
||||
MyGoodSchema.pre('save', async function (next) {
|
||||
|
||||
@@ -8,6 +8,8 @@ const shared_consts = require('../tools/shared_nodejs');
|
||||
mongoose.Promise = global.Promise;
|
||||
mongoose.level = 'F';
|
||||
|
||||
const { ObjectID } = require('mongodb');
|
||||
|
||||
// Resolving error Unknown modifier: $pushAll
|
||||
mongoose.plugin(schema => {
|
||||
schema.options.usePushEach = true;
|
||||
@@ -123,6 +125,12 @@ const MyGroupSchema = new Schema({
|
||||
lastdate_reqRisGroup: {
|
||||
type: Date,
|
||||
},
|
||||
|
||||
idMyGroup: {
|
||||
type: String,
|
||||
},
|
||||
// **ADDFIELD_MYGROUPS
|
||||
|
||||
});
|
||||
|
||||
MyGroupSchema.statics.getFieldsForSearch = function () {
|
||||
@@ -234,7 +242,7 @@ MyGroupSchema.statics.getListAdminsByGroupName = async function (idapp, groupnam
|
||||
|
||||
MyGroupSchema.statics.getWhatToShow = function (idapp, username) {
|
||||
// FOR ME, PERMIT ALL
|
||||
return {
|
||||
let whatToShow = {
|
||||
groupname: 1,
|
||||
title: 1,
|
||||
descr: 1,
|
||||
@@ -258,10 +266,14 @@ MyGroupSchema.statics.getWhatToShow = function (idapp, username) {
|
||||
lastdate_reqRisGroup: 1,
|
||||
};
|
||||
|
||||
whatToShow = { ...whatToShow, ...shared_consts.ANNUNCI_FIELDS };
|
||||
|
||||
return whatToShow;
|
||||
|
||||
};
|
||||
|
||||
MyGroupSchema.statics.getWhatToShow_Unknown = function (idapp, username) {
|
||||
return {
|
||||
let whatToShow = {
|
||||
groupname: 1,
|
||||
title: 1,
|
||||
descr: 1,
|
||||
@@ -275,6 +287,11 @@ MyGroupSchema.statics.getWhatToShow_Unknown = function (idapp, username) {
|
||||
mycircuits: 1,
|
||||
lastdate_reqRisGroup: 1,
|
||||
};
|
||||
|
||||
whatToShow = { ...whatToShow, ...shared_consts.ANNUNCI_FIELDS };
|
||||
|
||||
return whatToShow;
|
||||
|
||||
};
|
||||
|
||||
MyGroupSchema.statics.getArrUsernameFromFieldByGroupname = async function (
|
||||
@@ -646,7 +663,16 @@ MyGroupSchema.statics.setReceiveRisGroup = async function (idapp, groupname) {
|
||||
|
||||
};
|
||||
|
||||
MyGroupSchema.statics.getFieldsForAnnunci = function () {
|
||||
let annunciFields = {
|
||||
idMyGroup: {
|
||||
type: String,
|
||||
},
|
||||
// **ADDFIELD_MYGROUPS
|
||||
};
|
||||
|
||||
return annunciFields;
|
||||
};
|
||||
|
||||
const MyGroup = mongoose.model('MyGroup', MyGroupSchema);
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ mongoose.level = 'F';
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { Reaction } = require('./reaction');
|
||||
const { MyGroup } = require('./mygroup');
|
||||
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
const { ObjectID } = require('mongodb');
|
||||
@@ -29,6 +30,9 @@ const MyHospSchema = new Schema({
|
||||
visibile: {
|
||||
type: Boolean
|
||||
},
|
||||
adType: {
|
||||
type: Number,
|
||||
},
|
||||
typeHosp: { // scambio casa / ospitalità
|
||||
type: Number,
|
||||
},
|
||||
@@ -94,7 +98,8 @@ const MyHospSchema = new Schema({
|
||||
type: Date,
|
||||
},
|
||||
},
|
||||
...Reaction.getFieldsForReactions()
|
||||
...Reaction.getFieldsForReactions(),
|
||||
...MyGroup.getFieldsForAnnunci()
|
||||
});
|
||||
|
||||
MyHospSchema.pre('save', async function (next) {
|
||||
@@ -325,6 +330,19 @@ MyHospSchema.statics.getCompleteRecord = function (idapp, id) {
|
||||
|
||||
};
|
||||
|
||||
MyHospSchema.statics.SettaAdTypeOffro_In_Hosps = function () {
|
||||
const MyHosp = this;
|
||||
|
||||
// Set all records 'adType' to shared_consts.AdType.OFFRO
|
||||
MyHosp.updateMany({}, { $set: { adType: shared_consts.AdType.OFFRO } }, function (err, result) {
|
||||
if (err) {
|
||||
console.error('Error updating adType:', err);
|
||||
} else {
|
||||
console.log('Successfully updated adType for', result.nModified, 'records');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
MyHospSchema.statics.getProject = function () {
|
||||
let proj = {
|
||||
visibile: 1,
|
||||
|
||||
@@ -130,7 +130,13 @@ const MyPageSchema = new Schema({
|
||||
},
|
||||
showFooter: {
|
||||
type: Boolean,
|
||||
}
|
||||
},
|
||||
mainMenu: {
|
||||
type: Boolean,
|
||||
},
|
||||
sottoMenu: [{
|
||||
type: String
|
||||
}],
|
||||
});
|
||||
|
||||
MyPageSchema.statics.getFieldsForSearch = function () {
|
||||
@@ -169,10 +175,11 @@ MyPageSchema.statics.findOnlyStruttRec = async function (idapp) {
|
||||
});
|
||||
|
||||
const arrfixed = await MyPage.find(
|
||||
{ idapp,
|
||||
{
|
||||
idapp,
|
||||
$or: [
|
||||
{loadFirst: {$exists: false}},
|
||||
{loadFirst: {$exists: true, $eq: false}}],
|
||||
{ loadFirst: { $exists: false } },
|
||||
{ loadFirst: { $exists: true, $eq: false } }],
|
||||
}
|
||||
, {
|
||||
title: 1,
|
||||
@@ -190,6 +197,8 @@ MyPageSchema.statics.findOnlyStruttRec = async function (idapp) {
|
||||
iconsize: 1,
|
||||
extraclass: 1,
|
||||
loadFirst: 1,
|
||||
mainMenu: 1,
|
||||
sottoMenu: 1,
|
||||
}, (err, arrrec) => {
|
||||
return arrrec
|
||||
});
|
||||
|
||||
@@ -7,6 +7,7 @@ mongoose.level = 'F';
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { Reaction } = require('./reaction');
|
||||
const { MyGroup } = require('./mygroup');
|
||||
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
@@ -97,7 +98,8 @@ const MySkillSchema = new Schema(
|
||||
type: Date,
|
||||
},
|
||||
},
|
||||
...Reaction.getFieldsForReactions()
|
||||
...Reaction.getFieldsForReactions(),
|
||||
...MyGroup.getFieldsForAnnunci()
|
||||
}, { strict: false });
|
||||
|
||||
MySkillSchema.index({ 'idapp': 1 });
|
||||
|
||||
@@ -1132,7 +1132,7 @@ module.exports.getmsgorderTelegram = async function (ordersCart) {
|
||||
msg += '<br>Note: ' + ordersCart.note;
|
||||
|
||||
|
||||
msg += '<br><br>Lista Prodotti: (🍊🥑🍋)';
|
||||
msg += '<br><br>Lista Prodotti:'; // 🍊🥑🍋
|
||||
for (const ord of ordersCart.items) {
|
||||
msg += '<br>';
|
||||
let qtystr = ''
|
||||
|
||||
@@ -500,6 +500,20 @@ module.exports.findAllIdApp = async function (idapp, code, id, all) {
|
||||
as: 'productInfo.authors'
|
||||
}
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'publishers',
|
||||
localField: 'productInfo.idPublisher',
|
||||
foreignField: '_id',
|
||||
as: 'productInfo.publisher'
|
||||
}
|
||||
},
|
||||
{
|
||||
$unwind: {
|
||||
path: '$productInfo.publisher',
|
||||
preserveNullAndEmptyArrays: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
from: 'catprods',
|
||||
|
||||
@@ -88,6 +88,9 @@ const productInfoSchema = new Schema({
|
||||
checkout_link: {
|
||||
type: String,
|
||||
},
|
||||
versioneGM: {
|
||||
type: String,
|
||||
},
|
||||
img2: {
|
||||
type: String,
|
||||
},
|
||||
@@ -114,9 +117,12 @@ const productInfoSchema = new Schema({
|
||||
date_publishing: {
|
||||
type: Date,
|
||||
},
|
||||
productType: {
|
||||
date_publishing_ts: {
|
||||
type: Number,
|
||||
},
|
||||
productTypes: [{
|
||||
type: Number,
|
||||
}],
|
||||
|
||||
});
|
||||
|
||||
@@ -215,6 +221,51 @@ module.exports.findAllIdApp = async function (idapp, code, id) {
|
||||
module.exports.getProductByCode = function (idapp, code) {
|
||||
return productInfo.findAllIdApp(idapp, code);
|
||||
}
|
||||
module.exports.correggiProductTypes = async function() {
|
||||
const ProductInfo = this;
|
||||
const bulkOps = [];
|
||||
|
||||
try {
|
||||
// Fase di aggregazione
|
||||
const cursor = ProductInfo.aggregate([
|
||||
{
|
||||
$project: {
|
||||
_id: 1,
|
||||
productType: 1,
|
||||
productTypes: [{ $ifNull: ['$productType', 10] }]
|
||||
}
|
||||
}
|
||||
]).cursor({ batchSize: 1000 }).exec();
|
||||
|
||||
// Itera attraverso ogni documento utilizzando il cursore
|
||||
for await (const doc of cursor) {
|
||||
bulkOps.push({
|
||||
updateOne: {
|
||||
filter: { _id: doc._id },
|
||||
update: {
|
||||
$set: { productTypes: doc.productTypes },
|
||||
$unset: { productType: "" }
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Scrivi i batch di operazioni ogni 1000 documenti
|
||||
if (bulkOps.length === 1000) {
|
||||
await ProductInfo.bulkWrite(bulkOps);
|
||||
bulkOps.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Scrivi eventuali operazioni rimanenti
|
||||
if (bulkOps.length > 0) {
|
||||
await ProductInfo.bulkWrite(bulkOps);
|
||||
}
|
||||
|
||||
console.log('ProductInfo.productType converted to productTypes array and saved');
|
||||
} catch (err) {
|
||||
console.error('Error converting ProductInfo.productType:', err);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.createIndexes((err) => {
|
||||
if (err) throw err;
|
||||
|
||||
87
src/server/models/sectoractivities.js
Executable file
87
src/server/models/sectoractivities.js
Executable file
@@ -0,0 +1,87 @@
|
||||
const mongoose = require('mongoose').set('debug', false)
|
||||
const Schema = mongoose.Schema;
|
||||
|
||||
mongoose.Promise = global.Promise;
|
||||
mongoose.level = "F";
|
||||
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { ObjectID } = require('mongodb');
|
||||
|
||||
// Resolving error Unknown modifier: $pushAll
|
||||
mongoose.plugin(schema => {
|
||||
schema.options.usePushEach = true
|
||||
});
|
||||
|
||||
const SectorActivitiesSchema = new Schema({
|
||||
_id: {
|
||||
type: Number,
|
||||
},
|
||||
descr: {
|
||||
type: String,
|
||||
},
|
||||
idSectorActivities: {
|
||||
type: Number
|
||||
},
|
||||
icon: {
|
||||
type: String,
|
||||
},
|
||||
img: {
|
||||
type: String,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
},
|
||||
theme: {
|
||||
type: String,
|
||||
},
|
||||
});
|
||||
|
||||
SectorActivitiesSchema.pre('save', async function (next) {
|
||||
if (this.isNew) {
|
||||
const myrec = await SectorActivities.findOne().limit(1).sort({ _id: -1 });
|
||||
if (!!myrec) {
|
||||
if (myrec._doc._id === 0)
|
||||
this._id = 1;
|
||||
else
|
||||
this._id = myrec._doc._id + 1;
|
||||
} else {
|
||||
this._id = 1;
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
SectorActivitiesSchema.statics.findAllIdApp = async function (idapp) {
|
||||
const SectorActivities = this;
|
||||
|
||||
const query = [
|
||||
{ $sort: { descr: 1 } }
|
||||
];
|
||||
|
||||
return await SectorActivities
|
||||
.aggregate(query)
|
||||
.then((arrrec) => {
|
||||
return arrrec
|
||||
})
|
||||
|
||||
};
|
||||
|
||||
SectorActivitiesSchema.statics.getFieldsForSearch = function () {
|
||||
return [{ field: 'descr', type: tools.FieldType.string }]
|
||||
};
|
||||
|
||||
SectorActivitiesSchema.statics.executeQueryTable = function (idapp, params) {
|
||||
params.fieldsearch = this.getFieldsForSearch();
|
||||
return tools.executeQueryTable(this, 0, params);
|
||||
};
|
||||
|
||||
|
||||
const SectorActivities = mongoose.model('SectorActivities', SectorActivitiesSchema);
|
||||
|
||||
SectorActivities.createIndexes((err) => {
|
||||
if (err) throw err;
|
||||
});
|
||||
|
||||
module.exports = { SectorActivities };
|
||||
@@ -535,7 +535,7 @@ sendNotifSchema.statics.getDescrAndLinkByRecNotif = async function (recnotif, us
|
||||
|
||||
} else {
|
||||
newdescr = i18n.__('ID_CIRCUIT_COINS_ACCEPTED_FROM_GROUP_TO_YOU', qty, symbol, strtipocontoOrig, myorig, circuitname, username_action)
|
||||
+ `\n` + i18n.__('SALDO_UPDATE', recnotif.paramsObj.extrarec.saldoDest, symbol);
|
||||
+ `\n` + i18n.__('SALDO_UPDATE', recnotif.paramsObj.extrarec.saldoDest, symbol, circuitname);
|
||||
}
|
||||
} else {
|
||||
if (groupOComdest) {
|
||||
@@ -674,6 +674,34 @@ sendNotifSchema.statics.findLastNotifCoinsByUserIdAndIdApp = function (username,
|
||||
|
||||
};
|
||||
|
||||
sendNotifSchema.statics.findAllNotifCoinsAllIdAndIdApp = function (idapp) {
|
||||
const SendNotif = this;
|
||||
|
||||
let filter = {
|
||||
idapp,
|
||||
typedir: shared_consts.TypeNotifs.TYPEDIR_CIRCUITS,
|
||||
typeid: shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ,
|
||||
status: 0,
|
||||
'extrarec.circuitname': { $ne: "Circuito di TEST" },
|
||||
'extrarec.symbol': { $ne: "RISTeST"},
|
||||
}
|
||||
|
||||
return SendNotif.aggregate([
|
||||
{
|
||||
$match: filter,
|
||||
},
|
||||
{
|
||||
$sort: { datenotif: -1 },
|
||||
},
|
||||
]).then(async (arrnotif) => {
|
||||
return this.compileOtherFields(arrnotif);
|
||||
|
||||
}).catch((err) => {
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
sendNotifSchema.statics.saveAndSendNotif = async function (myrecnotif, req, res, user) {
|
||||
const SendNotif = this;
|
||||
|
||||
@@ -1248,6 +1276,48 @@ sendNotifSchema.statics.getSumPendingTransactionsDest = async function (idapp, u
|
||||
|
||||
};
|
||||
|
||||
sendNotifSchema.statics.RemovePendentTransactions = async function (idapp) {
|
||||
const SendNodif = this;
|
||||
|
||||
return await SendNodif.deleteMany(
|
||||
{
|
||||
idapp,
|
||||
typedir: shared_consts.TypeNotifs.TYPEDIR_CIRCUITS,
|
||||
typeid: shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ,
|
||||
status: 0,
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
sendNotifSchema.statics.RemoveOldNotif = async function (idapp, numgg) {
|
||||
const SendNodif = this;
|
||||
|
||||
const currentDate = new Date();
|
||||
const limitDate = new Date(currentDate.setDate(currentDate.getDate() - numgg));
|
||||
|
||||
return await SendNodif.deleteMany(
|
||||
{
|
||||
idapp,
|
||||
date_created: { $lt: limitDate },
|
||||
// typedir: { $ne: shared_consts.TypeNotifs.TYPEDIR_CIRCUITS },
|
||||
$or: [
|
||||
{ typeid: { $ne: shared_consts.TypeNotifs.ID_CIRCUIT_SENDCOINSREQ } },
|
||||
{ status: { $ne: 0 } }
|
||||
]
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
sendNotifSchema.statics.RemoveOldNotif90 = async function (idapp) {
|
||||
return this.RemoveOldNotif(idapp, 90);
|
||||
}
|
||||
|
||||
sendNotifSchema.statics.RemoveOldNotif30 = async function (idapp) {
|
||||
return this.RemoveOldNotif(idapp, 30);
|
||||
}
|
||||
|
||||
sendNotifSchema.statics.updatePendingTransactions = async function (recnotif) {
|
||||
|
||||
const { Circuit } = require('../models/circuit');
|
||||
|
||||
@@ -37,9 +37,45 @@ const SiteSchema = new Schema({
|
||||
host: {
|
||||
type: String,
|
||||
},
|
||||
host_ip: {
|
||||
type: String,
|
||||
},
|
||||
host_test: {
|
||||
type: String,
|
||||
},
|
||||
host_test_ip: {
|
||||
type: String,
|
||||
},
|
||||
host_api: {
|
||||
type: String,
|
||||
},
|
||||
host_api_ip: {
|
||||
type: String,
|
||||
},
|
||||
host_testapi: {
|
||||
type: String,
|
||||
},
|
||||
host_testapi_ip: {
|
||||
type: String,
|
||||
},
|
||||
cf_token: {
|
||||
type: String,
|
||||
},
|
||||
cf_zoneId: {
|
||||
type: String,
|
||||
},
|
||||
servermail: {
|
||||
type: String,
|
||||
},
|
||||
servermailip: {
|
||||
type: String,
|
||||
},
|
||||
dkim: {
|
||||
type: String,
|
||||
},
|
||||
enable_servermail: {
|
||||
type: Boolean,
|
||||
},
|
||||
portapp: {
|
||||
type: String,
|
||||
},
|
||||
@@ -135,6 +171,11 @@ const SiteSchema = new Schema({
|
||||
enableAI: { type: Boolean, default: false },
|
||||
enableGroups: { type: Boolean, default: false },
|
||||
enableCircuits: { type: Boolean, default: false },
|
||||
enableGoods: { type: Boolean, default: false },
|
||||
enableServices: { type: Boolean, default: false },
|
||||
enableActivities: { type: Boolean, default: false },
|
||||
enableHosps: { type: Boolean, default: false },
|
||||
enableEvents: { type: Boolean, default: false },
|
||||
enableProj: { type: Boolean, default: false },
|
||||
enableTodos: { type: Boolean, default: false },
|
||||
enableRegByBot: { type: Boolean, default: false },
|
||||
@@ -191,7 +232,10 @@ const SiteSchema = new Schema({
|
||||
ecomm: {
|
||||
enablePreOrders: { type: Boolean, default: false },
|
||||
NoteExtraOnCart: { type: String, default: '' },
|
||||
}
|
||||
},
|
||||
idMyGroup: {
|
||||
type: String,
|
||||
},
|
||||
});
|
||||
|
||||
var Site = module.exports = mongoose.model('Site', SiteSchema);
|
||||
@@ -226,6 +270,17 @@ module.exports.executeQueryTable = async function (idapp, params, userreq) {
|
||||
if (User.isAdmin(userreq.perm)) {
|
||||
const myarr = await Site.find({});
|
||||
|
||||
if (myarr.length === 0) {
|
||||
/* {
|
||||
"_id" : ObjectId("620a71e194438ecd1acfdbca"),
|
||||
"idapp" : "14",
|
||||
"chiave" : "vers",
|
||||
"userId" : "ALL",
|
||||
"valore" : "0.3.21"
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
// return await Site.find({}).lean();
|
||||
return ({ count: myarr.length, rows: myarr })
|
||||
|
||||
@@ -251,6 +306,8 @@ module.exports.findAllIdApp = async function (idapp) {
|
||||
rec.email_pwd = '';
|
||||
rec.telegram_key = '';
|
||||
rec.telegram_key_test = '';
|
||||
rec.cf_token = '';
|
||||
rec.cf_zoneId = '';
|
||||
// rec.confsite = {};
|
||||
|
||||
return rec;
|
||||
@@ -351,7 +408,7 @@ module.exports.createFirstUserAdmin = async function () {
|
||||
const numusers = await User.countDocuments({ idapp: mysite.idapp });
|
||||
if (numusers === 0) {
|
||||
// Non esistono utenti, quindi creo quello di Admin
|
||||
|
||||
|
||||
const utenteadmin = { idapp: '13', username: telegrambot.ADMIN_USER_SERVER };
|
||||
|
||||
const newuser = new User(utenteadmin);
|
||||
|
||||
181
src/server/models/stat.js
Executable file
181
src/server/models/stat.js
Executable file
@@ -0,0 +1,181 @@
|
||||
const mongoose = require('mongoose').set('debug', false);
|
||||
const Schema = mongoose.Schema;
|
||||
|
||||
mongoose.Promise = global.Promise;
|
||||
mongoose.level = 'F';
|
||||
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const { User } = require('../models/user');
|
||||
const { Movement } = require('../models/movement');
|
||||
const { Circuit } = require('../models/circuit');
|
||||
const { MyGroup } = require('../models/mygroup');
|
||||
const { Settings } = require('../models/settings');
|
||||
|
||||
const shared_consts = require('../tools/shared_nodejs');
|
||||
const { ObjectID } = require('mongodb');
|
||||
|
||||
// Resolving error Unknown modifier: $pushAll
|
||||
mongoose.plugin(schema => {
|
||||
schema.options.usePushEach = true;
|
||||
});
|
||||
|
||||
const StatSchema = new Schema({
|
||||
...{
|
||||
_id: {
|
||||
type: String,
|
||||
},
|
||||
idapp: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
num_reg: {
|
||||
type: Number,
|
||||
},
|
||||
date_created: {
|
||||
type: Date,
|
||||
default: Date.now,
|
||||
},
|
||||
num_reg: Number,
|
||||
num_reg_today: Number,
|
||||
online_today: Number,
|
||||
activeusers: Number,
|
||||
num_teleg_attivo: Number,
|
||||
num_autorizzati: Number,
|
||||
num_autorizzare: Number,
|
||||
num_teleg_pending: Number,
|
||||
arr_nations: [],
|
||||
numreg_untilday: Number,
|
||||
reg_daily: [],
|
||||
reg_weekly: [],
|
||||
lastsreg: [],
|
||||
lastsonline: [],
|
||||
lastssharedlink: [],
|
||||
diffusorilist: [],
|
||||
receiveRislist: [],
|
||||
receiveRislistgroup: [],
|
||||
strettelist: [],
|
||||
num_transaz_tot: Number,
|
||||
tot_RIS_transati: Number,
|
||||
num_circuiti: Number,
|
||||
num_circuiti_attivi: Number,
|
||||
num_annunci: Number,
|
||||
last_transactions: [],
|
||||
},
|
||||
});
|
||||
|
||||
StatSchema.statics.updateStats = async function (datastat) {
|
||||
|
||||
datastat.last_transactions.forEach(function (mov) {
|
||||
let ris = tools.getStringaConto(mov)
|
||||
mov.myfrom = ris.myfrom
|
||||
mov.myto = ris.myto
|
||||
mov.tipocontofrom = ris.tipocontofrom
|
||||
mov.tipocontoto = ris.tipocontoto
|
||||
});
|
||||
|
||||
|
||||
return datastat;
|
||||
};
|
||||
|
||||
StatSchema.statics.calculateStats = async function (idapp) {
|
||||
const Stat = this;
|
||||
|
||||
try {
|
||||
|
||||
let datastat = {
|
||||
idapp,
|
||||
num_reg: await User.getUsersRegistered(idapp),
|
||||
num_reg_today: await User.getUsersRegisteredToday(idapp),
|
||||
online_today: await User.getUsersOnLineToday(idapp),
|
||||
activeusers: await User.getUsersOnLineActive(idapp),
|
||||
num_teleg_attivo: await User.getUsersTelegramAttivo(idapp),
|
||||
num_autorizzati: await User.getUsersAutorizzati(idapp),
|
||||
num_autorizzare: await User.getUsersAutorizzare(idapp),
|
||||
num_teleg_pending: await User.getUsersTelegramPending(idapp),
|
||||
arr_nations: await User.findAllDistinctNationality(idapp),
|
||||
numreg_untilday: await User.calcnumRegUntilDay(idapp),
|
||||
reg_daily: await User.calcRegDaily(idapp),
|
||||
reg_weekly: await User.calcRegWeekly(idapp),
|
||||
lastsreg: await User.getLastUsers(idapp),
|
||||
lastsonline: await User.getLastOnlineUsers(idapp),
|
||||
lastssharedlink: await User.getLastSharedLink(idapp),
|
||||
diffusorilist: await User.getDiffusoriUsers(idapp),
|
||||
receiveRislist: await User.getReceiveRISUsers(idapp),
|
||||
receiveRislistgroup: await MyGroup.getReceiveRISGroups(idapp),
|
||||
strettelist: await User.getBestStretteDiManoUsers(idapp),
|
||||
num_transaz_tot: await Movement.getTotal_Transactions(idapp),
|
||||
tot_RIS_transati: await Movement.getTot_RIS_Transati(idapp),
|
||||
num_circuiti: await Circuit.getnumCircuits(idapp),
|
||||
num_circuiti_attivi: await Circuit.getnumActiveCircuits(idapp),
|
||||
num_annunci: await User.getnumAnnunci(idapp),
|
||||
last_transactions: await Movement.getLastN_Transactions(idapp, 10),
|
||||
};
|
||||
|
||||
// Trova il record di oggi:
|
||||
const trova_se_oggi = await Stat.findOne({ idapp, date_created: { $gte: new Date(new Date().setHours(0, 0, 0, 0)) } });
|
||||
|
||||
if (trova_se_oggi) {
|
||||
// Aggiorna il record di oggi:
|
||||
await Stat.updateOne({ _id: trova_se_oggi._id }, { $set: datastat });
|
||||
} else {
|
||||
// Aggiungi un nuovo record:
|
||||
await Stat.insertMany([datastat]);
|
||||
}
|
||||
|
||||
return datastat;
|
||||
|
||||
} catch (e) {
|
||||
console.error('Error', e);
|
||||
return null;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
StatSchema.statics.getStats = async function (idapp) {
|
||||
const Stat = this;
|
||||
|
||||
const minuti = await Settings.getValDbSettings(idapp, 'NUMMINUTI_STAT', 30);
|
||||
|
||||
// Ottieni l'ultimo record salvato:
|
||||
const rec = await Stat.findOne({ idapp })
|
||||
.sort({ date_created: -1 })
|
||||
.lean();
|
||||
|
||||
let isOld = true;
|
||||
|
||||
if (rec) {
|
||||
// se rec.date_created è più vecchio di minuti fa, allora ricalcola.
|
||||
const dateCreated = new Date(rec.date_created);
|
||||
const now = new Date();
|
||||
|
||||
// Calcola la differenza in millisecondi
|
||||
const difference = now - dateCreated; // Differenza in millisecondi
|
||||
|
||||
// Controlla se la differenza è maggiore di 10 minuti (10 * 60 * 1000 ms)
|
||||
isOld = (difference > minuti * 60 * 1000);
|
||||
}
|
||||
|
||||
let datastat = null;
|
||||
|
||||
if (isOld) {
|
||||
datastat = await Stat.calculateStats(idapp);
|
||||
|
||||
} else {
|
||||
datastat = rec;
|
||||
}
|
||||
|
||||
datastat = await Stat.updateStats(datastat);
|
||||
|
||||
return datastat;
|
||||
|
||||
};
|
||||
|
||||
|
||||
const Stat = mongoose.model('Stat', StatSchema);
|
||||
|
||||
Stat.createIndexes((err) => {
|
||||
if (err) throw err;
|
||||
});
|
||||
|
||||
module.exports = { Stat };
|
||||
@@ -63,7 +63,9 @@ const UserSchema = new mongoose.Schema({
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
idMyGroup: {
|
||||
type: String,
|
||||
},
|
||||
group: {
|
||||
type: Number,
|
||||
},
|
||||
@@ -672,6 +674,16 @@ UserSchema.statics.isManagerById = async function (id) {
|
||||
}
|
||||
};
|
||||
|
||||
UserSchema.statics.isAdminById = async function (id) {
|
||||
try {
|
||||
const ris = await User.findOne({ _id: id }, { perm: 1 }).lean();
|
||||
return ((ris.perm & shared_consts.Permissions.Admin) ===
|
||||
shared_consts.Permissions.Admin);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
UserSchema.statics.isEditor = function (perm) {
|
||||
try {
|
||||
return ((perm & shared_consts.Permissions.Editor) ===
|
||||
@@ -946,6 +958,7 @@ UserSchema.statics.getProjectUser = function () {
|
||||
sospeso: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.teleg_id': 1,
|
||||
'profile.username_telegram': 1,
|
||||
'profile.firstname_telegram': 1,
|
||||
@@ -1486,6 +1499,7 @@ UserSchema.statics.createNewRequestPwd = function (idapp, email, code) {
|
||||
res.status(400).send();
|
||||
});
|
||||
} else {
|
||||
console.log('findByEmail idapp: ', idapp, 'email', email);
|
||||
return User.findByEmail(idapp, email).then(async (user) => {
|
||||
if (!user) {
|
||||
return { ris: false };
|
||||
@@ -1866,6 +1880,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
|
||||
username_who_report: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.nationality': 1,
|
||||
'profile.mygroups': 1,
|
||||
'profile.mycircuits': 1,
|
||||
@@ -1911,6 +1926,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
|
||||
username_who_report: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.nationality': 1,
|
||||
'profile.mygroups': 1,
|
||||
'profile.mycircuits': 1,
|
||||
@@ -1956,6 +1972,7 @@ UserSchema.statics.getUserProfileByUsername = async function (
|
||||
username_who_report: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
notask_verif: 1,
|
||||
'profile.nationality': 1,
|
||||
'profile.mygroups': 1,
|
||||
@@ -3222,20 +3239,80 @@ UserSchema.statics.setCircuitCmd = async function (idapp, usernameOrig, circuitn
|
||||
await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec);
|
||||
|
||||
} else if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REQ) {
|
||||
const onlycheck = false;
|
||||
|
||||
outres = await Circuit.sendCoins(true, idapp, usernameOrig, extrarec);
|
||||
outres = await Circuit.sendCoins(onlycheck, idapp, usernameOrig, extrarec);
|
||||
|
||||
if (outres.cansend) {
|
||||
// Invia una notifica di moneta alla persona
|
||||
const out = await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action,
|
||||
extrarec);
|
||||
if (out)
|
||||
outres.result = out.ris;
|
||||
//const out = await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action,
|
||||
// extrarec);
|
||||
//if (out)
|
||||
// outres.result = out.ris;
|
||||
} else {
|
||||
outres.cansend = false;
|
||||
}
|
||||
|
||||
ris = true;
|
||||
// } else if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
|
||||
// Before to accept, I see if it's already set !
|
||||
|
||||
/*outres = {
|
||||
cansend: false,
|
||||
errormsg: '',
|
||||
}; */
|
||||
|
||||
let outcheck = outres;
|
||||
|
||||
let risStatus = '';
|
||||
const status = await SendNotif.getStatus(extrarec.notifId);
|
||||
if (status === shared_consts.CircuitsNotif.STATUS_ACCEPTED) {
|
||||
risStatus = i18n.__('STATUS_SENT');
|
||||
} else if (status === shared_consts.CircuitsNotif.STATUS_REFUSED) {
|
||||
risStatus = i18n.__('STATUS_REFUSED');
|
||||
}
|
||||
// if (!await SendNotif.checkIfCoinsAlreadySent(extrarec.notifId)) {
|
||||
//if (!await Movement.checkIfCoinsAlreadySent(extrarec.notifId)) {
|
||||
if (true) {
|
||||
if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) {
|
||||
//outcheck = await Circuit.sendCoins(true, idapp, usernameOrig, extrarec);
|
||||
outcheck.cansend = true;
|
||||
outres.cansend = true;
|
||||
} else {
|
||||
outcheck.cansend = true;
|
||||
outres.cansend = true;
|
||||
}
|
||||
|
||||
cmd = shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT;
|
||||
|
||||
/*if (cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT && outcheck.cansend) {
|
||||
if (!await Movement.checkIfCoinsAlreadySent(extrarec.notifId)) {
|
||||
outres = await Circuit.sendCoins(false, idapp, usernameOrig, extrarec);
|
||||
|
||||
} else {
|
||||
outcheck.cansend = false; //GIA INVIATO
|
||||
}
|
||||
} */
|
||||
|
||||
if (outcheck.cansend) {
|
||||
// Invia una notifica di moneta (accettata o rifiutata) alla persona
|
||||
const out = await tools.sendNotificationByCircuit(idapp, usernameOrig, circuitname, cmd, false, true, username_action, extrarec);
|
||||
|
||||
if (outres && extrarec.groupname) {
|
||||
// Setta agli altri admin,
|
||||
}
|
||||
}
|
||||
|
||||
outres.recnotif = await SendNotif.getRecNotif(extrarec.notifId);
|
||||
outres.arrrecnotif = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIF_FOR_USER, shared_consts.QualiNotifs.OTHERS);
|
||||
if (await User.isAdminByUsername(idapp, username_action)) {
|
||||
outres.arrrecnotifcoins = await SendNotif.findAllNotifCoinsAllIdAndIdApp(idapp);
|
||||
} else {
|
||||
outres.arrrecnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
|
||||
// Before to accept, I see if it's already set !
|
||||
|
||||
@@ -3281,8 +3358,14 @@ UserSchema.statics.setCircuitCmd = async function (idapp, usernameOrig, circuitn
|
||||
}
|
||||
|
||||
outres.recnotif = await SendNotif.getRecNotif(extrarec.notifId);
|
||||
outres.arrrecnotif = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIF_FOR_USER, shared_consts.QualiNotifs.OTHERS);
|
||||
outres.arrrecnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS);
|
||||
outres.arrrecnotif = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIF_FOR_USER);
|
||||
if (await User.isAdminByUsername(idapp, username_action)) {
|
||||
outres.arrrecnotifcoins = await SendNotif.findAllNotifCoinsAllIdAndIdApp(idapp);
|
||||
} else {
|
||||
outres.arrrecnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(username_action, extrarec.lastdr, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS);
|
||||
}
|
||||
|
||||
//----
|
||||
|
||||
} else {
|
||||
outres.cansend = false;
|
||||
@@ -3322,6 +3405,7 @@ function getWhatToShow(idapp, username) {
|
||||
username_who_report: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
notask_verif: 1,
|
||||
'profile.nationality': 1,
|
||||
'profile.mygroups': 1,
|
||||
@@ -3360,6 +3444,7 @@ function getWhatToShow_Unknown(idapp, username) {
|
||||
// sospeso: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.username_telegram': 1,
|
||||
'profile.img': 1,
|
||||
'profile.sex': 1,
|
||||
@@ -3388,6 +3473,7 @@ UserSchema.statics.getWhatToShow_IfFriends = async function (idapp, username) {
|
||||
verified_email: 1,
|
||||
'profile.username_telegram': 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.img': 1,
|
||||
'profile.sex': 1,
|
||||
'profile.born_province': 1,
|
||||
@@ -3991,6 +4077,20 @@ UserSchema.statics.isAdminByIdTeleg = async function (idapp, idtelegram) {
|
||||
});
|
||||
};
|
||||
|
||||
UserSchema.statics.isAdminByUsername = async function (idapp, username) {
|
||||
const User = this;
|
||||
|
||||
return await User.findOne({
|
||||
idapp,
|
||||
username,
|
||||
}, { perm: 1 }).then((rec) => {
|
||||
return User.isAdmin(rec.perm);
|
||||
}).catch((e) => {
|
||||
console.error('isAdminByUsername', e);
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
UserSchema.statics.getUsersList = function (idapp) {
|
||||
const User = this;
|
||||
|
||||
@@ -4005,6 +4105,7 @@ UserSchema.statics.getUsersList = function (idapp) {
|
||||
lasttimeonline: 1,
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
made_gift: 1,
|
||||
perm: 1,
|
||||
email: 1,
|
||||
@@ -4236,6 +4337,25 @@ UserSchema.statics.getUsersOnLineToday = async function (idapp) {
|
||||
return await User.countDocuments(myfind);
|
||||
};
|
||||
|
||||
|
||||
UserSchema.statics.getUsersOnLineActive = async function (idapp) {
|
||||
const User = this;
|
||||
|
||||
const numgiorni_attivi = await Settings.getValDbSettings(idapp, 'SHOW_LAST_ACTIVE_USERS', 90);
|
||||
|
||||
let daytocheck = new Date();
|
||||
daytocheck.setDate(daytocheck.getDate() - numgiorni_attivi);
|
||||
daytocheck.setHours(0, 0, 0, 0);
|
||||
|
||||
const myfind = {
|
||||
idapp,
|
||||
$or: [{ deleted: { $exists: false } }, { deleted: { $exists: true, $eq: false } }],
|
||||
lasttimeonline: { $gt: daytocheck },
|
||||
};
|
||||
|
||||
return await User.countDocuments(myfind);
|
||||
};
|
||||
|
||||
/*
|
||||
UserSchema.statics.getUsersQualified = async function (idapp, numinvitati) {
|
||||
const User = this;
|
||||
@@ -4433,11 +4553,12 @@ UserSchema.statics.getLastUsers = async function (idapp) {
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.img': 1,
|
||||
date_reg: 1,
|
||||
index: 1,
|
||||
'profile.nationality': 1,
|
||||
}).sort({ date_reg: -1 }).limit(lastn).then((arr) => {
|
||||
}).sort({ date_reg: -1 }).limit(lastn).lean().then((arr) => {
|
||||
//return JSON.stringify(arr)
|
||||
return arr;
|
||||
});
|
||||
@@ -4463,9 +4584,10 @@ UserSchema.statics.getLastOnlineUsers = async function (idapp) {
|
||||
lasttimeonline: 1,
|
||||
date_reg: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.img': 1,
|
||||
index: 1,
|
||||
}).sort({ lasttimeonline: -1 }).limit(lastn).then((arr) => {
|
||||
}).sort({ lasttimeonline: -1 }).limit(lastn).lean().then((arr) => {
|
||||
//return JSON.stringify(arr)
|
||||
return arr;
|
||||
});
|
||||
@@ -4490,10 +4612,11 @@ UserSchema.statics.getLastSharedLink = async function (idapp) {
|
||||
surname: 1,
|
||||
lasttimeonline: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
date_reg: 1,
|
||||
'profile.img': 1,
|
||||
index: 1,
|
||||
}).sort({ date_tokenreg: -1 }).limit(lastn).then((arr) => {
|
||||
}).sort({ date_tokenreg: -1 }).limit(lastn).lean().then((arr) => {
|
||||
return arr;
|
||||
});
|
||||
|
||||
@@ -4504,7 +4627,7 @@ UserSchema.statics.getDiffusoriUsers = async function (idapp) {
|
||||
|
||||
const lastn = 10;
|
||||
|
||||
return await User.aggregate(User.getQueryUsersDiffusori(idapp)).then(ris => {
|
||||
return await User.aggregate(await User.getQueryUsersDiffusori(idapp)).then(ris => {
|
||||
// console.table(ris);
|
||||
return ris;
|
||||
});
|
||||
@@ -4516,7 +4639,7 @@ UserSchema.statics.getBestStretteDiManoUsers = async function (idapp) {
|
||||
|
||||
const lastn = 10;
|
||||
|
||||
return await User.aggregate(User.getQueryUsersStretteDiMano(idapp)).then(ris => {
|
||||
return await User.aggregate(await User.getQueryUsersStretteDiMano(idapp)).then(ris => {
|
||||
// console.table(ris);
|
||||
return ris;
|
||||
});
|
||||
@@ -4539,6 +4662,7 @@ UserSchema.statics.checkUser = async function (idapp, username) {
|
||||
return await User.findOne({ idapp, username }, {
|
||||
verified_email: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
notask_verif: 1,
|
||||
'profile.teleg_id': 1,
|
||||
'profile.teleg_checkcode': 1,
|
||||
@@ -4555,7 +4679,7 @@ UserSchema.statics.calculateStat = async function (idapp, username) {
|
||||
const { MySkill } = require('../models/myskill');
|
||||
const { MyGood } = require('../models/mygood');
|
||||
const { MyBacheca } = require('../models/mybacheca');
|
||||
const { MyGroup } = require('../models/mygroup');
|
||||
// const { MyGroup } = require('../models/mygroup');
|
||||
const globalTables = require('../tools/globalTables');
|
||||
|
||||
const numUsersReg = await User.countDocuments(
|
||||
@@ -4684,7 +4808,9 @@ UserSchema.statics.getUsersRegDailyAverage = function (idapp, nrec) {
|
||||
return query;
|
||||
};
|
||||
|
||||
UserSchema.statics.getQueryUsersDiffusori = function (idapp) {
|
||||
UserSchema.statics.getQueryUsersDiffusori = async function (idapp) {
|
||||
|
||||
const lastn = await Settings.getValDbSettings(idapp, 'SHOW_LAST_N_USERS', 20);
|
||||
|
||||
const query = [
|
||||
{
|
||||
@@ -4721,7 +4847,7 @@ UserSchema.statics.getQueryUsersDiffusori = function (idapp) {
|
||||
count: -1,
|
||||
},
|
||||
},
|
||||
{ $limit: 20 },
|
||||
{ $limit: lastn },
|
||||
{
|
||||
$lookup: {
|
||||
from: "users",
|
||||
@@ -4774,15 +4900,17 @@ UserSchema.statics.getQueryUsersDiffusori = function (idapp) {
|
||||
date_reg: 1,
|
||||
idapp: 1,
|
||||
"profile.img": 1,
|
||||
'profile.mycircuits': 1,
|
||||
'profile.handshake': 1,
|
||||
// 'profile.mycircuits': 1,
|
||||
// 'profile.handshake': 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
return query;
|
||||
};
|
||||
|
||||
UserSchema.statics.getQueryUsersStretteDiMano = function (idapp) {
|
||||
UserSchema.statics.getQueryUsersStretteDiMano = async function (idapp) {
|
||||
|
||||
const lastn = await Settings.getValDbSettings(idapp, 'SHOW_LAST_N_USERS', 20);
|
||||
|
||||
const query = [
|
||||
{
|
||||
@@ -4814,7 +4942,7 @@ UserSchema.statics.getQueryUsersStretteDiMano = function (idapp) {
|
||||
}
|
||||
},
|
||||
{ $sort: { count: -1 } },
|
||||
{ $limit: 20 },
|
||||
{ $limit: lastn },
|
||||
{
|
||||
$lookup: {
|
||||
from: "users",
|
||||
@@ -4867,8 +4995,8 @@ UserSchema.statics.getQueryUsersStretteDiMano = function (idapp) {
|
||||
date_reg: 1,
|
||||
idapp: 1,
|
||||
"profile.img": 1,
|
||||
'profile.handshake': 1,
|
||||
'profile.mycircuits': 1,
|
||||
// 'profile.handshake': 1,
|
||||
// 'profile.mycircuits': 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
@@ -5736,10 +5864,10 @@ UserSchema.statics.tooManyLoginWrong = async function (idapp, username, set) {
|
||||
|
||||
await User.findOneAndUpdate({ _id: user._id }, { $set: { retry_pwd: user.retry_pwd } });
|
||||
}
|
||||
return {troppilogin: user.retry_pwd > maxnum, retry_pwd: user.retry_pwd};
|
||||
return { troppilogin: user.retry_pwd > maxnum, retry_pwd: user.retry_pwd };
|
||||
}
|
||||
|
||||
return {troppilogin: false, retry_pwd: 0};
|
||||
return { troppilogin: false, retry_pwd: 0 };
|
||||
};
|
||||
|
||||
UserSchema.statics.setLastCircuitOpened = async function (idapp, username, circuitpath) {
|
||||
@@ -5839,6 +5967,30 @@ UserSchema.statics.renameCircuitName = async function (idapp, oldcircuitname, ne
|
||||
return await User.updateMany({ idapp, 'profile.mycircuits.circuitname': oldcircuitname }, { $set: { 'profile.mycircuits.$.circuitname': newcircuitname } });
|
||||
};
|
||||
|
||||
UserSchema.statics.getnumAnnunci = async function (idapp) {
|
||||
|
||||
const { MySkill } = require('../models/myskill');
|
||||
const { MyGood } = require('../models/mygood');
|
||||
const { MyBacheca } = require('../models/mybacheca');
|
||||
const { MyHosp } = require('../models/myhosp');
|
||||
|
||||
let num = 0;
|
||||
|
||||
try {
|
||||
|
||||
num += await MySkill.countDocuments({ idapp });
|
||||
num += await MyGood.countDocuments({ idapp });
|
||||
num += await MyBacheca.countDocuments({ idapp });
|
||||
num += await MyHosp.countDocuments({ idapp });
|
||||
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
return num;
|
||||
|
||||
};
|
||||
|
||||
UserSchema.statics.createNewSubRecord = async function (idapp, req) {
|
||||
const User = this;
|
||||
|
||||
|
||||
222
src/server/modules/Mailinabox.js
Normal file
222
src/server/modules/Mailinabox.js
Normal file
@@ -0,0 +1,222 @@
|
||||
const axios = require('axios');
|
||||
|
||||
const apiUrl = 'https://api.cloudflare.com/client/v4'; // Endpoint
|
||||
|
||||
class Mailinabox {
|
||||
constructor(config) {
|
||||
this.config = config ? config : {};
|
||||
if (!this.config.miabHost) {
|
||||
this.config.miabHost = process.env.MIAB_HOST;
|
||||
this.config.adminEmail = process.env.MIAB_ADMIN_EMAIL;
|
||||
this.config.adminPassword = process.env.MIAB_ADMIN_PASSWORD;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
init() {
|
||||
if (this.config.arrTokens) {
|
||||
this.zones = [];
|
||||
}
|
||||
}
|
||||
|
||||
checkIfParamOk() {
|
||||
if (!this.config.miabHost || !this.config.adminEmail || !this.config.adminPassword) {
|
||||
console.error('Configurazione mancante per il recupero del record DKIM.');
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Funzione per ottenere il record DKIM
|
||||
async getDKIMRecord(domain) {
|
||||
|
||||
if (!this.checkIfParamOk()) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const url = `https://${this.config.miabHost}/admin/dns/zonefile/${domain}`;
|
||||
const auth = Buffer.from(`${this.config.adminEmail}:${this.config.adminPassword}`).toString('base64');
|
||||
|
||||
try {
|
||||
const response = await axios.get(url, {
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`
|
||||
}
|
||||
});
|
||||
|
||||
// console.log(`Record DNS esterni per ${config.domain}:`);
|
||||
|
||||
// Analizza la risposta per estrarre i record DNS
|
||||
const records = response.data.split('\n')
|
||||
.filter(line => line.trim() !== '' && !line.startsWith(';'))
|
||||
.map(line => line.trim());
|
||||
|
||||
// Trova e stampa il record DKIM
|
||||
const dkimRecord = records.find(record => record.includes('mail._domainkey'));
|
||||
if (dkimRecord) {
|
||||
|
||||
const pattern = /p=([A-Za-z0-9+/=]+)(?:"\s*"([A-Za-z0-9+/=]+))?/;
|
||||
|
||||
// Esegui la ricerca
|
||||
const match = dkimRecord.match(pattern);
|
||||
|
||||
if (match) {
|
||||
// Concatena le due parti trovate di 'p', la seconda parte è facoltativa
|
||||
return match[1] + (match[2] || '');
|
||||
} else {
|
||||
console.log('Record DKIM non trovato.');
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore nel recupero del record DKIM:', error.message);
|
||||
if (error.response) {
|
||||
console.error('Dettagli errore:', error.response.data);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
async MIAB_getEmails(myrec) {
|
||||
|
||||
if (!this.checkIfParamOk() || !myrec.domain) {
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `https://${this.config.miabHost}/admin/mail/users?format=text`;
|
||||
const auth = Buffer.from(`${this.config.adminEmail}:${this.config.adminPassword}`).toString('base64');
|
||||
|
||||
try {
|
||||
const response = await axios.get(url, {
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`
|
||||
}
|
||||
});
|
||||
|
||||
const records = response.data.split('\n')
|
||||
.filter(line => line.trim() !== '' && line.indexOf(myrec.domain) > -1)
|
||||
.map(line => line.trim());
|
||||
|
||||
return records;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore nel recupero delle Email ', error.message);
|
||||
if (error.response) {
|
||||
console.error('Dettagli errore:', error.response.data);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
async removeEmail(myrec) {
|
||||
|
||||
if (!this.checkIfParamOk() || !myrec.email) {
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `https://${this.config.miabHost}/admin/mail/users/remove`;
|
||||
const auth = Buffer.from(`${this.config.adminEmail}:${this.config.adminPassword}`).toString('base64');
|
||||
|
||||
try {
|
||||
const myrecout = `email=${myrec.email}`;
|
||||
|
||||
const response = await axios.post(url, myrecout, {
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`
|
||||
}
|
||||
});
|
||||
|
||||
const ris = response.data;
|
||||
|
||||
return ris;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore nella cancellazione della Email ' + record.email, error.message);
|
||||
if (error.response) {
|
||||
console.error('Dettagli errore:', error.response.data);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
async addEmail(myrec) {
|
||||
|
||||
if (!this.checkIfParamOk() || !myrec.email) {
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `https://${this.config.miabHost}/admin/mail/users/add`;
|
||||
const auth = Buffer.from(`${this.config.adminEmail}:${this.config.adminPassword}`).toString('base64');
|
||||
|
||||
try {
|
||||
let privileges = myrec.privileges ? 'admin' : ''
|
||||
const myrecout = `email=${myrec.email}&password=${myrec.pwd}&privileges="${privileges}"`;
|
||||
|
||||
const response = await axios.post(url, myrecout, {
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`
|
||||
}
|
||||
});
|
||||
|
||||
const ris = response.data;
|
||||
|
||||
return ris;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore nella creazione della Email ' + record.email, error.message);
|
||||
if (error.response) {
|
||||
console.error('Dettagli errore:', error.response.data);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
async setMailUserPassword(myrec) {
|
||||
|
||||
if (!this.checkIfParamOk() || !myrec.email) {
|
||||
return;
|
||||
}
|
||||
|
||||
const url = `https://${this.config.miabHost}/admin/mail/users/password`;
|
||||
const auth = Buffer.from(`${this.config.adminEmail}:${this.config.adminPassword}`).toString('base64');
|
||||
|
||||
try {
|
||||
|
||||
let data = `email=${myrec.email}&password=${myrec.pwd}`;
|
||||
|
||||
const response = await axios.post(url,
|
||||
data,
|
||||
{
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`,
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
}
|
||||
});
|
||||
|
||||
let ris = '';
|
||||
|
||||
if (response.status === 200) {
|
||||
ris = `Password cambiata con successo per ${myrec.email}`;
|
||||
} else {
|
||||
ris = `Errore nel cambio password per ${myrec.email}`;
|
||||
}
|
||||
|
||||
return ris;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore nella creazione della Email ' + record.email, error.message);
|
||||
if (error.response) {
|
||||
console.error('Dettagli errore:', error.response.data);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Mailinabox
|
||||
452
src/server/modules/cloudflare.js
Normal file
452
src/server/modules/cloudflare.js
Normal file
@@ -0,0 +1,452 @@
|
||||
const axios = require('axios');
|
||||
|
||||
const apiUrl = 'https://api.cloudflare.com/client/v4'; // Endpoint
|
||||
|
||||
const MailinaboxClass = require('./Mailinabox.js');
|
||||
|
||||
class CloudFlare {
|
||||
constructor(config) {
|
||||
this.config = config ? config : {};
|
||||
|
||||
if (!this.config.arrTokens) {
|
||||
this.config.arrTokens = process.env.CLOUDFLARE_TOKENS;
|
||||
}
|
||||
}
|
||||
|
||||
init() {
|
||||
if (this.config.arrTokens) {
|
||||
// this.zones = this.fetchCloudflareZones(this.config.apiToken);
|
||||
this.zones = [];
|
||||
this.dnsRecords = null;
|
||||
}
|
||||
}
|
||||
|
||||
async fetchCloudflareZones(apiToken) {
|
||||
try {
|
||||
|
||||
// Effettua una richiesta GET all'API di Cloudflare
|
||||
const response = await axios.get(apiUrl + '/zones', {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
|
||||
'Content-Type': 'application/json' // Tipo di contenuto
|
||||
}
|
||||
});
|
||||
|
||||
// Estrai i dati dalla risposta
|
||||
this.zones = response.data.result;
|
||||
|
||||
if (this.zones && this.zones.length > 0) {
|
||||
for (const zone of this.zones) {
|
||||
let domain = zone.name;
|
||||
|
||||
await this.findAndUpdateOnSite(domain, zone, apiToken);
|
||||
|
||||
// Cerca su Site
|
||||
}
|
||||
}
|
||||
|
||||
return this.zones;
|
||||
|
||||
// Stampa le zone
|
||||
// console.log('Zone di Cloudflare:', zones);
|
||||
} catch (error) {
|
||||
console.error('Errore durante il recupero delle zone di Cloudflare:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
async findAndUpdateOnSite(domain, zone, apiToken) {
|
||||
try {
|
||||
const Site = require('../models/site');
|
||||
|
||||
domain = domain.replace(/^https?:\/\//, '');
|
||||
|
||||
let normalizedDomain = domain.startsWith("http://") || domain.startsWith("https://") ? domain : "https://" + domain;
|
||||
|
||||
// Trova il sito usando il dominio normalizzato
|
||||
const recsite = await Site.findOne({ host: normalizedDomain });
|
||||
|
||||
|
||||
if (recsite) {
|
||||
// Aggiorna i parametri token e zoneId
|
||||
|
||||
let modif = (recsite.cf_token !== apiToken) || (recsite.cf_zoneId !== zone.id);
|
||||
|
||||
if (modif && apiToken) {
|
||||
// update the Site
|
||||
|
||||
await Site.findOneAndUpdate({ _id: recsite._id }, {
|
||||
$set: {
|
||||
cf_token: apiToken,
|
||||
cf_zoneId: zone.id
|
||||
}
|
||||
}, { new: true })
|
||||
.then((updatedSite) => {
|
||||
console.log('Site aggiornato:', updatedSite);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Errore durante l\'aggiornamento del Site:', error);
|
||||
});
|
||||
}
|
||||
|
||||
// Controlla se ho il DKIM !
|
||||
|
||||
if (recsite.enable_servermail && !recsite.dkim) {
|
||||
let miab = new MailinaboxClass(null);
|
||||
miab.init();
|
||||
|
||||
const dkim = await miab.getDKIMRecord(recsite.host.replace(/^https?:\/\//, ''));
|
||||
|
||||
if (dkim) {
|
||||
await Site.findOneAndUpdate({ _id: recsite._id }, {
|
||||
$set: {
|
||||
dkim,
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore durante il recupero dei record DNS di Cloudflare:', error.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Funzione per estrarre i record DNS
|
||||
async fetchDNSRecords(apiToken, zoneId) {
|
||||
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records`;
|
||||
|
||||
try {
|
||||
const response = await axios.get(apiUrlDNS, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
|
||||
'Content-Type': 'application/json' // Tipo di contenuto
|
||||
}
|
||||
});
|
||||
|
||||
this.dnsRecords = response.data.result;
|
||||
|
||||
return this.dnsRecords;
|
||||
} catch (error) {
|
||||
console.error('Errore durante il recupero dei record DNS di Cloudflare:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione per aggiornare un record DNS
|
||||
async updateDNSRecord(apiToken, zoneId, dnsRecordId, newDnsRecordData) {
|
||||
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records/${dnsRecordId}`;
|
||||
|
||||
try {
|
||||
|
||||
const response = await axios.put(apiUrlDNS, newDnsRecordData, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
|
||||
'Content-Type': 'application/json' // Tipo di contenuto
|
||||
}
|
||||
});
|
||||
|
||||
const updatedRecord = response.data.result;
|
||||
|
||||
// Stampa il record DNS aggiornato
|
||||
console.log('Record DNS aggiornato:', updatedRecord);
|
||||
|
||||
return updatedRecord;
|
||||
} catch (error) {
|
||||
console.error('Errore durante l\'aggiornamento del record DNS:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione per creare un record DNS di CloudFlare
|
||||
async createDNSRecord(apiToken, zoneId, dnsRecordData) {
|
||||
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records`;
|
||||
try {
|
||||
const response = await axios.post(apiUrlDNS, dnsRecordData, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
|
||||
'Content-Type': 'application/json' // Tipo di contenuto
|
||||
}
|
||||
});
|
||||
const createdRecord = response.data.result;
|
||||
console.log('Record DNS creato:', createdRecord);
|
||||
|
||||
return createdRecord;
|
||||
// Stampa il record DNS creato
|
||||
} catch (error) {
|
||||
console.error('Errore durante la creazione del record DNS:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione per cancellare un record DNS di CloudFlare
|
||||
async deleteDNSRecord(apiToken, zoneId, dnsRecordId) {
|
||||
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records/${dnsRecordId}`;
|
||||
try {
|
||||
const response = await axios.delete(apiUrlDNS, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
|
||||
'Content-Type': 'application/json' // Tipo di contenuto
|
||||
}
|
||||
});
|
||||
const deletedRecord = response.data.result;
|
||||
console.log('Record DNS cancellato:', deletedRecord);
|
||||
|
||||
return deletedRecord;
|
||||
} catch (error) {
|
||||
console.error('Errore durante la cancellazione del record DNS:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async setCorrectIpsOnDNS(domainrec) {
|
||||
|
||||
const arrparams = [{ urladd: '', paramsite: 'host_ip', type: 'A' },
|
||||
{ urladd: 'test.', paramsite: 'host_test_ip', type: 'A' },
|
||||
{ urladd: 'api.', paramsite: 'host_api_ip', type: 'A' },
|
||||
{ urladd: 'testapi.', paramsite: 'host_testapi_ip', type: 'A' },
|
||||
{ urladd: 'www.', paramsite: 'host', type: 'CNAME' },
|
||||
]
|
||||
|
||||
for (let i = 0; i < arrparams.length; i++) {
|
||||
await this.setSingleIpsOnDNS(domainrec.name, arrparams[i])
|
||||
}
|
||||
|
||||
// Set Server Mail
|
||||
await this.setServerMail(domainrec);
|
||||
|
||||
// pause for 3 second
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
}
|
||||
|
||||
async setServerMail(domainrec) {
|
||||
|
||||
try {
|
||||
// get the parameters (Token and zoneId on Database)
|
||||
const Site = require('../models/site');
|
||||
|
||||
let domain = domainrec.name.replace(/^https?:\/\//, '');
|
||||
|
||||
let normalizedDomain = domain.startsWith("http://") || domain.startsWith("https://") ? domain : "https://" + domain;
|
||||
|
||||
// Trova il sito usando il dominio normalizzato
|
||||
await Site.findOne({ host: normalizedDomain }).lean()
|
||||
.then(async (site) => {
|
||||
if (site) {
|
||||
|
||||
if (site.cf_token && site.cf_zoneId) {
|
||||
const myarrrecdns = await this.fetchDNSRecords(site.cf_token, site.cf_zoneId);
|
||||
|
||||
// MX:
|
||||
let recTypeMX = await myarrrecdns.find((rec) => rec.type === 'MX' && (rec.name === (domain)));
|
||||
|
||||
if (recTypeMX) {
|
||||
if (recTypeMX.content !== site.servermail) {
|
||||
recTypeMX.content = site.servermail;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, recTypeMX.id, recTypeMX);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: 'MX',
|
||||
name: domain,
|
||||
content: site.servermail,
|
||||
ttl: 1,
|
||||
proxied: false,
|
||||
priority: 10,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
|
||||
// TXT record spf1 : TXT nomedominio v=spf1 a mx:box.lamiaposta.org ip4:65.21.63.147 ~all
|
||||
|
||||
let recTypeTXTspf1 = await myarrrecdns.find((rec) => rec.type === 'TXT' && (rec.name === (domain) && (rec.content.indexOf('v=spf1') > -1)));
|
||||
|
||||
if (site.servermailip) {
|
||||
let contentTXTspf1 = `v=spf1 a mx:${site.servermail} ip4:${site.servermailip} ~all`;
|
||||
|
||||
if (recTypeTXTspf1) {
|
||||
if (recTypeTXTspf1.content !== contentTXTspf1) {
|
||||
recTypeTXTspf1.content = contentTXTspf1;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, recTypeTXTspf1.id, recTypeTXTspf1);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: 'TXT',
|
||||
name: domain,
|
||||
content: contentTXTspf1,
|
||||
ttl: 3600,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
}
|
||||
|
||||
// mail._domainkey.nomedominio v=DKIM1; h=sha256; k=rsa; s=email; p=<dkim>
|
||||
|
||||
let nameDkimtoFind = `mail._domainkey.${domain}`;
|
||||
|
||||
let recTypeTXTDKIM = await myarrrecdns.find((rec) => rec.type === 'TXT' && (rec.name === nameDkimtoFind));
|
||||
|
||||
if (site.dkim) {
|
||||
let contentTXTDKIM = `v=DKIM1; h=sha256; k=rsa; s=email; p=${site.dkim}`;
|
||||
|
||||
if (recTypeTXTDKIM) {
|
||||
if (recTypeTXTDKIM.content !== contentTXTDKIM) {
|
||||
recTypeTXTDKIM.content = contentTXTDKIM;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, recTypeTXTDKIM.id, recTypeTXTDKIM);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: 'TXT',
|
||||
name: nameDkimtoFind,
|
||||
content: contentTXTDKIM,
|
||||
ttl: 1,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
}
|
||||
|
||||
// DMARC:
|
||||
|
||||
let nameDmarctoFind = `_dmarc.${domain}`;
|
||||
|
||||
let recTypeTXTdmarc = await myarrrecdns.find((rec) => rec.type === 'TXT' && (rec.name === (nameDmarctoFind) && (rec.content.indexOf('v=DMARC1') > -1)));
|
||||
|
||||
if (site.servermailip) {
|
||||
let contentTXTdmarc = `v=DMARC1; p=quarantine; ruf=mailto:dmarc@${domain};`;
|
||||
|
||||
if (recTypeTXTdmarc) {
|
||||
if (recTypeTXTdmarc.content !== contentTXTdmarc) {
|
||||
recTypeTXTdmarc.content = contentTXTdmarc;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, recTypeTXTspf1.id, recTypeTXTspf1);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: 'TXT',
|
||||
name: nameDmarctoFind,
|
||||
content: contentTXTdmarc,
|
||||
ttl: 1,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
}
|
||||
|
||||
// AutoConfig:
|
||||
let myType = 'CNAME';
|
||||
let strfind = `autoconfig.${domain}`;
|
||||
let contentExpected = site.servermail;
|
||||
let rectofind = await myarrrecdns.find((rec) => rec.type === 'CNAME' && (rec.name === strfind));
|
||||
|
||||
if (rectofind) {
|
||||
if (rectofind.content !== contentExpected) {
|
||||
rectofind.content = contentExpected;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, rectofind.id, rectofind);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: myType,
|
||||
name: strfind,
|
||||
content: contentExpected,
|
||||
ttl: 1,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
|
||||
// AutoDiscover:
|
||||
myType = 'CNAME';
|
||||
strfind = `autodiscover.${domain}`;
|
||||
contentExpected = site.servermail;
|
||||
rectofind = await myarrrecdns.find((rec) => rec.type === 'CNAME' && (rec.name === strfind));
|
||||
|
||||
if (rectofind) {
|
||||
if (rectofind.content !== contentExpected) {
|
||||
rectofind.content = contentExpected;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, rectofind.id, rectofind);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: myType,
|
||||
name: strfind,
|
||||
content: contentExpected,
|
||||
ttl: 1,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
}
|
||||
}
|
||||
|
||||
async setSingleIpsOnDNS(domain, paramobj) {
|
||||
try {
|
||||
// get the parameters (Token and zoneId on Database)
|
||||
const Site = require('../models/site');
|
||||
|
||||
domain = domain.replace(/^https?:\/\//, '');
|
||||
|
||||
let normalizedDomain = domain.startsWith("http://") || domain.startsWith("https://") ? domain : "https://" + domain;
|
||||
|
||||
// Trova il sito usando il dominio normalizzato
|
||||
await Site.findOne({ host: normalizedDomain }).lean()
|
||||
.then(async (site) => {
|
||||
if (site) {
|
||||
|
||||
if (site.cf_token && site.cf_zoneId) {
|
||||
const myarrrecdns = await this.fetchDNSRecords(site.cf_token, site.cf_zoneId);
|
||||
|
||||
let nametofind = paramobj.urladd + domain;
|
||||
|
||||
// find
|
||||
let recType = await myarrrecdns.find((rec) => rec.type === paramobj.type && (rec.name === nametofind));
|
||||
|
||||
let paramexpected = '';
|
||||
try {
|
||||
paramexpected = site[paramobj.paramsite].replace(/^https?:\/\//, '');;
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
|
||||
if (recType && paramexpected) {
|
||||
if (recType.content !== paramexpected) {
|
||||
recType.content = paramexpected;
|
||||
return this.updateDNSRecord(site.cf_token, site.cf_zoneId, recType.id, recType);
|
||||
}
|
||||
} else {
|
||||
// create a new record
|
||||
const newRecord = {
|
||||
type: paramobj.type,
|
||||
name: nametofind,
|
||||
content: paramexpected,
|
||||
ttl: 1,
|
||||
proxied: true,
|
||||
};
|
||||
|
||||
await this.createDNSRecord(site.cf_token, site.cf_zoneId, newRecord);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = CloudFlare
|
||||
@@ -70,5 +70,16 @@ module.exports = {
|
||||
{_id: 68, idSectorGood: [7], descr: 'Fermentati'},
|
||||
{_id: 69, idSectorGood: [7], descr: 'Marmellate'},
|
||||
{_id: 70, idSectorGood: [7], descr: 'Salse'},
|
||||
{_id: 71, idSectorGood: [20], descr: 'Cereali'},
|
||||
{_id: 72, idSectorGood: [20], descr: 'Frutta'},
|
||||
{_id: 73, idSectorGood: [20], descr: 'Ortaggi'},
|
||||
{_id: 74, idSectorGood: [20], descr: 'Zootecnia'},
|
||||
{_id: 75, idSectorGood: [20], descr: 'Giardinaggio'},
|
||||
{_id: 76, idSectorGood: [20], descr: 'Biologica'},
|
||||
{_id: 77, idSectorGood: [20], descr: 'Permacultura'},
|
||||
{_id: 78, idSectorGood: [20], descr: 'Sinergico'},
|
||||
{_id: 79, idSectorGood: [20], descr: 'Tradizionale'},
|
||||
{_id: 80, idSectorGood: [20], descr: 'Viticoltura'},
|
||||
{_id: 81, idSectorGood: [20], descr: 'Acquacoltura'},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -1,126 +1,126 @@
|
||||
module.exports = {
|
||||
list: [
|
||||
{_id: 1, reg: 'SIC', prov: 'AG', descr: 'Agrigento', link_grp: 'https://t.me/c/1614195634/562?thread=553', link_telegram: ''},
|
||||
{_id: 2, reg: 'PIE', prov: 'AL', descr: 'Alessandria', link_grp: 'https://t.me/c/1614195634/513?thread=504', link_telegram: ''},
|
||||
{_id: 3, reg: 'MAR', prov: 'AN', descr: 'Ancona', link_grp: 'https://t.me/c/1614195634/450?thread=446', link_telegram: ''},
|
||||
{_id: 4, reg: 'VDA', prov: 'AO', descr: 'Aosta', link_grp: 'https://t.me/c/1614195634/521?thread=520', link_telegram: ''},
|
||||
{_id: 5, reg: 'TOS', prov: 'AR', descr: 'Arezzo', link_grp: 'https://t.me/c/1614195634/583?thread=572', link_telegram: ''},
|
||||
{_id: 6, reg: 'MAR', prov: 'AP', descr: 'Ascoli Piceno', link_grp: 'https://t.me/c/1614195634/451?thread=447', link_telegram: ''},
|
||||
{_id: 7, reg: 'PIE', prov: 'AT', descr: 'Asti', link_grp: 'https://t.me/c/1614195634/514?thread=505', link_telegram: ''},
|
||||
{_id: 8, reg: 'CAM', prov: 'AV', descr: 'Avellino', link_grp: 'https://t.me/c/1614195634/413?thread=409', link_telegram: ''},
|
||||
{_id: 9, reg: 'PUG', prov: 'BA', descr: 'Bari', link_grp: 'https://t.me/c/1614195634/534?thread=528', link_telegram: ''},
|
||||
{_id: 10, reg: 'PUG', prov: 'BT', descr: 'Barletta-Andria-Trani', link_grp: 'https://t.me/c/1614195634/535?thread=529', link_telegram: ''},
|
||||
{_id: 11, reg: 'VEN', prov: 'BL', descr: 'Belluno', link_grp: 'https://t.me/c/1614195634/608?thread=599', link_telegram: ''},
|
||||
{_id: 12, reg: 'CAM', prov: 'BN', descr: 'Benevento', link_grp: 'https://t.me/c/1614195634/415?thread=411', link_telegram: ''},
|
||||
{_id: 13, reg: 'LOM', prov: 'BG', descr: 'Bergamo', link_grp: 'https://t.me/c/1614195634/491?thread=477', link_telegram: ''},
|
||||
{_id: 14, reg: 'PIE', prov: 'BI', descr: 'Biella', link_grp: 'https://t.me/c/1614195634/515?thread=506', link_telegram: ''},
|
||||
{_id: 15, reg: 'EMR', prov: 'BO', descr: 'Bologna', link_grp: 'https://t.me/c/1614195634/428?thread=419', link_telegram: ''},
|
||||
{_id: 16, reg: 'TAA', prov: 'BZ', descr: 'Bolzano', link_grp: 'https://t.me/c/1614195634/596?thread=594', link_telegram: ''},
|
||||
{_id: 17, reg: 'LOM', prov: 'BS', descr: 'Brescia', link_grp: 'https://t.me/c/1614195634/490?thread=478', link_telegram: ''},
|
||||
{_id: 18, reg: 'PUG', prov: 'BR', descr: 'Brindisi', link_grp: 'https://t.me/c/1614195634/536?thread=530', link_telegram: ''},
|
||||
{_id: 19, reg: 'SAR', prov: 'CA', descr: 'Cagliari', link_grp: 'https://t.me/c/1614195634/546?thread=541', link_telegram: ''},
|
||||
{_id: 20, reg: 'SIC', prov: 'CL', descr: 'Caltanissetta', link_grp: 'https://t.me/c/1614195634/563?thread=554', link_telegram: ''},
|
||||
{_id: 21, reg: 'MOL', prov: 'CB', descr: 'Campobasso', link_grp: 'https://t.me/c/1614195634/398?thread=396', link_telegram: ''},
|
||||
{_id: 22, reg: 'SAR', prov: 'CI', descr: 'Carbonia-Iglesias', link_grp: '', link_telegram: ''},
|
||||
{_id: 23, reg: 'CAM', prov: 'CE', descr: 'Caserta', link_grp: 'https://t.me/c/1614195634/414?thread=410', link_telegram: ''},
|
||||
{_id: 24, reg: 'SIC', prov: 'CT', descr: 'Catania', link_grp: 'https://t.me/c/1614195634/564?thread=555', link_telegram: ''},
|
||||
{_id: 25, reg: 'CAL', prov: 'CZ', descr: 'Catanzaro', link_grp: 'https://t.me/c/1614195634/378?thread=377', link_telegram: ''},
|
||||
{_id: 26, reg: 'ABR', prov: 'CH', descr: 'Chieti', link_grp: 'https://t.me/c/1614195634/366?thread=365', link_telegram: ''},
|
||||
{_id: 27, reg: 'LOM', prov: 'CO', descr: 'Como', link_grp: 'https://t.me/c/1614195634/492?thread=479', link_telegram: ''},
|
||||
{_id: 28, reg: 'CAL', prov: 'CS', descr: 'Cosenza', link_grp: 'https://t.me/c/1614195634/381?thread=379', link_telegram: ''},
|
||||
{_id: 29, reg: 'LOM', prov: 'CR', descr: 'Cremona', link_grp: 'https://t.me/c/1614195634/493?thread=480', link_telegram: ''},
|
||||
{_id: 30, reg: 'CAL', prov: 'KR', descr: 'Crotone', link_grp: 'https://t.me/c/1614195634/382?thread=380', link_telegram: ''},
|
||||
{_id: 31, reg: 'PIE', prov: 'CN', descr: 'Cuneo', link_grp: 'https://t.me/c/1614195634/516?thread=507', link_telegram: ''},
|
||||
{_id: 32, reg: 'SIC', prov: 'EN', descr: 'Enna', link_grp: 'https://t.me/c/1614195634/565?thread=556', link_telegram: ''},
|
||||
{_id: 33, reg: 'MAR', prov: 'FM', descr: 'Fermo', link_grp: 'https://t.me/c/1614195634/453?thread=448', link_telegram: ''},
|
||||
{_id: 34, reg: 'EMR', prov: 'FE', descr: 'Ferrara', link_grp: 'https://t.me/c/1614195634/429?thread=420', link_telegram: ''},
|
||||
{_id: 35, reg: 'TOS', prov: 'FI', descr: 'Firenze', link_grp: 'https://t.me/c/1614195634/584?thread=573', link_telegram: ''},
|
||||
{_id: 36, reg: 'PUG', prov: 'FG', descr: 'Foggia', link_grp: 'https://t.me/c/1614195634/537?thread=531', link_telegram: ''},
|
||||
{_id: 37, reg: 'EMR', prov: 'FC', descr: 'Forli-Cesena', link_grp: 'https://t.me/c/1614195634/430?thread=421', link_telegram: ''},
|
||||
{_id: 38, reg: 'LAZ', prov: 'FR', descr: 'Frosinone', link_grp: 'https://t.me/c/1614195634/48?thread=44', link_telegram: ''},
|
||||
{_id: 39, reg: 'LIG', prov: 'GE', descr: 'Genova', link_grp: 'https://t.me/c/1614195634/392?thread=388', link_telegram: ''},
|
||||
{_id: 40, reg: 'FVG', prov: 'GO', descr: 'Gorizia', link_grp: 'https://t.me/c/1614195634/469?thread=465', link_telegram: ''},
|
||||
{_id: 41, reg: 'TOS', prov: 'GR', descr: 'Grosseto', link_grp: 'https://t.me/c/1614195634/585?thread=574', link_telegram: ''},
|
||||
{_id: 42, reg: 'LIG', prov: 'IM', descr: 'Imperia', link_grp: 'https://t.me/c/1614195634/393?thread=389', link_telegram: ''},
|
||||
{_id: 43, reg: 'MOL', prov: 'IS', descr: 'Isernia', link_grp: 'https://t.me/c/1614195634/399?thread=397', link_telegram: ''},
|
||||
{_id: 44, reg: 'LIG', prov: 'SP', descr: 'La Spezia', link_grp: 'https://t.me/c/1614195634/394?thread=390', link_telegram: ''},
|
||||
{_id: 45, reg: 'ABR', prov: 'AQ', descr: 'L\'Aquila', link_grp: 'https://t.me/c/1614195634/364?thread=363', link_telegram: ''},
|
||||
{_id: 46, reg: 'LAZ', prov: 'LT', descr: 'Latina', link_grp: 'https://t.me/c/1614195634/60?thread=46', link_telegram: ''},
|
||||
{_id: 47, reg: 'PUG', prov: 'LE', descr: 'Lecce', link_grp: 'https://t.me/c/1614195634/538?thread=532', link_telegram: ''},
|
||||
{_id: 48, reg: 'LOM', prov: 'LC', descr: 'Lecco', link_grp: 'https://t.me/c/1614195634/494?thread=482', link_telegram: ''},
|
||||
{_id: 49, reg: 'TOS', prov: 'LI', descr: 'Livorno', link_grp: 'https://t.me/c/1614195634/586?thread=575', link_telegram: ''},
|
||||
{_id: 50, reg: 'LOM', prov: 'LO', descr: 'Lodi', link_grp: 'https://t.me/c/1614195634/495?thread=483', link_telegram: ''},
|
||||
{_id: 51, reg: 'TOS', prov: 'LU', descr: 'Lucca', link_grp: 'https://t.me/c/1614195634/587?thread=576', link_telegram: ''},
|
||||
{_id: 52, reg: 'MAR', prov: 'MC', descr: 'Macerata', link_grp: 'https://t.me/c/1614195634/300?thread=162', link_telegram: ''},
|
||||
{_id: 53, reg: 'LOM', prov: 'MN', descr: 'Mantova', link_grp: 'https://t.me/c/1614195634/497?thread=484', link_telegram: ''},
|
||||
{_id: 54, reg: 'TOS', prov: 'MS', descr: 'Massa-Carrara', link_grp: 'https://t.me/c/1614195634/588?thread=577', link_telegram: ''},
|
||||
{_id: 55, reg: 'BAS', prov: 'MT', descr: 'Matera', link_grp: 'https://t.me/c/1614195634/374?thread=373', link_telegram: ''},
|
||||
{_id: 56, reg: 'SIC', prov: 'ME', descr: 'Messina', link_grp: 'https://t.me/c/1614195634/566?thread=557', link_telegram: ''},
|
||||
{_id: 57, reg: 'LOM', prov: 'MI', descr: 'Milano', link_grp: 'https://t.me/c/1614195634/214?thread=173', link_telegram: ''},
|
||||
{_id: 58, reg: 'EMR', prov: 'MO', descr: 'Modena', link_grp: 'https://t.me/c/1614195634/431?thread=422', link_telegram: ''},
|
||||
{_id: 59, reg: 'LOM', prov: 'MB', descr: 'Monza e della Brianza', link_grp: 'https://t.me/c/1614195634/498?thread=485', link_telegram: ''},
|
||||
{_id: 60, reg: 'CAM', prov: 'NA', descr: 'Napoli', link_grp: 'https://t.me/c/1614195634/407?thread=406', link_telegram: ''},
|
||||
{_id: 61, reg: 'PIE', prov: 'NO', descr: 'Novara', link_grp: 'https://t.me/c/1614195634/517?thread=508', link_telegram: ''},
|
||||
{_id: 62, reg: 'SAR', prov: 'NU', descr: 'Nuoro', link_grp: 'https://t.me/c/1614195634/548?thread=542', link_telegram: ''},
|
||||
{_id: 63, reg: 'SAR', prov: 'OT', descr: 'Olbia-Tempio', link_grp: '', link_telegram: ''},
|
||||
{_id: 64, reg: 'SAR', prov: 'OR', descr: 'Oristano', link_grp: 'https://t.me/c/1614195634/550?thread=543', link_telegram: ''},
|
||||
{_id: 65, reg: 'VEN', prov: 'PD', descr: 'Padova', link_grp: 'https://t.me/c/1614195634/610?thread=600', link_telegram: ''},
|
||||
{_id: 66, reg: 'SIC', prov: 'PA', descr: 'Palermo', link_grp: 'https://t.me/c/1614195634/568?thread=558', link_telegram: ''},
|
||||
{_id: 67, reg: 'EMR', prov: 'PR', descr: 'Parma', link_grp: 'https://t.me/c/1614195634/432?thread=423', link_telegram: ''},
|
||||
{_id: 68, reg: 'LOM', prov: 'PV', descr: 'Pavia', link_grp: 'https://t.me/c/1614195634/499?thread=486', link_telegram: ''},
|
||||
{_id: 69, reg: 'UMB', prov: 'PG', descr: 'Perugia', link_grp: 'https://t.me/c/1614195634/403?thread=401', link_telegram: ''},
|
||||
{_id: 70, reg: 'MAR', prov: 'PU', descr: 'Pesaro e Urbino', link_grp: 'https://t.me/c/1614195634/454?thread=449', link_telegram: ''},
|
||||
{_id: 71, reg: 'ABR', prov: 'PE', descr: 'Pescara', link_grp: 'https://t.me/c/1614195634/368?thread=367', link_telegram: ''},
|
||||
{_id: 72, reg: 'EMR', prov: 'PC', descr: 'Piacenza', link_grp: 'https://t.me/c/1614195634/433?thread=424', link_telegram: ''},
|
||||
{_id: 73, reg: 'TOS', prov: 'PI', descr: 'Pisa', link_grp: 'https://t.me/c/1614195634/589?thread=578', link_telegram: ''},
|
||||
{_id: 74, reg: 'TOS', prov: 'PT', descr: 'Pistoia', link_grp: 'https://t.me/c/1614195634/590?thread=579', link_telegram: ''},
|
||||
{_id: 75, reg: 'FVG', prov: 'PN', descr: 'Pordenone', link_grp: 'https://t.me/c/1614195634/470?thread=466', link_telegram: ''},
|
||||
{_id: 76, reg: 'BAS', prov: 'PZ', descr: 'Potenza', link_grp: 'https://t.me/c/1614195634/376?thread=375', link_telegram: ''},
|
||||
{_id: 77, reg: 'TOS', prov: 'PO', descr: 'Prato', link_grp: 'https://t.me/c/1614195634/591?thread=580', link_telegram: ''},
|
||||
{_id: 78, reg: 'SIC', prov: 'RG', descr: 'Ragusa', link_grp: 'https://t.me/c/1614195634/569?thread=559', link_telegram: ''},
|
||||
{_id: 79, reg: 'EMR', prov: 'RA', descr: 'Ravenna', link_grp: 'https://t.me/c/1614195634/434?thread=425', link_telegram: ''},
|
||||
{_id: 80, reg: 'CAL', prov: 'RC', descr: 'Reggio Calabria', link_grp: 'https://t.me/c/1614195634/385?thread=383', link_telegram: ''},
|
||||
{_id: 81, reg: 'EMR', prov: 'RE', descr: 'Reggio Emilia', link_grp: 'https://t.me/c/1614195634/435?thread=426', link_telegram: ''},
|
||||
{_id: 82, reg: 'LAZ', prov: 'RI', descr: 'Rieti', link_grp: 'https://t.me/c/1614195634/61?thread=45', link_telegram: ''},
|
||||
{_id: 83, reg: 'EMR', prov: 'RN', descr: 'Rimini', link_grp: 'https://t.me/c/1614195634/436?thread=https://t.me/c/1614195634/64?thread=57427', link_telegram: ''},
|
||||
{_id: 84, reg: 'LAZ', prov: 'RM', descr: 'Roma', link_grp: '', link_telegram: ''},
|
||||
{_id: 85, reg: 'VEN', prov: 'RO', descr: 'Rovigo', link_grp: 'https://t.me/c/1614195634/611?thread=601', link_telegram: ''},
|
||||
{_id: 86, reg: 'CAM', prov: 'SA', descr: 'Salerno', link_grp: 'https://t.me/c/1614195634/416?thread=412', link_telegram: ''},
|
||||
{_id: 87, reg: 'SAR', prov: 'VS', descr: 'Medio Campidano', link_grp: '', link_telegram: ''},
|
||||
{_id: 88, reg: 'SAR', prov: 'SS', descr: 'Sassari', link_grp: 'https://t.me/c/1614195634/551?thread=544', link_telegram: ''},
|
||||
{_id: 89, reg: 'LIG', prov: 'SV', descr: 'Savona', link_grp: 'https://t.me/c/1614195634/395?thread=391', link_telegram: ''},
|
||||
{_id: 90, reg: 'TOS', prov: 'SI', descr: 'Siena', link_grp: 'https://t.me/c/1614195634/592?thread=581', link_telegram: ''},
|
||||
{_id: 91, reg: 'SIC', prov: 'SR', descr: 'Siracusa', link_grp: 'https://t.me/c/1614195634/570?thread=560', link_telegram: ''},
|
||||
{_id: 92, reg: 'LOM', prov: 'SO', descr: 'Sondrio', link_grp: 'https://t.me/c/1614195634/500?thread=487', link_telegram: ''},
|
||||
{_id: 93, reg: 'PUG', prov: 'TA', descr: 'Taranto', link_grp: 'https://t.me/c/1614195634/539?thread=533', link_telegram: ''},
|
||||
{_id: 94, reg: 'ABR', prov: 'TE', descr: 'Teramo', link_grp: 'https://t.me/c/1614195634/370?thread=369', link_telegram: ''},
|
||||
{_id: 95, reg: 'UMB', prov: 'TR', descr: 'Terni', link_grp: 'https://t.me/c/1614195634/404?thread=402', link_telegram: ''},
|
||||
{_id: 96, reg: 'PIE', prov: 'TO', descr: 'Torino', link_grp: 'https://t.me/c/1614195634/518?thread=509', link_telegram: ''},
|
||||
{_id: 97, reg: 'SAR', prov: 'OG', descr: 'Ogliastra', link_grp: '', link_telegram: ''},
|
||||
{_id: 98, reg: 'SIC', prov: 'TP', descr: 'Trapani', link_grp: 'https://t.me/c/1614195634/571?thread=561', link_telegram: ''},
|
||||
{_id: 99, reg: 'TAA', prov: 'TN', descr: 'Trento', link_grp: 'https://t.me/c/1614195634/597?thread=595', link_telegram: ''},
|
||||
{_id: 100, reg: 'VEN', prov: 'TV', descr: 'Treviso', link_grp: 'https://t.me/c/1614195634/612?thread=602', link_telegram: ''},
|
||||
{_id: 101, reg: 'FVG', prov: 'TS', descr: 'Trieste', link_grp: 'https://t.me/c/1614195634/471?thread=467', link_telegram: ''},
|
||||
{_id: 102, reg: 'FVG', prov: 'UD', descr: 'Udine', link_grp: 'https://t.me/c/1614195634/472?thread=468', link_telegram: ''},
|
||||
{_id: 103, reg: 'LOM', prov: 'VA', descr: 'Varese', link_grp: 'https://t.me/c/1614195634/501?thread=488', link_telegram: ''},
|
||||
{_id: 104, reg: 'VEN', prov: 'VE', descr: 'Venezia', link_grp: 'https://t.me/c/1614195634/613?thread=603', link_telegram: ''},
|
||||
{_id: 105, reg: 'PIE', prov: 'VB', descr: 'Verbano-Cusio-Ossola', link_grp: 'https://t.me/c/1614195634/519?thread=510 ', link_telegram: ''},
|
||||
{_id: 106, reg: 'PIE', prov: 'VC', descr: 'Vercelli', link_grp: 'https://t.me/c/1614195634/512?thread=511', link_telegram: ''},
|
||||
{_id: 107, reg: 'VEN', prov: 'VR', descr: 'Verona', link_grp: 'https://t.me/c/1614195634/614?thread=604', link_telegram: ''},
|
||||
{_id: 108, reg: 'CAL', prov: 'VV', descr: 'Vibo Valentia', link_grp: 'https://t.me/c/1614195634/386?thread=384', link_telegram: ''},
|
||||
{_id: 109, reg: 'VEN', prov: 'VI', descr: 'Vicenza', link_grp: 'https://t.me/c/1614195634/615?thread=605', link_telegram: ''},
|
||||
{_id: 110, reg: 'LAZ', prov: 'VT', descr: 'Viterbo', link_grp: 'https://t.me/c/1614195634/76?thread=74', link_telegram: ''},
|
||||
{_id: 111, reg: 'RSM', prov: 'RSM', descr: 'Repubblica di San Marino', link_grp: 'https://t.me/+HSdNurm0IXY1MGI0', link_telegram: ''},
|
||||
{_id: 112, reg: 'EST', prov: 'EST', descr: 'Estero', link_grp: '', link_telegram: ''},
|
||||
{_id: 113, reg: 'ONL', prov: 'ONL', descr: 'On Line', link_grp: '', link_telegram: ''},
|
||||
{_id: 114, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord-Est', card: 'NORD-EST', link_grp: 'https://t.me/c/1614195634/64?thread=57', link_telegram: ''},
|
||||
{_id: 115, reg: 'LAZ', prov: 'RM', descr: 'Roma Sud-Est', card: 'SUD-EST', link_grp: 'https://t.me/c/1614195634/65?thread=58', link_telegram: ''},
|
||||
{_id: 116, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord', card: 'NORD', link_grp: 'https://t.me/c/1614195634/75?thread=73', link_telegram: ''},
|
||||
{_id: 117, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord-Ovest', card: 'NORD-OVEST', link_grp: 'https://t.me/c/1614195634/62?thread=47', link_telegram: ''},
|
||||
{_id: 118, reg: 'LAZ', prov: 'RM', descr: 'Roma Sud e Litorale', card: 'SUD', link_grp: 'https://t.me/c/1614195634/67?thread=43', link_telegram: ''},
|
||||
{_id: 119, reg: 'PUG', prov: 'VAL', descr: 'Valle D\'Itria', link_grp: 'https://t.me/progettoriso/7016?thread=7015', link_telegram: ''},
|
||||
{_id: 120, reg: 'SAR', prov: 'SUS', descr: 'Sud Sardegna', link_grp: 'https://t.me/c/1614195634/552?thread=545', link_telegram: ''},
|
||||
{_id: 121, reg: 'ITA', prov: 'ITA', descr: 'Italia', link_grp: '', link_telegram: ''},
|
||||
{_id: 122, reg: 'LOM', prov: 'MI', descr: 'Milano Est', card: 'EST', link_grp: '', link_telegram: ''},
|
||||
{ _id: 1, reg: 'SIC', prov: 'AG', descr: 'Agrigento', link_grp: 'https://t.me/c/1614195634/562?thread=553', link_telegram: '' },
|
||||
{ _id: 2, reg: 'PIE', prov: 'AL', descr: 'Alessandria', link_grp: 'https://t.me/c/1614195634/513?thread=504', link_telegram: '' },
|
||||
{ _id: 3, reg: 'MAR', prov: 'AN', descr: 'Ancona', link_grp: 'https://t.me/c/1614195634/450?thread=446', link_telegram: '' },
|
||||
{ _id: 4, reg: 'VDA', prov: 'AO', descr: 'Aosta', link_grp: 'https://t.me/c/1614195634/521?thread=520', link_telegram: '' },
|
||||
{ _id: 5, reg: 'TOS', prov: 'AR', descr: 'Arezzo', link_grp: 'https://t.me/c/1614195634/583?thread=572', link_telegram: '' },
|
||||
{ _id: 6, reg: 'MAR', prov: 'AP', descr: 'Ascoli Piceno', link_grp: 'https://t.me/c/1614195634/451?thread=447', link_telegram: '' },
|
||||
{ _id: 7, reg: 'PIE', prov: 'AT', descr: 'Asti', link_grp: 'https://t.me/c/1614195634/514?thread=505', link_telegram: '' },
|
||||
{ _id: 8, reg: 'CAM', prov: 'AV', descr: 'Avellino', link_grp: 'https://t.me/c/1614195634/413?thread=409', link_telegram: '' },
|
||||
{ _id: 9, reg: 'PUG', prov: 'BA', descr: 'Bari', link_grp: 'https://t.me/c/1614195634/534?thread=528', link_telegram: '' },
|
||||
{ _id: 10, reg: 'PUG', prov: 'BT', descr: 'Barletta-Andria-Trani', link_grp: 'https://t.me/c/1614195634/535?thread=529', link_telegram: '' },
|
||||
{ _id: 11, reg: 'VEN', prov: 'BL', descr: 'Belluno', link_grp: 'https://t.me/c/1614195634/608?thread=599', link_telegram: '' },
|
||||
{ _id: 12, reg: 'CAM', prov: 'BN', descr: 'Benevento', link_grp: 'https://t.me/c/1614195634/415?thread=411', link_telegram: '' },
|
||||
{ _id: 13, reg: 'LOM', prov: 'BG', descr: 'Bergamo', link_grp: 'https://t.me/c/1614195634/491?thread=477', link_telegram: '' },
|
||||
{ _id: 14, reg: 'PIE', prov: 'BI', descr: 'Biella', link_grp: 'https://t.me/c/1614195634/515?thread=506', link_telegram: '' },
|
||||
{ _id: 15, reg: 'EMR', prov: 'BO', descr: 'Bologna', link_grp: 'https://t.me/c/1614195634/428?thread=419', link_telegram: '' },
|
||||
{ _id: 16, reg: 'TAA', prov: 'BZ', descr: 'Bolzano', link_grp: 'https://t.me/c/1614195634/596?thread=594', link_telegram: '' },
|
||||
{ _id: 17, reg: 'LOM', prov: 'BS', descr: 'Brescia', link_grp: 'https://t.me/c/1614195634/490?thread=478', link_telegram: '' },
|
||||
{ _id: 18, reg: 'PUG', prov: 'BR', descr: 'Brindisi', link_grp: 'https://t.me/c/1614195634/536?thread=530', link_telegram: '' },
|
||||
{ _id: 19, reg: 'SAR', prov: 'CA', descr: 'Cagliari', link_grp: 'https://t.me/c/1614195634/546?thread=541', link_telegram: '' },
|
||||
{ _id: 20, reg: 'SIC', prov: 'CL', descr: 'Caltanissetta', link_grp: 'https://t.me/c/1614195634/563?thread=554', link_telegram: '' },
|
||||
{ _id: 21, reg: 'MOL', prov: 'CB', descr: 'Campobasso', link_grp: 'https://t.me/c/1614195634/398?thread=396', link_telegram: '' },
|
||||
{ _id: 22, reg: 'SAR', prov: 'CI', descr: 'Carbonia-Iglesias', link_grp: '', link_telegram: '' },
|
||||
{ _id: 23, reg: 'CAM', prov: 'CE', descr: 'Caserta', link_grp: 'https://t.me/c/1614195634/414?thread=410', link_telegram: '' },
|
||||
{ _id: 24, reg: 'SIC', prov: 'CT', descr: 'Catania', link_grp: 'https://t.me/c/1614195634/564?thread=555', link_telegram: '' },
|
||||
{ _id: 25, reg: 'CAL', prov: 'CZ', descr: 'Catanzaro', link_grp: 'https://t.me/c/1614195634/378?thread=377', link_telegram: '' },
|
||||
{ _id: 26, reg: 'ABR', prov: 'CH', descr: 'Chieti', link_grp: 'https://t.me/c/1614195634/366?thread=365', link_telegram: '' },
|
||||
{ _id: 27, reg: 'LOM', prov: 'CO', descr: 'Como', link_grp: 'https://t.me/c/1614195634/492?thread=479', link_telegram: '' },
|
||||
{ _id: 28, reg: 'CAL', prov: 'CS', descr: 'Cosenza', link_grp: 'https://t.me/c/1614195634/381?thread=379', link_telegram: '' },
|
||||
{ _id: 29, reg: 'LOM', prov: 'CR', descr: 'Cremona', link_grp: 'https://t.me/c/1614195634/493?thread=480', link_telegram: '' },
|
||||
{ _id: 30, reg: 'CAL', prov: 'KR', descr: 'Crotone', link_grp: 'https://t.me/c/1614195634/382?thread=380', link_telegram: '' },
|
||||
{ _id: 31, reg: 'PIE', prov: 'CN', descr: 'Cuneo', link_grp: 'https://t.me/c/1614195634/516?thread=507', link_telegram: '' },
|
||||
{ _id: 32, reg: 'SIC', prov: 'EN', descr: 'Enna', link_grp: 'https://t.me/c/1614195634/565?thread=556', link_telegram: '' },
|
||||
{ _id: 33, reg: 'MAR', prov: 'FM', descr: 'Fermo', link_grp: 'https://t.me/c/1614195634/453?thread=448', link_telegram: '' },
|
||||
{ _id: 34, reg: 'EMR', prov: 'FE', descr: 'Ferrara', link_grp: 'https://t.me/c/1614195634/429?thread=420', link_telegram: '' },
|
||||
{ _id: 35, reg: 'TOS', prov: 'FI', descr: 'Firenze', link_grp: 'https://t.me/c/1614195634/584?thread=573', link_telegram: '' },
|
||||
{ _id: 36, reg: 'PUG', prov: 'FG', descr: 'Foggia', link_grp: 'https://t.me/c/1614195634/537?thread=531', link_telegram: '' },
|
||||
{ _id: 37, reg: 'EMR', prov: 'FC', descr: 'Forli-Cesena', link_grp: 'https://t.me/c/1614195634/430?thread=421', link_telegram: '' },
|
||||
{ _id: 38, reg: 'LAZ', prov: 'FR', descr: 'Frosinone', link_grp: 'https://t.me/c/1614195634/48?thread=44', link_telegram: '' },
|
||||
{ _id: 39, reg: 'LIG', prov: 'GE', descr: 'Genova', link_grp: 'https://t.me/c/1614195634/392?thread=388', link_telegram: '' },
|
||||
{ _id: 40, reg: 'FVG', prov: 'GO', descr: 'Gorizia', link_grp: 'https://t.me/c/1614195634/469?thread=465', link_telegram: '' },
|
||||
{ _id: 41, reg: 'TOS', prov: 'GR', descr: 'Grosseto', link_grp: 'https://t.me/c/1614195634/585?thread=574', link_telegram: '' },
|
||||
{ _id: 42, reg: 'LIG', prov: 'IM', descr: 'Imperia', link_grp: 'https://t.me/c/1614195634/393?thread=389', link_telegram: '' },
|
||||
{ _id: 43, reg: 'MOL', prov: 'IS', descr: 'Isernia', link_grp: 'https://t.me/c/1614195634/399?thread=397', link_telegram: '' },
|
||||
{ _id: 44, reg: 'LIG', prov: 'SP', descr: 'La Spezia', link_grp: 'https://t.me/c/1614195634/394?thread=390', link_telegram: '' },
|
||||
{ _id: 45, reg: 'ABR', prov: 'AQ', descr: 'L\'Aquila', link_grp: 'https://t.me/c/1614195634/364?thread=363', link_telegram: '' },
|
||||
{ _id: 46, reg: 'LAZ', prov: 'LT', descr: 'Latina', link_grp: 'https://t.me/c/1614195634/60?thread=46', link_telegram: '' },
|
||||
{ _id: 47, reg: 'PUG', prov: 'LE', descr: 'Lecce', link_grp: 'https://t.me/c/1614195634/538?thread=532', link_telegram: '' },
|
||||
{ _id: 48, reg: 'LOM', prov: 'LC', descr: 'Lecco', link_grp: 'https://t.me/c/1614195634/494?thread=482', link_telegram: '' },
|
||||
{ _id: 49, reg: 'TOS', prov: 'LI', descr: 'Livorno', link_grp: 'https://t.me/c/1614195634/586?thread=575', link_telegram: '' },
|
||||
{ _id: 50, reg: 'LOM', prov: 'LO', descr: 'Lodi', link_grp: 'https://t.me/c/1614195634/495?thread=483', link_telegram: '' },
|
||||
{ _id: 51, reg: 'TOS', prov: 'LU', descr: 'Lucca', link_grp: 'https://t.me/c/1614195634/587?thread=576', link_telegram: '' },
|
||||
{ _id: 52, reg: 'MAR', prov: 'MC', descr: 'Macerata', link_grp: 'https://t.me/c/1614195634/300?thread=162', link_telegram: '' },
|
||||
{ _id: 53, reg: 'LOM', prov: 'MN', descr: 'Mantova', link_grp: 'https://t.me/c/1614195634/497?thread=484', link_telegram: '' },
|
||||
{ _id: 54, reg: 'TOS', prov: 'MS', descr: 'Massa-Carrara', link_grp: 'https://t.me/c/1614195634/588?thread=577', link_telegram: '' },
|
||||
{ _id: 55, reg: 'BAS', prov: 'MT', descr: 'Matera', link_grp: 'https://t.me/c/1614195634/374?thread=373', link_telegram: '' },
|
||||
{ _id: 56, reg: 'SIC', prov: 'ME', descr: 'Messina', link_grp: 'https://t.me/c/1614195634/566?thread=557', link_telegram: '' },
|
||||
{ _id: 57, reg: 'LOM', prov: 'MI', descr: 'Milano', link_grp: 'https://t.me/c/1614195634/214?thread=173', link_telegram: '' },
|
||||
{ _id: 58, reg: 'EMR', prov: 'MO', descr: 'Modena', link_grp: 'https://t.me/c/1614195634/431?thread=422', link_telegram: '' },
|
||||
{ _id: 59, reg: 'LOM', prov: 'MB', descr: 'Monza e della Brianza', link_grp: 'https://t.me/c/1614195634/498?thread=485', link_telegram: '' },
|
||||
{ _id: 60, reg: 'CAM', prov: 'NA', descr: 'Napoli', link_grp: 'https://t.me/c/1614195634/407?thread=406', link_telegram: '' },
|
||||
{ _id: 61, reg: 'PIE', prov: 'NO', descr: 'Novara', link_grp: 'https://t.me/c/1614195634/517?thread=508', link_telegram: '' },
|
||||
{ _id: 62, reg: 'SAR', prov: 'NU', descr: 'Nuoro', link_grp: 'https://t.me/c/1614195634/548?thread=542', link_telegram: '' },
|
||||
{ _id: 63, reg: 'SAR', prov: 'OT', descr: 'Olbia-Tempio', link_grp: '', link_telegram: '' },
|
||||
{ _id: 64, reg: 'SAR', prov: 'OR', descr: 'Oristano', link_grp: 'https://t.me/c/1614195634/550?thread=543', link_telegram: '' },
|
||||
{ _id: 65, reg: 'VEN', prov: 'PD', descr: 'Padova', link_grp: 'https://t.me/c/1614195634/610?thread=600', link_telegram: '' },
|
||||
{ _id: 66, reg: 'SIC', prov: 'PA', descr: 'Palermo', link_grp: 'https://t.me/c/1614195634/568?thread=558', link_telegram: '' },
|
||||
{ _id: 67, reg: 'EMR', prov: 'PR', descr: 'Parma', link_grp: 'https://t.me/c/1614195634/432?thread=423', link_telegram: '' },
|
||||
{ _id: 68, reg: 'LOM', prov: 'PV', descr: 'Pavia', link_grp: 'https://t.me/c/1614195634/499?thread=486', link_telegram: '' },
|
||||
{ _id: 69, reg: 'UMB', prov: 'PG', descr: 'Perugia', link_grp: 'https://t.me/c/1614195634/403?thread=401', link_telegram: '' },
|
||||
{ _id: 70, reg: 'MAR', prov: 'PU', descr: 'Pesaro e Urbino', link_grp: 'https://t.me/c/1614195634/454?thread=449', link_telegram: '' },
|
||||
{ _id: 71, reg: 'ABR', prov: 'PE', descr: 'Pescara', link_grp: 'https://t.me/c/1614195634/368?thread=367', link_telegram: '' },
|
||||
{ _id: 72, reg: 'EMR', prov: 'PC', descr: 'Piacenza', link_grp: 'https://t.me/c/1614195634/433?thread=424', link_telegram: '' },
|
||||
{ _id: 73, reg: 'TOS', prov: 'PI', descr: 'Pisa', link_grp: 'https://t.me/c/1614195634/589?thread=578', link_telegram: '' },
|
||||
{ _id: 74, reg: 'TOS', prov: 'PT', descr: 'Pistoia', link_grp: 'https://t.me/c/1614195634/590?thread=579', link_telegram: '' },
|
||||
{ _id: 75, reg: 'FVG', prov: 'PN', descr: 'Pordenone', link_grp: 'https://t.me/c/1614195634/470?thread=466', link_telegram: '' },
|
||||
{ _id: 76, reg: 'BAS', prov: 'PZ', descr: 'Potenza', link_grp: 'https://t.me/c/1614195634/376?thread=375', link_telegram: '' },
|
||||
{ _id: 77, reg: 'TOS', prov: 'PO', descr: 'Prato', link_grp: 'https://t.me/+PzI_p0ao_jU1OGQ0', link_telegram: '' },
|
||||
{ _id: 78, reg: 'SIC', prov: 'RG', descr: 'Ragusa', link_grp: 'https://t.me/c/1614195634/569?thread=559', link_telegram: '' },
|
||||
{ _id: 79, reg: 'EMR', prov: 'RA', descr: 'Ravenna', link_grp: 'https://t.me/c/1614195634/434?thread=425', link_telegram: '' },
|
||||
{ _id: 80, reg: 'CAL', prov: 'RC', descr: 'Reggio Calabria', link_grp: 'https://t.me/c/1614195634/385?thread=383', link_telegram: '' },
|
||||
{ _id: 81, reg: 'EMR', prov: 'RE', descr: 'Reggio Emilia', link_grp: 'https://t.me/c/1614195634/435?thread=426', link_telegram: '' },
|
||||
{ _id: 82, reg: 'LAZ', prov: 'RI', descr: 'Rieti', link_grp: 'https://t.me/c/1614195634/61?thread=45', link_telegram: '' },
|
||||
{ _id: 83, reg: 'EMR', prov: 'RN', descr: 'Rimini', link_grp: 'https://t.me/c/1614195634/436?thread=https://t.me/c/1614195634/64?thread=57427', link_telegram: '' },
|
||||
{ _id: 84, reg: 'LAZ', prov: 'RM', descr: 'Roma', link_grp: '', link_telegram: '' },
|
||||
{ _id: 85, reg: 'VEN', prov: 'RO', descr: 'Rovigo', link_grp: 'https://t.me/c/1614195634/611?thread=601', link_telegram: '' },
|
||||
{ _id: 86, reg: 'CAM', prov: 'SA', descr: 'Salerno', link_grp: 'https://t.me/c/1614195634/416?thread=412', link_telegram: '' },
|
||||
{ _id: 87, reg: 'SAR', prov: 'VS', descr: 'Medio Campidano', link_grp: '', link_telegram: '' },
|
||||
{ _id: 88, reg: 'SAR', prov: 'SS', descr: 'Sassari', link_grp: 'https://t.me/c/1614195634/551?thread=544', link_telegram: '' },
|
||||
{ _id: 89, reg: 'LIG', prov: 'SV', descr: 'Savona', link_grp: 'https://t.me/c/1614195634/395?thread=391', link_telegram: '' },
|
||||
{ _id: 90, reg: 'TOS', prov: 'SI', descr: 'Siena', link_grp: 'https://t.me/c/1614195634/592?thread=581', link_telegram: '' },
|
||||
{ _id: 91, reg: 'SIC', prov: 'SR', descr: 'Siracusa', link_grp: 'https://t.me/c/1614195634/570?thread=560', link_telegram: '' },
|
||||
{ _id: 92, reg: 'LOM', prov: 'SO', descr: 'Sondrio', link_grp: 'https://t.me/c/1614195634/500?thread=487', link_telegram: '' },
|
||||
{ _id: 93, reg: 'PUG', prov: 'TA', descr: 'Taranto', link_grp: 'https://t.me/c/1614195634/539?thread=533', link_telegram: '' },
|
||||
{ _id: 94, reg: 'ABR', prov: 'TE', descr: 'Teramo', link_grp: 'https://t.me/c/1614195634/370?thread=369', link_telegram: '' },
|
||||
{ _id: 95, reg: 'UMB', prov: 'TR', descr: 'Terni', link_grp: 'https://t.me/c/1614195634/404?thread=402', link_telegram: '' },
|
||||
{ _id: 96, reg: 'PIE', prov: 'TO', descr: 'Torino', link_grp: 'https://t.me/c/1614195634/518?thread=509', link_telegram: '' },
|
||||
{ _id: 97, reg: 'SAR', prov: 'OG', descr: 'Ogliastra', link_grp: '', link_telegram: '' },
|
||||
{ _id: 98, reg: 'SIC', prov: 'TP', descr: 'Trapani', link_grp: 'https://t.me/c/1614195634/571?thread=561', link_telegram: '' },
|
||||
{ _id: 99, reg: 'TAA', prov: 'TN', descr: 'Trento', link_grp: 'https://t.me/c/1614195634/597?thread=595', link_telegram: '' },
|
||||
{ _id: 100, reg: 'VEN', prov: 'TV', descr: 'Treviso', link_grp: 'https://t.me/c/1614195634/612?thread=602', link_telegram: '' },
|
||||
{ _id: 101, reg: 'FVG', prov: 'TS', descr: 'Trieste', link_grp: 'https://t.me/c/1614195634/471?thread=467', link_telegram: '' },
|
||||
{ _id: 102, reg: 'FVG', prov: 'UD', descr: 'Udine', link_grp: 'https://t.me/c/1614195634/472?thread=468', link_telegram: '' },
|
||||
{ _id: 103, reg: 'LOM', prov: 'VA', descr: 'Varese', link_grp: 'https://t.me/c/1614195634/501?thread=488', link_telegram: '' },
|
||||
{ _id: 104, reg: 'VEN', prov: 'VE', descr: 'Venezia', link_grp: 'https://t.me/c/1614195634/613?thread=603', link_telegram: '' },
|
||||
{ _id: 105, reg: 'PIE', prov: 'VB', descr: 'Verbano-Cusio-Ossola', link_grp: 'https://t.me/c/1614195634/519?thread=510 ', link_telegram: '' },
|
||||
{ _id: 106, reg: 'PIE', prov: 'VC', descr: 'Vercelli', link_grp: 'https://t.me/c/1614195634/512?thread=511', link_telegram: '' },
|
||||
{ _id: 107, reg: 'VEN', prov: 'VR', descr: 'Verona', link_grp: 'https://t.me/c/1614195634/614?thread=604', link_telegram: '' },
|
||||
{ _id: 108, reg: 'CAL', prov: 'VV', descr: 'Vibo Valentia', link_grp: 'https://t.me/c/1614195634/386?thread=384', link_telegram: '' },
|
||||
{ _id: 109, reg: 'VEN', prov: 'VI', descr: 'Vicenza', link_grp: 'https://t.me/c/1614195634/615?thread=605', link_telegram: '' },
|
||||
{ _id: 110, reg: 'LAZ', prov: 'VT', descr: 'Viterbo', link_grp: 'https://t.me/c/1614195634/76?thread=74', link_telegram: '' },
|
||||
{ _id: 111, reg: 'RSM', prov: 'RSM', descr: 'Repubblica di San Marino', link_grp: 'https://t.me/+HSdNurm0IXY1MGI0', link_telegram: '' },
|
||||
{ _id: 112, reg: 'EST', prov: 'EST', descr: 'Estero', link_grp: '', link_telegram: '' },
|
||||
{ _id: 113, reg: 'ONL', prov: 'ONL', descr: 'On Line', link_grp: '', link_telegram: '' },
|
||||
{ _id: 114, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord-Est', card: 'NORD-EST', link_grp: 'https://t.me/c/1614195634/64?thread=57', link_telegram: '' },
|
||||
{ _id: 115, reg: 'LAZ', prov: 'RM', descr: 'Roma Sud-Est', card: 'SUD-EST', link_grp: 'https://t.me/c/1614195634/65?thread=58', link_telegram: '' },
|
||||
{ _id: 116, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord', card: 'NORD', link_grp: 'https://t.me/c/1614195634/75?thread=73', link_telegram: '' },
|
||||
{ _id: 117, reg: 'LAZ', prov: 'RM', descr: 'Roma Nord-Ovest', card: 'NORD-OVEST', link_grp: 'https://t.me/c/1614195634/62?thread=47', link_telegram: '' },
|
||||
{ _id: 118, reg: 'LAZ', prov: 'RM', descr: 'Roma Sud e Litorale', card: 'SUD', link_grp: 'https://t.me/c/1614195634/67?thread=43', link_telegram: '' },
|
||||
{ _id: 119, reg: 'PUG', prov: 'VAL', descr: 'Valle D\'Itria', link_grp: 'https://t.me/progettoriso/7016?thread=7015', link_telegram: '' },
|
||||
{ _id: 120, reg: 'SAR', prov: 'SUS', descr: 'Sud Sardegna', link_grp: 'https://t.me/c/1614195634/552?thread=545', link_telegram: '' },
|
||||
{ _id: 121, reg: 'ITA', prov: 'ITA', descr: 'Italia', link_grp: '', link_telegram: '' },
|
||||
{ _id: 122, reg: 'LOM', prov: 'MI', descr: 'Milano Est', card: 'EST', link_grp: '', link_telegram: '' },
|
||||
],
|
||||
};
|
||||
|
||||
@@ -19,6 +19,7 @@ module.exports = {
|
||||
{_id: 17, descr: 'Attrezzature', icon: 'fas fa-tools', color: 'blue-7'},
|
||||
{_id: 18, descr: 'Animali', icon: 'fas fa-paw', color: 'green-7'},
|
||||
{_id: 19, descr: 'Arte / Decorazioni', icon: 'fas fa-palette', color: 'purple-7'},
|
||||
{_id: 20, descr: 'Agricoltura', icon: 'fa-seedling', color: 'green-7'},
|
||||
|
||||
],
|
||||
};
|
||||
|
||||
@@ -7,6 +7,8 @@ const shared_consts = require('../tools/shared_nodejs');
|
||||
|
||||
const tools = require('../tools/general');
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
const { City } = require('../models/city');
|
||||
const Product = require('../models/product');
|
||||
const Inventariogm = require('../models/inventariogm');
|
||||
@@ -18,6 +20,14 @@ const Publisher = require('../models/publisher');
|
||||
const SubCatProd = require('../models/subcatprod');
|
||||
const Gasordine = require('../models/gasordine');
|
||||
|
||||
const { User } = require('../models/user');
|
||||
|
||||
const server_constants = require('../tools/server_constants');
|
||||
|
||||
const { ImageDownloader } = require('../tools/general.js');
|
||||
|
||||
const path = require('path');
|
||||
|
||||
var { authenticate } = require('../middleware/authenticate');
|
||||
|
||||
router.post('/updateval', authenticate, async (req, res) => {
|
||||
@@ -45,6 +55,35 @@ function fixURL(url) {
|
||||
return url.replace(/https:\//g, 'https://');
|
||||
}
|
||||
|
||||
async function downloadImgIfMissing(productInfo) {
|
||||
|
||||
if (!productInfo.image_link)
|
||||
return { prodInfo: null, aggiornatoimg: false };
|
||||
|
||||
const img = 'upload/products/' + productInfo.image_link.split('/').pop();
|
||||
const savePath = path.resolve(__dirname, img); // Sostituisci con il percorso dove salvare l'immagine
|
||||
|
||||
if (!productInfo.img || !fs.existsSync(savePath)) {
|
||||
// Download image from the URL productInfo.image_link
|
||||
productInfo.img = img;
|
||||
|
||||
const downloader = new ImageDownloader();
|
||||
|
||||
const aggiornatoimg = await downloader.downloadImage(productInfo.image_link, savePath).then(result => {
|
||||
if (result) {
|
||||
// console.log('Download completato con successo!');
|
||||
} else {
|
||||
console.log('Download non riuscito.');
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
});
|
||||
return { prodInfo: productInfo, aggiornatoimg };
|
||||
}
|
||||
|
||||
return { prodInfo: null, aggiornatoimg: false };
|
||||
}
|
||||
|
||||
async function completaSettaggioProduct_AndProductInfo(arrcampi_productInfo, arrcampi_product, rec, product, productInfo) {
|
||||
|
||||
@@ -95,7 +134,11 @@ async function completaSettaggioProduct_AndProductInfo(arrcampi_productInfo, arr
|
||||
productInfo.img = 'upload/products/' + product.code + '.jpg';
|
||||
} else {
|
||||
if (rec.hasOwnProperty('img')) {
|
||||
productInfo.img = 'upload/products/' + rec['img'];
|
||||
if (rec['img']) {
|
||||
productInfo.img = 'upload/products/' + rec['img'];
|
||||
} else {
|
||||
productInfo.img = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,10 +158,10 @@ async function completaSettaggioProduct_AndProductInfo(arrcampi_productInfo, arr
|
||||
productInfo.code = preccode;
|
||||
}
|
||||
}
|
||||
if (rec.hasOwnProperty('productType')) {
|
||||
productInfo.productType = rec.hasOwnProperty('productType');
|
||||
if (rec.hasOwnProperty('productTypes')) {
|
||||
productInfo.productTypes = productInfo.productTypes;
|
||||
} else {
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.PRODUCT;
|
||||
productInfo.productTypes = [shared_consts.PRODUCTTYPE.PRODUCT];
|
||||
}
|
||||
|
||||
return { product, productInfo };
|
||||
@@ -325,6 +368,8 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
let indprod = 0;
|
||||
let newprod = 0;
|
||||
|
||||
let numprod = dataObjects.length;
|
||||
|
||||
for (const product of dataObjects) {
|
||||
let isnuovo = false
|
||||
let setta = false
|
||||
@@ -335,6 +380,11 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
importa = false;
|
||||
|
||||
if (importa) {
|
||||
let versGM = product.Versione ? product.Versione : '';
|
||||
|
||||
// split versioneGM in array with separated ","
|
||||
let arrversGM = versGM.split(",").map(x => x.trim());
|
||||
|
||||
let productInfo = {
|
||||
idapp: product.idapp,
|
||||
code: product.isbn,
|
||||
@@ -358,43 +408,45 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
|
||||
let versione = 0;
|
||||
|
||||
// Download, DVD, Epub, Mobi, Nuovo, PDF, Streaming, Usato
|
||||
if (product.Versione === 'Nuovo')
|
||||
versione = shared_consts.VERSIONE.NUOVO
|
||||
else if (product.Versione === 'Usato')
|
||||
versione = shared_consts.VERSIONE.USATO;
|
||||
else if (product.Versione === 'Download')
|
||||
versione = shared_consts.VERSIONE.DOWNLOAD;
|
||||
else if (product.Versione === 'DVD')
|
||||
versione = shared_consts.VERSIONE.DVD;
|
||||
else if (product.Versione === 'Epub')
|
||||
versione = shared_consts.VERSIONE.EPUB;
|
||||
else if (product.Versione === 'Mobi')
|
||||
versione = shared_consts.VERSIONE.MOBI;
|
||||
else if (product.Versione === 'PDF')
|
||||
versione = shared_consts.VERSIONE.PDF;
|
||||
else if (product.Versione === 'Streaming')
|
||||
versione = shared_consts.VERSIONE.STREAMING;
|
||||
else
|
||||
versione = 100;
|
||||
console.log(indprod + '/' + numprod);
|
||||
|
||||
if (versione === shared_consts.VERSIONE.DOWNLOAD)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.DOWNLOAD;
|
||||
else if (versione === shared_consts.VERSIONE.DVD)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.DVD;
|
||||
else if (versione === shared_consts.VERSIONE.EPUB)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.EPUB;
|
||||
else if (versione === shared_consts.VERSIONE.MOBI)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.MOBI;
|
||||
else if (versione === shared_consts.VERSIONE.PDF)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.PDF;
|
||||
else if (versione === shared_consts.VERSIONE.STREAMING)
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.STREAMING;
|
||||
else
|
||||
productInfo.productType = shared_consts.PRODUCTTYPE.LIBRO;
|
||||
|
||||
if (product.Data)
|
||||
productInfo.productTypes = [];
|
||||
// console.log('indprod', indprod, 'arrversGM', arrversGM, 'versione', product.Versione);
|
||||
|
||||
for (let i = 0; i < arrversGM.length; i++) {
|
||||
// Download, DVD, Epub, Mobi, Nuovo, PDF, Streaming, Usato
|
||||
if (arrversGM[i] === 'Nuovo')
|
||||
vers = shared_consts.PRODUCTTYPE.NUOVO
|
||||
else if (arrversGM[i] === 'Usato')
|
||||
vers = shared_consts.PRODUCTTYPE.USATO;
|
||||
else if (arrversGM[i] === 'Download')
|
||||
vers = shared_consts.PRODUCTTYPE.DOWNLOAD;
|
||||
else if (arrversGM[i] === 'DVD')
|
||||
vers = shared_consts.PRODUCTTYPE.DVD;
|
||||
else if (arrversGM[i] === 'Epub')
|
||||
vers = shared_consts.PRODUCTTYPE.EPUB;
|
||||
else if (arrversGM[i] === 'Mobi')
|
||||
vers = shared_consts.PRODUCTTYPE.MOBI;
|
||||
else if (arrversGM[i] === 'PDF')
|
||||
vers = shared_consts.PRODUCTTYPE.PDF;
|
||||
else if (arrversGM[i] === 'Streaming')
|
||||
vers = shared_consts.PRODUCTTYPE.STREAMING;
|
||||
|
||||
if (i === 0) {
|
||||
// salvati il primo, // nel 99,9% dei casi c'è solo 1 elemento (perchè queste sono tutte le variazioni)
|
||||
versione = vers;
|
||||
}
|
||||
|
||||
productInfo.productTypes.push(vers);
|
||||
}
|
||||
|
||||
|
||||
if (product.Data) {
|
||||
productInfo.date_publishing = new Date(product.Data * 1000);
|
||||
// convert data to timestamp
|
||||
productInfo.date_publishing_ts = productInfo.date_publishing.getTime();
|
||||
}
|
||||
|
||||
productInfo.name = productInfo.name.replace(/ - Usato$| - Nuovo$| - Epub$| - Ebook$| - Mobi$| - DVD$| - Streaming$| - Download$/, "");
|
||||
|
||||
@@ -544,6 +596,12 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
product.idProductInfo = risrecInfo._id;
|
||||
recnewInfo = await ProductInfo.findOne({ code: productInfo.code }).lean();
|
||||
|
||||
let { prodInfo, aggiornatoimg } = await downloadImgIfMissing(recnewInfo);
|
||||
|
||||
if (aggiornatoimg) {
|
||||
await ProductInfo.findOneAndUpdate({ code: productInfo.code }, { $set: prodInfo });
|
||||
}
|
||||
|
||||
if (risrecInfo._id) {
|
||||
// Record existed, so it was updated
|
||||
let arrfieldchange = tools.differentObjects(productInfo, recnewInfo);
|
||||
@@ -600,7 +658,9 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
}
|
||||
|
||||
// cerca l'indice della versione in arrvariazioni
|
||||
let ind = arrvariazioni.findIndex(x => x.versione === versione);
|
||||
let ind = arrvariazioni.findIndex(x =>
|
||||
x.versione === versione)
|
||||
|
||||
let nuovaVariazione = ind < 0;
|
||||
|
||||
//
|
||||
@@ -766,7 +826,7 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
img: 'upload/products/' + product.code + '.jpg',
|
||||
weight: product.weight,
|
||||
unit: tools.getIdUnitsByText(product.unit),
|
||||
productType: shared_consts.PRODUCTTYPE.PRODUCT,
|
||||
productTypes: shared_consts.PRODUCTTYPE.PRODUCT,
|
||||
}
|
||||
|
||||
let reccateg = null;
|
||||
@@ -1100,4 +1160,123 @@ router.post('/import', authenticate, async (req, res) => {
|
||||
|
||||
});
|
||||
|
||||
router.post('/exec', authenticate, async (req, res) => {
|
||||
try {
|
||||
idapp = req.body.idapp;
|
||||
console.log('/exec idapp=', idapp, req.body.script);
|
||||
script = req.body.mydata.script;
|
||||
listafiles = req.body.mydata.listafiles;
|
||||
tokcheck = req.body.mydata.tokcheck;
|
||||
extfiles = req.body.mydata.extfiles;
|
||||
dir = req.body.mydata.dir;
|
||||
withinput = req.body.mydata.withinput;
|
||||
|
||||
const TOKCHECK = 'php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz'
|
||||
|
||||
if (!User.isAdmin(req.user.perm) || (tokcheck !== TOKCHECK)) {
|
||||
// If without permissions, exit
|
||||
return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
|
||||
}
|
||||
|
||||
let result = '';
|
||||
|
||||
if (withinput)
|
||||
result = await tools.execScriptWithInputOnServer(idapp, script);
|
||||
else
|
||||
result = await tools.execScriptOnServer(idapp, script, dir, listafiles, extfiles);
|
||||
|
||||
return res.send(result);
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
return res.status(400).send({ code: server_constants.RIS_CODE_ERR, msg: '' });
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
router.post('/cloudflare', authenticate, async (req, res) => {
|
||||
try {
|
||||
idapp = req.body.idapp;
|
||||
cmd = req.body.cmd;
|
||||
tok = req.body.tok;
|
||||
zoneId = req.body.zoneId;
|
||||
tokcheck = req.body.tokcheck;
|
||||
dnsRecordId = req.body.dnsRecordId;
|
||||
record = req.body.record;
|
||||
// console.log('/cloudflare idapp=', idapp, req.body.script);
|
||||
|
||||
const CloudFlareClass = require('../modules/Cloudflare.js');
|
||||
|
||||
const TOKCHECK = 'php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz'
|
||||
|
||||
if (!User.isAdmin(req.user.perm) || (tokcheck !== TOKCHECK)) {
|
||||
// If without permissions, exit
|
||||
return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
|
||||
}
|
||||
|
||||
let result = '';
|
||||
|
||||
let cf = new CloudFlareClass(null);
|
||||
cf.init();
|
||||
|
||||
if (cmd === "getzones") {
|
||||
result = await cf.fetchCloudflareZones(tok);
|
||||
} else if (cmd === "getDNS") {
|
||||
result = await cf.fetchDNSRecords(tok, zoneId);
|
||||
} else if (cmd === "setRecordDNS") {
|
||||
result = await cf.updateDNSRecord(tok, zoneId, dnsRecordId, record);
|
||||
} else if (cmd === "delRecordDNS") {
|
||||
result = await cf.deleteDNSRecord(tok, zoneId, dnsRecordId);
|
||||
} else if (cmd === "setCorrectIpsOnDNS") {
|
||||
result = await cf.setCorrectIpsOnDNS(record);
|
||||
} else if (cmd === "gettok") {
|
||||
result = process.env.CLOUDFLARE_TOKENS ? JSON.parse(process.env.CLOUDFLARE_TOKENS) : '';
|
||||
}
|
||||
|
||||
return res.send(result);
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
return res.status(400).send({ code: server_constants.RIS_CODE_ERR, msg: '' });
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
router.post('/miab', authenticate, async (req, res) => {
|
||||
try {
|
||||
idapp = req.body.idapp;
|
||||
cmd = req.body.cmd;
|
||||
record = req.body.record;
|
||||
tokcheck = req.body.tokcheck;
|
||||
|
||||
const MailinaboxClass = require('../modules/Mailinabox.js');
|
||||
|
||||
const TOKCHECK = 'php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz'
|
||||
|
||||
if (!User.isAdmin(req.user.perm) || (tokcheck !== TOKCHECK)) {
|
||||
// If without permissions, exit
|
||||
return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
|
||||
}
|
||||
|
||||
let result = '';
|
||||
|
||||
let miab = new MailinaboxClass(null);
|
||||
miab.init();
|
||||
|
||||
if (cmd === "getEmails") {
|
||||
result = await miab.MIAB_getEmails(record);
|
||||
} else if (cmd === "removeEmails") {
|
||||
result = await miab.removeEmail(record);
|
||||
} else if (cmd === "addEmail") {
|
||||
result = await miab.addEmail(record);
|
||||
} else if (cmd === "setMailUserPassword") {
|
||||
result = await miab.setMailUserPassword(record);
|
||||
}
|
||||
|
||||
return res.send(result);
|
||||
} catch (e) {
|
||||
console.error('e', e);
|
||||
return res.status(400).send({ code: server_constants.RIS_CODE_ERR, msg: '' });
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
@@ -45,7 +45,7 @@ router.post('/', authenticate, (req, res) => {
|
||||
// console.log('trovato', trovato);
|
||||
if (trovato) {
|
||||
return Booking.findOneAndUpdate({ id_bookedevent: id }, { $set: fieldtochange }, {
|
||||
new: false,
|
||||
new: true,
|
||||
upsert: true
|
||||
}).then((recbooking) => {
|
||||
// tools.mylog('booking:', booking);
|
||||
@@ -79,7 +79,7 @@ router.delete('/:id/:notify/:idapp', authenticate, (req, res) => {
|
||||
const notify = req.params.notify;
|
||||
const idapp = req.params.idapp;
|
||||
|
||||
Booking.deleteOne({_id: id}).then((recbooking) => {
|
||||
Booking.findOneAndDelete({_id: id}).then((recbooking) => {
|
||||
if (!recbooking) {
|
||||
return res.status(404).send();
|
||||
}
|
||||
|
||||
@@ -84,8 +84,13 @@ router.post('/load', authenticate, async (req, res) => {
|
||||
data.account = await Account.getAccountByUsernameAndCircuitId(idapp, '', data._id, false, false, '', data.path);
|
||||
}
|
||||
|
||||
let arrrecnotifcoins = null;
|
||||
const arrrecnotif = await SendNotif.findAllNotifByUsernameIdAndIdApp(req.user.username, lastdr, idapp, shared_consts.LIMIT_NOTIF_FOR_USER, shared_consts.QualiNotifs.OTHERS);
|
||||
const arrrecnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(req.user.username, lastdr, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS);
|
||||
if (isAdminById(req.user.id)) {
|
||||
arrrecnotifcoins = await SendNotif.findAllNotifCoinsAllIdAndIdApp(idapp);
|
||||
} else {
|
||||
arrrecnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(req.user.username, lastdr, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS);
|
||||
}
|
||||
/// E' QUIIII !!!!
|
||||
const useraccounts = await Account.getUserAccounts(idapp, req.user.username);
|
||||
|
||||
|
||||
@@ -74,6 +74,7 @@ const SubCatProd = require('../models/subcatprod');
|
||||
const Gasordine = require('../models/gasordine');
|
||||
const Product = require('../models/product');
|
||||
const Author = require('../models/author');
|
||||
const Publisher = require('../models/publisher');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Scontistica = require('../models/scontistica');
|
||||
const Department = require('../models/department');
|
||||
@@ -657,11 +658,15 @@ router.post('/setsubrec', authenticate, (req, res) => {
|
||||
|
||||
});
|
||||
|
||||
router.post('/gettable', authenticate, (req, res) => {
|
||||
router.post('/gettable', authenticate_noerror, (req, res) => {
|
||||
let params = req.body;
|
||||
|
||||
params.table = sanitizeHtml(params.table);
|
||||
|
||||
|
||||
if (!shared_consts.TABLES_ENABLE_GETTABLE_FOR_NOT_LOGGED.includes(params.table) && !req.user) {
|
||||
return res.status(403).send({});
|
||||
}
|
||||
|
||||
let idapp = req.user ? req.user.idapp : sanitizeHtml(params.idapp);
|
||||
const mytable = globalTables.getTableByTableName(params.table);
|
||||
//console.log('mytable', mytable);
|
||||
@@ -1282,9 +1287,11 @@ router.delete('/delrec/:table/:id', authenticate, async (req, res) => {
|
||||
telegrambot.sendMsgTelegramToTheManagers(idapp, text);
|
||||
|
||||
}
|
||||
cancellato = true;
|
||||
|
||||
return res.send({ code: server_constants.RIS_CODE_OK, msg: '' });
|
||||
if (!User.isAdmin(req.user.perm)) {
|
||||
cancellato = true;
|
||||
return res.send({ code: server_constants.RIS_CODE_OK, msg: '' });
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1366,6 +1373,7 @@ router.post('/duprec/:table/:id', authenticate, async (req, res) => {
|
||||
|
||||
tools.mylog('DUPLICATED ', rec);
|
||||
|
||||
|
||||
// Do extra things after deleted
|
||||
return await actions.doOtherThingsAfterDuplicated(tablename, rec).
|
||||
then(({ myrec }) => {
|
||||
@@ -1400,15 +1408,21 @@ router.get('/loadsite/:userId/:idapp/:vers', authenticate_noerror,
|
||||
});
|
||||
|
||||
function load(req, res, version) {
|
||||
|
||||
const userId = req.params.userId;
|
||||
|
||||
let userId = '0';
|
||||
try {
|
||||
userId = req.user ? req.user._id.toString() : req.params.userId;
|
||||
} catch (e) {
|
||||
console.error('Err userId LOAD', e);
|
||||
userId = '0';
|
||||
}
|
||||
const idapp = req.params.idapp;
|
||||
|
||||
let status = 200
|
||||
if (req.code === server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED) {
|
||||
status = server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!version) {
|
||||
version = '0';
|
||||
@@ -1425,6 +1439,7 @@ function load(req, res, version) {
|
||||
|
||||
// tools.mylog('loadsite : ', req.params);
|
||||
|
||||
|
||||
let bookedevent = [];
|
||||
// let msgs = [];
|
||||
|
||||
@@ -1490,6 +1505,7 @@ function load(req, res, version) {
|
||||
}
|
||||
let products = Product.findAllIdApp(idapp, undefined, undefined, ismanager);
|
||||
let authors = Author.findAllIdApp(idapp);
|
||||
let publishers = Publisher.findAllIdApp(idapp);
|
||||
let productInfos = ProductInfo.findAllIdApp(idapp);
|
||||
let scontisticas = Scontistica.findAllIdApp(idapp);
|
||||
let departments = Department.findAllIdApp(idapp);
|
||||
@@ -1587,6 +1603,7 @@ function load(req, res, version) {
|
||||
catprods_gas,
|
||||
catAI,
|
||||
authors,
|
||||
publishers,
|
||||
]).then((arrdata) => {
|
||||
// console.table(arrdata);
|
||||
let myuser = req.user;
|
||||
@@ -1680,6 +1697,7 @@ function load(req, res, version) {
|
||||
catAI: arrdata[48],
|
||||
code: req.code,
|
||||
authors: arrdata[49],
|
||||
publishers: arrdata[50],
|
||||
});
|
||||
|
||||
const prova = 1;
|
||||
@@ -1702,8 +1720,24 @@ router.get(process.env.LINK_CHECK_UPDATES, authenticate_noerror, async (req, res
|
||||
|
||||
await CfgServer.find({ idapp }).then(async (arrcfgrec) => {
|
||||
|
||||
if (!arrcfgrec)
|
||||
return res.status(404).send();
|
||||
if (arrcfgrec.length === 0) {
|
||||
if (User.isAdmin(req.user.perm)) {
|
||||
// crea un nuovo record
|
||||
const mycfgServer = new CfgServer();
|
||||
mycfgServer.idapp = idapp;
|
||||
mycfgServer.chiave = 'vers';
|
||||
mycfgServer.userId = 'ALL';
|
||||
mycfgServer.valore = await tools.getVersServer();
|
||||
|
||||
mycfgServer.save();
|
||||
|
||||
arrcfgrec = await CfgServer.find({ idapp })
|
||||
} else {
|
||||
return res.status(404).send();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// ++Add to Log Stat ....
|
||||
|
||||
@@ -1711,6 +1745,7 @@ router.get(process.env.LINK_CHECK_UPDATES, authenticate_noerror, async (req, res
|
||||
let last_notifs = null;
|
||||
let last_notifcoins = null;
|
||||
let usersList = null;
|
||||
let last_notifcoins_inattesa = null;
|
||||
// const sall = '0';
|
||||
|
||||
// msgs = SendMsg.findAllByUserIdAndIdApp(userId, req.user.username, req.user.idapp);
|
||||
@@ -1723,7 +1758,12 @@ router.get(process.env.LINK_CHECK_UPDATES, authenticate_noerror, async (req, res
|
||||
|
||||
last_msgs = SendMsg.findLastGroupByUserIdAndIdApp(userId, req.user.username, idapp);
|
||||
last_notifs = SendNotif.findLastNotifsByUserIdAndIdApp(req.user.username, idapp, 40);
|
||||
last_notifcoins_inattesa = SendNotif.findLastNotifCoinsByUserIdAndIdApp(req.user.username, idapp, 200, true);
|
||||
// Se sono il Gestore, le ricevo tutte quante:
|
||||
if (User.isAdmin(req.user.perm)) {
|
||||
last_notifcoins_inattesa = SendNotif.findAllNotifCoinsAllIdAndIdApp(idapp);
|
||||
} else {
|
||||
last_notifcoins_inattesa = SendNotif.findLastNotifCoinsByUserIdAndIdApp(req.user.username, idapp, 200, true);
|
||||
}
|
||||
last_notifcoins = SendNotif.findLastNotifCoinsByUserIdAndIdApp(req.user.username, idapp, 1, false);
|
||||
|
||||
if (req.user) {
|
||||
@@ -1881,19 +1921,23 @@ function uploadFile(req, res, version) {
|
||||
tofile = mydir + '/' + file.originalFilename;
|
||||
let newname = tofile;
|
||||
file.path = newname;
|
||||
// console.log('fromfile', fromfile)
|
||||
// console.log('tofile', tofile);
|
||||
console.log('fromfile', fromfile, 'tofile', tofile)
|
||||
|
||||
|
||||
if (!tools.sulServer()) {
|
||||
// Se faccio eseguire questo in Locale, lui mi fa l'aggiornamento della pagina, quindi poi non posso salvare!
|
||||
// allora mi conviene che lo faccio dopo, manualmente.
|
||||
|
||||
console.log('Dovresti copiare fromfile', fromfile, 'tofile', tofile);
|
||||
console.log('cp ', fromfile, tofile);
|
||||
console.log('sudo cp -R ' + fromfile + ' ' + tofile);
|
||||
// await tools.execScriptNoOutput('sudo cp -R ' + fromfile + ' ' + tofile)
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Move in the folder application !
|
||||
tools.move(fromfile, tofile, (err) => {
|
||||
await tools.move(fromfile, tofile, (err) => {
|
||||
if (err) {
|
||||
console.log('err uploadDir:', err);
|
||||
res.status(400).send();
|
||||
|
||||
@@ -159,7 +159,14 @@ async function getNotif(req, res) {
|
||||
}
|
||||
|
||||
const arrnotif = await SendNotif.findAllNotifByUsernameIdAndIdApp(username, lastdataread, idapp, shared_consts.LIMIT_NOTIF_FOR_USER, shared_consts.QualiNotifs.OTHERS);
|
||||
const arrnotifcoins_inattesa = await SendNotif.findAllNotifByUsernameIdAndIdApp(username, lastdataread, idapp, shared_consts.LIMIT_NOTIFCOINS_IN_ATTESA_FOR_USER, shared_consts.QualiNotifs.CIRCUITS, [{ status: 0 }]);
|
||||
let arrnotifcoins_inattesa = null;
|
||||
|
||||
if (await User.isAdminByUsername(idapp, req.user.username)) {
|
||||
arrnotifcoins_inattesa = await SendNotif.findAllNotifCoinsAllIdAndIdApp(idapp);
|
||||
} else {
|
||||
arrnotifcoins_inattesa = await SendNotif.findAllNotifByUsernameIdAndIdApp(username, lastdataread, idapp, shared_consts.LIMIT_NOTIFCOINS_IN_ATTESA_FOR_USER, shared_consts.QualiNotifs.CIRCUITS, [{ status: 0 }]);
|
||||
}
|
||||
|
||||
const arrnotifcoins = await SendNotif.findAllNotifByUsernameIdAndIdApp(username, lastdataread, idapp, shared_consts.LIMIT_NOTIFCOINS_FOR_USER, shared_consts.QualiNotifs.CIRCUITS, [{ status: {$ne: 0 }}]);
|
||||
|
||||
|
||||
|
||||
@@ -8,13 +8,11 @@ const server_constants = require('../tools/server_constants');
|
||||
const { authenticate } = require('../middleware/authenticate');
|
||||
|
||||
const { MyGroup } = require('../models/mygroup');
|
||||
const { User } = require('../models/user');
|
||||
const { Stat } = require('../models/stat');
|
||||
|
||||
const mongoose = require('mongoose').set('debug', false)
|
||||
|
||||
const { User } = require('../models/user');
|
||||
// const { Nave } = require('../models/nave');
|
||||
// const { ListaIngresso } = require('../models/listaingresso');
|
||||
|
||||
const _ = require('lodash');
|
||||
|
||||
const { ObjectID } = require('mongodb');
|
||||
@@ -25,45 +23,19 @@ router.post('/load', async (req, res) => {
|
||||
const idapp = req.body.idapp;
|
||||
const username = req.body.username;
|
||||
|
||||
try {
|
||||
let datastat = await Stat.getStats(idapp);
|
||||
|
||||
let datastat = {
|
||||
num_reg: await User.getUsersRegistered(idapp),
|
||||
num_reg_today: await User.getUsersRegisteredToday(idapp),
|
||||
online_today: await User.getUsersOnLineToday(idapp),
|
||||
// num_passeggeri: await 0,
|
||||
// num_imbarcati: 0,
|
||||
// email_non_verif: await User.getEmailNotVerified(idapp),
|
||||
num_teleg_attivo: await User.getUsersTelegramAttivo(idapp),
|
||||
num_autorizzati: await User.getUsersAutorizzati(idapp),
|
||||
num_autorizzare: await User.getUsersAutorizzare(idapp),
|
||||
num_teleg_pending: await User.getUsersTelegramPending(idapp),
|
||||
// num_qualificati: await User.getNumUsersQualified(idapp, 2),
|
||||
// num_requisiti: await User.getNumUsersQualified(idapp, 0),
|
||||
// num_modalita_pagamento: await User.getnumPaymentOk(idapp),
|
||||
// num_part_zoom: await User.getUsersZoom(idapp),
|
||||
// num_part_accepted: await User.getSaw_and_Accepted(idapp),
|
||||
arr_nations: await User.findAllDistinctNationality(idapp),
|
||||
numreg_untilday: await User.calcnumRegUntilDay(idapp),
|
||||
reg_daily: await User.calcRegDaily(idapp),
|
||||
// imbarcati_daily: 0,
|
||||
// imbarcati_weekly: 0,
|
||||
reg_weekly: await User.calcRegWeekly(idapp),
|
||||
lastsreg: await User.getLastUsers(idapp),
|
||||
lastsonline: await User.getLastOnlineUsers(idapp),
|
||||
lastssharedlink: await User.getLastSharedLink(idapp),
|
||||
diffusorilist: await User.getDiffusoriUsers(idapp),
|
||||
receiveRislist: await User.getReceiveRISUsers(idapp),
|
||||
// receiveRislist: await User.find({idapp}).limit(20),
|
||||
receiveRislistgroup: await MyGroup.getReceiveRISGroups(idapp),
|
||||
strettelist: await User.getBestStretteDiManoUsers(idapp),
|
||||
checkuser: await User.checkUser(idapp, username),
|
||||
// navi_partite: await Nave.getNaviPartite(idapp),
|
||||
// navi_in_partenza: await Nave.getNaviInPartenza(idapp),
|
||||
};
|
||||
if (datastat) {
|
||||
datastat.checkuser = await User.checkUser(idapp, username);
|
||||
}
|
||||
|
||||
res.send({ datastat });
|
||||
|
||||
} catch (e) {
|
||||
console.error('Error', e);
|
||||
}
|
||||
|
||||
// console.table(datastat.lastsreg);
|
||||
|
||||
/*
|
||||
let datastat = {
|
||||
@@ -80,7 +52,6 @@ router.post('/load', async (req, res) => {
|
||||
};
|
||||
*/
|
||||
|
||||
res.send({ datastat });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
@@ -36,9 +36,9 @@ const { authenticate, authenticate_noerror } = require('../middleware/authentica
|
||||
const Cart = require('../models/cart');
|
||||
const CartClass = require('../modules/Cart');
|
||||
const Product = require('../models/product');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const CatProd = require('../models/catprod');
|
||||
const SubCatProd = require('../models/subcatprod');
|
||||
const ProductInfo = require('../models/productInfo');
|
||||
const Order = require('../models/order');
|
||||
const OrdersCart = require('../models/orderscart');
|
||||
const Variant = require('../models/variant');
|
||||
@@ -117,7 +117,7 @@ router.post('/', async (req, res) => {
|
||||
|
||||
if (!tools.isAlphaNumericAndSpecialCharacter(body.username) ||
|
||||
body.email.length < 6 ||
|
||||
body.username.length < 5 || body.password.length < 5) {
|
||||
body.username.length < 4 || body.password.length < 5) {
|
||||
await tools.snooze(5000);
|
||||
console.log('Username non valido in Registrazione: ' + body.username);
|
||||
res.status(400).
|
||||
@@ -266,14 +266,23 @@ router.post('/', async (req, res) => {
|
||||
|
||||
user.aportador_solidario = user.aportador_solidario.trim();
|
||||
|
||||
|
||||
user.aportador_solidario = user.aportador_solidario.replace('@', '');
|
||||
|
||||
let id_aportador = await User.getIdByUsername(user.idapp, user.aportador_solidario);
|
||||
if (!id_aportador) {
|
||||
// Cerca se esiste l'aportador solidario con l'username Telegram
|
||||
const useraportador = await User.getUserByUsernameTelegram(user.idapp, user.aportador_solidario);
|
||||
id_aportador = useraportador._id;
|
||||
user.aportador_solidario = useraportador.username;
|
||||
if (useraportador) {
|
||||
id_aportador = useraportador._id;
|
||||
user.aportador_solidario = useraportador.username;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let idMyGroupSite = tools.getidMyGroupBySite(body.idapp);
|
||||
user.idMyGroup = idMyGroupSite ? idMyGroupSite : '';
|
||||
|
||||
if (id_aportador) {
|
||||
// Ottiene l'username "corretto" (senza maiuscole o minuscole)
|
||||
user.aportador_solidario = await User.getRealUsernameByUsername(user.idapp, user.aportador_solidario);
|
||||
@@ -630,7 +639,7 @@ router.post('/newtok', async (req, res) => {
|
||||
// Ottieni l'utente in base al refreshtoken
|
||||
const recFound = await User.findOne({ 'tokens.refreshToken': refreshToken });
|
||||
|
||||
console.log('recFound', recFound ? recFound.name : 'NOTFOUND', 'Token=', refreshToken);
|
||||
// console.log('recFound', recFound ? recFound.name : 'NOTFOUND', 'Token=', refreshToken);
|
||||
|
||||
if (recFound) {
|
||||
return recFound.generateAuthToken(req)
|
||||
@@ -672,7 +681,7 @@ function checkBlocked(req, res, next) {
|
||||
|
||||
if (failedLoginAttempts[username] && failedLoginAttempts[username] > now) {
|
||||
text = 'Utente bloccato. Riprova più tardi. (username=' + username + ')';
|
||||
console.log(text);
|
||||
console.log(text);
|
||||
return res.status(403).json({ message: 'Utente bloccato. Riprova più tardi.' });
|
||||
}
|
||||
|
||||
@@ -719,11 +728,14 @@ router.post('/login', checkBlocked, (req, res) => {
|
||||
failedLoginAttempts[body.username]++;
|
||||
}
|
||||
|
||||
let numvolteerrati = failedLoginAttempts[body.username];
|
||||
|
||||
const msg = 'Tentativo (' + failedLoginAttempts[body.username] + ') di Login ERRATO [' + body.username + ' , ' + ']\n' + '[IP: ' + tools.getiPAddressUser(req) + ']';
|
||||
tools.mylogshow(msg);
|
||||
await telegrambot.sendMsgTelegramToTheAdmin(myuser.idapp, msg, true);
|
||||
tools.writeErrorLog(msg);
|
||||
if (numvolteerrati > 2) {
|
||||
const msg = 'Tentativo (' + numvolteerrati + ') di Login ERRATO [' + body.username + ' , ' + ']\n' + '[IP: ' + tools.getiPAddressUser(req) + ']';
|
||||
tools.mylogshow(msg);
|
||||
await telegrambot.sendMsgTelegramToTheAdmin(myuser.idapp, msg, true);
|
||||
tools.writeErrorLog(msg);
|
||||
}
|
||||
// telegrambot.sendMsgTelegramToTheManagers(body.idapp, msg);
|
||||
|
||||
if (failedLoginAttempts[body.username] >= MAX_FAILED_ATTEMPTS) {
|
||||
@@ -1416,10 +1428,19 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
|
||||
await Circuit.CheckTransazioniCircuiti(false);
|
||||
} else if (mydata.dbop === 'CorreggiTransazioniCircuiti') {
|
||||
await Circuit.CheckTransazioniCircuiti(true);
|
||||
} else if (mydata.dbop === 'RemovePendentTransactions') {
|
||||
await SendNotif.RemovePendentTransactions(true);
|
||||
} else if (mydata.dbop === 'RemoveOldNotif90') {
|
||||
await SendNotif.RemoveOldNotif90(idapp);
|
||||
} else if (mydata.dbop === 'RemoveOldNotif30') {
|
||||
await SendNotif.RemoveOldNotif30(idapp);
|
||||
} else if (mydata.dbop === 'UpdateCoordProv') {
|
||||
await Province.setCoordinatesOnDB();
|
||||
} else if (mydata.dbop === 'insertGeojsonToMongoDB') {
|
||||
await City.insertGeojsonToMongoDB('comuni_italia.geojson');
|
||||
} else if (mydata.dbop === 'listCollectionsBySize') {
|
||||
mystr = await tools.listCollectionsBySize();
|
||||
ris = { mystr };
|
||||
} else if (mydata.dbop === 'AbilitaNewsletterALL') {
|
||||
await User.updateMany({
|
||||
$or: [
|
||||
@@ -1432,6 +1453,10 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
|
||||
|
||||
} else if (mydata.dbop === 'SvuotaTuttiGliAccessiOnlineConToken') {
|
||||
await User.SvuotaTuttiGliAccessiOnlineConToken(idapp);
|
||||
} else if (mydata.dbop === 'SettaAdTypeOffro_In_Hosps') {
|
||||
const { MyHosp } = require('../models/myhosp');
|
||||
|
||||
await MyHosp.SettaAdTypeOffro_In_Hosps(idapp);
|
||||
} else if (mydata.dbop === 'removeRegulations') {
|
||||
await Circuit.updateMany({}, { $set: { regulation: '' } });
|
||||
|
||||
@@ -1577,7 +1602,7 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
|
||||
const { MyBacheca } = require('../models/mybacheca');
|
||||
const { MyHosp } = require('../models/myhosp');
|
||||
const { MyGood } = require('../models/mygood');
|
||||
const { MyGroup } = require('../models/mygroup');
|
||||
// const { MyGroup } = require('../models/mygroup');
|
||||
|
||||
console.log('INIZIO - Conversioni');
|
||||
// 'myskills',
|
||||
@@ -1600,7 +1625,7 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
|
||||
const { MyBacheca } = require('../models/mybacheca');
|
||||
const { MyHosp } = require('../models/myhosp');
|
||||
const { MyGood } = require('../models/mygood');
|
||||
const { MyGroup } = require('../models/mygroup');
|
||||
// const { MyGroup } = require('../models/mygroup');
|
||||
|
||||
console.log('INIZIO - Rimozione');
|
||||
|
||||
@@ -1621,6 +1646,18 @@ async function eseguiDbOp(idapp, mydata, locale, req, res) {
|
||||
await Circuit.createCircuitIfNotExist(req, idapp, recprov.prov);
|
||||
}
|
||||
|
||||
} else if (mydata.dbop === 'correggiProductTypes') {
|
||||
|
||||
await ProductInfo.correggiProductTypes();
|
||||
|
||||
} else if (mydata.dbop === 'correggiCircuitiANull') {
|
||||
|
||||
|
||||
await User.updateMany(
|
||||
{},
|
||||
{ $pull: { "profile.mycircuits": { "circuitname": null } } }
|
||||
);
|
||||
|
||||
} else if (mydata.dbop === 'ImpostaMinMaxPersonali') {
|
||||
|
||||
await Account.SetMinMaxPersonali(idapp, mydata.valmin, mydata.valmax, '');
|
||||
@@ -1835,15 +1872,11 @@ router.post('/dbop', authenticate, async (req, res) => {
|
||||
}
|
||||
|
||||
try {
|
||||
let ris = await eseguiDbOp(idapp, mydata, locale, req, res);
|
||||
let risOp = await eseguiDbOp(idapp, mydata, locale, req, res);
|
||||
|
||||
if (!ris) {
|
||||
ris = {};
|
||||
}
|
||||
// ris = await User.updateMyData(ris, idapp, req.user.username);
|
||||
|
||||
ris = await User.updateMyData(ris, idapp, req.user.username);
|
||||
|
||||
res.send({ code: server_constants.RIS_CODE_OK, data: ris.data });
|
||||
res.send({ code: server_constants.RIS_CODE_OK, data: risOp });
|
||||
|
||||
} catch (e) {
|
||||
res.status(400).send({ code: server_constants.RIS_CODE_ERR, msg: e });
|
||||
|
||||
@@ -5,6 +5,8 @@ require('./config/config');
|
||||
|
||||
const Email = require('email-templates');
|
||||
|
||||
const { decode } = require('entities');
|
||||
|
||||
const i18n = require('i18n');
|
||||
|
||||
const { ObjectID } = require('mongodb');
|
||||
@@ -302,6 +304,26 @@ module.exports = {
|
||||
this.sendEmail_base('resetpwd/' + lang, emailto, mylocalsconf, '');
|
||||
},
|
||||
|
||||
sendEmail_RisRicevuti: async function (lang, userDest, emailto, idapp, myrec) {
|
||||
console.log('sendEmail_RisRicevuti');
|
||||
|
||||
let mylocalsconf = {
|
||||
idapp,
|
||||
dataemail: await this.getdataemail(idapp),
|
||||
locale: lang,
|
||||
nomeapp: tools.getNomeAppByIdApp(idapp),
|
||||
emailto: emailto,
|
||||
qty: myrec.qty,
|
||||
mittente: decode(myrec.mittente),
|
||||
nomecircuito: decode(myrec.nomecircuito),
|
||||
symbol: myrec.symbol,
|
||||
};
|
||||
|
||||
mylocalsconf = this.setParamsForTemplate(userDest, mylocalsconf);
|
||||
|
||||
this.sendEmail_base('risricevuti/' + lang, emailto, mylocalsconf, '');
|
||||
},
|
||||
|
||||
sendEmail_Booking: async function (res, lang, emailto, user, idapp, recbooking) {
|
||||
|
||||
tools.mylog('sendEmail_Booking');
|
||||
@@ -642,12 +664,14 @@ module.exports = {
|
||||
mylocalsconf.dataemail.disclaimer) : '';
|
||||
mylocalsconf.dataemail.disc_bottom_out = !!mylocalsconf.dataemail.disc_bottom ? this.fieldsloop(mylocalsconf,
|
||||
mylocalsconf.dataemail.disc_bottom) : '';
|
||||
if (mylocalsconf.dataemail.templ)
|
||||
|
||||
if (mylocalsconf.dataemail.templ) {
|
||||
mylocalsconf.dataemail.templ.testoheadermail_out = !!mylocalsconf.dataemail.templ.testoheadermail ? this.fieldsloop(mylocalsconf,
|
||||
mylocalsconf.dataemail.templ.testoheadermail) : '';
|
||||
|
||||
mylocalsconf.dataemail.templ.content = !!mylocalsconf.dataemail.templ.content ? this.fieldsloop(mylocalsconf,
|
||||
mylocalsconf.dataemail.templ.content) : '';
|
||||
mylocalsconf.dataemail.templ.content = !!mylocalsconf.dataemail.templ.content ? this.fieldsloop(mylocalsconf,
|
||||
mylocalsconf.dataemail.templ.content) : '';
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error('Error replacefields: ' + e);
|
||||
@@ -739,6 +763,7 @@ module.exports = {
|
||||
mylocalsconf.name = user.name;
|
||||
mylocalsconf.surname = user.surname;
|
||||
mylocalsconf.aportador_solidario = user.aportador_solidario ? user.aportador_solidario : '';
|
||||
mylocalsconf.idMyGroup = user.idMyGroup;
|
||||
mylocalsconf.emailto = user.email;
|
||||
mylocalsconf.hashemail = tools.getHash(user.email);
|
||||
mylocalsconf.user = user;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
require('./config/config');
|
||||
require('./config/config');
|
||||
|
||||
// console.log(" lodash");
|
||||
|
||||
@@ -12,18 +11,26 @@ const cors = require('cors');
|
||||
// console.log(" 2) fs");
|
||||
const fs = require('fs');
|
||||
|
||||
var https = require('https');
|
||||
var http = require('http');
|
||||
|
||||
const WebSocket = require('ws');
|
||||
const { spawn } = require('child_process');
|
||||
|
||||
const NUOVO_METODO_TEST = true;
|
||||
|
||||
const METODO_MULTI_CORS = true;
|
||||
|
||||
const server_constants = require('./tools/server_constants');
|
||||
|
||||
//const throttle = require('express-throttle-bandwidth');
|
||||
// app.use(throttle(1024 * 128)) // throttling bandwidth
|
||||
|
||||
const port = process.env.PORT;
|
||||
|
||||
// var cookieParser = require('cookie-parser')
|
||||
// var csrf = require('csurf')
|
||||
const express = require('express');
|
||||
const vhost = require('vhost');
|
||||
|
||||
const bodyParser = require('body-parser');
|
||||
const path = require('path');
|
||||
|
||||
@@ -44,6 +51,9 @@ const Site = require('./models/site');
|
||||
|
||||
const i18n = require('i18n');
|
||||
|
||||
const readline = require('readline');
|
||||
|
||||
|
||||
let credentials = null;
|
||||
|
||||
// OBTAIN
|
||||
@@ -246,85 +256,24 @@ myLoad().then(ris => {
|
||||
|
||||
if ((process.env.NODE_ENV === 'production') ||
|
||||
(process.env.NODE_ENV === 'test')) {
|
||||
|
||||
const keyStream = path.resolve(`./${process.env.PATH_CERT_KEY}`);
|
||||
const certificateStream = path.resolve(`./${process.env.PATH_SERVER_CRT}`);
|
||||
|
||||
const privateKey = fs.readFileSync(keyStream, "utf8");
|
||||
const certificate = fs.readFileSync(certificateStream, "utf8");
|
||||
|
||||
|
||||
if (NUOVO_METODO_TEST) {
|
||||
credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
};
|
||||
} else {
|
||||
// NON USATO !
|
||||
credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
ca: [
|
||||
fs.readFileSync(process.env.PATH_SSL_ROOT_PEM, 'utf8'),
|
||||
fs.readFileSync(process.env.PATH_SSL_CHAIN_PEM, 'utf8'),
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
var https = require('https');
|
||||
} else {
|
||||
if (process.env.HTTPS_LOCALHOST === "true") {
|
||||
var privateKey = fs.readFileSync(process.env.PATH_CERT_KEY, 'utf8');
|
||||
var certificate = fs.readFileSync(process.env.PATH_SERVER_CRT, 'utf8');
|
||||
credentials = {
|
||||
key: privateKey,
|
||||
cert: certificate,
|
||||
ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384',
|
||||
honorCipherOrder: true,
|
||||
secureProtocol: 'TLSv1_2_method',
|
||||
};
|
||||
var https = require('https');
|
||||
|
||||
} else {
|
||||
var http = require('http');
|
||||
}
|
||||
}
|
||||
|
||||
if ((process.env.NODE_ENV === 'production') ||
|
||||
(process.env.NODE_ENV === 'test') || process.env.HTTPS_LOCALHOST === "true") {
|
||||
|
||||
if (false) {
|
||||
/*pem.createCertificate({ days: 1, selfSigned: true }, (err, keys) => {
|
||||
if (err) {
|
||||
throw err
|
||||
}
|
||||
const httpsServer = https.createServer({ key: keys.clientKey, cert: keys.certificate }, (req, res) => {
|
||||
res.end('o hai!')
|
||||
}).listen(port)
|
||||
}) */
|
||||
} else {
|
||||
const httpsServer = https.createServer(credentials, app);
|
||||
|
||||
console.log('httpsServer: port ', port);
|
||||
httpsServer.listen(port);
|
||||
}
|
||||
} else {
|
||||
console.log('httpServer: port ', port);
|
||||
const httpServer = http.createServer(app);
|
||||
httpServer.listen(port);
|
||||
}
|
||||
startServer(app, process.env.PORT);
|
||||
|
||||
mystart();
|
||||
|
||||
});
|
||||
|
||||
|
||||
// app.use(throttle(1024 * 128)); // throttling bandwidth
|
||||
|
||||
// app.use((req, res, next) => {
|
||||
// res.header('Access-Control-Allow-Origin', '*')
|
||||
// res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
|
||||
// next()
|
||||
// });
|
||||
/*
|
||||
app.use((req, res, next) => {
|
||||
res.header('Access-Control-Allow-Origin', '*')
|
||||
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
|
||||
next();
|
||||
});
|
||||
|
||||
*/
|
||||
|
||||
async function myLoad() {
|
||||
|
||||
@@ -335,6 +284,9 @@ async function mystart() {
|
||||
|
||||
// await estraiTutteLeImmagini();
|
||||
|
||||
console.log('Versione Server: ' + await tools.getVersServer());
|
||||
|
||||
|
||||
await tools.getApps();
|
||||
|
||||
if (process.env.PROD !== 1) {
|
||||
@@ -768,5 +720,247 @@ async function faitest() {
|
||||
}
|
||||
}
|
||||
|
||||
function getCredentials(hostname) {
|
||||
|
||||
if (NUOVO_METODO_TEST) {
|
||||
if (METODO_MULTI_CORS) {
|
||||
const fileprivkey = `/etc/letsencrypt/live/${hostname}/privkey.pem`;
|
||||
const filecert = `/etc/letsencrypt/live/${hostname}/cert.pem`;
|
||||
|
||||
console.log('fileprivkey: ', fileprivkey, ' filecert: ', filecert);
|
||||
|
||||
/* return {
|
||||
|
||||
SNICallback: function (hostname, callback) {
|
||||
console.log('hostname: ', hostname);
|
||||
if (domains.includes(hostname)) {
|
||||
const fileprivkey = `/etc/letsencrypt/live/${hostname}/privkey.pem`;
|
||||
const filecert = `/etc/letsencrypt/live/${hostname}/fullchain.pem`;
|
||||
|
||||
// console.log('fileprivkey: ', fileprivkey, ' filecert: ', filecert);
|
||||
|
||||
const domainCert = {
|
||||
key: fs.readFileSync(fileprivkey, "utf8"),
|
||||
cert: fs.readFileSync(filecert, "utf8"),
|
||||
};
|
||||
callback(null, domainCert);
|
||||
} else {
|
||||
callback(null, { key: privateKey, cert: certificate });
|
||||
}
|
||||
}
|
||||
|
||||
};*/
|
||||
|
||||
try {
|
||||
const key = fs.readFileSync(fileprivkey, "utf8");
|
||||
const cert = fs.readFileSync(filecert, "utf8");
|
||||
return { key, cert };
|
||||
} catch (error) {
|
||||
console.error(`Errore nel caricamento delle credenziali per ${hostname}:`, error);
|
||||
// Gestisci l'errore, per esempio ritorna null o lancia un'eccezione
|
||||
}
|
||||
|
||||
} else {
|
||||
const keyStream = path.resolve(`./${process.env.PATH_CERT_KEY}`);
|
||||
const certificateStream = path.resolve(`./${process.env.PATH_SERVER_CRT}`);
|
||||
|
||||
const privateKey = fs.readFileSync(keyStream, "utf8");
|
||||
const certificate = fs.readFileSync(certificateStream, "utf8");
|
||||
|
||||
return { key: privateKey, cert: certificate };
|
||||
}
|
||||
} else if (process.env.HTTPS_LOCALHOST === "true") {
|
||||
try {
|
||||
return {
|
||||
key: fs.readFileSync(process.env.PATH_CERT_KEY, 'utf8'),
|
||||
cert: fs.readFileSync(process.env.PATH_SERVER_CRT, 'utf8'),
|
||||
ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384',
|
||||
honorCipherOrder: true,
|
||||
secureProtocol: 'TLSv1_2_method'
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Errore durante la lettura dei file di certificazione, error:', error.message);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
// Caso di default non specificato, potrebbe essere necessario aggiungere una gestione degli errori qui
|
||||
}
|
||||
|
||||
function startServer(app, port) {
|
||||
try {
|
||||
const isProduction = ['production', 'test'].includes(process.env.NODE_ENV);
|
||||
|
||||
let domains = [];
|
||||
|
||||
try {
|
||||
if (process.env.DOMAINS)
|
||||
domains = JSON.parse(process.env.DOMAINS);
|
||||
} catch (error) {
|
||||
console.error("Errore durante la conversione della stringa DOMAINS:", error);
|
||||
}
|
||||
|
||||
console.log('domains', domains);
|
||||
|
||||
let httpsServer = null;
|
||||
let httpServer = null;
|
||||
|
||||
console.log('isProduction', isProduction);
|
||||
|
||||
if (isProduction) {
|
||||
for (let i = 0; i < domains.length; i++) {
|
||||
const credentials = getCredentials(domains[i].hostname);
|
||||
// console.log('credentials: ', credentials);
|
||||
httpsServer = https.createServer(credentials, app);
|
||||
console.log('⭐️⭐️⭐️⭐️⭐️ HTTPS server: ' + domains[i].hostname + ' Port:', domains[i].port + (domains[i].website ? 'WebSite = ' + domains[i].website : ''));
|
||||
httpsServer.listen(domains[i].port);
|
||||
}
|
||||
} else {
|
||||
if (process.env.HTTPS_LOCALHOST === "true") {
|
||||
let credentials = null;
|
||||
try {
|
||||
credentials = {
|
||||
key: fs.readFileSync(process.env.PATH_CERT_KEY, 'utf8'),
|
||||
cert: fs.readFileSync(process.env.PATH_SERVER_CRT, 'utf8'),
|
||||
ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES256-SHA384',
|
||||
honorCipherOrder: true,
|
||||
secureProtocol: 'TLSv1_2_method'
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Errore durante la lettura dei file di certificazione, error:', error.message);
|
||||
throw error;
|
||||
}
|
||||
|
||||
if (credentials) {
|
||||
httpsServer = https.createServer(credentials, app);
|
||||
console.log('⭐️⭐️⭐️ HTTPS server IN LOCALE : port', port);
|
||||
httpsServer.listen(port);
|
||||
} else {
|
||||
httpServer = http.createServer(app);
|
||||
if (httpServer) {
|
||||
console.log('⭐️⭐️⭐️ HTTP server IN LOCALE : port', port);
|
||||
httpServer.listen(port);
|
||||
}
|
||||
}
|
||||
|
||||
// console.log('credentials', credentials);
|
||||
|
||||
} else {
|
||||
httpServer = http.createServer(app);
|
||||
if (httpServer) {
|
||||
console.log('⭐️⭐️⭐️ HTTP server IN LOCALE : port', port);
|
||||
httpServer.listen(port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let wss = null;
|
||||
|
||||
if (httpsServer) {
|
||||
wss = new WebSocket.Server({ server: httpsServer });
|
||||
} else if (httpServer) {
|
||||
wss = new WebSocket.Server({ server: httpServer });
|
||||
} else {
|
||||
// console.error('Nessun server HTTP o HTTPS disponibile per WebSocket');
|
||||
// process.exit(1);
|
||||
}
|
||||
|
||||
if (wss) {
|
||||
|
||||
wss.on('connection', (ws) => {
|
||||
console.log('Client socket connected...');
|
||||
|
||||
const { User } = require('./models/user');
|
||||
|
||||
let scriptProcess = null;
|
||||
|
||||
const pty = require('node-pty');
|
||||
|
||||
ws.on('message', (message) => {
|
||||
|
||||
const parsedMessage = JSON.parse(message);
|
||||
|
||||
try {
|
||||
|
||||
if ((parsedMessage.type === 'start_script') && (User.isAdminById(parsedMessage.user_id))) {
|
||||
if (scriptProcess) {
|
||||
scriptProcess.kill();
|
||||
}
|
||||
|
||||
const scriptPath = path.join(__dirname, '..', '..', '', parsedMessage.scriptName);
|
||||
|
||||
// Verifica che lo script esista e sia all'interno della directory consentita
|
||||
if (fs.existsSync(scriptPath)) {
|
||||
scriptProcess = pty.spawn('bash', [scriptPath], {
|
||||
name: 'xterm-color',
|
||||
cols: 80,
|
||||
rows: 40,
|
||||
cwd: process.cwd(),
|
||||
env: process.env
|
||||
});
|
||||
|
||||
let buffer = '';
|
||||
scriptProcess.on('data', (data) => {
|
||||
buffer += data;
|
||||
|
||||
// Invia l'output al client
|
||||
ws.send(JSON.stringify({ type: 'output', data: data }));
|
||||
|
||||
// Controlla se c'è una richiesta di input
|
||||
if (buffer.endsWith(': ') || buffer.includes('? ') ||
|
||||
buffer.toLowerCase().includes('password')
|
||||
|| buffer.includes('Inserisci')
|
||||
|| buffer.includes('Inserted')
|
||||
|| buffer.includes('(Y')
|
||||
) {
|
||||
ws.send(JSON.stringify({ type: 'input_required', prompt: data.trim() }));
|
||||
buffer = '';
|
||||
}
|
||||
|
||||
// Pulisci il buffer se diventa troppo grande
|
||||
if (buffer.length > 5024) {
|
||||
buffer = buffer.slice(-500);
|
||||
}
|
||||
});
|
||||
|
||||
scriptProcess.on('exit', (code) => {
|
||||
if (code === 0) {
|
||||
ws.send(JSON.stringify({ type: 'close', data: `*** FINE SCRIPT ***` }));
|
||||
} else {
|
||||
ws.send(JSON.stringify({ type: 'close', data: `Script terminato con codice ${code}` }));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
ws.send(JSON.stringify({ type: 'error', data: 'Script non trovato o non autorizzato' }));
|
||||
}
|
||||
} else if (parsedMessage.type === 'input') {
|
||||
if (scriptProcess) {
|
||||
scriptProcess.write(parsedMessage.data + '\n');
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Errore durante l\'elaborazione del messaggio:', error.message);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
ws.on('close', () => {
|
||||
console.log('*** Client socket disconnected');
|
||||
if (scriptProcess) {
|
||||
scriptProcess.kill();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
} else {
|
||||
console.error('Nessuna Socket Aperta con WebSocket !!');
|
||||
}
|
||||
|
||||
|
||||
} catch (e) {
|
||||
console.log('error startServer: ' + e);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { app };
|
||||
|
||||
|
||||
@@ -487,7 +487,7 @@ const txt = {
|
||||
MSG_ASK_USERNAME_BO: 'Scrivete nel messaggio l\'username (SENZA SPAZI) o la email con cui vi siete registrati sul sito di %s:',
|
||||
MSG_ASK_USERNAME_INVITANTE: 'Scrivi nel messaggio <b>l\'USERNAME TELEGRAM</b> di chi ti ha INVITATO',
|
||||
MSG_NEW_REG: '<br><br>⁉️🙈 Per aiuto scrivi sulla <a href="https://t.me/riso_gruppo">Chat RISO</a><br>oppure direttamente a Paolo (@surya1977) ☀️.',
|
||||
MSG_ERRORE_INVITANTE_NOT_FOUND: 'L\'username dell\'invitante appena digitato non sembra essere corretto! Ti ricordo che dev\'essere l\'username con cui si è registrato su RISO',
|
||||
MSG_ERRORE_INVITANTE_NOT_FOUND: 'L\'username dell\'invitante appena digitato non sembra essere corretto! Ti ricordo che dev\'essere l\'username con cui si è registrato su %s',
|
||||
MSG_ERRORE_USERNAME: 'Attenzione! Devi inserire solo lo username (40 caratteri massimo)',
|
||||
MSG_ERRORE_USERNAME_NOT_FOUND: 'Per Completare la Verifica Telegram BOT, dovete ora scrivere qui sotto nel messaggio l\'Username (senza spazi) OPPURE la email con cui vi siete registrati sul sito',
|
||||
MSG_ERRORE_USERNAME_ANNULLA: 'Inserimento Annullato. Riprovare',
|
||||
@@ -502,12 +502,12 @@ const txt = {
|
||||
MSG_EXIT_TELEGRAM: 'L\'account è stato ora scollegato da questo Telegram BOT.',
|
||||
MSG_APORTADOR_USER_REGISTERED: emo.FIRE +
|
||||
' Si è appena Registrato "%s" (n. %s)\nInvitato da %s',
|
||||
MSG_APORTADOR_ASK_CONFIRM: '🆕💥 🧍♂️ %s si sta registrando alla App di RISO e ti chiede di poter entrare. Confermi di conoscerla ?',
|
||||
MSG_APORTADOR_ASK_CONFIRM: '🆕💥 🧍♂️ %s si sta registrando alla App %d e ti chiede di poter entrare. Confermi di conoscerla ?',
|
||||
MSG_ACCEPT_NEWENTRY_INGROUP: '❇️👥 🧍♂️ Accetta Ingresso nel GRUPPO %s:',
|
||||
MSG_FRIENDS_NOT_ACCEPTED_CONFIRMED: '🚫 Hai rifiutato la richiesta di Amicizia di %s !',
|
||||
MSG_HANDSHAKE_NOT_ACCEPTED_CONFIRMED: '🚫 Hai rifiutato la richiesta di Stretta di mano di %s !',
|
||||
MSG_APORTADOR_CONFIRMED: '✅ %s è stato Abilitato correttamente (da %s)!',
|
||||
MSG_APORTADOR_DEST_CONFIRMED: '✅ La tua registrazione a RISO è stata accettata da %s!\n' +
|
||||
MSG_APORTADOR_DEST_CONFIRMED: '✅ La tua registrazione a %s è stata accettata da %s!\n' +
|
||||
'Vai sulla App oppure clicca qui per entrare\n👉🏻 %s',
|
||||
MSG_GROUP_CONFIRMED: '✅ Sei stato Aggiunto sul Gruppo %s!',
|
||||
MSG_APORTADOR_DEST_NOT_CONFIRMED: emo.EXCLAMATION_MARK +
|
||||
@@ -752,16 +752,16 @@ const MyTelegramBot = {
|
||||
|
||||
local_sendMsgTelegramByIdTelegram: async function (idapp, idtelegram, text,
|
||||
message_id, chat_id, ripr_menuPrec,
|
||||
MyForm = null) {
|
||||
MyForm = null, img = '') {
|
||||
|
||||
if (!idtelegram)
|
||||
return { text: '' };
|
||||
|
||||
const cl = getclTelegByidapp(idapp);
|
||||
if (cl && idtelegram) {
|
||||
|
||||
|
||||
return await cl.sendMsg(idtelegram, text, null, MyForm, message_id,
|
||||
chat_id, ripr_menuPrec);
|
||||
chat_id, ripr_menuPrec, img);
|
||||
}
|
||||
|
||||
return { text: '' };
|
||||
@@ -908,6 +908,8 @@ const MyTelegramBot = {
|
||||
|
||||
const struserinfomsg = tools.getUserInfoMsg(idapp, myuser);
|
||||
|
||||
const nomeapp = myuser.idapp ? tools.getNomeAppByIdApp(myuser.idapp) : tools.getNomeAppByIdApp(idapp);
|
||||
|
||||
if (myfunc === shared_consts.CallFunz.REGISTRATION) {
|
||||
|
||||
cl.setPhotoProfile(myuser, telegid, false);
|
||||
@@ -936,7 +938,7 @@ const MyTelegramBot = {
|
||||
} else {
|
||||
|
||||
msg_notifpush = getstr(langdest, 'MSG_APORTADOR_ASK_CONFIRM', myuser.username);
|
||||
domanda = getstr(langdest, 'MSG_APORTADOR_ASK_CONFIRM', myuser.username) + '<br>' + struserinfomsg;
|
||||
domanda = getstr(langdest, 'MSG_APORTADOR_ASK_CONFIRM', myuser.username, nomeapp) + '<br>' + struserinfomsg;
|
||||
|
||||
keyb = cl.getInlineKeyboard(myuser.lang, [
|
||||
{
|
||||
@@ -1300,7 +1302,7 @@ const MyTelegramBot = {
|
||||
|
||||
sendMsgTelegramByIdTelegram: async function (
|
||||
idapp, idtelegram, text, message_id, chat_id, ripr_menuPrec,
|
||||
MyForm = null) {
|
||||
MyForm = null, img = '') {
|
||||
|
||||
if (!idtelegram)
|
||||
return;
|
||||
@@ -1310,7 +1312,7 @@ const MyTelegramBot = {
|
||||
let myform = null;
|
||||
|
||||
return await cl.sendMsg(idtelegram, text, null, MyForm, message_id,
|
||||
chat_id, ripr_menuPrec);
|
||||
chat_id, ripr_menuPrec, img);
|
||||
}
|
||||
|
||||
},
|
||||
@@ -1370,6 +1372,7 @@ const MyTelegramBot = {
|
||||
//const rismsg =
|
||||
params.content = eventobj.newdescr;
|
||||
params.title = '';
|
||||
params.img = eventobj.img;
|
||||
invia = true;
|
||||
}
|
||||
}
|
||||
@@ -1785,7 +1788,7 @@ class Telegram {
|
||||
risp = 'Chissà... Forse si!\nAnche se meglio averne un altro di scorta, nel caso il Principe non sia disponibile.';
|
||||
} else if (MsgBot.START_INV.find(
|
||||
(rec) => testo.indexOf(rec) > -1)) {
|
||||
risp = 'Sei già registrato a RISO. Per accedere alla App, aprila dall\'icona sul tuo schermo, oppure vai su https://riso.app ed installa la App.\n\nSe hai dimenticato la password: \n clicca sul menu in basso su "⚒ Strumenti" e poi "🔑 Cambio Password"'
|
||||
risp = 'Sei già registrato. Per accedere alla App, aprila dall\'icona sul tuo schermo, oppure vai sul sito ed installa la App.\n\nSe hai dimenticato la password: \n clicca sul menu in basso su "⚒ Strumenti" e poi "🔑 Cambio Password"'
|
||||
} else if (MsgBot.COSE_COVID.find(
|
||||
(rec) => testo.indexOf(rec) > -1)) {
|
||||
risp = 'Un \'influenza più "grave", dovuta a paure e a fattori interiori di evoluzione, oltre ad una pulizia del corpo. ';
|
||||
@@ -2024,7 +2027,7 @@ class Telegram {
|
||||
if (rec.user && cmd2) {
|
||||
let isAdmin = rec.user ? rec.user.profile.admin_telegram : false;
|
||||
if (isAdmin) {
|
||||
const ris = await tools.execScript(this.idapp, msg, cmd2, 'Eseguo lo script');
|
||||
const ris = await tools.execScriptByTelegram(this.idapp, msg, cmd2, 'Eseguo lo script');
|
||||
}
|
||||
}
|
||||
} else if (cmd1 === Menu.LOG_SRV) {
|
||||
@@ -2486,8 +2489,13 @@ class Telegram {
|
||||
file = '~/batch/test_restart_server.sh';
|
||||
}
|
||||
|
||||
const ris = await tools.execScript(this.idapp, msg, file,
|
||||
this.chisono(rec) + ' Restart il Server (Node.Js) : ' + process.version);
|
||||
let messaggio = this.chisono(rec) + ' Restart il Server (Node.Js) : ' + process.version;
|
||||
|
||||
messaggio += '\nVersione Server: ' + await tools.getVersServer();
|
||||
|
||||
const ris = await tools.execScriptByTelegram(this.idapp, msg, file, messaggio);
|
||||
|
||||
|
||||
} else {
|
||||
this.nonAbilitato(msg);
|
||||
}
|
||||
@@ -2495,7 +2503,7 @@ class Telegram {
|
||||
|
||||
async menuLogSrv(rec, msg, cmd2) {
|
||||
if (cmd2 === '6711') {
|
||||
const ris = await tools.execScript(this.idapp, msg, '~/batch/logserver.sh', this.chisono(rec) + ' Visualizzo il Log del Server...');
|
||||
const ris = await tools.execScriptByTelegram(this.idapp, msg, '~/batch/logserver.sh', this.chisono(rec) + ' Visualizzo il Log del Server...');
|
||||
} else {
|
||||
this.nonAbilitato(msg);
|
||||
}
|
||||
@@ -2504,7 +2512,7 @@ class Telegram {
|
||||
async menuRebootSrv(rec, msg, cmd2) {
|
||||
if (cmd2 === '6711') {
|
||||
await MyTelegramBot.sendMsgTelegramToTheAdminAllSites(this.chisono(rec) + ' ha effettuato il Reboot del Server! ...');
|
||||
const ris = await tools.execScript(this.idapp, msg, '~/batch/esegui_reboot.sh',
|
||||
const ris = await tools.execScriptByTelegram(this.idapp, msg, '~/batch/esegui_reboot.sh',
|
||||
this.chisono(rec) + ' Eseguo il Reboot del Server !...');
|
||||
} else {
|
||||
this.nonAbilitato(msg);
|
||||
@@ -2786,6 +2794,8 @@ class Telegram {
|
||||
try {
|
||||
let mymsg = msg.text.toString().trim().toLowerCase();
|
||||
|
||||
let nomeapp = tools.getNomeAppByIdApp(this.idapp);
|
||||
|
||||
if (!!mymsg) {
|
||||
const rec = this.getRecInMem(msg);
|
||||
let aportador_solidario = rec.aportador_solidario;
|
||||
@@ -2809,12 +2819,12 @@ class Telegram {
|
||||
// rec.status = Status.WAITFOR_USERNAME_INVITANTE;
|
||||
rec.status = Status.SET_USERNAME_INVITANTE;
|
||||
|
||||
const str2 = '\n' + getstr(this.getlang(msg), 'MSG_ASK_USERNAME_INVITANTE', tools.getNomeAppByIdApp(this.idapp));
|
||||
const str2 = '\n' + getstr(this.getlang(msg), 'MSG_ASK_USERNAME_INVITANTE', nomeapp);
|
||||
|
||||
if (msg.from.username)
|
||||
console.log(msg.from.username + ' ha digitato: ' + msg.text);
|
||||
|
||||
await this.sendMsg(msg.from.id, getstr(this.getlang(msg), 'MSG_ERRORE_INVITANTE_NOT_FOUND') + str2, null);
|
||||
await this.sendMsg(msg.from.id, getstr(this.getlang(msg), 'MSG_ERRORE_INVITANTE_NOT_FOUND', nomeapp) + str2, null);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
@@ -3873,21 +3883,41 @@ class Telegram {
|
||||
},
|
||||
};
|
||||
}
|
||||
return this.bot.sendMessage(id, text, form).catch((e) => {
|
||||
let blocked = false;
|
||||
if ((e.message.indexOf('Forbidden') > 0) ||
|
||||
(e.message.indexOf('chat not found') > 0)) {
|
||||
blocked = true;
|
||||
}
|
||||
if (!blocked) {
|
||||
console.error(e.message);
|
||||
}
|
||||
if (blocked) {
|
||||
User.SetTelegramWasBlocked(this.idapp, id);
|
||||
// ++Todo: DA FARE ! local_sendMsgTelegramToTheManagers(this.idapp, addtext + text);
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
if (opt && opt.img) {
|
||||
return this.bot.sendPhoto(id, opt.img, { caption: text, ...form }).catch((e) => {
|
||||
let blocked = false;
|
||||
if ((e.message.indexOf('Forbidden') > 0) ||
|
||||
(e.message.indexOf('chat not found') > 0)) {
|
||||
blocked = true;
|
||||
}
|
||||
if (!blocked) {
|
||||
console.error(e.message);
|
||||
}
|
||||
if (blocked) {
|
||||
User.SetTelegramWasBlocked(this.idapp, id);
|
||||
// ++Todo: DA FARE ! local_sendMsgTelegramToTheManagers(this.idapp, addtext + text);
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
} else {
|
||||
return this.bot.sendMessage(id, text, form).catch((e) => {
|
||||
let blocked = false;
|
||||
if ((e.message.indexOf('Forbidden') > 0) ||
|
||||
(e.message.indexOf('chat not found') > 0)) {
|
||||
blocked = true;
|
||||
}
|
||||
if (!blocked) {
|
||||
console.error(e.message);
|
||||
}
|
||||
if (blocked) {
|
||||
User.SetTelegramWasBlocked(this.idapp, id);
|
||||
// ++Todo: DA FARE ! local_sendMsgTelegramToTheManagers(this.idapp, addtext + text);
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error(e, 'text', text);
|
||||
return 0;
|
||||
@@ -3913,7 +3943,7 @@ class Telegram {
|
||||
}
|
||||
}
|
||||
|
||||
async sendMsg(id, text, menu, form, msg_id, chat_id, ripr_menuPrec) {
|
||||
async sendMsg(id, text, menu, form, msg_id, chat_id, ripr_menuPrec, img = '') {
|
||||
|
||||
if (!id || !text)
|
||||
return false;
|
||||
@@ -3923,12 +3953,12 @@ class Telegram {
|
||||
let text1 = text.slice(0, 4090);
|
||||
let text2 = text.slice(4090, text.length);
|
||||
await this._inviaMsg(id, text1, form, menu, msg_id, chat_id,
|
||||
ripr_menuPrec);
|
||||
ripr_menuPrec, { img });
|
||||
return await this._inviaMsg(id, text2, form, menu, msg_id, chat_id,
|
||||
ripr_menuPrec);
|
||||
ripr_menuPrec, { img });
|
||||
} else {
|
||||
return await this._inviaMsg(id, text, form, menu, msg_id, chat_id,
|
||||
ripr_menuPrec);
|
||||
ripr_menuPrec, { img });
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Error sendMsg', e);
|
||||
@@ -4412,11 +4442,13 @@ if (true) {
|
||||
|
||||
if (changed) {
|
||||
const req = tools.getReqByPar(user.idapp, username_action);
|
||||
|
||||
nomeapp = tools.getNomeAppByIdApp(user.idapp);
|
||||
// await User.setFriendsCmd(req, user.idapp, data.username, userDest.username, shared_consts.FRIENDSCMD.SETFRIEND, null, true);
|
||||
|
||||
await User.setaportador_solidario(user.idapp, data.username, userDest.username);
|
||||
|
||||
const msgOrig = printf(getstr(userDest.lang, 'MSG_APORTADOR_DEST_CONFIRMED'), `${userDest.username}`,
|
||||
const msgOrig = printf(getstr(userDest.lang, 'MSG_APORTADOR_DEST_CONFIRMED', nomeapp), `${userDest.username}`,
|
||||
tools.getHostByIdApp(user.idapp));
|
||||
const msgDest = printf(getstr(user.lang, 'MSG_APORTADOR_CONFIRMED'), `${user.username}`, `${userDest.username}`);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
const os = require('os');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const WebSocket = require('ws');
|
||||
|
||||
require('../config/config');
|
||||
require('../models/subscribers');
|
||||
@@ -43,6 +44,12 @@ const FIELDS_REGEX = ['username', 'name', 'surname'];
|
||||
|
||||
const sanitizeHtml = require('sanitize-html');
|
||||
|
||||
const { exec } = require('child_process');
|
||||
|
||||
const { spawn } = require('child_process');
|
||||
const readline = require('readline');
|
||||
|
||||
|
||||
// Code goes here
|
||||
const keySize = 256;
|
||||
const ivSize = 128;
|
||||
@@ -129,6 +136,7 @@ const textlang = {
|
||||
'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",
|
||||
"TELEFONO": "Tel",
|
||||
},
|
||||
si: {},
|
||||
es: {
|
||||
@@ -399,6 +407,70 @@ const textlang = {
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Scarica un'immagine da una URL e la salva in una directory locale
|
||||
* @param {string} url - L'URL dell'immagine da scaricare
|
||||
* @param {string} filepath - Il percorso dove salvare l'immagine scaricata
|
||||
*/
|
||||
class ImageDownloader {
|
||||
/**
|
||||
* Scarica un'immagine da una URL e la salva in una directory locale.
|
||||
* Tenta di scaricare fino a 3 volte in caso di errore, con un ritardo tra i tentativi.
|
||||
*
|
||||
* @param {string} url - L'URL dell'immagine da scaricare
|
||||
* @param {string} filepath - Il percorso dove salvare l'immagine scaricata
|
||||
* @param {number} maxRetries - Numero massimo di tentativi in caso di fallimento (default: 3)
|
||||
* @param {number} delay - Ritardo in millisecondi tra i tentativi (default: 1000)
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
async downloadImage(url, filepath, maxRetries = 1, delay = 1000) {
|
||||
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
||||
try {
|
||||
const writer = fs.createWriteStream(filepath);
|
||||
|
||||
console.log('url da scaricare:', url);
|
||||
|
||||
const response = await axios({
|
||||
url,
|
||||
method: 'GET',
|
||||
responseType: 'stream',
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
|
||||
}
|
||||
});
|
||||
|
||||
response.data.pipe(writer);
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
writer.on('finish', () => {
|
||||
console.info('✅ Immagine scaricata ' + url + ' in ' + filepath);
|
||||
resolve(true);
|
||||
});
|
||||
writer.on('error', reject);
|
||||
});
|
||||
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(`❌ Tentativo ${attempt} fallito per l'URL ${url}. Errore:`, error.message);
|
||||
|
||||
if (attempt === maxRetries) {
|
||||
console.error('❌ Tutti i tentativi sono falliti. Scaricamento interrotto.');
|
||||
return false;
|
||||
} else {
|
||||
console.info(`🔁 Ritentando... (${attempt + 1} di ${maxRetries})`);
|
||||
await sleep(delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Funzione per implementare il ritardo tra i tentativi
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
MYAPPS: [],
|
||||
INITDB_FIRSTIME: true,
|
||||
@@ -1125,10 +1197,10 @@ module.exports = {
|
||||
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;
|
||||
// } 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1653,7 +1725,12 @@ module.exports = {
|
||||
|
||||
removeSpecialCharForEmail(myhtml) {
|
||||
let msg = myhtml;
|
||||
msg = msg.replace(/"/g, '\'');
|
||||
try {
|
||||
if (msg)
|
||||
msg = msg.replace(/"/g, '\'');
|
||||
} catch (e) {
|
||||
return msg;
|
||||
}
|
||||
|
||||
return msg;
|
||||
},
|
||||
@@ -1790,9 +1867,9 @@ module.exports = {
|
||||
this.MYAPPS.find(item => item.idapp === idapp);
|
||||
if (myapp) {
|
||||
if (process.env.NODE_ENV === 'test')
|
||||
mypath = (myapp) ? myapp.dir_test : '';
|
||||
mypath = (myapp && myapp.dir_test) ? myapp.dir_test : '';
|
||||
else
|
||||
mypath = (myapp) ? myapp.dir : '';
|
||||
mypath = (myapp && myapp.dir) ? myapp.dir : '';
|
||||
|
||||
if (dirmain) {
|
||||
if (!this.sulServer()) {
|
||||
@@ -1831,10 +1908,20 @@ module.exports = {
|
||||
}
|
||||
},
|
||||
|
||||
getparamSiteTableByIdApp: function (idapp, param) {
|
||||
const myapp = this.MYAPPS.find((item) => item.idapp === idapp);
|
||||
return myapp && param ? myapp[param] : '';
|
||||
},
|
||||
|
||||
|
||||
getAskToVerifyReg: function (idapp) {
|
||||
return this.getConfSiteOptionEnabledByIdApp(idapp, shared_consts.ConfSite.Need_Aportador_On_DataReg_To_Verify_Reg);
|
||||
},
|
||||
|
||||
getidMyGroupBySite: function (idapp) {
|
||||
return this.getparamSiteTableByIdApp(idapp, 'idMyGroup');
|
||||
},
|
||||
|
||||
isManagAndAdminDifferent(idapp) {
|
||||
const manag = this.getManagerEmailByIdApp(idapp);
|
||||
return (manag !== this.getAdminEmailByIdApp(idapp)) && (manag !== '');
|
||||
@@ -2299,6 +2386,13 @@ module.exports = {
|
||||
query = [...query, ...queryadd];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const numtabbacheca = this.getNumTabByTable(shared_consts.TABLES_MYBACHECAS);
|
||||
if (numtab === numtabbacheca) {
|
||||
const queryadd = this.getQueryMyBacheca(idapp);
|
||||
query = [...query, ...queryadd];
|
||||
}
|
||||
*/
|
||||
|
||||
proj = {
|
||||
@@ -2341,11 +2435,13 @@ module.exports = {
|
||||
numpeople: 1,
|
||||
numpeopleLunch: 1,
|
||||
numpeopleDinner: 1,
|
||||
numpeopleDinnerShared: 1,
|
||||
infoevent: 1,
|
||||
msgbooking: 1,
|
||||
booked: 1,
|
||||
datebooked: 1,
|
||||
userId: 1,
|
||||
idapp: 1,
|
||||
}
|
||||
},
|
||||
],
|
||||
@@ -2622,16 +2718,40 @@ module.exports = {
|
||||
query.push({ $match: { $and: filtriadded } });
|
||||
}
|
||||
|
||||
let numrowend = params.endRow - params.startRow;
|
||||
if (numrowend < 0)
|
||||
numrowend = 1;
|
||||
|
||||
let projectEnd = { $slice: ['$results', params.startRow, numrowend] };
|
||||
|
||||
let querymatch = {};
|
||||
|
||||
if (idapp > 0) {
|
||||
query.push({ $match: { idapp } });
|
||||
querymatch.idapp = idapp;
|
||||
}
|
||||
|
||||
if (params.searchByBoundariesMap) {
|
||||
projectEnd = "$results";
|
||||
|
||||
querymatch.coordinate_gps = {
|
||||
$geoWithin: {
|
||||
$box: [
|
||||
[params.searchByBoundariesMap.sw.lng, params.searchByBoundariesMap.sw.lat],
|
||||
[params.searchByBoundariesMap.ne.lng, params.searchByBoundariesMap.ne.lat]
|
||||
]
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
if (Object.keys(querymatch).length > 0) {
|
||||
query.push(
|
||||
{ $match: querymatch });
|
||||
|
||||
}
|
||||
|
||||
// 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) {
|
||||
|
||||
@@ -2742,13 +2862,33 @@ module.exports = {
|
||||
if (qa1) query = [...query, ...qa1];
|
||||
query.push({ $unwind: '$group' });
|
||||
|
||||
query.push({
|
||||
$match: {
|
||||
$and: [
|
||||
{ 'group.idapp': params.idapp },
|
||||
],
|
||||
},
|
||||
});
|
||||
if (true) {
|
||||
|
||||
query.push({
|
||||
$match: {
|
||||
$and: [
|
||||
{ 'group.idapp': params.idapp },
|
||||
],
|
||||
coordinate_gps: {
|
||||
$geoWithin: {
|
||||
$box: [
|
||||
[searchByBoudariesMap.sw.lng, searchByBoudariesMap.sw.lat],
|
||||
[searchByBoudariesMap.ne.lng, searchByBoudariesMap.ne.lat]
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
} else {
|
||||
|
||||
query.push({
|
||||
$match: {
|
||||
$and: [
|
||||
{ 'group.idapp': params.idapp },
|
||||
],
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
query.push({
|
||||
@@ -2989,6 +3129,11 @@ module.exports = {
|
||||
}
|
||||
}
|
||||
|
||||
if (params.table === shared_consts.TABLES_MYBACHECAS) {
|
||||
const myq = this.getQueryMyBacheca(idapp);
|
||||
query.push(myq[0]);
|
||||
}
|
||||
|
||||
if (params.filtersearch3or) {
|
||||
if (params.filtersearch3or.length > 0) {
|
||||
query.push({ $match: { $or: params.filtersearch3or } });
|
||||
@@ -3082,7 +3227,7 @@ module.exports = {
|
||||
if (q1) query = [...query, ...q1];
|
||||
}
|
||||
|
||||
if (params.sortBy) {
|
||||
if (params.sortBy && !params.searchByBoundariesMap) {
|
||||
// maybe we want to sort by blog title or something
|
||||
const mysort = { $sort: params.sortBy };
|
||||
// console.log('sortBy', params.sortBy);
|
||||
@@ -3101,18 +3246,22 @@ module.exports = {
|
||||
},
|
||||
},
|
||||
// and finally trim the results to within the range given by start/endRow
|
||||
{
|
||||
$project: {
|
||||
count: 1,
|
||||
rows: { $slice: ['$results', params.startRow, numrowend] },
|
||||
},
|
||||
},
|
||||
);
|
||||
if (projectEnd) {
|
||||
query.push(
|
||||
{
|
||||
$project: {
|
||||
count: 1,
|
||||
rows: projectEnd,
|
||||
},
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
if (this.testing()) {
|
||||
// console.log('query', query);
|
||||
}
|
||||
// console.log('query', query);
|
||||
//console.log('query', query);
|
||||
|
||||
return query;
|
||||
} catch (e) {
|
||||
@@ -3689,15 +3838,30 @@ module.exports = {
|
||||
|
||||
},
|
||||
|
||||
readlogfile(idapp, filename) {
|
||||
async readlogfile(idapp, filename) {
|
||||
|
||||
try {
|
||||
return fs.readFileSync(idapp + '/' + filename, 'utf8');
|
||||
return await fs.readFileSync(idapp + '/' + filename, 'utf8');
|
||||
} catch (e) {
|
||||
return '';
|
||||
}
|
||||
},
|
||||
|
||||
async readfilecontent(filename) {
|
||||
|
||||
try {
|
||||
const cont = await fs.readFileSync(filename, 'utf8');
|
||||
return cont;
|
||||
} catch (e) {
|
||||
return '';
|
||||
}
|
||||
},
|
||||
|
||||
async getVersServer() {
|
||||
return await this.readfilecontent(__dirname + '/../version.txt');
|
||||
},
|
||||
|
||||
|
||||
writelog(mystr) {
|
||||
this.writelogfile(mystr, FILELOG);
|
||||
},
|
||||
@@ -3729,45 +3893,49 @@ module.exports = {
|
||||
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;
|
||||
async move(oldPath, newPath, callback) {
|
||||
try {
|
||||
const ris = await fs.promises.rename(oldPath, newPath);
|
||||
console.log('... File Rinominato:', oldPath, 'in:', newPath, 'ris', ris);
|
||||
callback(); // Chiamare il callback senza errori
|
||||
} catch (err) {
|
||||
if (err.code === 'EXDEV') {
|
||||
await copy(); // Se EXDEV, utilizza la funzione copy
|
||||
} else {
|
||||
console.log(' ... File Rinominato', oldPath, 'in:', newPath);
|
||||
console.error('Errore durante lo spostamento:', err);
|
||||
callback(err); // Passa l'errore al callback
|
||||
}
|
||||
}
|
||||
|
||||
callback();
|
||||
});
|
||||
|
||||
function copy() {
|
||||
async 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.on('error', (err) => {
|
||||
console.error('Errore nella lettura del file:', err);
|
||||
callback(err); // Passa l'errore al callback
|
||||
});
|
||||
writeStream.on('error', (err) => {
|
||||
console.error('Errore nella scrittura del file:', err);
|
||||
callback(err); // Passa l'errore al callback
|
||||
});
|
||||
|
||||
readStream.pipe(writeStream);
|
||||
|
||||
writeStream.on('finish', async () => {
|
||||
console.log('File copiato, ora rimuovo il file di origine:', oldPath);
|
||||
try {
|
||||
await fs.promises.unlink(oldPath); // Rimuovi il file originale
|
||||
callback(); // Chiama il callback al termine
|
||||
} catch (err) {
|
||||
console.error('Errore nella rimozione del file originale:', err);
|
||||
callback(err); // Passa l'errore al callback
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4360,7 +4528,151 @@ module.exports = {
|
||||
return strlinkreg;
|
||||
},
|
||||
|
||||
execScript: function (idapp, msg, script, testo) {
|
||||
execScriptOnServer: async function (idapp, script, dir, listafiles, extfiles) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
exec(script, async (error, stdout, stderr) => { // Aggiunto async qui
|
||||
if (error) {
|
||||
console.error(`error: ${error}`);
|
||||
return reject(`Execution failed: ${error}`);
|
||||
}
|
||||
if (stderr) {
|
||||
console.error(`stderr: ${stderr}`);
|
||||
}
|
||||
// Se vuoi mantenere questa parte, puoi decommentarla
|
||||
// if (stdout) {
|
||||
// console.log(`OUT: ${stdout}`);
|
||||
// }
|
||||
|
||||
let arrout = [];
|
||||
let arrscripts = stdout
|
||||
.split('\n')
|
||||
.filter((script) => script.trim() !== '')
|
||||
.map((script) => script.replace(/\//g, ''));
|
||||
|
||||
|
||||
for (let i = 0; i < arrscripts.length; i++) {
|
||||
let label = arrscripts[i];
|
||||
let sock = false;
|
||||
let description = '';
|
||||
if (listafiles) {
|
||||
if (arrscripts[i].endsWith('.sh')) {
|
||||
let labelFilePath = path.join(__dirname, '..', '..', '..', dir, `${arrscripts[i]}`);
|
||||
|
||||
// Verifica se il file esiste
|
||||
try {
|
||||
// console.log(__dirname);
|
||||
|
||||
// console.log(labelFilePath);
|
||||
|
||||
// Leggi il contenuto del file .label
|
||||
const labelContent = await fs.readFileSync(labelFilePath, 'utf-8');
|
||||
const lines = labelContent.split('\n');
|
||||
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
let linea = lines[i];
|
||||
// se la linea inizia con #DATA
|
||||
if (linea.indexOf('#DATA') !== -1) {
|
||||
// estrai la linea separata da |
|
||||
let arrparams = linea.split('|');
|
||||
|
||||
if (arrparams && arrparams.length > 0) {
|
||||
let paramstr = arrparams[1].trim();
|
||||
let value = arrparams[2].trim();
|
||||
|
||||
if (paramstr === 'TITLE') {
|
||||
label = value;
|
||||
} else if (paramstr === 'DESCRIZ') {
|
||||
description = value;
|
||||
} else if (paramstr === 'SOCK') {
|
||||
sock = (value.toLowerCase() === 'true');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
// Se desideri, puoi tenere un avviso o un log qui
|
||||
}
|
||||
}
|
||||
} else {
|
||||
label = '';
|
||||
}
|
||||
|
||||
if ((label) && (!extfiles || (extfiles && arrscripts[i].endsWith('.' + extfiles)))) {
|
||||
arrout.push({ label, value: arrscripts[i], description, sock });
|
||||
}
|
||||
}
|
||||
|
||||
resolve({ error, stdout, stderr, arrout });
|
||||
});
|
||||
});
|
||||
},
|
||||
execScriptNoOutput: async function (script) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
console.log('execScriptNoOutput:', script);
|
||||
exec(script, async (error, stdout, stderr) => { // Aggiunto async qui
|
||||
if (error) {
|
||||
console.error(`error: ${error}`);
|
||||
}
|
||||
if (stderr) {
|
||||
console.error(`stderr: ${stderr}`);
|
||||
}
|
||||
resolve(!error && !stderr);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
execScriptWithInputOnServer: async function (idapp, script) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const rl = readline.createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout,
|
||||
});
|
||||
|
||||
// Esegui il processo
|
||||
const child = spawn('bash', [script]);
|
||||
|
||||
let outputData = '';
|
||||
let errorData = '';
|
||||
|
||||
// Gestisci l'output standard
|
||||
child.stdout.on('data', (data) => {
|
||||
outputData += data.toString(); // Accumulate output data
|
||||
console.log(`Output: ${data}`);
|
||||
|
||||
// Chiedi l'input dell'utente
|
||||
rl.question('Your input: ', (answer) => {
|
||||
child.stdin.write(`${answer}\n`); // Invia la risposta allo script
|
||||
});
|
||||
});
|
||||
|
||||
// Gestisci l'output di errore
|
||||
child.stderr.on('data', (data) => {
|
||||
errorData += data.toString(); // Accumulate error data
|
||||
console.error(`Error: ${data}`);
|
||||
});
|
||||
|
||||
// Gestisci la chiusura del processo
|
||||
child.on('close', (code) => {
|
||||
console.log(`Process exited with code ${code}`);
|
||||
rl.close(); // Chiusura dell'interfaccia readline
|
||||
|
||||
// Risolvi la promessa con i dati raccolti
|
||||
if (code !== 0) {
|
||||
reject(new Error(`Process exited with code ${code}: ${errorData}`)); // Rifiuta in caso di errore
|
||||
} else {
|
||||
resolve({ stdout: outputData, stderr: errorData });
|
||||
}
|
||||
});
|
||||
|
||||
// Gestisci errori nel processo
|
||||
child.on('error', (error) => {
|
||||
reject(new Error(`Failed to start process: ${error.message}`));
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
execScriptByTelegram: function (idapp, msg, script, testo) {
|
||||
const { exec } = require('child_process');
|
||||
const telegrambot = require('../telegram/telegrambot');
|
||||
|
||||
@@ -4443,26 +4755,6 @@ module.exports = {
|
||||
}
|
||||
},
|
||||
|
||||
convertHTMLTagsForTelegram(text) {
|
||||
const htmlTagsMap = {
|
||||
'<font': '<span',
|
||||
'</font>': '</span>',
|
||||
'<i>': '',
|
||||
'</i>': '',
|
||||
'<u>': '',
|
||||
'</u>': '',
|
||||
};
|
||||
|
||||
// Sostituzione dei tag HTML con quelli Markdown supportati da Telegram
|
||||
let convertedText = text;
|
||||
for (const htmlTag in htmlTagsMap) {
|
||||
const regex = new RegExp(htmlTag, 'g');
|
||||
convertedText = convertedText.replace(regex, htmlTagsMap[htmlTag]);
|
||||
}
|
||||
|
||||
return convertedText;
|
||||
},
|
||||
|
||||
removeFontTags(text) {
|
||||
// Rimozione dei tag <font> e </font> dalla stringa di testo
|
||||
const regex = /<font[^>]*>|<\/font>/gi;
|
||||
@@ -4517,7 +4809,7 @@ module.exports = {
|
||||
|
||||
/*if (params.openUrl)
|
||||
content = content + '\n' + '<a href="' + myhost + params.openUrl + '">' + i18n.__('OPEN PAGE') + '</a>';
|
||||
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -4750,22 +5042,92 @@ module.exports = {
|
||||
}
|
||||
},
|
||||
|
||||
convertHTMLTagsToText(input) {
|
||||
convertAndTruncateHTMLForTelegram(text, maxLength = 200, link = '') {
|
||||
const tagMap = {
|
||||
"<ul>": "",
|
||||
"<ol>": "1. ",
|
||||
"<li>": "\n- ",
|
||||
"</ul>": "",
|
||||
"</ol>": "",
|
||||
"</li>": ""
|
||||
"<ul>": "", "<ol>": "", "<li>": "\n• ", "</ul>": "", "</ol>": "", "</li>": "",
|
||||
"<br>": "\n", "<div>": "", "</div>": "\n"
|
||||
};
|
||||
|
||||
// Replace supported HTML tags with their corresponding text representations
|
||||
let output = input.replace(/<ul>|<ol>|<li>|<\/ul>|<\/ol>|<\/li>/g, (match) => {
|
||||
return tagMap[match];
|
||||
// Rimuoviamo specificamente <b>\n</b>
|
||||
text = text.replace(/<b>\n<\/b>/g, '');
|
||||
|
||||
Object.keys(tagMap).forEach(tag => {
|
||||
const replacement = tagMap[tag];
|
||||
text = text.replaceAll(tag, replacement);
|
||||
});
|
||||
|
||||
return output;
|
||||
text = text.split('\n').map(line => line.trim()).join('\n');
|
||||
text = text.replace(/\n{3,}/g, '\n\n').replace(/\n+$/, '').trim();
|
||||
|
||||
if (text.length <= maxLength) {
|
||||
return text;
|
||||
}
|
||||
|
||||
// Tronchiamo il testo
|
||||
let truncated = text.slice(0, maxLength);
|
||||
let openTags = [];
|
||||
|
||||
// Troviamo tutti i tag aperti
|
||||
const regex = /<(\w+)[^>]*>/g;
|
||||
let match;
|
||||
while ((match = regex.exec(truncated)) !== null) {
|
||||
if (!truncated.includes(`</${match[1]}>`, match.index)) {
|
||||
openTags.push(match[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Rimuoviamo l'ultima parola parziale
|
||||
truncated = truncated.replace(/\S+$/, '');
|
||||
|
||||
let strcontinua = '';
|
||||
if (link) {
|
||||
strcontinua = `<em> (... <a href="${link}">continua sulla App</a>)</em>`;
|
||||
} else {
|
||||
strcontinua = `<em> (... continua sulla App)</em>`;
|
||||
}
|
||||
|
||||
// Aggiungiamo '...' e chiudiamo i tag aperti
|
||||
truncated += strcontinua;
|
||||
while (openTags.length > 0) {
|
||||
truncated += `</${openTags.pop()}>`;
|
||||
}
|
||||
|
||||
return truncated;
|
||||
},
|
||||
|
||||
convertHTMLTagsForTelegram(text) {
|
||||
const tagMap = {
|
||||
"<ul>": "",
|
||||
"<ol>": "",
|
||||
"<li>": "\n• ",
|
||||
"</ul>": "",
|
||||
"</ol>": "",
|
||||
"</li>": "",
|
||||
"<br>": "\n",
|
||||
"<div>": "",
|
||||
"</div>": "\n"
|
||||
};
|
||||
|
||||
// Rimuoviamo i tag vuoti o contenenti solo spazi bianchi o newline
|
||||
text = text.replace(/<(b|i|strong|em)>(\s|\n)*<\/\1>/g, '');
|
||||
|
||||
Object.keys(tagMap).forEach(tag => {
|
||||
const replacement = tagMap[tag];
|
||||
text = text.replaceAll(tag, replacement);
|
||||
});
|
||||
|
||||
// Rimuoviamo gli spazi bianchi all'inizio e alla fine di ogni riga
|
||||
text = text.split('\n').map(line => line.trim()).join('\n');
|
||||
|
||||
// Rimuoviamo le righe vuote consecutive, lasciandone solo una
|
||||
text = text.replace(/\n{3,}/g, '\n\n');
|
||||
|
||||
// Rimuoviamo le righe vuote alla fine del testo
|
||||
text = text.replace(/\n+$/, '');
|
||||
|
||||
text = text.replace(/<b>\n<\/b>/g, '');
|
||||
|
||||
return text.trim();
|
||||
},
|
||||
|
||||
async getAnnuncioForTelegram(myrec, tablerec, mydescr, userorig, nuovo) {
|
||||
@@ -4778,11 +5140,15 @@ module.exports = {
|
||||
let tiposcambio = ''
|
||||
let iconascambio = '🟢';
|
||||
|
||||
let lang = 'it';
|
||||
|
||||
let datastr = '';
|
||||
let dovestr = '';
|
||||
let organizedby = '';
|
||||
let contributo = '';
|
||||
|
||||
let img = '';
|
||||
|
||||
if ((tablerec === shared_consts.TABLES_MYGOODS) || (tablerec === shared_consts.TABLES_MYSKILLS)) {
|
||||
iconascambio = this.getIconByAdType(myrec.adType);
|
||||
if (myrec.adType === shared_consts.AdType.OFFRO)
|
||||
@@ -4790,11 +5156,16 @@ module.exports = {
|
||||
else if (myrec.adType === shared_consts.AdType.CERCO)
|
||||
tiposcambio = 'Cerco';
|
||||
} else if (tablerec === shared_consts.TABLES_MYHOSPS) {
|
||||
tiposcambio = 'Offro ';
|
||||
iconascambio = this.getIconByAdType(myrec.adType);
|
||||
if (myrec.adType === shared_consts.AdType.CERCO)
|
||||
tiposcambio = 'Cerco';
|
||||
else
|
||||
tiposcambio = 'Offro';
|
||||
|
||||
if (myrec.typeHosp === shared_consts.TYPEHOSP_OSPITALITA)
|
||||
tiposcambio += 'Ospitalità';
|
||||
tiposcambio += ' Ospitalità';
|
||||
else if (myrec.typeHosp === shared_consts.TYPEHOSP_SCAMBIOCASA)
|
||||
tiposcambio += 'Scambio Casa';
|
||||
tiposcambio += ' Scambio Casa';
|
||||
} else if (tablerec === shared_consts.TABLES_MYBACHECAS) {
|
||||
datastr = this.getstrDateTimeEvent(myrec);
|
||||
organizedby = myrec.organisedBy;
|
||||
@@ -4810,11 +5181,14 @@ module.exports = {
|
||||
}
|
||||
|
||||
let contatto = userorig;
|
||||
let contatto_telegram = '';
|
||||
try {
|
||||
let username_telegram = myrec.profile.username_telegram;
|
||||
|
||||
if (username_telegram)
|
||||
contatto = `@${username_telegram}`;
|
||||
if (username_telegram) {
|
||||
contatto_telegram = `@${username_telegram}`;
|
||||
contatto = contatto_telegram;
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
@@ -4840,11 +5214,11 @@ module.exports = {
|
||||
organizedBy = myrec.organisedBy;
|
||||
contatto = '';
|
||||
}
|
||||
if (myrec.contact_phone) {
|
||||
contatto += '/n' + myrec.contact_phone;
|
||||
if ((myrec.contact_telegram.toLowerCase() !== contatto_telegram.toLowerCase()) || !contatto) {
|
||||
contatto += '\n' + myrec.contact_telegram;
|
||||
}
|
||||
if (myrec.contact_telegram) {
|
||||
contatto += '/n' + myrec.contact_telegram;
|
||||
if (myrec.contact_phone) {
|
||||
contatto += ' - ' + this.get__('TELEFONO', lang) + ': ' + myrec.contact_phone;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4863,9 +5237,9 @@ module.exports = {
|
||||
if (cat)
|
||||
out += this.addRowTelegram('⭐️', 'Categoria', cat, true);
|
||||
|
||||
let note = this.convertHTMLTagsToText(myrec.note)
|
||||
let descrcontent = this.convertAndTruncateHTMLForTelegram(myrec.note, 500, url)
|
||||
|
||||
let descrcontent = this.firstchars(this.removeLastSpaceAndACapo(note), 500, true, url);
|
||||
// let descrcontent = this.firstchars(this.removeLastSpaceAndACapo(note), 200, true, url);
|
||||
|
||||
descrcontent = this.cleanHtmlForTelegram(descrcontent);
|
||||
|
||||
@@ -4893,14 +5267,19 @@ module.exports = {
|
||||
out += this.addRowTelegram('👤', 'Contatto', contatto, true);
|
||||
}
|
||||
|
||||
|
||||
out += this.addRowTelegram('', `👉🏻 Vedi Annuncio completo su RISO`, url, true, true);
|
||||
|
||||
if (myrec.photos && myrec.photos.length > 0) {
|
||||
// prende la prima foto ! ;
|
||||
if (myrec.photos[0].imagefile)
|
||||
img = this.getURLImg(myrec.idapp, tablerec, myrec.username, myrec.photos[0].imagefile, false);
|
||||
}
|
||||
|
||||
console.log('out', out);
|
||||
|
||||
// out += i18n.__('ADDED_FROM', );
|
||||
|
||||
return { newdescr, newdescrtelegram: out }
|
||||
return { newdescr, newdescrtelegram: out, img };
|
||||
} catch (e) {
|
||||
console.error('Error', e);
|
||||
}
|
||||
@@ -4960,7 +5339,7 @@ module.exports = {
|
||||
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 regex = /^(\d+\.?\d*)\s*(ml|gr|g|l|kg|uova)\s*$/; // Aggiunto un punto dopo \d+ per accettare anche i numeri con la virgola
|
||||
|
||||
const match = regex.exec(text);
|
||||
if (match) {
|
||||
@@ -5162,8 +5541,149 @@ module.exports = {
|
||||
console.error('Errore durante la pulizia dell\'HTML:', error);
|
||||
throw error; // Oppure, gestisci l'errore come preferisci
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getHostWithNoHttporHttps(url) {
|
||||
try {
|
||||
const parsedUrl = new URL(url);
|
||||
return parsedUrl.host;
|
||||
} catch (error) {
|
||||
console.error('Errore durante la pulizia dell\'HTML:', error);
|
||||
throw error; // Oppure, gestisci l'errore come preferisci
|
||||
}
|
||||
},
|
||||
|
||||
// Crea un file con all'interno il nome del dominio per ogni app:
|
||||
createFileWithDomainName() {
|
||||
const arrapps = getApps();
|
||||
|
||||
const filename = server_constants.FILECONFIG_SERVER;
|
||||
|
||||
for (const app of arrapps) {
|
||||
fs.writeFile(filename, this.getHostWithNoHttporHttps(app.host), function (err) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
});
|
||||
if (app.host_test) {
|
||||
fs.writeFile(filename, this.getHostWithNoHttporHttps(app.host_test), function (err) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async listCollectionsBySize() {
|
||||
let output = ""; // Variabile per memorizzare l'output
|
||||
|
||||
try {
|
||||
const conn = mongoose.connection;
|
||||
|
||||
// Ottieni le collezioni e calcola la dimensione
|
||||
const collections = await conn.db.listCollections().toArray();
|
||||
|
||||
// Calcola la dimensione per ciascuna collezione
|
||||
const collectionSizes = await Promise.all(collections.map(async (collection) => {
|
||||
const stats = await conn.db.collection(collection.name).stats();
|
||||
return { name: collection.name, size: stats.size };
|
||||
}));
|
||||
|
||||
// Ordina le collezioni per dimensione
|
||||
collectionSizes.sort((a, b) => b.size - a.size); // Ordine decrescente
|
||||
|
||||
output += "Collezioni ordinate per dimensione:\n"; // Inizio dell'output
|
||||
collectionSizes.forEach(collection => {
|
||||
const sizeInMB = (collection.size / (1024 * 1024)).toFixed(2); // Converti in MB
|
||||
output += `Collezione: ${collection.name}, Dimensione: ${sizeInMB} MB\n`; // Aggiungi all'output
|
||||
});
|
||||
|
||||
return output; // Restituisci l'output alla fine
|
||||
} catch (error) {
|
||||
console.error("Errore:", error);
|
||||
return `Errore: ${error.message}`; // Restituisci l'errore come stringa
|
||||
}
|
||||
},
|
||||
|
||||
getStringaConto(mov) {
|
||||
|
||||
let mystr = ''
|
||||
let myfrom = ''
|
||||
let myto = ''
|
||||
|
||||
let tipocontofrom = shared_consts.AccountType.USER
|
||||
let tipocontoto = shared_consts.AccountType.USER
|
||||
|
||||
if (mov.contocomfrom && mov.contocomfrom.name) {
|
||||
myfrom += mov.contocomfrom.name + ' '
|
||||
tipocontofrom = shared_consts.AccountType.COMMUNITY_ACCOUNT
|
||||
}
|
||||
if (mov.groupfrom) {
|
||||
myfrom += mov.groupfrom.groupname + ' '
|
||||
tipocontofrom = shared_consts.AccountType.COLLECTIVE_ACCOUNT
|
||||
}
|
||||
if (mov.userfrom) {
|
||||
myfrom += mov.userfrom.username + ' '
|
||||
}
|
||||
|
||||
if (mov.contocomto && mov.contocomto.name) {
|
||||
myto += mov.contocomto.name + ' '
|
||||
tipocontoto = shared_consts.AccountType.COMMUNITY_ACCOUNT
|
||||
}
|
||||
if (mov.groupto) {
|
||||
myto += mov.groupto.groupname + ' '
|
||||
tipocontoto = shared_consts.AccountType.COLLECTIVE_ACCOUNT
|
||||
}
|
||||
if (mov.userto) {
|
||||
myto += mov.userto.username + ' '
|
||||
}
|
||||
|
||||
// mystr = t('movement.from') + myfrom + ' ' + t('movement.to') + myto
|
||||
|
||||
return { myfrom, myto, tipocontofrom, tipocontoto }
|
||||
},
|
||||
|
||||
ImageDownloader,
|
||||
|
||||
getDirUpload() {
|
||||
return 'upload/'
|
||||
},
|
||||
|
||||
getURLImg(idapp, table, username, img, checkifExist) {
|
||||
let dirmain = '';
|
||||
|
||||
try {
|
||||
|
||||
let dir = this.getdirByIdApp(idapp) + dirmain + '/' + this.getDirUpload();
|
||||
|
||||
let foldermain = dir + 'profile/' + username;
|
||||
|
||||
img = foldermain + '/' + table + '/' + img;
|
||||
|
||||
if (checkifExist) {
|
||||
if (!fs.existsSync(img)) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.sulServer()) {
|
||||
// Finta Immagine
|
||||
img = 'https://riso.app/upload/profile/SoniaVioletFlame/myskills/1000133092.jpg';
|
||||
}
|
||||
|
||||
return img;
|
||||
} catch (e) {
|
||||
console.error('Err GetURLImg', e);
|
||||
return '';
|
||||
}
|
||||
},
|
||||
|
||||
getLangByUsername(idapp, username) {
|
||||
|
||||
//++Todo LANG: Estrarre il Lang dall'username (user, group)
|
||||
return 'it';
|
||||
},
|
||||
|
||||
|
||||
// Scriviere qui SOPRA le funzioni
|
||||
};
|
||||
|
||||
@@ -24,6 +24,7 @@ const { Skill } = require('../models/skill');
|
||||
const { Good } = require('../models/good');
|
||||
const { SubSkill } = require('../models/subskill');
|
||||
const { MySkill } = require('../models/myskill');
|
||||
const { Attivita } = require('../models/attivita');
|
||||
const { MyGood } = require('../models/mygood');
|
||||
const { MyBacheca } = require('../models/mybacheca');
|
||||
const { MyHosp } = require('../models/myhosp');
|
||||
@@ -176,7 +177,7 @@ module.exports = {
|
||||
mytable = Newstosent;
|
||||
else if (tablename === 'gallery')
|
||||
mytable = Gallery;
|
||||
else if (tablename === 'mypage')
|
||||
else if ((tablename === 'mypages') || (tablename === 'mypage'))
|
||||
mytable = MyPage;
|
||||
else if (tablename === 'myelems')
|
||||
mytable = MyElem;
|
||||
@@ -212,6 +213,8 @@ module.exports = {
|
||||
mytable = SubSkill;
|
||||
else if (tablename === shared_consts.TABLES_MYSKILLS)
|
||||
mytable = MySkill;
|
||||
else if (tablename === shared_consts.TABLES_ATTIVITAS)
|
||||
mytable = Attivita;
|
||||
else if (tablename === shared_consts.TABLES_MYBACHECAS)
|
||||
mytable = MyBacheca;
|
||||
else if (tablename === shared_consts.TABLES_MYHOSPS)
|
||||
@@ -289,7 +292,7 @@ module.exports = {
|
||||
textcontent_Telegram: recnotif.textcontent_Telegram ? recnotif.textcontent_Telegram : '',
|
||||
linkaddTelegram: recnotif.linkaddTelegram ? recnotif.linkaddTelegram : '',
|
||||
};
|
||||
|
||||
|
||||
if (tools.isBitActive(recnotif.typesend, shared_consts.MessageOptions.Notify_ByPushNotification) && this.checkifSendPushNotification) {
|
||||
params.typesend = params.typesend + shared_consts.TypeSend.PUSH_NOTIFICATION;
|
||||
invia = true;
|
||||
@@ -451,7 +454,7 @@ module.exports = {
|
||||
|
||||
text = tools.getContentNotifByParams(params, mycontent, shared_consts.TypeSend.TELEGRAM);
|
||||
if (telegid > 0) {
|
||||
risult = await telegrambot.local_sendMsgTelegramByIdTelegram(idapp, telegid, text);
|
||||
risult = await telegrambot.local_sendMsgTelegramByIdTelegram(idapp, telegid, text, undefined, undefined, undefined, undefined, params.img);
|
||||
await tools.snooze(25);
|
||||
|
||||
textsent = risult.text;
|
||||
@@ -497,7 +500,7 @@ module.exports = {
|
||||
return await this.SendMsgToParam(idapp, params);
|
||||
},
|
||||
|
||||
replaceUsername: async function (idapp, search_username, replace_username) {
|
||||
replaceUsername: async function (idapp, search_username, replace_username) {
|
||||
|
||||
if (!search_username || !replace_username) {
|
||||
return false;
|
||||
|
||||
@@ -120,6 +120,8 @@ module.exports = Object.freeze({
|
||||
'surname',
|
||||
'news_on',
|
||||
'profile',
|
||||
]
|
||||
],
|
||||
|
||||
FILECONFIG_SERVER: 'lists_serverconfig.txt',
|
||||
|
||||
});
|
||||
|
||||
@@ -51,6 +51,7 @@ module.exports = {
|
||||
OPTIONS_SEARCH_USER_ALL_WORDS: 4,
|
||||
OPTIONS_ADD_COUNT_FAVORITE: 8,
|
||||
|
||||
|
||||
PROD: {
|
||||
GAS: 1,
|
||||
BOTTEGA: 2,
|
||||
@@ -149,13 +150,15 @@ module.exports = {
|
||||
TABLES_MYEVENTS: 'myevents',
|
||||
TABLES_CIRCUITS: 'circuits',
|
||||
TABLES_MYGROUPS: 'mygroups',
|
||||
TABLES_ATTIVITAS: 'attivitas',
|
||||
|
||||
MYTABS: [{ id: 0, table: 'none' },
|
||||
{ id: 1, table: 'myskills' },
|
||||
{ id: 2, table: 'mybachecas' },
|
||||
{ id: 3, table: 'myhosps' },
|
||||
{ id: 4, table: 'mygoods' },
|
||||
{ id: 5, table: 'myevents' }],
|
||||
{ id: 5, table: 'myevents' },
|
||||
{ id: 6, table: 'attivitas' }],
|
||||
|
||||
CMD_REACTION: {
|
||||
SET_FAVORITE: 1,
|
||||
@@ -172,16 +175,24 @@ module.exports = {
|
||||
numattend: 1,
|
||||
},
|
||||
|
||||
TABLES_ENABLE_GETREC_BYID: ['mybachecas', 'myhosps', 'myskills', 'mygoods'],
|
||||
TABLES_REACTIONS: ['mybachecas', 'myhosps', 'myskills', 'mygoods'],
|
||||
ANNUNCI_FIELDS: {
|
||||
idMyGroup: 1,
|
||||
// **ADDFIELD_MYGROUPS
|
||||
},
|
||||
|
||||
// Condivise
|
||||
TABLES_FAVORITE_BOOKMARK: ['myskills', 'mygoods', 'mybachecas', 'myhosps', 'attivitas'],
|
||||
|
||||
// Solo per NODEJS
|
||||
|
||||
TABLES_ENABLE_GETREC_BYID: ['mybachecas', 'myhosps', 'myskills', 'mygoods', 'attivitas'],
|
||||
TABLES_USER_INCLUDE_MY: ['mygroups', 'circuits'],
|
||||
TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods'],
|
||||
TABLES_INSERT_ALMOST_ONE_TO_ENABLE_CIRCUIT: ['myskills', 'myhosps', 'mygoods'],
|
||||
TABLES_GETCOMPLETEREC: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'attivitas'],
|
||||
|
||||
//++Todo: per abilitare gli utenti ad inserire un Circuito aggiungere 'circuits' alla lista TABLES_PERM_NEWREC
|
||||
TABLES_PERM_NEWREC: ['skills', 'goods', 'subskills', 'mygroups', 'myhosps'],
|
||||
TABLES_REC_ID: ['skills', 'goods', 'subskills'],
|
||||
TABLES_FAVORITE_BOOKMARK: ['myskills', 'mygoods', 'mybachecas', 'myhosps'],
|
||||
|
||||
TABLES_REACTIONS: ['mybachecas', 'myhosps', 'myskills', 'mygoods', 'attivitas'],
|
||||
|
||||
TABLES_VISU_STAT_IN_HOME: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'mygroups', 'circuits'],
|
||||
|
||||
@@ -192,6 +203,8 @@ module.exports = {
|
||||
TABLES_GROUPS_NOTIFICATION: ['mygroups'],
|
||||
TABLES_CIRCUITS_NOTIFICATION: ['circuits'],
|
||||
|
||||
TABLES_ENABLE_GETTABLE_FOR_NOT_LOGGED: ['attivitas'],
|
||||
|
||||
TABLES_NUM_AS_ID_NUMBER: [],
|
||||
|
||||
TABLES_ID_STRING: [
|
||||
@@ -208,6 +221,7 @@ module.exports = {
|
||||
'adtypegoods',
|
||||
'statusSkills',
|
||||
'sectors',
|
||||
'goods',
|
||||
'sectorgoods',
|
||||
'catgrps',
|
||||
'skills',
|
||||
@@ -221,8 +235,8 @@ module.exports = {
|
||||
// 'mygroups'
|
||||
],
|
||||
TABLES_USER_ID: ['mygroups', 'myskills', 'mybachecas', 'myhosps', 'mygoods'],
|
||||
TABLES_CREATEDBY: ['mygroups', 'circuits'],
|
||||
TABLES_UPDATE_LASTMODIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots', 'mygroups', 'circuits'],
|
||||
TABLES_CREATEDBY: ['mygroups', 'circuits', 'attivitas'],
|
||||
TABLES_UPDATE_LASTMODIFIED: ['myskills', 'mybachecas', 'myhosps', 'mygoods', 'bots', 'mygroups', 'circuits', 'attivitas'],
|
||||
|
||||
TABLES_FIELDS_DESCR_AND_CITY_AND_USER: ['myskills', 'mybachecas', 'myhosps', 'mygoods'],
|
||||
|
||||
@@ -843,6 +857,7 @@ module.exports = {
|
||||
} else if (table === this.TABLES_MYHOSPS) {
|
||||
proj = {
|
||||
visibile: 1,
|
||||
adType: 1,
|
||||
typeHosp: 1,
|
||||
numMaxPeopleHosp: 1,
|
||||
accomodation: 1,
|
||||
@@ -855,6 +870,31 @@ module.exports = {
|
||||
link_maplocation: 1,
|
||||
}
|
||||
|
||||
} else if (table === this.TABLES_ATTIVITAS) {
|
||||
proj = {
|
||||
recSkill: 1,
|
||||
sector: 1,
|
||||
idSector: 1,
|
||||
idSkill: 1,
|
||||
idCity: 1,
|
||||
logo: 1,
|
||||
photos: 1,
|
||||
note: 1,
|
||||
descr: 1,
|
||||
website: 1,
|
||||
date_created: 1,
|
||||
date_updated: 1,
|
||||
tipodiAttivita: 1,
|
||||
name: 1,
|
||||
coordinate_gps: 1,
|
||||
email: 1,
|
||||
telegram_username: 1,
|
||||
cell_phone: 1,
|
||||
whatsapp: 1,
|
||||
createdBy: 1,
|
||||
//**ADDFIELD_ATTIVITA
|
||||
};
|
||||
|
||||
} else if (table === this.TABLES_MYBACHECAS) {
|
||||
proj = {
|
||||
recSkill: 1,
|
||||
@@ -911,6 +951,7 @@ module.exports = {
|
||||
mycities: 1,
|
||||
lang: 1,
|
||||
verified_by_aportador: 1,
|
||||
idMyGroup: 1,
|
||||
'profile.img': 1,
|
||||
'profile.mygroups': 1,
|
||||
'profile.mycircuits': 1,
|
||||
@@ -933,6 +974,7 @@ module.exports = {
|
||||
proj = Object.assign({}, proj, proj_add);
|
||||
|
||||
proj = { ...proj, ...this.REACTIONS_FIELD };
|
||||
proj = { ...proj, ...this.ANNUNCI_FIELDS };
|
||||
|
||||
if (table) {
|
||||
let proj_add3 = this.getProjectByTable(table);
|
||||
@@ -993,29 +1035,29 @@ module.exports = {
|
||||
},
|
||||
|
||||
CAMPI_PRODUCTINFO: [
|
||||
{name: 'name', type: ''},
|
||||
{name: 'code', type: ''},
|
||||
{name: 'description', type: 1},
|
||||
{name: 'link_scheda', type: ''},
|
||||
{name: 'idCatProds', type: ''},
|
||||
{name: 'idSubCatProds', type: ''},
|
||||
{name: 'weight', type: ''},
|
||||
{name: 'weight_lordo', type: ''},
|
||||
{name: 'unit', type: ''},
|
||||
{name: 'unit_lordo', type: ''},
|
||||
{name: 'size', type: ''},
|
||||
{name: 'vegan', type: ''},
|
||||
{name: 'sfuso', type: ''},
|
||||
{name: 'img', type: ''},
|
||||
{name: 'image_link', type: ''},
|
||||
{name: 'link', type: ''},
|
||||
{name: 'ingredienti', type: ''},
|
||||
{name: 'valori_nutrizionali', type: ''},
|
||||
{name: 'author', type: ''},
|
||||
{name: 'collezione', type: ''},
|
||||
{name: 'publisher', type: ''},
|
||||
{name: 'numpages', type: ''},
|
||||
{name: 'note', type: ''},
|
||||
{ name: 'name', type: '' },
|
||||
{ name: 'code', type: '' },
|
||||
{ name: 'description', type: 1 },
|
||||
{ name: 'link_scheda', type: '' },
|
||||
{ name: 'idCatProds', type: '' },
|
||||
{ name: 'idSubCatProds', type: '' },
|
||||
{ name: 'weight', type: '' },
|
||||
{ name: 'weight_lordo', type: '' },
|
||||
{ name: 'unit', type: '' },
|
||||
{ name: 'unit_lordo', type: '' },
|
||||
{ name: 'size', type: '' },
|
||||
{ name: 'vegan', type: '' },
|
||||
{ name: 'sfuso', type: '' },
|
||||
{ name: 'img', type: '' },
|
||||
{ name: 'image_link', type: '' },
|
||||
{ name: 'link', type: '' },
|
||||
{ name: 'ingredienti', type: '' },
|
||||
{ name: 'valori_nutrizionali', type: '' },
|
||||
{ name: 'author', type: '' },
|
||||
{ name: 'collezione', type: '' },
|
||||
{ name: 'publisher', type: '' },
|
||||
{ name: 'numpages', type: '' },
|
||||
{ name: 'note', type: '' },
|
||||
],
|
||||
|
||||
CAMPI_PRODUCT: [
|
||||
@@ -1061,18 +1103,24 @@ module.exports = {
|
||||
AUDIOLIBRO: 22,
|
||||
VIDEO: 23,
|
||||
CARTE: 25,
|
||||
// -----------
|
||||
NUOVO: 101,
|
||||
USATO: 102,
|
||||
DOWNLOAD: 103,
|
||||
DVD: 104,
|
||||
EPUB: 105,
|
||||
MOBI: 106,
|
||||
PDF: 107,
|
||||
STREAMING: 108,
|
||||
|
||||
},
|
||||
|
||||
AccountType: {
|
||||
USER: 0,
|
||||
COLLECTIVE_ACCOUNT: 1,
|
||||
COMMUNITY_ACCOUNT: 2,
|
||||
},
|
||||
|
||||
// Download, DVD, Epub, Mobi, Nuovo, PDF, Streaming, Usato
|
||||
VERSIONE: {
|
||||
NUOVO: 1,
|
||||
USATO: 2,
|
||||
DOWNLOAD: 3,
|
||||
DVD: 4,
|
||||
EPUB: 5,
|
||||
MOBI: 6,
|
||||
PDF: 7,
|
||||
STREAMING: 8,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
1
src/server/version.txt
Normal file
1
src/server/version.txt
Normal file
@@ -0,0 +1 @@
|
||||
1.1.0
|
||||
48
yarn.lock
48
yarn.lock
@@ -8184,6 +8184,11 @@ mysql@^2.18.1:
|
||||
safe-buffer "5.1.2"
|
||||
sqlstring "2.3.1"
|
||||
|
||||
nan@^2.17.0:
|
||||
version "2.20.0"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
|
||||
integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
|
||||
|
||||
nanoid@^3.3.7:
|
||||
version "3.3.7"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
||||
@@ -8334,6 +8339,13 @@ node-pre-gyp@^0.14.0:
|
||||
semver "^5.3.0"
|
||||
tar "^4.4.2"
|
||||
|
||||
node-pty@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd"
|
||||
integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==
|
||||
dependencies:
|
||||
nan "^2.17.0"
|
||||
|
||||
node-releases@^2.0.14:
|
||||
version "2.0.14"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
|
||||
@@ -10731,7 +10743,7 @@ string-length@^4.0.1:
|
||||
char-regex "^1.0.2"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
"string-width-cjs@npm:string-width@^4.2.0":
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
@@ -10749,6 +10761,15 @@ string-width@^1.0.1:
|
||||
is-fullwidth-code-point "^1.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
|
||||
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
dependencies:
|
||||
emoji-regex "^8.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string-width@^5.0.1, string-width@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
|
||||
@@ -10805,7 +10826,7 @@ string_decoder@~1.1.1:
|
||||
dependencies:
|
||||
safe-buffer "~5.1.0"
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
@@ -10819,6 +10840,13 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
||||
dependencies:
|
||||
ansi-regex "^2.0.0"
|
||||
|
||||
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
|
||||
version "7.1.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
|
||||
@@ -11611,6 +11639,11 @@ verror@1.10.0:
|
||||
core-util-is "1.0.2"
|
||||
extsprintf "^1.2.0"
|
||||
|
||||
vhost@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5"
|
||||
integrity sha512-S3pJdWrpFWrKMboRU4dLYgMrTgoPALsmYwOvyebK2M6X95b9kQrjZy5rwl3uzzpfpENe/XrNYu/2U+e7/bmT5g==
|
||||
|
||||
vinyl-contents@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/vinyl-contents/-/vinyl-contents-1.0.0.tgz#f8f3456fe2dfb208a62c85653c2b682f87b5a2d5"
|
||||
@@ -11863,7 +11896,16 @@ workerpool@6.2.1:
|
||||
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
|
||||
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
wrap-ansi@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
|
||||
Reference in New Issue
Block a user