91 Commits

Author SHA1 Message Date
Surya Paolo
2ee710b748 galleria prodotto 2025-08-12 19:43:41 +02:00
Surya Paolo
e3db42dcbc - Iniziato a scrivere la CHATBOT... 2025-08-09 00:48:50 +02:00
Surya Paolo
32210bb96a - corretto sendemail password... l'ho cambiata. e ho messo dei controlli 2025-07-29 12:53:28 +02:00
Surya Paolo
f26ae170bb - Ricerca delle Organizzazioni, per inviare i RIS. 2025-07-21 22:49:55 +02:00
Surya Paolo
a189aeb99c - Poter impostare per ogni Provincia un Circuito RIS specifico, anziché quello provinciale:
Esempio: Napoli: (Circuito RIS Campania) e Sud Sardegna: Cagliari.
2025-07-21 19:08:43 +02:00
Surya Paolo
e118c30f47 - Aggiunta possibilità di disattivare i link alle immagini dei libri. (opzione sul catalogo: disattiva_link_immagini) 2025-07-18 10:43:16 +02:00
Surya Paolo
fb11e15907 - Aggiunta della copertina iniziale nelle raccolte (Catalogo Generale).
- Corretto altezza delle immagini che erano stretchate.
- Fix: poter spostare l'ordinamento dei libri corretto.
2025-07-15 17:46:37 +02:00
Surya Paolo
87c8bf4c45 - corretto import XLS... 2025-07-11 15:03:01 +02:00
Surya Paolo
efd1d12ba7 - Import di un file XLS contenente una lista di libri, all'interno di un catalogo. 2025-07-11 12:55:30 +02:00
Surya Paolo
29437d9d7b . esportazione lista catalogo direttamente in EXCEL, e scelta dei campi. 2025-07-10 00:43:37 +02:00
Surya Paolo
ed27a6f6a5 -statistiche OK 2025-07-08 18:01:24 +02:00
Surya Paolo
d6579763f4 - Aggiunto le Statistiche di visualizzazione delle pagine.
- Aggiunto il componente per visualizzare le statistiche
2025-07-08 16:19:05 +02:00
Surya Paolo
88cb2f13cc - Non funziona l'ammetti il nuovo registrato, sulla App.
- All'interno di una Organizzazione, mostrare se non si è ancora entrati in un Circuito, mettere bottone per Entrare.
2025-07-08 10:25:05 +02:00
Surya Paolo
91ac7a5bde - aggiornato la versione STAMPA, che non funzionava 2025-07-07 09:37:56 +02:00
Surya Paolo
0b06f9f93a - Raccolte Cataloghi corretto e migliorato.
- Bottoni "Apri" e "PDF".
2025-07-06 23:13:03 +02:00
Surya Paolo
a13635ab4e - Sistemato i Referenti (e non Editori), quando crei un nuovo Catalogo ti imposta la proprietà a te, ma chiunque Collaboratore potrebbe cmq modificartelo. 2025-07-01 12:59:54 +02:00
Surya Paolo
31a93424aa - aggiunto filtro nella lista producttable
- ora compare il bottone aggiungi alla lista solo se non è presente.
- corretto la ricerca con "#"
2025-06-25 17:48:44 +02:00
Surya Paolo
8d4158c2c6 - corretto il titolo che lo prendo dall'estrazione del sito... JSON. 2025-06-23 20:48:11 +02:00
Surya Paolo
8c0619992b - Corretta query di estrapolazione libri su GM (Marco)
- aggiornato bestseller su fatlast1Y
- non mostrare piu i libri che non hanno l'immagine (sul catalogo).
- metti online i compressi
2025-06-16 19:36:57 +02:00
Surya Paolo
5668c620da - Sistemato link pdf che ogni volta che si aggiorna prendeva il PDF dalla cache...
- Raccolta Cataloghi, procedura che li AUTO genera in automatico.
2025-06-13 17:46:03 +02:00
Surya Paolo
6b9ddc8986 - Creazione di un Nuovo Catalogo (e la sua relativa pagina), a partire da un modello ed un catalogo esistente.
- Aggiunta dei bottoni sul Ccatalogocard
2025-06-12 23:49:18 +02:00
Surya Paolo
133dc6a502 - aggiornato carrello e bottoni sul catalogo 2025-06-12 10:08:13 +02:00
Surya Paolo
25377090c1 - corretto la gestione degli Sconti
- Duplicare un Catalogo
2025-06-11 01:05:25 +02:00
Surya Paolo
d1d4b73da0 - Esporta Lista Carrello (Totale)
- Sconto Applicato
2025-06-09 09:48:40 +02:00
Surya Paolo
f88f433003 - Aggiunto bottone Aggiungi al Carrello sulla lista dei libri dei cataloghi 2025-06-06 00:07:53 +02:00
Surya Paolo
28a4fe1952 - sistemato "Pare che selezionando una condizione, non sempre viene aggiornato il record !"
- Aggiunto filtro "Escludi Editoriale"
2025-06-04 15:46:39 +02:00
Surya Paolo
f85b8d0637 - Corretto la possibilità di effettuare un Ordine di libri, sul sito gruppomacro.app. arriverà una email a "info@gruppomacro.app". 2025-06-03 01:01:46 +02:00
Surya Paolo
3d6455f23c - generazione della raccolta PDF OK !!! 2025-05-30 16:45:01 +02:00
Surya Paolo
f0c25366db - aggiornato la visualoizzazione per scaricare il PDF e per aprirlo 2025-05-30 10:49:32 +02:00
Surya Paolo
d2aaf78c0e - anche la versione file compressa del PDF ora è ok. 2025-05-29 19:19:40 +02:00
Surya Paolo
40214abe64 - generazione del PDF riscritto totalmente
- ora è possibile generarlo anche da backend
- FIX: corretto la qualità del PDF e la dimensione non esatta in pixel...
2025-05-29 18:23:20 +02:00
Surya Paolo
9efd193124 - versione 1.2.50 2025-05-23 19:02:51 +02:00
Surya Paolo
0e5d28d199 - Finalmente risolto il calcolo e l'impaginazione del PDF, per WEb e per Stampa (300 dpi) !
- corretto altre cose sulla lista cataloghi.
2025-05-23 17:02:41 +02:00
Surya Paolo
d6aaaabb00 - corretto footer catalogo
- corretti il path delle immagini (quando hanno lo spazio nel nomefile).
- aggiunto colore di sfondo per il testo descrittivo, in trasparenza
2025-05-21 12:06:15 +02:00
Surya Paolo
10097f4238 - Per generare la sinossi è possibile estrarre con 1 click la descrizione sia da Amazon che da GruppoMacro.
- corretto piccolo bug sul catalogo.
2025-05-20 12:21:51 +02:00
Surya Paolo
a3c7b92c0c - Estrazione dei dati da Amazon
- Ciclo di Estrapolazione di tutti i prodotti ed aggiornamento dei campi scraped e scraped_updated
- Creazione file CSV con i campi modificati.
2025-05-19 17:33:58 +02:00
Surya Paolo
a374a7d7bc - estrazione dei dati del libro sul sito di Amazon.
- possibilità di visualizzare i dati estratti e di aggiornare i dati, sia solo se vuoti, che sovrascrivere tutti i dati.
2025-05-16 18:52:21 +02:00
Surya Paolo
7e50299854 - ver 1.2.47 :
- corretto errore di modifica scheda
- aggiunto scraping (fase 1)
2025-05-16 10:26:55 +02:00
Surya Paolo
1da0e0f4b5 corretto altre cose (workbox mancante) 2025-05-15 21:41:30 +02:00
Surya Paolo
636136a077 - ho migliorato la grafica della generazione del PDF e PDF Stampa. 2025-05-15 19:18:56 +02:00
Surya Paolo
3521a88395 - ottimizzato il caricamento del sito
- ottimizzato il caricamento del catalogo.
2025-05-15 18:22:43 +02:00
Surya Paolo
768d299881 - sistemato timeout corto
- corretto errori sulla generazione del PDF
- corretto alcune directory
- corretto fs.promise
- corretto CORS !
2025-05-15 14:27:46 +02:00
Surya Paolo
a76d6c9b12 - il catalogo si aggiorna in base alle impostazioni del template anche per la "Stampa" 2025-05-14 20:18:16 +02:00
Surya Paolo
0bf8d3c83c - Assegnazione di linkIdTemplate anche per la "Pagina di Default", in modo che posso da "Templates" cambiare le impostazioni. 2025-05-14 17:04:24 +02:00
Surya Paolo
b2c19801e6 - Generazione della Raccolta dei Cataloghi (web e Stampa), e creazione del PDF Online.
- Lista Raccolta Cataloghi, aggiungi/togli catalogo.
2025-05-14 15:02:21 +02:00
Surya Paolo
ee3846159c - Creazione PDF Temporanei (Generati)
- Assegnazione di questi su PDF OnLine e PDF per Stampa
2025-05-12 18:43:30 +02:00
Surya Paolo
5ab24b2abd - Generazione PDF e per Stampa 2025-05-12 16:34:04 +02:00
Surya Paolo
09a05a11d5 Creazione Nutriben-natoropatia.it 2025-05-11 21:59:25 +02:00
Surya Paolo
6c254a6a8e - Export Lista
- Ordinamento
- PDF Risolto Salvataggio ed invio al server direttamente.
2025-05-08 23:32:19 +02:00
Surya Paolo
240a7be7f1 - Cron Completato 2025-05-08 00:53:33 +02:00
Surya Paolo
58839c32e1 - Aggiunta della funzione Cron
- Flag: Pubblicati OnLine + Solo CagalogoGenerale + Dettagli
2025-05-07 21:58:43 +02:00
Surya Paolo
b77a0579f1 - newsletter: prende la lista utenti (flag news_on)
- Abilita a Tutti la Newsletter news_on
- isCommerciale
- JobsInProgress
- PCB: Corretto Totali che era a zero
2025-05-06 18:19:09 +02:00
Surya Paolo
6e8d1fcff1 Aggiungere un campo "Vagliato dall'Editore" e aggiungere anche il campo "chi" e delle Note 2025-05-02 19:11:35 +02:00
Surya Paolo
192fd4706c - ordinamento aggiornare la pagina "templates" per Fatturati ultimo anno
- bestseller
2025-05-02 10:10:11 +02:00
Surya Paolo
fcc3755c19 - corretto scheda prodotto, record salvato 2025-05-01 00:20:16 +02:00
Surya Paolo
97abe8b46d corretto errore che se sbagliava password dava errore... myuser... 2025-04-30 14:43:45 +02:00
Surya Paolo
e40fbd550b - miglioramenti ricerca titoli e modifica del trafiletto
- miglior visualizzazione delle liste
2025-04-30 13:27:54 +02:00
Surya Paolo
3d4f8b0d04 - aggiornato scheda e rigenera lista
- corretto filtro sulla Collana
2025-04-29 02:30:19 +02:00
Surya Paolo
95793fd73f - Altri aggiornamenti della scheda 2025-04-24 19:31:40 +02:00
Surya Paolo
4b4e3963ac - scheda prodotto migliorata
- aggiornamento filtri
2025-04-24 01:03:27 +02:00
Surya Paolo
85e2df56e1 - ordinamento tabella titoli
- migliorata la lista degli argomenti
2025-04-23 01:59:45 +02:00
Surya Paolo
58431c144c aggiornamento cataloghi, search 2025-04-22 18:30:48 +02:00
Surya Paolo
ad45ce60ee - aggiornamento cataloghi.
possibilità di estrapolare i dati da GM direttamente
- migrazione delle tabelle di GM in locale
- corretto l'ordinamento del Catalogo
2025-04-18 13:23:59 +02:00
Surya Paolo
fba2ebd710 - Aggiornamento dal DB di GM al DB Locale 2025-04-16 23:28:29 +02:00
Surya Paolo
8e8a3204a7 Aggiornamento cataloghi... 2025-04-11 18:49:59 +02:00
Surya Paolo
e1ca4ef17f - aggiornamento catalogo: lista titoli del catalogo
- scheda prodotto libro
- migliorata tabella prodotto
2025-04-04 18:15:21 +02:00
Surya Paolo
5431fe118e - Ricerca Titolo per nome o autore o ISBN o codice articolo 2025-03-31 23:56:01 +02:00
Surya Paolo
789dc1dcae - sendcoins
- font
- catalogo
2025-03-26 23:23:48 +01:00
Surya Paolo
76bacf3f5a fix: non riuscivi ad acquistare i RIS al gruppo
- lista linkREG
2025-03-23 22:54:04 +01:00
Surya Paolo
d94cbde948 aggiornamenti vari... 2025-03-21 19:52:01 +01:00
Surya Paolo
dfe492df45 - corretto la registrazione 2025-03-15 15:35:35 +01:00
Surya Paolo
6c50f35b2b - fix: refresh token, codice di errore ... 2025-03-15 15:04:28 +01:00
Surya Paolo
a03c4cf613 - fix: refresh token, codice di errore ... 2025-03-15 14:52:33 +01:00
Surya Paolo
7d845355a9 - fix: authenticate_withUser mancava su alcuni...
- fix: '/signin' non riproponeva il login nel caso il token fosse invalido
2025-03-14 12:52:44 +01:00
Surya Paolo
aeb83a512b - fix: nModified è stato sostituito con modifiedCount
- .ok con .acknowledged
- coretto la chiamata per il REFRESH TOKEN !
2025-03-14 10:55:37 +01:00
Surya Paolo
e04247b1b6 - fix: ris da inviare al gruppo (nuovamente) e immagini rimaste ancora "images/" anzichè "/images/". 2025-03-13 18:58:26 +01:00
Surya Paolo
f713f66369 - fix: sistemato pagina gruppo che non si visualizzava (errore per modifica)
- fix: corretto il "Invia RIS" al gruppo.
2025-03-13 18:19:42 +01:00
Surya Paolo
f32bd189dc - fatta ottimizzazione della funzione addExtraInfo, chiamando parallelamente tutte le promise... 2025-03-13 12:48:23 +01:00
Surya Paolo
0017f04e45 - risolto problema della non attesa della PWA durante la chiamata a Node.js.
- risolto problema dell'ambiente in Locale HTTPS certificato installato aggiornato.
2025-03-13 12:05:16 +01:00
Surya Paolo
65b29a6eee - fixed: Se tenti d'inviare dei RIS a chi ha raggiunto il limite, deve comparirti un msg ed inviare un msg al destinatario ! 2025-03-12 22:42:43 +01:00
Surya Paolo
7827e49760 versione 1.2.14 :
- aggiornati i file di configurazione, ENV e script non funzionanti., package.
- corretto custom-service-worker.js con CORS
- ottimizzato il server, la chiamata Load iniziale (senza promise, con async/await).
2025-03-12 21:03:02 +01:00
Surya Paolo
d106a59bb5 - corretta configurazione
- fix problemi al database su piuchebuono una chiamata dava errore...
const c = ....
if (mycart && mycart.length > 0) {
2025-03-10 19:59:03 +01:00
Surya Paolo
4758ce0857 - COMPLETAMENTO PASSAGGIO A VITE - versione 1.2.2:
- Sistemato RefreshToken
  - Integrato modifiche di PiuCheBuono
  - Aggiornato a Node 22
  - Aggiornato Server a Mongodb 8.0.
2025-03-10 17:20:57 +01:00
Surya Paolo
6579c6bb3f script... 2025-03-06 18:03:23 +01:00
Surya Paolo
6270991b76 - Conversione Codice... Errore Service Worker regostration.
- Sistemare quasar.config.ts di piuchebuono!
-Le categorie non si vedono piu !!
2025-03-06 01:23:56 +01:00
Surya Paolo
f6d8e1bb0b - aggiornamento con proj RISO. postcss, pwa. 2025-03-05 18:14:09 +01:00
Surya Paolo
f3597facd3 - Aggiornato i vari .ENV 2025-03-04 20:20:26 +01:00
Surya Paolo
8363d65456 - passato mongoose da versione 7 a versione 8 2025-03-03 01:07:00 +01:00
Surya Paolo
0a4cea94ae - passato mongoose da versione 6 a versione 7 2025-03-03 00:59:13 +01:00
Surya Paolo
53a70a1c96 - Aggiornato node.js alla versione 22.18.1
- Aggiornato tutti i pacchetti del server all'ultima versione.
- passato mongoose da versione 5 a versione 6
2025-03-03 00:46:08 +01:00
Surya Paolo
45d06b0923 PASSAGGIO A VITE !
AGG. 1.1.23
2025-03-01 14:17:39 +01:00
205 changed files with 29557 additions and 165886 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -8,24 +8,21 @@ appTelegram_TEST=["1","17"]
appTelegram=["1","17"] appTelegram=["1","17"]
appTelegram_DEVELOP=["17"] appTelegram_DEVELOP=["17"]
DOMAIN=mongodb://localhost:27017/ DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1 AUTH_MONGODB=0
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
ENABLE_PUSHNOTIFICATION=1 ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost URLBASE_APP1=https://localhost
PORT_APP1=8080 PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true HTTPS_LOCALHOST=true
VITE_DEBUG=0 VITE_DEBUG=0
VITE_DEBUG=0
TESTING_ON=1 TESTING_ON=1
LOCALE=1 LOCALE=1
DELAY_SENDEMAIL=2000 DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8 PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.crt PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY="" GCM_API_KEY=""
@@ -45,6 +42,5 @@ MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A MIAB_ADMIN_PASSWORD=passpao1pabox@1A
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7" DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
SERVER_A_URL="http://51.77.156.69:3000"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK" API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
SERVER_A_URL="http://51.77.156.69:3000"

View File

@@ -8,31 +8,28 @@ appTelegram_TEST=["1","13"]
appTelegram=["1","13"] appTelegram=["1","13"]
appTelegram_DEVELOP=["13"] appTelegram_DEVELOP=["13"]
DOMAIN=mongodb://localhost:27017/ DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1 AUTH_MONGODB=0
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
ENABLE_PUSHNOTIFICATION=1 ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost URLBASE_APP1=https://localhost
PORT_APP1=8080 PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true HTTPS_LOCALHOST=true
VITE_DEBUG=0 VITE_DEBUG=0
VITE_DEBUG=0
TESTING_ON=1 TESTING_ON=1
LOCALE=1 LOCALE=1
DELAY_SENDEMAIL=2000 DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8 PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.crt PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY="" GCM_API_KEY=""
PROD=0 PROD=0
PROJECT_DESCR_MAIN='__PROJECTS' PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=Askb38v23jjDFaoskBOWj92axXCQ SECRK=Askb38v23jjDFaoskBOWj92axXCQ
TOKEN_LIFE=2h TOKEN_LIFE=1m
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
FTPSERVER_HOST=139.162.166.31 FTPSERVER_HOST=139.162.166.31
FTPSERVER_PORT=21 FTPSERVER_PORT=21

View File

@@ -1,38 +1,35 @@
DATABASE=test_PiuCheBuono DATABASE=test_FreePlanet
UDB=paofreeplanet UDB=paofreeplanet
PDB=mypassword@1A PDB=mypassword@1A
SEND_EMAIL=0 SEND_EMAIL=0
SEND_EMAIL_ORDERS=1 SEND_EMAIL_ORDERS=1
PORT=3000 PORT=3000
appTelegram_TEST=["1","17"] appTelegram_TEST=["1","13"]
appTelegram=["1","17"] appTelegram=["1","13"]
appTelegram_DEVELOP=["17"] appTelegram_DEVELOP=["13"]
DOMAIN=mongodb://localhost:27017/ DOMAIN=mongodb://localhost:27017/
AUTH_MONGODB=1 AUTH_MONGODB=0
MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A
ENABLE_PUSHNOTIFICATION=1 ENABLE_PUSHNOTIFICATION=1
URLBASE_APP1=https://localhost URLBASE_APP1=https://localhost
PORT_APP1=8080 PORT_APP1=8080
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
HTTPS_LOCALHOST=true HTTPS_LOCALHOST=true
VITE_DEBUG=0 VITE_DEBUG=0
VITE_DEBUG=0
TESTING_ON=1 TESTING_ON=1
LOCALE=1 LOCALE=1
DELAY_SENDEMAIL=2000 DELAY_SENDEMAIL=2000
VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app VAPI_KEY_SUBJECT=mailto:paolo@freeplanet.app
PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8 PUBLIC_VAPI_KEY=BDncvMiUZmjaCG2Kr1V9N0_33hOG-AuNSbHSvL24y2dzBiUjAxKm02emx5SeJvz2IGmtRf6YqCgopeQwCwUmZw8
PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo PRIVATE_VAPI_KEY=uB2-jQkrbysyDtqN3ziMBDsVn0wdEaDsksX81zoOGQo
PATH_CERT_KEY=localhost.key PATH_CERT_KEY=localhost-key.pem
PATH_SERVER_CRT=localhost.crt PATH_SERVER_CRT=localhost.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem
GCM_API_KEY="" GCM_API_KEY=""
PROD=0 PROD=0
PROJECT_DESCR_MAIN='__PROJECTS' PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=Askb38v23jjDFaoskBOWj92axXCQ SECRK=Askb38v23jjDFaoskBOWj92axXCQ
TOKEN_LIFE=2h TOKEN_LIFE=1m
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
FTPSERVER_HOST=139.162.166.31 FTPSERVER_HOST=139.162.166.31
FTPSERVER_PORT=21 FTPSERVER_PORT=21
@@ -41,10 +38,4 @@ FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123 AUTH_NEW_SITES=123123123
SCRIPTS_DIR=admin_scripts SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}] 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
DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7" DS_API_KEY="sk-222e3addb3d8455d8b0516d93906eec7"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
SERVER_A_URL="http://51.77.156.69:3000"

View File

@@ -8,7 +8,9 @@ DIRECTORY_SERVER=/var/www/www.freeplanet_server
SERVERDIR_WEBSITE=/var/www/www.freeplanet_server SERVERDIR_WEBSITE=/var/www/www.freeplanet_server
PORT_APP1="0" PORT_APP1="0"
DOMAIN=mongodb://localhost:27017/ DOMAIN=mongodb://localhost:27017/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27017/
AUTH_MONGODB=1 AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
@@ -19,7 +21,7 @@ VAPI_KEY_SUBJECT="mailto:paolo@freeplanet.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs" PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0" PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8" GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem

View File

@@ -10,8 +10,11 @@ ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/nodejs_piuchebuono_server DIRECTORY_SERVER=/var/www/nodejs_piuchebuono_server
SERVERDIR_WEBSITE=/var/www/piuchebuono.app SERVERDIR_WEBSITE=/var/www/piuchebuono.app
PORT_APP1="0" PORT_APP1="0"
DOMAIN=mongodb://localhost:32001/ DOMAIN_OFF=mongodb://localhost:32001/
DOMAIN_AUTH_OLD=mongodb://{username}:{password}@127.0.0.1:32001/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27030/
AUTH_MONGODB=1 AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
@@ -31,15 +34,11 @@ TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
DOMAINS=[{"hostname":"piuchebuono.app","port":"3030"},{"hostname":"gruppomacro.app","port":"3010"}] DOMAINS=[{"hostname":"piuchebuono.app","port":"3030"},{"hostname":"gruppomacro.app","port":"3010"}]
DOMAINS_ALLOWED=[]
SCRIPTS_DIR=admin_scripts SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}] CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A MIAB_ADMIN_PASSWORD=passpao1pabox@1A
SERVER_A_URL="http://51.77.156.69:3000"
#DB_CONNECTION=sqlsrv API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"
DB_HOST_SQLSRVTEST=31.3.180.50
DB_PORT_SQLSRVTEST=14338
DB_DATABASE_SQLSRVTEST=ANAG_MACRO
DB_USERNAME_SQLSRVTEST=woo
DB_PASSWORD_SQLSRVTEST=4n4traPe@

View File

@@ -7,8 +7,11 @@ ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/nodejs_riso_server DIRECTORY_SERVER=/var/www/nodejs_riso_server
SERVERDIR_WEBSITE=/var/www/riso.app SERVERDIR_WEBSITE=/var/www/riso.app
PORT_APP1="0" PORT_APP1="0"
DOMAIN=mongodb://localhost:32015/ DOMAIN_OFF=mongodb://localhost:32015/
DOMAIN_AUTH_OLD=mongodb://{username}:{password}@127.0.0.1:32015/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:27030/
AUTH_MONGODB=1 AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin MONGODB_USER=admin
MONGODB_PWD=mypwadminREAL@1A MONGODB_PWD=mypwadminREAL@1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
@@ -28,6 +31,7 @@ TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"riso.app","port":"3006"},{"hostname":"freeplanet.app","port":"3000"}] DOMAINS=[{"hostname":"riso.app","port":"3006"},{"hostname":"freeplanet.app","port":"3000"}]
DOMAINS_ALLOWED=["comunitanuovomondo.app","kolibrilab.it","artenergetica.org","freeplanet.app","www.freeplanet.app","freeplanet.app:3000","freeplanet.app:3001","www.freeplanet.app:3000","www.freeplanet.app:3001"]
#DOMAINS=[{"hostname":"abitaregliiblei.it","port":"3021"},{"hostname":"riso.app","port":"3005"}] #DOMAINS=[{"hostname":"abitaregliiblei.it","port":"3021"},{"hostname":"riso.app","port":"3005"}]
SCRIPTS_DIR=admin_scripts SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}] CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -11,9 +11,11 @@ DIRECTORY_SERVER=/var/www/nodejs_test.piuchebuono_server
SERVERDIR_WEBSITE=var/www/test.piuchebuono.app SERVERDIR_WEBSITE=var/www/test.piuchebuono.app
PORT_APP1="0" PORT_APP1="0"
DOMAIN=mongodb://localhost:32002/ DOMAIN=mongodb://localhost:32002/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:32002/
AUTH_MONGODB=1 AUTH_MONGODB=1
AUTH_DB_PASSING=1
MONGODB_USER=admin MONGODB_USER=admin
MONGODB_PWD=mypwadmin@1A MONGODB_PWD=mypwadminS1A
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
VITE_DEBUG=0 VITE_DEBUG=0
LOCALE=0 LOCALE=0
@@ -22,7 +24,7 @@ VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc" PUBLIC_VAPI_KEY="BJgo8XR_upbnbMLWgCAUELo6DK7dRXffYAnFOxbaMMz5favBgcQBKT-eISqouO-jRad4Sw8l5nd2wCF6KorGiTc"
PRIVATE_VAPI_KEY="LVpFDJuKscdHuQr5pe20dFuYuWX1-ZRb6x72PP-Pp4I" PRIVATE_VAPI_KEY="LVpFDJuKscdHuQr5pe20dFuYuWX1-ZRb6x72PP-Pp4I"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8" GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem
@@ -33,8 +35,11 @@ TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"piuchebuono.app","port":"3031"},{"hostname":"gruppomacro.app","port":"3011"}] DOMAINS=[{"hostname":"piuchebuono.app","port":"3031"},{"hostname":"gruppomacro.app","port":"3011"}]
DOMAINS_ALLOWED=[]
SCRIPTS_DIR=admin_scripts SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}] CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org MIAB_HOST=box.lamiaposta.org
MIAB_ADMIN_EMAIL=admin@lamiaposta.org MIAB_ADMIN_EMAIL=admin@lamiaposta.org
MIAB_ADMIN_PASSWORD=passpao1pabox@1A MIAB_ADMIN_PASSWORD=passpao1pabox@1A
SERVER_A_URL="http://51.77.156.69:3000"
API_KEY_MSSQL="m68yADSr123MIVIDA@154$DSAGVOK"

View File

@@ -8,28 +8,31 @@ DIRECTORY_SERVER=/var/www/nodejs_test.riso_server
SERVERDIR_WEBSITE=/var/www/test.riso.app SERVERDIR_WEBSITE=/var/www/test.riso.app
PORT_APP1="0" PORT_APP1="0"
DOMAIN=mongodb://localhost:32012/ DOMAIN=mongodb://localhost:32012/
DOMAIN_AUTH=mongodb://{username}:{password}@127.0.0.1:32012/
AUTH_MONGODB=1 AUTH_MONGODB=1
MONGODB_USER=admin AUTH_DB_PASSING=1
MONGODB_PWD=mypwadmin@1A MONGODB_USER="admin"
MONGODB_PWD="mypwadminS1A"
SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB SIGNCODE=SU2134hncaskjdbo231oihJSDNHEI$1@AB
VITE_DEBUG=0 VITE_DEBUG=1
LOCALE=0 LOCALE=0
DELAY_SENDEMAIL=1000 DELAY_SENDEMAIL=1000
VAPI_KEY_SUBJECT="mailto:surya@riso.app" VAPI_KEY_SUBJECT="mailto:surya@riso.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs" PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0" PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8" GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem
PROD=0 PROD=0
PROJECT_DESCR_MAIN='__PROJECTS' PROJECT_DESCR_MAIN='__PROJECTS'
SECRK=iUUb38v23jjDFaosWj92axkBOXCQ SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=1m TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"riso.app","port":"3005"}] DOMAINS=[{"hostname":"riso.app","port":"3005"}]
DOMAINS_ALLOWED=["comunitanuovomondo.app","kolibrilab.it","artenergetica.org","freeplanet.app","www.freeplanet.app","freeplanet.app:3000","freeplanet.app:3001","www.freeplanet.app:3000","www.freeplanet.app:3001"]
SCRIPTS_DIR=admin_scripts SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}] CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]
MIAB_HOST=box.lamiaposta.org MIAB_HOST=box.lamiaposta.org

View File

@@ -20,7 +20,7 @@ VAPI_KEY_SUBJECT="mailto:paolo@freeplanet.app"
PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs" PUBLIC_VAPI_KEY="BGXRf1TgcqocqD6J7qnRgCG7AvM2lxAoW7peb7UEzB4SxBb6DxGRdJ0UvD9ewnrB9KrSrh0-aDCODXBm7sZ1DDs"
PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0" PRIVATE_VAPI_KEY="St9UMzcS76Q9yKG6RInAuYydYjFRliqwHTJY3A5wjO0"
GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8" GCM_API_KEY="AIzaSyD7w1jztfVV05mX1iyxoI-r1pZWxuxdUK8"
PATH_CERT_KEY=key.pem PATH_CERT_KEY=privkey.pem
PATH_SERVER_CRT=fullchain.pem PATH_SERVER_CRT=fullchain.pem
PATH_SSL_ROOT_PEM=root.pem PATH_SSL_ROOT_PEM=root.pem
PATH_SSL_CHAIN_PEM=chain.pem PATH_SSL_CHAIN_PEM=chain.pem

View File

@@ -0,0 +1,76 @@
#!/bin/bash
source ./.env.production
msg="*** SERVER DI PRODUZIONE **** SEI SICURO DI INVIARE GLI AGGIORNAMENTI SERVERSIDE (NODE JS) - SUL SERVER DI PRODUZIONE ?? $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso NODEPRODUZIONE ... $SERVERDIR_WEBSITE/"
echo ""
#!/bin/bash
# Configurazione
REMOTE_USER="suryapaolo"
REMOTE_HOST="servereng"
REMOTE_PORT="8855"
REMOTE_DIR="$SERVERDIR_WEBSITE"
SSH_OPTIONS="-p $REMOTE_PORT"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"admin_scripts"
"sass"
"src"
)
echo
echo ""
echo "*** Sincronizzazione Cartelle su $REMOTE_DIR ..."
# 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.production "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
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.js "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER PRODUZIONE! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

View File

@@ -1,6 +1,6 @@
db.myelems.insertMany([ db.myelems.insertMany([
{ {
"_id": ObjectId("669fbf9dc9d625d0628eb12f"), "_id": new ObjectId("669fbf9dc9d625d0628eb12f"),
"order": 20, "order": 20,
"active": true, "active": true,
"type": 20, "type": 20,
@@ -13,14 +13,14 @@ db.myelems.insertMany([
"__v": 0, "__v": 0,
"containerHtml": "<div style=\"text-align: center;\"><b><font size=\"4\">Abitare Gli Iblei</font></b></div>", "containerHtml": "<div style=\"text-align: center;\"><b><font size=\"4\">Abitare Gli Iblei</font></b></div>",
"anim": { "anim": {
"_id": ObjectId("66e456981e0719a1012121c0"), "_id": new ObjectId("66e456981e0719a1012121c0"),
"name": "", "name": "",
"clduration": "", "clduration": "",
"cldelay": "", "cldelay": "",
"timingtype": "ease-in-out" "timingtype": "ease-in-out"
} }
}, { }, {
"_id": ObjectId("669fbfc3c9d625d0628eb131"), "_id": new ObjectId("669fbfc3c9d625d0628eb131"),
"order": 100, "order": 100,
"active": true, "active": true,
"type": 145, "type": 145,
@@ -32,7 +32,7 @@ db.myelems.insertMany([
"list": [], "list": [],
"__v": 0 "__v": 0
}, { }, {
"_id": ObjectId("66db2a45054b3b09f85e6983"), "_id": new ObjectId("66db2a45054b3b09f85e6983"),
"order": 26, "order": 26,
"active": true, "active": true,
"type": 35, "type": 35,
@@ -45,7 +45,7 @@ db.myelems.insertMany([
"__v": 0, "__v": 0,
"image": "logo.jpg", "image": "logo.jpg",
"anim": { "anim": {
"_id": ObjectId("66db34215740efc77547a93a"), "_id": new ObjectId("66db34215740efc77547a93a"),
"name": "", "name": "",
"clduration": "", "clduration": "",
"cldelay": "", "cldelay": "",
@@ -55,7 +55,7 @@ db.myelems.insertMany([
"align": 2 "align": 2
} }
, { , {
"_id": ObjectId("66db38a77e24f4509eef655b"), "_id": new ObjectId("66db38a77e24f4509eef655b"),
"order": 26, "order": 26,
"active": true, "active": true,
"type": 20, "type": 20,
@@ -68,7 +68,7 @@ db.myelems.insertMany([
"__v": 0, "__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.&nbsp;</p>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <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 nellambito delle proprie iniziative (profit e non profit) individuali o collettive.</p>\n\n\n&nbsp; &nbsp; <p>Larea 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&nbsp; &nbsp; <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&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <ul>\n&nbsp; &nbsp; &nbsp; &nbsp; <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 laffidabilità (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&nbsp; &nbsp; &nbsp; &nbsp; <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&nbsp; &nbsp; &nbsp; &nbsp; <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&nbsp; &nbsp; &nbsp; &nbsp; <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 dacqua e spiagge, presenza di inquinamento nellaria, … <strong>Accesso riservato</strong></li>\n&nbsp; &nbsp; </ul>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <p>Se vuoi aderire alla rete puoi richiederne la registrazione utilizzando questo Link <a href=\"#\"><strong>(Pagina in Costruzione)</strong></a>.</p>\n\n", "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.&nbsp;</p>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <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 nellambito delle proprie iniziative (profit e non profit) individuali o collettive.</p>\n\n\n&nbsp; &nbsp; <p>Larea 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&nbsp; &nbsp; <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&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <ul>\n&nbsp; &nbsp; &nbsp; &nbsp; <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 laffidabilità (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&nbsp; &nbsp; &nbsp; &nbsp; <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&nbsp; &nbsp; &nbsp; &nbsp; <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&nbsp; &nbsp; &nbsp; &nbsp; <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 dacqua e spiagge, presenza di inquinamento nellaria, … <strong>Accesso riservato</strong></li>\n&nbsp; &nbsp; </ul>\n&nbsp; &nbsp;&nbsp;\n&nbsp; &nbsp; <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": { "anim": {
"_id": ObjectId("66db393e3b885ccdfaed28d6"), "_id": new ObjectId("66db393e3b885ccdfaed28d6"),
"name": "", "name": "",
"clduration": "", "clduration": "",
"cldelay": "", "cldelay": "",
@@ -76,7 +76,7 @@ db.myelems.insertMany([
} }
} }
, { , {
"_id": ObjectId("66e41cff78c8d880eebfbf1c"), "_id": new ObjectId("66e41cff78c8d880eebfbf1c"),
"order": 32.5, "order": 32.5,
"active": true, "active": true,
"type": 20, "type": 20,
@@ -89,7 +89,7 @@ db.myelems.insertMany([
"__v": 0, "__v": 0,
"containerHtml": "ORAAAA", "containerHtml": "ORAAAA",
"anim": { "anim": {
"_id": ObjectId("66e459421e0719a1012123ad"), "_id": new ObjectId("66e459421e0719a1012123ad"),
"name": "", "name": "",
"clduration": "", "clduration": "",
"cldelay": "", "cldelay": "",
@@ -98,7 +98,7 @@ db.myelems.insertMany([
} }
, ,
{ {
"_id": ObjectId("66e4270d78c8d880eebfbf24"), "_id": new ObjectId("66e4270d78c8d880eebfbf24"),
"order": 40, "order": 40,
"active": true, "active": true,
"type": 20, "type": 20,
@@ -111,14 +111,14 @@ db.myelems.insertMany([
"__v": 0, "__v": 0,
"containerHtml": "BBB", "containerHtml": "BBB",
"anim": { "anim": {
"_id": ObjectId("66e4568d1e0719a1012121a6"), "_id": new ObjectId("66e4568d1e0719a1012121a6"),
"name": "", "name": "",
"clduration": "", "clduration": "",
"cldelay": "", "cldelay": "",
"timingtype": "ease-in-out" "timingtype": "ease-in-out"
} }
}, { }, {
"_id": ObjectId("66e45b0c78c8d880eebfbf45"), "_id": new ObjectId("66e45b0c78c8d880eebfbf45"),
"order": 70, "order": 70,
"active": true, "active": true,
"type": 20, "type": 20,
@@ -136,7 +136,7 @@ db.myelems.insertMany([
db.sites.insert( db.sites.insert(
/* 1 */ /* 1 */
{ {
"_id": ObjectId("669fbef7fc704b8912263af9"), "_id": new ObjectId("669fbef7fc704b8912263af9"),
"confpages": { "confpages": {
"font": "", "font": "",
"col_toolbar": "", "col_toolbar": "",
@@ -235,7 +235,7 @@ db.sites.insert(
db.users.insert( db.users.insert(
{ {
"_id": ObjectId("669fbef7c9d625d0628eb12d"), "_id": new ObjectId("669fbef7c9d625d0628eb12d"),
"profile": { "profile": {
"paymenttypes": [], "paymenttypes": [],
"notif_idCities": [], "notif_idCities": [],
@@ -343,7 +343,7 @@ db.users.insert(
"tokens": [ "tokens": [
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
"_id": ObjectId("66e6fcf1ac95a84fd0e11b2c"), "_id": new ObjectId("66e6fcf1ac95a84fd0e11b2c"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
@@ -351,7 +351,7 @@ db.users.insert(
}, },
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
"_id": ObjectId("66e73f04ac95a84fd0e122ae"), "_id": new ObjectId("66e73f04ac95a84fd0e122ae"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",

View File

@@ -14,7 +14,7 @@ db.mygroups.insert(
"photos": [], "photos": [],
"admins": [ "admins": [
{ {
"_id": ObjectId("66e2e6276b502b07f1e89571"), "_id": new ObjectId("66e2e6276b502b07f1e89571"),
"username": "paoloar77" "username": "paoloar77"
} }
], ],

View File

@@ -1,6 +1,6 @@
db.mypages.insertMany([ db.mypages.insertMany([
{ {
"_id": ObjectId("66db21118009ea4503bb6a01"), "_id": new ObjectId("66db21118009ea4503bb6a01"),
"order": 10, "order": 10,
"idapp": "19", "idapp": "19",
"path": "home", "path": "home",
@@ -8,7 +8,7 @@ db.mypages.insertMany([
"title": "Home", "title": "Home",
}, },
{ {
"_id": ObjectId("66db21118009ea4503bb6a03"), "_id": new ObjectId("66db21118009ea4503bb6a03"),
"order": 10, "order": 10,
"idapp": "19", "idapp": "19",
"path": "home_logout", "path": "home_logout",
@@ -16,7 +16,7 @@ db.mypages.insertMany([
"title": "Home NoLoggato", "title": "Home NoLoggato",
}, },
{ {
"_id": ObjectId("66e322dd5a6360e3b3c71c5a"), "_id": new ObjectId("66e322dd5a6360e3b3c71c5a"),
"order": 40, "order": 40,
"idapp": "19", "idapp": "19",
"path": "presentazione", "path": "presentazione",

View File

@@ -1,6 +1,6 @@
db.users.insertMany([ db.users.insertMany([
{ {
"_id": ObjectId("66db21115281b23462d496d2"), "_id": new ObjectId("66db21115281b23462d496d2"),
"profile": { "profile": {
"paymenttypes": [], "paymenttypes": [],
"notif_idCities": [], "notif_idCities": [],
@@ -66,7 +66,7 @@ db.users.insertMany([
"tokens": [ "tokens": [
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3Mjc3MjI0NjV9.EOvF89kswT1eqVJCSwVMMI-jB4kokP-aQVhi7xSUods", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3Mjc3MjI0NjV9.EOvF89kswT1eqVJCSwVMMI-jB4kokP-aQVhi7xSUods",
"_id": ObjectId("66e87ee1bbe2ce0f77adf6b8"), "_id": new ObjectId("66e87ee1bbe2ce0f77adf6b8"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZkYjIxMTE1MjgxYjIzNDYyZDQ5NmQyIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG9hcjc3IiwiaWF0IjoxNzI2NTEyODY1LCJleHAiOjE3MjY1MjAwNjV9.ESvyTWmXhfAQ0i-wwjxZR1A1Y5Bwixb60uG_UcOPQ5Y",
@@ -90,7 +90,7 @@ db.users.insertMany([
"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" "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"), "_id": new ObjectId("66e49515d18d313a144ead56"),
"profile": { "profile": {
"paymenttypes": [], "paymenttypes": [],
"notif_idCities": [], "notif_idCities": [],
@@ -187,7 +187,7 @@ db.users.insertMany([
"tokens": [ "tokens": [
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3Mjc1NTY5MTV9.NHnFUXOL0MbjRs9F6HrQsEBRGXG89AsBYP7jU9m8icY", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3Mjc1NTY5MTV9.NHnFUXOL0MbjRs9F6HrQsEBRGXG89AsBYP7jU9m8icY",
"_id": ObjectId("66e5f83392c9540e18f89730"), "_id": new ObjectId("66e5f83392c9540e18f89730"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNDk1MTVkMThkMzEzYTE0NGVhZDU2IiwiYWNjZXNzIjoiYXV0aCIsInVuIjoicGFvbG90ZXN0IiwiaWF0IjoxNzI2MzQ3MzE1LCJleHAiOjE3MjYzNTQ1MTV9.HTr1kNMhBU_38R2Tfy6m22XCbiRh5IsBKC3fl0ipIgM",
@@ -207,7 +207,7 @@ db.users.insertMany([
"perm": 16 "perm": 16
}, },
{ {
"_id": ObjectId("66e6fb5aac95a84fd0e11881"), "_id": new ObjectId("66e6fb5aac95a84fd0e11881"),
"profile": { "profile": {
"paymenttypes": [], "paymenttypes": [],
"notif_idCities": [], "notif_idCities": [],
@@ -304,7 +304,7 @@ db.users.insertMany([
"tokens": [ "tokens": [
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI3NjIzNjY1fQ.6QaBaiE1pv7mDy7S8YUReqH8m0CCK7jTmd57eGHgnzE",
"_id": ObjectId("66e6fcf1ac95a84fd0e11b2c"), "_id": new ObjectId("66e6fcf1ac95a84fd0e11b2c"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQxNDA2NSwiZXhwIjoxNzI2NDIxMjY1fQ.wCZcQ5uSQXnVgS_ZGyzjl6TOQk8rflfe2HSxSku0Aj4",
@@ -312,7 +312,7 @@ db.users.insertMany([
}, },
{ {
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI3NjQwNTgwfQ.YdB5unWwaZ21kk87RRPolLGiWxf7bKX0piKd-bGQifU",
"_id": ObjectId("66e73f04ac95a84fd0e122ae"), "_id": new ObjectId("66e73f04ac95a84fd0e122ae"),
"access": "auth", "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", "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", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJQUk9WQU1TR0AxQSIsInNtYXJ0IjoiNjZlNmZiNWFhYzk1YTg0ZmQwZTExODgxIiwiYWNjZXNzIjoiYXV0aCIsInVuIjoiRW56byIsImlhdCI6MTcyNjQzMDk4MCwiZXhwIjoxNzI2NDM4MTgwfQ.TMF1UNbgw-EpGVWWDNnY3wRdLYOyp5HzAQiakpyaL_4",

View File

@@ -80,7 +80,8 @@ p {
/* Whitespace (imageless spacer) */ /* Whitespace (imageless spacer) */
.whitespace { .whitespace {
line-height: 0; } line-height: 0;
}
.firma { .firma {
font-size: 0.75rem; } font-size: 0.75rem; }

View File

@@ -1,64 +0,0 @@
#!/bin/bash
source ./.env.prod.pcb
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
#!/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

View File

@@ -1,64 +0,0 @@
#!/bin/bash
source ./.env.test.pcb
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
echo ""
#!/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

82
deploynode_pcb_prod.sh Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/bash
source ./.env.prod.pcb
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI PRODUZIONE PCB **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.pcb_prod.js"
ENV_FILE=".env.prod.pcb"
ENV_OUT=".env.production"
# 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_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 $CONFIG_JS in 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 PCB PRODUZIONE! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

82
deploynode_pcb_test.sh Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/bash
source ./.env.test.pcb
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI TEST PCB **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso PCB TEST ... $DIRECTORY_SERVER/"
echo ""
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.pcb_test.js"
ENV_FILE=".env.test.pcb"
ENV_OUT=".env.test"
# 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_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 $CONFIG_JS in 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 PCB TEST! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
fi

77
deploynode_riso_prod.sh Executable file
View File

@@ -0,0 +1,77 @@
#!/bin/bash
source ./.env.prod.riso
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI ### PRODUZIONE ### RISO **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.riso_prod.js"
ENV_FILE=".env.prod.riso"
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
fi

86
deploynode_riso_test.sh Executable file
View File

@@ -0,0 +1,86 @@
#!/bin/bash
source ./.env.test.risosrv
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
msg="*** SERVER DI ### TEST ### RISO **** INVIARE GLI AGGIORNAMENTI ? (Y/N)"
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.riso_test.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"
echo ""
echo "*** Copia del file $CONFIG_JS in 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
fi

View File

@@ -1,70 +0,0 @@
#!/bin/bash
source ./.env.prod.riso
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.prod_riso.js"
ENV_FILE=".env.prod.riso"
ENV_OUT=".env.production"
#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

View File

@@ -1,34 +0,0 @@
#!/bin/bash
source ./.env.test2
echo "Directory attuale: $PWD"
msg="*** SERVER DI TEST2 **** SEI SICURO DI INVIARE GLI AGGIORNAMENTI SERVERSIDE (NODE JS) - SUL SERVER $SERVERDIR_WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
echo "Sincronizzazione in corso... $SERVERDIR_WEBSITE"
echo "Copiando .env.test2..."
rsync -avz -e 'ssh -p 8855' .env.test2 suryapaolo@servereng:$SERVERDIR_WEBSITE/.env.test
echo "Sincronizzazione in corso... src"
rsync -avz -e 'ssh -p 8855' -a --exclude 'src/router/upload' src suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' package.json suryapaolo@servereng:$SERVERDIR_WEBSITE/package.json
rsync -avz -e 'ssh -p 8855' css suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' docs suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' emails suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' images suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' plugins suryapaolo@servereng:$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8855' sass suryapaolo@servereng:$SERVERDIR_WEBSITE/
echo "Sincronizzazione TERMINATA! - SERVER TEST2!"
fi

View File

@@ -1,70 +0,0 @@
#!/bin/bash
source ./.env.test.risosrv
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

38
docs/aaa.json Normal file
View File

@@ -0,0 +1,38 @@
{
"id": "70606",
"title": "Grande Libro dell'Autosufficienza - 50 anni - Nuovo",
"description": "<em><strong>\"Il Grande Libro dell\u2019Autosufficienza\"<\/strong><\/em> di John Seymour \u00e8 un manuale completo che celebra 50 anni di pratiche di <strong>autosufficienza<\/strong> e <strong>sostenibilit\u00e0<\/strong>. Il libro offre insegnamenti pratici su come creare e gestire un <strong>orto biologico<\/strong>, raccogliere e conservare i raccolti, produrre <strong>energia rinnovabile<\/strong>, allevare animali e ridurre i rifiuti. Seymour ci guida passo passo in un viaggio verso una vita in armonia con la natura, promuovendo l\u2019indipendenza e la sostenibilit\u00e0. Un testo imprescindibile per chi desidera riscoprire le tradizioni agricole e applicarle per vivere in modo pi\u00f9 <strong>sostenibile<\/strong> e <strong>autonomo<\/strong>.\r\n<h2><strong>Con questo libro scoprirai<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Come <strong>coltivare un orto biologico<\/strong> e ottenere cibo sano.<\/li>\r\n \t<li>Le tecniche per <strong>conservare il raccolto<\/strong> e ottimizzare le risorse naturali.<\/li>\r\n \t<li>Come allevare animali per ottenere cibo e altri prodotti.<\/li>\r\n \t<li>Come produrre <strong>energia rinnovabile<\/strong> e ridurre l\u2019impatto ambientale.<\/li>\r\n \t<li>L\u2019arte di <strong>ridurre e riciclare<\/strong> rifiuti, promuovendo uno stile di vita pi\u00f9 sostenibile.<\/li>\r\n<\/ul>\r\n<h2><strong>Domande cruciali a cui <em>\"Il Grande Libro dell\u2019Autosufficienza\"<\/em> risponde<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Come posso vivere in modo <strong>autosufficiente<\/strong> e ridurre la mia dipendenza dalle risorse esterne?<\/li>\r\n \t<li>Quali sono le migliori tecniche per <strong>coltivare un orto biologico<\/strong> e garantire un raccolto abbondante?<\/li>\r\n \t<li>Come posso <strong>conservare il raccolto<\/strong> in modo naturale e duraturo?<\/li>\r\n \t<li>In che modo posso <strong>produrre energia rinnovabile<\/strong> a casa mia?<\/li>\r\n \t<li>Come posso vivere in <strong>armonia con la natura<\/strong> e promuovere la <strong>sostenibilit\u00e0<\/strong>?<\/li>\r\n<\/ul>\r\n<h2><strong>Questo libro \u00e8 dedicato a<\/strong>:<\/h2>\r\n<ul>\r\n \t<li>Lettori appassionati di <strong>giardinaggio<\/strong>, <strong>agricoltura biologica<\/strong> e vita rurale.<\/li>\r\n \t<li>Chiunque desideri adottare uno <strong>stile di vita sostenibile<\/strong> e autosufficiente.<\/li>\r\n \t<li><strong>Famiglie eco-consapevoli<\/strong> che vogliono ridurre il proprio impatto ambientale.<\/li>\r\n \t<li><strong>Amanti della natura<\/strong> e sostenitori delle <strong>energie rinnovabili<\/strong>.<\/li>\r\n<\/ul>\r\n<h2><strong>Contenuti chiave <em>\"Il Grande Libro dell\u2019Autosufficienza\"<\/em><\/strong>:<\/h2>\r\n<em>Il Grande Libro dell\u2019Autosufficienza<\/em> offre una panoramica completa di tutte le tecniche per vivere in modo <strong>autonomo<\/strong> e <strong>sostenibile<\/strong>. Attraverso 10 capitoli, il libro esplora vari aspetti dell\u2019autosufficienza, dalla coltivazione di ortaggi e frutti alla produzione di cibo dagli animali, fino alla gestione dell'energia e dei rifiuti. La guida si focalizza sul valore delle <strong>tradizioni agricole<\/strong>, sulla cura dell\u2019ambiente e sul benessere che deriva dal vivere in sintonia con la natura.\r\n\r\n&nbsp;",
"link": "https:\/\/www.fioredellavita.it\/grande-libro-dellautosufficienza-50-anni\/?attribute_pa_versione=nuovo",
"image_link": "https:\/\/www.fioredellavita.it\/wp-content\/uploads\/2024\/09\/il-grande-libro-dell-autosufficienza-speciale-50-anni-copertina-web.jpg",
"price": "39,00",
"sale_price": "37,05",
"categories": "Informazione Libera",
"isbn": "",
"Autore": "John,Seymour",
"Editore": "Macro Edizioni",
"Tipologia": "Libri",
"Collezione": "Libri Informazione Libera,Informazione Libera",
"Quantita": "1821",
"Lunghezza": "",
"Stato": "publish",
"Pagine": "",
"Edizione": "",
"Traduzione": "",
"Versione": "Nuovo",
"StockStatus": "instock",
"downloadable": "no",
"img1": "https:\/\/www.fioredellavita.it\/wp-content\/uploads\/2024\/09\/quarta_nuovo_grande_libro_dell_autosufficienza_2024_17038.jpg",
"img2": "",
"img3": "",
"formato": "Cartonato",
"preOrderDate": "2025-02-25",
"short_descr": null,
"availability": "in stock",
"checkout_link": "https:\/\/www.fioredellavita.it\/carrello\/?productId=70606",
"seo_descr": "Versione: Nuovo",
"preord": "no",
"addtocart_link": "https:\/\/www.fioredellavita.it\/grande-libro-dellautosufficienza-50-anni\/?attribute_pa_versione=nuovo&variation_id=70606&add-to-cart=70606",
"eta": "",
"misure": "cm 22x28",
"sku": "22464"
},

View File

@@ -1,839 +0,0 @@
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.VITE_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.VITE_DEBUG) {
mycron();
// }
});
// Cron every X minutes
cron.schedule('*/60 * * * *', async () => {
if (!process.env.VITE_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,
shared_consts.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 };

View File

@@ -1 +1,12 @@
<div class="row align-start" style="gap:0px;flex-direction:column;flex:1;display:flex;justify-content:space-between;"><!-- Parte superiore --><div class="justify-start" style="flex-grow:0"><span style="font-size:calc(12 * var(--scalecatalog) * 1px)" class="book-author">{autore}</span><div style="font-size:calc(16 * var(--scalecatalog) * 1px);font-weight:bold;" class="book-title">{titolo}</div><span class="book-descr">{descrizione}</span></div><!-- Parte inferiore (book-details e barcode) --><div style="margin-top:auto;width:100%"><div class="justify-end book-details" style="flex-grow:0;font-size:calc(10 * var(--scalecatalog) * 1px);">Pagine: <b>{pagine}</b><br />Formato: <b>{misure}</b><br />Prezzo: <b>{prezzo} €</b><br /></div></div></div> <div class="row align-start" style="gap:0px;flex-direction:column;flex:1;display:flex;justify-content:space-between;">
<!-- Parte superiore -->
<div class="justify-start" style="flex-grow:0"><span style="font-size:calc(12 * var(--scalecatalogx) * 1px)"
class="book-author">{autore}</span>
<div style="font-size:calc(16 * var(--scalecatalogx) * 1px);font-weight:bold;" class="book-title">{titolo}</div>
<span class="book-descr">{descrizione}</span>
</div><!-- Parte inferiore (book-details e barcode) -->
<div style="margin-top:auto;width:100%">
<div class="justify-end book-details" style="flex-grow:0;font-size:calc(10 * var(--scalecatalog) * 1px);">
Pagine: <b>{pagine}</b><br />Formato: <b>{misure}</b><br />Prezzo: <b>{prezzo} €</b><br /></div>
</div>
</div>

View File

@@ -4,7 +4,6 @@ module.exports = {
name: "FreePlanetServerSide", name: "FreePlanetServerSide",
script: "./src/server/server.js", script: "./src/server/server.js",
ignore_watch : ["node_modules"], ignore_watch : ["node_modules"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node",
watch: false, watch: false,
//autorestart: true, //autorestart: true,
instances: 1, instances: 1,

View File

@@ -1,11 +1,11 @@
module.exports = { module.exports = {
apps: [ apps: [
{ {
name: "PRODUZIONE PiuCheBuono_ServerSide", name: "PiuCheBuono (Prod)",
script: "/var/www/nodejs_piuchebuono_server/src/server/server.js", script: "/var/www/nodejs_piuchebuono_server/src/server/server.js",
ignore_watch: ["node_modules", "logs"], ignore_watch: ["node_modules", "logs"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node", interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
//autorestart: true, //autorestart: true,
instances: 1, instances: 1,
watch: false, watch: false,
env: { env: {

View File

@@ -1,11 +1,10 @@
module.exports = { module.exports = {
apps: [ apps: [
{ {
name: "TEST PiuCheBuono_ServerSide", name: "PiuCheBuono (TEST)",
script: "/var/www/nodejs_test.piuchebuono_server/src/server/server.js", script: "/var/www/nodejs_test.piuchebuono_server/src/server/server.js",
ignore_watch: ["node_modules", "logs"], ignore_watch: ["node_modules", "logs"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node", interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
//autorestart: true,
instances: 1, instances: 1,
watch: false, watch: false,
env: { env: {

View File

@@ -1,10 +1,10 @@
module.exports = { module.exports = {
apps: [ apps: [
{ {
name: "PRODUZIONE RISO - FREEPLANET", name: "RISO (Prod)",
script: "/var/www/nodejs_riso_server/src/server/server.js", script: "/var/www/nodejs_riso_server/src/server/server.js",
ignore_watch: ["node_modules", "logs"], ignore_watch: ["node_modules", "logs"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node", interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
//autorestart: true, //autorestart: true,
instances: 1, instances: 1,
watch: false, watch: false,

View File

@@ -1,12 +1,11 @@
module.exports = { module.exports = {
apps: [ apps: [
{ {
name: "TESTRISO2 FreePlanetServerSide", name: "RISO (TEST)",
script: "./src/server/server.js", script: "./src/server/server.js",
ignore_watch: ["node_modules", "logs"], ignore_watch: ["node_modules", "logs"],
interpreter: "/root/.nvm/versions/node/v16.19.0/bin/node", interpreter: "/root/.nvm/versions/node/v22.13.1/bin/node",
watch: false, watch: false,
//autorestart: true,
instances: 1, instances: 1,
env_test: { env_test: {
"PORT": 3001, "PORT": 3001,

BIN
emails/.DS_Store vendored

Binary file not shown.

View File

@@ -55,8 +55,7 @@ html
tr tr
td(class="whitespace", height="10") td
p &nbsp;
- var totalPrice = orders.totalPrice - var totalPrice = orders.totalPrice
- var note = orders.note - var note = orders.note
@@ -64,6 +63,7 @@ html
each rec in orders.items each rec in orders.items
- var descr = rec.order.product.productInfo.name - var descr = rec.order.product.productInfo.name
- var code = rec.order.product.productInfo.code
- var img = dirimg + rec.order.product.productInfo.imagefile - var img = dirimg + rec.order.product.productInfo.imagefile
- var price = rec.order.price - var price = rec.order.price
- var after_price = rec.order.after_price - var after_price = rec.order.after_price
@@ -104,6 +104,9 @@ html
tr tr
td(class="sectionContentTitle boldhigh", valign="top") td(class="sectionContentTitle boldhigh", valign="top")
p #{descr} p #{descr}
tr
td(class="sectionContent", valign="top")
p Codice: #{code}
tr tr
td(class="sectionContent", valign="top") td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price} p Prezzo: #{price} € #{after_price}

View File

@@ -52,7 +52,7 @@ html
if (miordconfirmed) if (miordconfirmed)
p!= miordconfirmed p!= miordconfirmed
else else
p Puoi pertanto venire a ritirarli direttamente in sede, negli orari che ti sono stati indicati. p Puoi venire a ritirarli direttamente in sede, negli orari che ti sono stati indicati.
p &nbsp; p &nbsp;
@@ -62,6 +62,7 @@ html
each rec in orders.items each rec in orders.items
- var descr = rec.order.product.productInfo.name - var descr = rec.order.product.productInfo.name
- var code = rec.order.product.productInfo.code
- var img = dirimg + rec.order.product.productInfo.imagefile - var img = dirimg + rec.order.product.productInfo.imagefile
- var price = rec.order.product.price - var price = rec.order.product.price
- var after_price = rec.order.product.after_price - var after_price = rec.order.product.after_price
@@ -101,6 +102,9 @@ html
tr tr
td(class="sectionContentTitle boldhigh", valign="top") td(class="sectionContentTitle boldhigh", valign="top")
p #{descr} p #{descr}
tr
td(class="sectionContent", valign="top")
p Codice: #{code}
tr tr
td(class="sectionContent", valign="top") td(class="sectionContent", valign="top")
p Prezzo: #{price} € #{after_price} p Prezzo: #{price} € #{after_price}

View File

@@ -18,232 +18,267 @@
- var baseimg = baseurl + '/' - var baseimg = baseurl + '/'
doctype html doctype html
html html
- if (dataemail.title) head
head meta(charset="utf-8")
title dataemail.subject meta(name="viewport", content="width=device-width, initial-scale=1")
title= dataemail.title || "Email"
style.
/* embedded CSS */
body { margin:0; padding:0; background:#E9F2F9; font-family:Tahoma, Geneva, sans-serif; color:#5b656e; }
a { color:#09c; text-decoration:none; }
table, td { border-collapse:collapse; }
h1,h2,h3,p { margin:0; padding:0; }
//- import css/scss stylesheets .logoContainer { text-align:center; padding:20px 0; }
//- these file names will be replace by gulp with proper css file paths .logoContainer img { max-width:200px; }
link(rel="stylesheet", href="../sass/basic.scss")
link(rel="stylesheet", href="../sass/one/styles.scss")
//- embdedded css allowed, but not sass .testomail { padding:10px; font-size:0.75rem; line-height:1.4; }
style.
.red {
background-color: #E84C50;
}
.full-width { .clpromo {
width: 100%; background-color:orange;
} text-align:center;
font-size:1rem;
padding:10px;
color:#fff;
font-weight:bold;
}
.emailContainer {
background:#fff;
border-radius:10px;
padding:20px;
margin:20px auto;
}
.sectionArticleImage img {
max-width:150px;
border:1px solid #ccc;
display:block;
margin-bottom:10px;
}
.teacher {
font-style:italic;
font-size:0.75rem;
color:#555;
}
.contrib {
font-size:0.75rem;
font-weight:bold;
color:#333;
}
.button a {
display:inline-block;
padding:10px 20px;
background:#f75666;
color:#fff !important;
text-decoration:none;
border-radius:10px;
font-size:13px;
}
.button2 a {
display:block;
padding:12px 20px;
background:#0000ff;
color:#fff !important;
text-decoration:none;
border-radius:10px;
font-size:1.15rem;
}
.center_img img {
display:block;
margin:0 auto;
}
.discContainer {
background:#fff;
border-radius:10px;
padding:20px;
margin:20px auto;
}
.LinkDisc a {
text-decoration:none;
}
.pDisc:hover {
background:#5c8ef4 !important;
color:#fff !important;
}
.pDisc {
padding:5px 10px;
border-radius:10px;
display:inline-block;
}
.socialMedia {
background:#8bafcb;
text-align:center;
padding:10px 0;
}
.socialMedia img {
width:29px;
height:auto;
border:0;
}
.firma-container {
background:#ffffff;
padding:15px;
text-align:center;
border-top:1px solid #e0e0e0;
font-size:0.85rem;
color:#313a42;
}
.disclaimer-container {
background:#f9f9f9;
padding:15px;
text-align:center;
font-size:0.75rem;
color:#666;
border-top:1px solid #eee;
border-bottom:1px solid #eee;
}
.bottom-container {
background:#e9f2f9;
padding:15px;
text-align:center;
font-size:0.7rem;
color:#999;
}
.whitespace {
}
@media only screen and (max-width:480px) {
.button a, .button2 a {
font-size:1rem !important;
width:100%;
}
.sectionArticleImage,
.column {
width:100% !important;
display:block !important;
}
}
body(yahoofix) body(yahoofix)
span(id='body_style', style='display:block') span#body_style(style='display:block')
table(class="topHeader", cellpadding="0", cellspacing="0", width="100%") // Header
- if (dataemail.height_logo) table(width="100%", cellpadding="0", cellspacing="0", align="center")
tr
td
table(cellpadding="0", cellspacing="0", align="center", summary="")
tr
td.logoContainer
a(href=baseurl, title='logo')
img.logo(src=baseurl+"/images/logo.png", height=dataemail.height_logo)
tr tr
td.testomail td.logoContainer
p!= dataemail.templ.testoheadermail_out a(href=baseurl)
img.logo(src=baseurl+"/public/images/logo.png", alt="Logo")
- if (dataemail.templ.options.includes('SHOW_PROMO')) if dataemail.templ.testoheadermail_out
tr
td.testomail
p!= dataemail.templ.testoheadermail_out
if dataemail.templ.options.includes('SHOW_PROMO')
tr tr
td.clpromo td.clpromo
p!= dataemail.textpromo p!= dataemail.textpromo
- if (dataemail.templ.content) // Main Content
table(cellpadding="0", cellspacing="0", width="95%", align="center") if dataemail.templ.content
tr
td.emailContainer
p!=dataemail.templ.content
if dataemail.templ.img
img(src=baseimg + dataemail.templ.img, class="center_img")
if dataemail.templ.content2
p!=dataemail.templ.content2
if dataemail.templ.img2
img(src=baseimg + dataemail.templ.img2, class="center_img")
// Events
if dataemail.templ.options.includes('SHOW_EVENTS')
each event in arrevents
tr tr
td(class="textIniContainer", valign="top") td.emailContainer
p!=dataemail.templ.content table(width="100%", cellpadding="0", cellspacing="0")
- if (dataemail.templ.img)
img(src=baseimg + dataemail.templ.img, alt="", class="myimg")
- if (dataemail.templ.content2)
p!=dataemail.templ.content2
- if (dataemail.templ.img2)
img(src=baseimg + dataemail.templ.img2, alt="", class="myimg")
table(cellpadding="0", cellspacing="0", width="640", align="center")
- if (dataemail.templ.options.includes('SHOW_EVENTS'))
tr
td(class="whitespace", height="10")
p &nbsp;
tr
td(class="emailContainer", valign="top")
each event in arrevents
- var urlevent = baseurl + '/event/' + event.typol + '?eventid=' + event._id
- var imgev = event.img_small
- var mydate = prettyDate(event.dateTimeStart)
unless (imgev)
- imgev = event.img
- var teacher1 = ''
- var teacher2 = ''
- var teacher3 = ''
- var teacher4 = ''
- var contrib = ''
- var myclteach = 'q-chip'
- if (event.op1[0] && event.op1[0].username !== 'nessuno')
- teacher1 = event.op1[0].name + ' ' + event.op1[0].surname
- if ((event.op2[0] && event.op2[0].username !== 'nessuno'))
- teacher2 = event.op2[0].name + ' ' + event.op2[0].surname
- myclteach = 'q-chip2'
- if (event.op3[0] && event.op3[0].username !== 'nessuno')
- teacher3 = "<br>" . event.op3[0].name + ' ' + event.op3[0].surname
- if (event.op4[0] && event.op4[0].username !== 'nessuno')
- teacher4 = "<br>" . event.op4[0].name + ' ' + event.op4[0].surname
- if (event.contrib[0])
- contrib = event.contrib[0].label
- if (event.contrib[0].showprice)
- contrib += ' ' + event.price + ' €'
table(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center")
tr tr
td(class="column sectionArticleImage", valign="top") td.column.sectionArticleImage(width="150")
table(cellpadding="0", cellspacing="0", summary="", border="0") if event.news
- if (event.news) p.q-chip.bg-red.text-white Novità
tr img(src=baseimg + (event.img_small || event.img), alt=event.title)
td p.teacher= event.op1[0].name + ' ' + event.op1[0].surname
p(class="q-chip row inline no-wrap items-center cltexth5 chipnews shadow-5 glossy text-right bg-red text-white") Novità td.column
h2.sectionContentTitle= event.title
p.sectionContentSubTitle= prettyDate(event.dateTimeStart)
p.sectionContent!= event.details
if event.contrib.length
p.contrib= event.contrib[0].label + (event.contrib[0].showprice ? ' ' + event.price + ' €' : '')
table.buttonContainer
tr tr
td td.button
img(src=baseimg + imgev, alt="", width="150") a(href=baseurl + '/event/' + event.typol + '?eventid=' + event._id, target="_blank") Apri l'Evento
p(class="teacher") #{teacher1} <br> #{teacher2} #{teacher3} #{teacher4}
td(class="column", valign="top")
table(cellpadding="0", cellspacing="0", summary="", border="0") tr
tr td.center_img
td(class="sectionContentTitle boldhigh", valign="top") a.button2(href=urlcal, target="_blank") Calendario Eventi
p #{event.title}
tr
td(class="sectionContentSubTitle", valign="top")
p(class="q-chip row inline no-wrap items-center cltexth5 chipnews shadow-5 glossy text-right bg-blue text-white") #{mydate}
tr
td(class="sectionContent", valign="top")
p!= event.details
p.contrib= contrib
tr
td(class="buttonContainer")
table(width="50%", cellpadding="0", cellspacing="0", summary="", border="0")
tr
td(class="button hoverLink")
a(href=urlevent, title='Evento', target='_blank') Apri l'Evento
// Disciplines
if dataemail.templ.options.includes('SHOW_DISC')
tr
td.center
h2.cltitle_disc= dataemail.disc_title
each disc in dataemail.arrdiscipline
tr tr
table(cellpadding="0", cellspacing="0", summary="", border="0", align="center", class="") td.discContainer
tr table(width="100%", cellpadding="0", cellspacing="0")
td(class="whitespace", height="10")
p &nbsp;
tr
td.center_img(class="button2 hoverLink")
a(href=urlcal, title='Calendario Eventi', target='_blank') Calendario Eventi
tr
td(class="whitespace", height="10")
p &nbsp;
- if (dataemail.templ.options.includes('SHOW_DISC'))
tr
td(class="whitespace bg-white", height="20")
p(class="bg-white") &nbsp;
tr
td(class="center")
p(class="cltitle_disc") #{dataemail.disc_title}
tr
td(class="discContainer", valign="top")
each disc in dataemail.arrdiscipline
- var urldisc = baseurl + disc.linkpage
- var imgdisc = disc.img_small
unless (imgdisc)
- imgdisc = disc.img
table(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center")
tr tr
td(class="column sectionArticleImage", valign="top") td.column.sectionArticleImage(width="150")
table(cellpadding="0", cellspacing="0", summary="", border="0") img(src=baseimg + (disc.img_small || disc.img), alt=disc.label)
tr td.column
td p.LinkDisc
img(src=baseimg + imgdisc, alt="", width="150") a(href=baseurl + disc.linkpage, target="_blank")
td(class="column", valign="top") span.pDisc(style=`background-color:`+disc.color)= disc.label
p.sectionContent!= disc.description
table(cellpadding="0", cellspacing="0", summary="", border="0") // Additional Content
tr if dataemail.content_after_events
td(class="sectionContentTitle boldhigh center LinkDisc", valign="top")
a(href=urldisc, title='Disciplina', target='_blank')
p(class="q-chip row inline no-wrap items-center cltexth4 chipnews shadow-5 glossy text-right text-white pDisc", style=`background-color: `+disc.color) #{disc.label}
tr
td(class="sectionContent", valign="top")
p!= disc.description
tr
td(class="whitespace", height="20")
p &nbsp;
- if (dataemail.content_after_events)
tr tr
table(cellpadding="0", cellspacing="0", summary="", border="0") td.testomail
tr p!=dataemail.content_after_events
td.testomail
p!=dataemail.content_after_events
tr
td(class="whitespace", height="20")
p &nbsp;
// Social Media // Social Media
table.socialMedia(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center") tr
tr td.socialMedia
td(class="whitespace", height="5") table(width="120", align="center", cellpadding="0", cellspacing="0")
p &nbsp; if dataemail.urlinstagram
tr td
td a(href=dataemail.urlinstagram)
table(width="120", cellpadding="0", cellspacing="0", summary="", border="0", align="center") img(src=imginstagram, alt="Instagram")
tr if dataemail.urltwitter
- if (dataemail.urlinstagram) td
td(width="32", align="center") a(href=dataemail.urltwitter)
a(href=dataemail.urlinstagram, title='Instagram') img(src=imgtwitter, alt="Twitter")
img(src=imginstagram, alt="Instagram", width="29") if dataemail.urlfb
- if (dataemail.urltwitter) td
td(width="32", align="center") a(href=dataemail.urlfb)
a(href=dataemail.urltwitter, title='Twitter') img(src=imgfb, alt="Facebook")
img(src=imgtwitter, alt="Twitter", width="29") if dataemail.urlyoutube
- if (dataemail.urlfb) td
td(width="32", align="center") a(href=dataemail.urlyoutube)
a(href=dataemail.urlfb, title='Facebook') img(src=imgyoutube, alt="YouTube")
img(src=imgfb, alt="Facebook", width="29")
- if (dataemail.urlyoutube)
td(width="32", align="center")
a(href=dataemail.urlyoutube, title='YouTube')
img(src=imgyoutube, alt="YouTube", width="29")
tr
td(class="whitespace", height="5")
p &nbsp;
// Footer // Footer
table.footer(cellpadding="0", cellspacing="0", width="100%", summary="", border="0", align="center") tr
tr td.firma-container
td(class="whitespace", height="10") p!= dataemail.firma
p &nbsp; tr
tr td.disclaimer-container
td.firma p!= dataemail.disclaimer_out
p!= dataemail.firma tr
td.bottom-container
tr p!= dataemail.disc_bottom_out
td.disclaimer
p!= dataemail.disclaimer_out
tr
td.bottom
p!= dataemail.disc_bottom_out
tr
td(class="whitespace", height="10")
p &nbsp;

8
filelog.txt Normal file
View File

@@ -0,0 +1,8 @@
Dom 02/03 ORE 16:32: USER [surya1977]: ciao
Lun 10/03 ORE 15:52: USER [surya1977]: ciao
Lun 10/03 ORE 15:56: USER [surya1977]: ciao
Lun 07/07 ORE 10:45: USER [surya1977]: ciao

1
localhost-key.pem Symbolic link
View File

@@ -0,0 +1 @@
/Users/suryapaolo/certs/localhost-key.pem

1
localhost.pem Symbolic link
View File

@@ -0,0 +1 @@
/Users/suryapaolo/certs/localhost.pem

View File

@@ -835,4 +835,6 @@ https://t.me/riso_canale/739
In attesa di riscontri, salutiamo! 🍚💚 In attesa di riscontri, salutiamo! 🍚💚
Il gruppo dei Facilitatori Territoriali RISO Il gruppo dei Facilitatori Territoriali RISO
Mer 24/04 ORE 22:02: 🤖: Da Sùrya (Paolo) (paoloar77): Mer 24/04 ORE 22:02: 🤖: Da Sùrya (Paolo) (paoloar77):
✅ la regolarizzazione può avv ✅ la regolarizzazione può avv
Lun 07/07 ORE 10:50: 🤖: Da Sùrya undefined (surya1977):
✅ provatest7 è stato Ammesso correttamente (da surya1977)!

View File

@@ -418,4 +418,69 @@ Gio 09/01 ORE 17:04: [<b>Circuito RIS TerraNFT</b>]: Inviate Monete da terranft
Saldi: Saldi:
terranft (paoloar77): -30.00 RIS] terranft (paoloar77): -30.00 RIS]
SuryaArena: 30.00 RIS] SuryaArena: 30.00 RIS]
Ven 28/02 ORE 19:40: [<b>Circuito RIS Bologna</b>]: Inviate Monete da surya1977 a SuryaSecondo 2 RIS [causale: aaa]
Saldi:
surya1977: 33.90 RIS]
SuryaSecondo: 2.10 RIS]
Lun 03/03 ORE 00:38: [<b>Circuito RIS Bologna</b>]: Inviate Monete da surya1977 a SuryaSecondo 3 RIS [causale: ]
Saldi:
surya1977: 30.90 RIS]
SuryaSecondo: 5.10 RIS]
Lun 03/03 ORE 00:40: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a Giovannifruttadisicilia 5.4 RIS [causale: aranceee !!]
Saldi:
surya1977: 62.55 RIS]
Giovannifruttadisicilia: 362.40 RIS]
Lun 03/03 ORE 01:06: [<b>Circuito RIS Arezzo</b>]: Inviate Monete da surya1977 a Andro 1 RIS [causale: test]
Saldi:
surya1977: -1.10 RIS]
Andro: 1.00 RIS]
Mer 12/03 ORE 21:30: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a Giovannifruttadisicilia 60 RIS [causale: prova]
Saldi:
surya1977: 34.20 RIS]
Giovannifruttadisicilia: 458.50 RIS]
Gio 13/03 ORE 17:44: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a PiuCheBuono(GaseBottega) 1 RIS [causale: AAA]
Saldi:
surya1977: 33.20 RIS]
PiuCheBuono(GaseBottega): -65.50 RIS]
Gio 13/03 ORE 17:45: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a PiuCheBuono(GaseBottega) 3.2 RIS [causale: GGG]
Saldi:
surya1977: 30.00 RIS]
PiuCheBuono(GaseBottega): -62.30 RIS]
Gio 13/03 ORE 18:17: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a pontiUmani 2 RIS [causale: bbb]
Saldi:
surya1977: 28.00 RIS]
pontiUmani: 2.00 RIS]
Gio 13/03 ORE 18:18: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a GruppoYurta 2 RIS [causale: ggg]
Saldi:
surya1977: 26.00 RIS]
GruppoYurta: 2.00 RIS]
Gio 13/03 ORE 18:48: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a GruppoYurta 11 RIS [causale: ]
Saldi:
surya1977: 15.00 RIS]
GruppoYurta: 13.00 RIS]
Gio 13/03 ORE 18:53: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a GruppoYurta 3 RIS [causale: ]
Saldi:
surya1977: 12.00 RIS]
GruppoYurta: 16.00 RIS]
Gio 13/03 ORE 18:57: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a GruppoYurta 1 RIS [causale: ]
Saldi:
surya1977: 11.00 RIS]
GruppoYurta: 17.00 RIS]
Dom 23/03 ORE 22:24: [<b>Circuito RIS Italia</b>]: Inviate Monete da surya1977 a GruppoYurta 1 RIS [causale: ]
Saldi:
surya1977: 88.20 RIS]
GruppoYurta: 6.00 RIS]

View File

@@ -13,78 +13,79 @@
"starttest": "NODE_ENV=test node src/server/server.js", "starttest": "NODE_ENV=test node src/server/server.js",
"test-watch": "nodemon --exec 'npm test'" "test-watch": "nodemon --exec 'npm test'"
}, },
"engines": {
"node": "^18.19.0"
},
"author": "Surya", "author": "Surya",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"basic-ftp": "^5.0.2", "basic-ftp": "^5.0.5",
"bcryptjs": "^2.4.3", "bcryptjs": "^3.0.2",
"bluebird": "^3.7.2", "bluebird": "^3.7.2",
"body-parser": "^1.20.0", "body-parser": "^1.20.3",
"cookie-parser": "^1.4.6", "cheerio": "^1.0.0",
"compress-pdf": "^0.5.3",
"cookie-parser": "^1.4.7",
"cors": "^2.8.5", "cors": "^2.8.5",
"country-codes-list": "^1.6.8", "country-codes-list": "^2.0.0",
"crypto-js": "^4.1.1", "crypto-js": "^4.2.0",
"csurf": "^1.11.0", "csurf": "^1.11.0",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"ejs": "^3.1.8", "ejs": "^3.1.10",
"email-templates": "^10.0.1", "email-templates": "^12.0.2",
"express": "^4.18.1", "express": "^4.21.2",
"formidable": "^2.0.1", "formidable": "^3.5.2",
"ghostscript4js": "^3.2.3", "ghostscript4js": "^3.2.3",
"i18n": "^0.15.0", "i18n": "^0.15.1",
"image-downloader": "^4.3.0", "image-downloader": "^4.3.0",
"internet-available": "^1.0.0", "internet-available": "^1.0.0",
"jade": "^1.9.2", "jade": "^1.11.0",
"jsdom": "^24.0.0", "jsdom": "^26.0.0",
"jsonwebtoken": "^9.0.1", "jsonwebtoken": "^9.0.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mongodb": "^4.4.1", "mongodb": "^6.14.2",
"mongoose": "^5.13.15", "mongoose": "^8.12.1",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.2",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"node-cron": "^3.0.2", "node-cron": "^3.0.3",
"node-emoji": "^1.11.0", "node-emoji": "^2.2.0",
"node-image-resizer": "^1.0.0", "node-image-resizer": "^1.0.0",
"node-pre-gyp": "^0.14.0", "node-pre-gyp": "^0.17.0",
"node-pty": "^1.0.0", "node-pty": "^1.0.0",
"node-telegram-bot-api": "^0.65.1", "node-telegram-bot-api": "^0.66.0",
"nodemailer": "^6.7.8", "nodemailer": "^6.10.0",
"npm-check-updates": "^16.14.18", "npm-check-updates": "^17.1.15",
"openai": "^4.83.0", "openai": "^4.86.2",
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"pdf-parse": "^1.1.1", "pdf-parse": "^1.1.1",
"pem": "^1.14.6", "pem": "^1.14.8",
"preview-email": "^3.0.7", "preview-email": "^3.1.0",
"pug": "^3.0.2", "pug": "^3.0.3",
"rate-limiter-flexible": "^2.3.9", "puppeteer": "^24.9.0",
"request": "^2.34", "rate-limiter-flexible": "^5.0.5",
"sanitize-html": "^2.13.0", "request": "^2.88",
"save": "^2.5.0", "sanitize-html": "^2.14.0",
"sharp": "^0.30.7", "save": "^2.9.0",
"superagent": "^8.0.0", "sharp": "^0.33.5",
"superagent": "^10.1.1",
"tedious": "^18.6.1", "tedious": "^18.6.1",
"url-parse": "^1.5.10", "url-parse": "^1.5.10",
"validator": "^13.7.0", "validator": "^13.12.0",
"vhost": "^3.0.2", "vhost": "^3.0.2",
"web-push": "^3.6.7", "web-push": "^3.6.7",
"xlsx": "^0.18.5",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",
"xoauth2": "^1.2.0" "xoauth2": "^1.2.0"
}, },
"devDependencies": { "devDependencies": {
"browser-sync": "^2.27.10", "browser-sync": "^3.0.3",
"expect": "^29.0.2", "expect": "^29.7.0",
"gulp": "^3.9.1", "gulp": "^5.0.0",
"gulp-inline-css": "^2.0.0", "gulp-inline-css": "^4.0.0",
"gulp-pug": "^5.0.0", "gulp-pug": "^5.0.0",
"gulp-rename": "^2.0.0", "gulp-rename": "^2.0.0",
"gulp-replace": "^1.1.3", "gulp-replace": "^1.1.4",
"gulp-sass": "^5.1.0", "gulp-sass": "^6.0.1",
"jest": "^29.0.2", "jest": "^29.7.0",
"mocha": "^10.0.0", "mocha": "^11.1.0",
"nodemon": "^3.0.1", "nodemon": "^3.1.9",
"supertest": "^6.2.4" "supertest": "^7.0.0"
} }
} }

View File

@@ -1,4 +1,4 @@
const fs = require('fs'); const fs = require('fs');
const readline = require('readline'); const readline = require('readline');
const {google} = require('googleapis'); const {google} = require('googleapis');
var FILE = require('./file'); var FILE = require('./file');

53
scripts/esporta_dati.sh Normal file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# Definizione delle costanti
targetDB="FreePlanet"
MYDOCKER="mongodb_riso"
# Percorso del file da Esportare (specificare il percorso completo)
myCollection="$1"
fileToImport="$1.json"
# Leggi il nome della collezione come primo argomento
if [ -z "$1" ]; then
echo "Errore: Devi specificare il nome della collezione come argomento."
exit 1
fi
# Leggi le credenziali dal file di configurazione
source ~/batch/.my_cfg.ini
# Verifica che le variabili siano state impostate correttamente
if [ -z "$PWDDB" ]; then
echo "Errore: La password del database non è stata trovata in .my_cfg.ini."
exit 1
fi
# Messaggio di conferma
echo "Stai per Esportare i dati da '$fileToImport' nella collezione '$myCollection' del database '$targetDB'."
read -p "Sei sicuro di voler procedere? (Y/N): " risposta
# Controllo della risposta dell'utente
if [[ "$risposta" != "Y" && "$risposta" != "y" ]]; then
echo "Operazione annullata."
exit 0
fi
# Esegui il comando mongoimport dentro il container Docker
docker exec $MYDOCKER mongoexport \
--username admin \
--password "$PWDDB" \
--authenticationDatabase admin \
--db "$targetDB" \
--collection "$myCollection" \
--out "$fileToImport" \
# Verifica lo stato dell'operazione
if [ $? -eq 0 ]; then
echo "Esportazione completata con successo! $fileToImport"
else
echo "Errore durante l'esportazione."
exit 1
fi

53
scripts/importa_dati.sh Normal file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# Definizione delle costanti
targetDB="FreePlanet"
MYDOCKER="mongodb_riso"
# Percorso del file da importare (specificare il percorso completo)
myCollection="$1"
fileToImport="$1.json"
# Leggi il nome della collezione come primo argomento
if [ -z "$1" ]; then
echo "Errore: Devi specificare il nome della collezione come argomento."
exit 1
fi
# Leggi le credenziali dal file di configurazione
source ~/batch/.my_cfg.ini
# Verifica che le variabili siano state impostate correttamente
if [ -z "$PWDDB" ]; then
echo "Errore: La password del database non è stata trovata in .my_cfg.ini."
exit 1
fi
# Messaggio di conferma
echo "Stai per importare i dati da '$fileToImport' nella collezione '$myCollection' del database '$targetDB'."
read -p "Sei sicuro di voler procedere? (Y/N): " risposta
# Controllo della risposta dell'utente
if [[ "$risposta" != "Y" && "$risposta" != "y" ]]; then
echo "Operazione annullata."
exit 0
fi
# Esegui il comando mongoimport dentro il container Docker
docker exec $MYDOCKER mongoimport \
--username admin \
--password "$PWDDB" \
--authenticationDatabase admin \
--db "$targetDB" \
--collection "$myCollection" \
--file "$fileToImport" \
--jsonArray
# Verifica lo stato dell'operazione
if [ $? -eq 0 ]; then
echo "Importazione completata con successo!"
else
echo "Errore durante l'importazione."
exit 1
fi

View File

@@ -1,20 +0,0 @@
{
"folders": [
{
"path": "../.."
},
{
"path": "../../../newfreeplanet"
},
{
"path": "../../../cnm"
}
],
"settings": {
"search.useIgnoreFiles": false,
"search.useParentIgnoreFiles": false,
"files.exclude": {
"": true
}
}
}

View File

@@ -1,12 +1,28 @@
const tools = require('../tools/general'); const tools = require('../tools/general');
console.log('__');
console.log('__');
console.log('__');
console.log('__');
console.log('****************************************************');
console.log('*** AVVIO DEL SERVER NODE.JS ***');
console.log('****************************************************');
console.log('__');
if ((process.env.NODE_ENV === 'production')) {
console.log(' *** AMBIENTE DI PRODUZIONE !!!!')
} else if (process.env.NODE_ENV === 'test') {
console.log(' *** ### AMBIENTE DI TEST ')
} else if (process.env.NODE_ENV === 'development') {
console.log(' *** ### AMBIENTE DI SVILUPPO (LOCALE) ')
}
console.log('__');
// still in app.js // still in app.js
const node_env = process.env.NODE_ENV || 'production'; const node_env = process.env.NODE_ENV || 'production';
console.log('node_env=', node_env);
var file = `.env.${node_env}`; var file = `.env.${node_env}`;
// GLOBALI (Uguali per TUTTI) // GLOBALI (Uguali per TUTTI)
process.env.LINKVERIF_REG = '/vreg'; process.env.LINKVERIF_REG = '/vreg';
process.env.LINK_REQUEST_NEWPASSWORD = '/requestnewpwd'; process.env.LINK_REQUEST_NEWPASSWORD = '/requestnewpwd';
@@ -22,466 +38,18 @@ require('dotenv').config({ path: file });
process.env.DATABASE = process.env.DATABASE || 'FreePlanet'; process.env.DATABASE = process.env.DATABASE || 'FreePlanet';
console.log('process.env.DOMAIN:', process.env.DOMAIN); console.log('process.env.DOMAIN:', process.env.DOMAIN);
process.env.MONGODB_URI = process.env.DOMAIN + process.env.DATABASE; const domain = process.env.DOMAIN;
console.log('process.env.MONGODB_URI:', process.env.MONGODB_URI); const username = encodeURIComponent(process.env.MONGODB_USER);
const password = encodeURIComponent(process.env.MONGODB_PWD);
const database = process.env.DATABASE || "test"; // Nome del database, default a 'test'
if (process.env.AUTH_DB_PASSING === "1") {
// replace username and password in the process.env.DOMAIN
/* process.env.MONGODB_URI = process.env.DOMAIN_AUTH.replace('{username}', username).replace('{password}', password) + database;
if (process.env.NODE_ENV === 'production') { process.env.MONGODB_URI_NOPWD = process.env.DOMAIN_AUTH.replace('{username}', username) + database;
// ---------------- AMBIENTE DI PRODUZIONE !!!!!!!!!! --------------------
MYAPPS = [
{
idapp: '1',
name: 'FreePlanet',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
replyTo: 'paolo.arena77@gmail.com',
host: 'https://freeplanet.app',
portapp: '0',
dir: '/var/www/www.freeplanet.app',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '2',
name: 'Associazione Shen',
adminemail: 'pao.loarena77@gmail.com',
manageremail: 'info@associazioneshen.it',
replyTo: 'info@associazioneshen.it',
host: 'https://www.associazioneshen.it',
portapp: '0',
dir: '/var/www/associazioneshen.it',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '3',
name: 'Brigitte MG Dumont',
adminemail: '',
manageremail: '',
replyTo: '',
host: 'http://brigittemgdumont.com',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '4',
name: 'Mandala Solidale',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
replyTo: '',
host: 'https://mandala.freeplanet.app',
portapp: '0',
dir: '/var/www/mandala.freeplanet.app',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '6',
name: 'Mandala per l\'Anima',
adminemail: '',
manageremail: '',
replyTo: '',
host: 'http://mandalaperlanima.eu',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '8',
name: 'CentrOlistico Rimini',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
replyTo: 'info@arcodiluce.it',
host: 'https://www.centrolisticorimini.it',
portapp: '0',
dir: '/var/www/centrolisticorimini.it',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '9',
name: 'SalviamoIlPianeta',
adminemail: 'salviamoilpianeta2020@gmail.com',
manageremail: '',
replyTo: '',
host: 'https://salviamoilpianeta.app',
portapp: '0',
dir: '/var/www/salviamoilpianeta.app',
email_from: 'salviamoilpianeta2020@gmail.com',
email_pwd: 'c6f63e7aba9393c73f56e338a7fe5283a73949363662d26bd375dd05b6f6f37ebkw4vINQ0O/4d8JN71aNH3UsyndeFRgyyMvJMVl4iOk=',
telegram_key:'1202788747:AAErwzIsD7k-3Yj5AX6ci3p7ELMuyASq4vA',
telegram_bot_name: 'SalviamoIlPianeta_bot',
pathreg_add:'_sip',
abilitanave: false,
},
{
idapp: '10',
name: 'Comunità Nuovo Mondo',
adminemail: 'cnmrimini@gmail.com',
manageremail: '',
replyTo: '',
host: 'https://comunitanuovomondo.app',
portapp: '0',
dir: '/var/www/comunitanuovomondo.app',
// email_from: 'info.pianetalibero@gmail.com',
// email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
email_from: 'cnmrimini@gmail.com',
email_pwd: '9693e200ae56f1119185a29d34079656a628f2663dc108f7d106496ac0042815F+mvJF79KcQcUnF0twoyIg==',
telegram_key:'1646348227:AAF2qgpHB4KprhB0HPefazGLyoVGW_i4jTA',
telegram_bot_name: 'cnm_mybot',
pathreg_add:'_cnm',
abilitanave: false,
},
{
idapp: '11',
name: 'ArtEnergetica',
adminemail: '',
manageremail: '',
replyTo: '',
host: 'https://www.artenergetica.org',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
];
} else if (process.env.NODE_ENV === 'test') {
// ---------------- AMBIENTE DI TEST --------------------
MYAPPS = [
{
idapp: '1',
name: 'FreePlanet',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
replyTo: 'paolo.arena77@gmail.com',
host: 'https://test.freeplanet.app',
portapp: '0',
dir: '/var/www/www.freeplanet.app',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '2',
name: 'Associazione Shen',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
replyTo: 'info@associazioneshen.it',
host: 'http://test.associazioneshen.it',
portapp: '0',
dir: '/var/www/associazioneshen.it',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '3',
name: 'Brigitte MG Dumont',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
host: 'http://test.brigittemgdumont.com',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '4',
name: 'Mandala Solidale',
adminemail: '',
manageremail: '',
host: 'https://mandala.freeplanet.app',
portapp: '0',
dir: '/var/www/mandalatest.freeplanet.app',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '6',
name: 'Mandala per l\'Anima',
adminemail: '',
manageremail: '',
host: 'http://test.mandalaperlanima.eu',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '8',
name: 'CentrOlistico Rimini',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
replyTo: 'info@arcodiluce.it',
host: 'https://www.centrolisticorimini.it',
portapp: '0',
dir: '/var/www/centrolisticorimini.it',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '9',
name: 'SalviamoIlPianeta (Server Test)',
adminemail: 'info.pianetalibero@gmail.com',
manageremail: '',
replyTo: '',
host: 'https://test.salviamoilpianeta.app',
portapp: '0',
dir: '/var/www/test.salviamoilpianeta.app',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'_sip',
abilitanave: false,
},
{
idapp: '10',
name: 'Comunità Nuovo Mondo (Server Test)',
adminemail: 'info.pianetalibero@gmail.com',
manageremail: '',
replyTo: '',
host: 'https://test.comunitanuovomondo.app',
portapp: '0',
dir: '/var/www/test.comunitanuovomondo.app',
// email_from: 'info.pianetalibero@gmail.com',
// email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'_cnm',
abilitanave: false,
},
{
idapp: '3',
name: 'Brigitte MG Dumont',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
host: 'http://test.brigittemgdumont.com',
portapp: '0',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '11',
name: 'ArtEnergetica',
adminemail: '',
manageremail: '',
host: 'https://www.artenergetica.org',
portapp: '0',
dir: '/var/www/artenergetica.org',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '2df135e2b6c02b2c68ec6bf6b103751fcb4dfc48c57d0acb302482358ee8141fmaDuooPabDvlThiBI2XMyA==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
];
} else { } else {
// ---------------- AMBIENTE IN L O C A L E -------------------- process.env.MONGODB_URI = domain + database;
MYAPPS = [ process.env.MONGODB_URI_NOPWD = domain + database;
{
idapp: '1',
name: 'FreePlanet',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
replyTo: 'paolo.arena77@gmail.com',
host: 'http://localhost',
portapp: '8080',
dir: '/home/paolo/myproject/freeplanet/dist/spa',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '2',
name: 'Associazione Shen',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
replyTo: 'info@associazioneshen.it',
host: 'http://localhost',
portapp: '8081',
dir: '/home/paolo/myproject/associazioneShen/dist/spa',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '3',
name: 'Brigitte',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8082',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '4',
name: 'Mandala Solidale',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8084',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '6',
name: 'Mandala per l\'Anima',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8083',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '8',
name: 'CentrOlistico Rimini',
adminemail: 'pao.loarena77@gmail.com',
manageremail: '',
replyTo: 'info@arcodiluce.it',
host: 'http://localhost',
portapp: '8086',
dir: '/home/paolo/myproject/centrolisticorimini.it/dist/spa',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key:'',
telegram_bot_name: '',
pathreg_add:'',
abilitanave: false,
},
{
idapp: '9',
name: 'SalviamoIlPianeta',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8087',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
telegram_key: '',
telegram_bot_name: '',
// telegram_key:'1049833543:AAE1RhGUJVdm0N_vrj0ijHZ04GCkKjl8TuQ',
// telegram_bot_name: 'TestSalviamoIlPianeta_bot',
pathreg_add:'_sip',
abilitanave: false,
},
{
idapp: '10',
name: 'Comunità Nuovo Mondo',
adminemail: 'cnmrimini@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8090',
dir: '',
email_from: 'cnmrimini@gmail.com',
email_pwd: 'bc61ab32a09d22e3a5097aa6668d3c724854c5856de9c713c427017bb89cdb0ctIESmuHr3FCNTLlRAK6d5Q',
telegram_key: '',
telegram_bot_name: '',
pathreg_add:'_cnm',
abilitanave: false,
},
{
idapp: '11',
name: 'ArtEnergetica',
adminemail: 'paolo.arena77@gmail.com',
manageremail: '',
host: 'http://localhost',
portapp: '8091',
dir: '',
email_from: 'info.pianetalibero@gmail.com',
email_pwd: '66ffeb915e71fada64ad5c26947dd087c262be3b343734a0447c6dee534b888aZcfbjXEuMBWKxvbh60cniw==',
pathreg_add:'',
abilitanave: false,
},
];
} }
*/ console.log('process.env.MONGODB_URI:', process.env.MONGODB_URI_NOPWD);

File diff suppressed because it is too large Load Diff

View File

@@ -1,75 +1,84 @@
var mongoose = require('mongoose').set('debug', false) var mongoose = require('mongoose').set('debug', process.env.VITE_DEBUG);
// Configurazione globale di Mongoose
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = ""; mongoose.level = "";
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
mongoose.set('debug', false); mongoose.set('debug', false);
mongoose.set('strictQuery', false);
// Opzioni di connessione
let options = { let options = {
// user: process.env.UDB, maxPoolSize: 5,
// pass: process.env.PDB, // useNewUrlParser: true,
// useMongoClient: true, // useUnifiedTopology: true,
// useMongoClient: false, serverSelectionTimeoutMS: 20000, // Timeout di 30 secondi per la selezione del server
useNewUrlParser: true,
// useFindAndModify: true,
useFindAndModify: false,
// useCreateIndex: true,
useUnifiedTopology: true,
promiseLibrary: require('bluebird'),
// autoIndex: false, // Don't build indexes
// reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
// reconnectInterval: 500, // Reconnect every 500ms
// poolSize: 10, // Maintain up to 10 socket connections
// // If not connected, return errors immediately rather than waiting for reconnect
// bufferMaxEntries: 0,
// connectTimeoutMS: 10000, // Give up initial connection after 10 seconds
// socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
// family: 4 // Use IPv4, skip trying IPv6
// keepAlive: true, // keepAlive is true by default since mongoose 5.2.0
// keepAliveInitialDelay: 300000 // keepAliveInitialDelay is the number of milliseconds to wait before initiating keepAlive on the socket.
}; };
// Controllo dell'autenticazione
console.log('process.env.AUTH_MONGODB', process.env.AUTH_MONGODB); console.log('process.env.AUTH_MONGODB', process.env.AUTH_MONGODB);
const username = encodeURIComponent(process.env.MONGODB_USER);
const password = encodeURIComponent(process.env.MONGODB_PWD);
if (process.env.AUTH_MONGODB === '1') { if (process.env.AUTH_MONGODB === '1') {
options.auth = { options.auth = {
authSource: "admin", authSource: "admin",
poolSize: 10, username,
user: process.env.MONGODB_USER, password
password: process.env.MONGODB_PWD,
}; };
} }
if (options.auth && options.auth.user) { if (options.auth && options.auth.username) {
console.log('MongoDb con Authenticazione:', options.auth.user, '******'); console.log('MongoDb con Authenticazione:', options.auth.username, '******');
} else { } else {
console.log('### MongoDb SENZA Authenticazione !!! '); console.log('### MongoDb SENZA Authenticazione !!! ');
} }
const db = mongoose.connection; // Stampa delle informazioni di sistema
console.log('Node Version ' + process.version); console.log('Node Version ' + process.version);
console.log('Mongoose Version ' + mongoose.version); console.log('Mongoose Version ' + mongoose.version);
connectionUrl = process.env.MONGODB_URI; // URL di connessione
const connectionUrl = process.env.MONGODB_URI;
console.log('Connessione a ' + process.env.MONGODB_URI_NOPWD + ' in corso...');
console.log('Connessione a ' + connectionUrl + ' in corso...'); // Funzione per connettersi al database con retry
mongoose.connect(connectionUrl, options); async function connectToDatabase(uri, opts) {
let isConnected = false;
db.on('error', console.error.bind(console, 'connection error:')); while (!isConnected) {
db.once('open', function () { try {
// we're connected! console.log("Sto provando a connettermi al database...");
console.log('*** CONNESSIONE EFFETTUATA ! ' + connectionUrl + ' db: ' + process.env.DATABASE) await mongoose.connect(uri);
}); console.log(' *** CONNESSIONE EFFETTUATA ! ' + ' db: ' + process.env.DATABASE);
module.exports = { mongoose }; console.log(' Database corrente:', mongoose.connection.name);
// Ottieni l'URL completo della connessione
// console.log(' URL di connessione:', mongoose.connection.client.s.url);
const db = mongoose.connection;
const serverInfo = await db.db.admin().serverStatus(); // Ottieni lo stato del server
console.log(` Versione di MongoDB: ${serverInfo.version}`); // Stampa la versione
isConnected = true; // Imposta la flag di connessione a true
} catch (error) {
console.error(" Errore durante la connessione al database:", error.message);
// if (error.name === 'MongooseServerSelectionError' || error.name === 'MongoServerError') {
console.log(" Ritento la connessione tra 1 minuto...");
await new Promise((resolve) => setTimeout(resolve, 60000)); // Attendi 1 minuto prima di ritentare
/*} else {
console.error(" Errore irreversibile. Arresto il processo.");
await new Promise((resolve) => setTimeout(resolve, 10000)); // Attendi 1 minuto prima di ritentare
process.exit(1); // Termina il processo in caso di errore irreversibile
}*/
}
}
}
// Esporta Mongoose
module.exports = { mongoose, connectToDatabase, connectionUrl, options };

View File

@@ -104,8 +104,8 @@
"ID_CIRCUIT_COINS_ACCEPTED_TO_ME": "🔄 Hai inviato <strong>%s %s</strong> a %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": "%s %s rifiutati da %s sul '%s'.",
"ID_CIRCUIT_COINS_REFUSED_TO_ME": "%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", "CIRCUIT_AMOUNT_EXCEED_FIDO": "⚠️ L'importo supera la quantità massima concessa per %s",
"CIRCUIT_AMOUNT_EXCEED_QTAMAX": "L'importo supera la quantità massima che il destinatario (%s) può accumulare", "CIRCUIT_AMOUNT_EXCEED_QTAMAX": "⚠️ L'importo supera la quantità massima che il destinatario (%s) può accumulare",
"CIRCUIT_COINS_ALREADY_PROCESSED": "La richiesta è stata già processata. Stato %s", "CIRCUIT_COINS_ALREADY_PROCESSED": "La richiesta è stata già processata. Stato %s",
"STATUS_SENT": "Inviato", "STATUS_SENT": "Inviato",
"STATUS_REFUSED": "Rifiutato", "STATUS_REFUSED": "Rifiutato",
@@ -127,6 +127,9 @@
"🚫 Ti è stato rifiutato l'accesso. Probabilmente l'username con cui ti sei registrato non ti conosce. (%s) !<br>Contatta l'Assistenza Tecnica.": "🚫 Ti è stato rifiutato l'accesso. Probabilmente l'username con cui ti sei registrato non ti conosce. (%s) !<br>Contatta l'Assistenza Tecnica.", "🚫 Ti è stato rifiutato l'accesso. Probabilmente l'username con cui ti sei registrato non ti conosce. (%s) !<br>Contatta l'Assistenza Tecnica.": "🚫 Ti è stato rifiutato l'accesso. Probabilmente l'username con cui ti sei registrato non ti conosce. (%s) !<br>Contatta l'Assistenza Tecnica.",
"🚫 %s ha rifiutato l'accesso alla App a %s !": "🚫 %s ha rifiutato l'accesso alla App a %s !", "🚫 %s ha rifiutato l'accesso alla App a %s !": "🚫 %s ha rifiutato l'accesso alla App a %s !",
"✅ Hai Ammesso l'accesso alla App a %s !": "✅ Hai Ammesso l'accesso alla App a %s !", "✅ Hai Ammesso l'accesso alla App a %s !": "✅ Hai Ammesso l'accesso alla App a %s !",
"EXCEED_FIDO": "⚠️ L'importo supera la Fiducia concessa per %s",
"EXCEED_QTAMAX": "⚠️ Attenzione! %s sta tentando di inviarti %s RIS, ma il tuo conto ha raggiunto il limite massimo di accumulo sul %s. \nPer poter ricevere il pagamento, devi prima spendere alcuni RIS cercando quello che ti serve, in modo da liberare spazio nel tuo conto. 🙏🏻",
"EXCEED_QTAMAX_MITTENTE": "⚠️ Attenzione! %s ha raggiunto la quota massima accumulabile in RIS, pertanto non puoi inviarglieli. Dovrebbe prima cercare di spendere i RIS cercando quello che gli serve, in modo da liberare spazio nel suo conto. 🙏🏻",
"Good: %": "Good: %", "Good: %": "Good: %",
"Service: %": "Service: %" "Service: %": "Service: %"
} }

View File

@@ -11,103 +11,59 @@ const auth_default = (req, res, next) => {
}; };
const authenticate = (req, res, next) => { const authenticateMiddleware = async (req, res, next, withUser = false, lean = false, noError = false) => {
const token = req.header('x-auth');
//const refreshToken = req.header('x-refrtok');
// console.log('authenticate... ');
let noaut = false;
if (req.body.hasOwnProperty('noaut')) {
noaut = req.body.noaut;
}
if (noaut) {
next();
return;
}
const access = 'auth';
return User.findByToken(token, access, true).then((ris) => {
if (ris && ris.user && !!ris.user.deleted) {
if (ris.user.deleted)
ris.user = null;
}
if (ris.code === server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED) {
return Promise.reject(server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED);
}
if (!ris.user) {
return Promise.reject(server_constants.RIS_CODE_HTTP_INVALID_TOKEN);
}
if (!!ris.user) {
// Save last time online
ris.user.lasttimeonline = new Date();
ris.user.retry_pwd = 0
ris.user.useragent = req.get('User-Agent');
return ris.user.save().then(() => {
req.user = ris.user;
req.token = token;
// req.refreshToken = refreshToken;
req.access = access;
next(); // Esegui il codice successivo
});
}
// tools.mylog('userid', user._id);
}).catch((e) => {
if (e === server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED) {
return res.status(server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED).send();
}
tools.mylog("ERR authenticate invalid Token =", e);
res.status(server_constants.RIS_CODE_HTTP_INVALID_TOKEN).send();
});
};
const authenticate_noerror = (req, res, next) => {
try { try {
const token = req.header('x-auth'); const token = req.header('x-auth');
const refreshToken = req.header('x-refrtok'); const refreshToken = req.header('x-refrtok');
const logPrefix = noError ? (withUser ? (lean ? 'WITHUSERLEAN' : 'WITHUSER') : 'NOERROR') : 'AUTH';
const access = 'auth'; if (!token) {
return User.findByToken(token, access, false).then((ris) => {
if (ris.code !== server_constants.RIS_CODE_OK) {
req.user = null;
req.token = null;
req.access = null;
req.code = ris.code;
} else {
req.user = ris.user;
req.token = token;
req.refreshToken = refreshToken;
req.access = access;
req.code = ris.code;
}
if (ris.code === server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED) {
return res.status(server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED).send();
} else {
// Vai avanti ad eseguire il codice, in ogni modo !
next();
}
}).catch((e) => {
req.user = null; req.user = null;
req.token = null; req.token = null;
req.access = null; req.code = server_constants.RIS_CODE_HTTP_INVALID_TOKEN;
req.code = 0; if (!noError)
console.log(` ## ${logPrefix}_TOKEN INVALIDO ❌ ...`);
return noError ? next() : res.status(req.code).send();
}
// Continua comunque ! const user = await User.findByToken(token, 'auth', false, withUser, lean);
next();
}); if (user.code !== server_constants.RIS_CODE_OK) {
req.user = null;
req.token = null;
req.code = user.code;
} else {
req.user = user.user;
req.token = token;
req.refreshToken = refreshToken;
req.code = user.code;
}
if (user.code === server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED) {
console.log(` TOKEN SCADUTO ! `);
if (noError) {
return next()
} else {
return res.status(server_constants.RIS_CODE_HTTP_FORBIDDEN_TOKEN_EXPIRED).send();
}
}
// console.log(` ## ${logPrefix} NEXT ! AVANTI...`);
next();
} catch (e) { } catch (e) {
console.error('Err', e); console.error('Errore nel middleware di autenticazione:', e);
req.user = null;
req.token = null;
req.code = server_constants.RIS_CODE_HTTP_INVALID_TOKEN;
noError ? next() : res.status(req.code).send();
} }
}; };
module.exports = { authenticate, authenticate_noerror, auth_default }; const authenticate = (req, res, next) => authenticateMiddleware(req, res, next);
const authenticate_withUser = (req, res, next) => authenticateMiddleware(req, res, next, true);
const authenticate_withUserLean = (req, res, next) => authenticateMiddleware(req, res, next, true, true);
const authenticate_noerror = (req, res, next) => authenticateMiddleware(req, res, next, false, false, true);
const authenticate_noerror_WithUser = (req, res, next) => authenticateMiddleware(req, res, next, true, false, true);
const authenticate_noerror_WithUserLean = (req, res, next) => authenticateMiddleware(req, res, next, true, true, true);
module.exports = { authenticate, authenticate_noerror, auth_default, authenticate_withUser, authenticate_noerror_WithUser, authenticate_noerror_WithUserLean };

View File

@@ -0,0 +1,128 @@
const mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
const tools = require('../tools/general');
mongoose.Promise = global.Promise;
mongoose.level = "F";
const shared_consts = require('../tools/shared_nodejs');
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const JobsInProgressSchema = new Schema({
idapp: {
type: String,
},
descr: {
type: String,
},
nomeFunzioneDbOp: {
type: String,
},
status: {
type: Number,
},
terminatedWhy: {
type: Number,
},
comment: {
type: String,
},
date_created: {
type: Date,
default: Date.now
},
});
JobsInProgressSchema.statics.chechifExistJobWorking = async function (jobData, terminateiftoolong) {
// controlla se esiste un altro job, non ancora terminato !STATUS_JOB.FINISH
// se esiste già allora ritorna false
const existingJob = await this.findOne({ idapp: jobData.idapp, nomeFunzioneDbOp: jobData.nomeFunzioneDbOp, status: { $ne: shared_consts.STATUS_JOB.FINISH } });
if (existingJob) {
// se il Job trovato è passato troppo tempo (oltre 3 ore date_created), allora fai finta che abbia già terminato
// (in questo caso, non ritorna false, ma ritorna il job trovato, per permettere di gestire il caso in cui si vuole forzare il job a terminare)
if (Math.abs(Date.now() - existingJob.date_created.getTime()) > 180 * 60 * 1000) {
if (terminateiftoolong) {
existingJob.status = shared_consts.STATUS_JOB.FINISH;
existingJob.terminatedWhy = shared_consts.TERMINATED_WHY.TOOLONGTIME;
await existingJob.save();
return false;
}
} else {
return true; // E' in FUNZIONE il JOB
}
}
return false;
};
JobsInProgressSchema.statics.addNewJob = async function (jobData) {
if (!jobData || typeof jobData !== 'object') {
console.error('ERRORE: ❌ jobData deve essere un oggetto valido');
}
const esistegia = await this.chechifExistJobWorking(jobData, true);
if (esistegia) {
return null;
}
try {
const newJob = await this.create(jobData);
return newJob;
} catch (err) {
console.error('Errore nell\'aggiungere un nuovo record: ', err);
throw err;
}
};
JobsInProgressSchema.methods.terminateJob = async function (witherror) {
try {
this.status = shared_consts.STATUS_JOB.FINISH;
this.terminatedWhy = witherror ? shared_consts.TERMINATED_WHY.END_WITHERROR : shared_consts.TERMINATED_WHY.END_NORMALLY;
await this.save();
return true;
} catch (err) {
console.error('Errore durante la terminazione del job: ', err);
return false;
}
};
JobsInProgressSchema.statics.getFieldsForSearch = function () {
return [{ field: 'descr', type: tools.FieldType.string }]
};
JobsInProgressSchema.statics.executeQueryTable = function (idapp, params, user) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params, user);
};
JobsInProgressSchema.statics.findAllIdApp = async function (idapp) {
const JobsInProgress = this;
try {
return await JobsInProgress.find({ idapp }).then((arrrec) => {
return arrrec;
});
} catch (err) {
console.error('Errore: ', err);
}
};
const JobsInProgress = mongoose.model('JobsInProgress', JobsInProgressSchema);
JobsInProgress.createIndexes()
.then(() => { })
.catch((err) => { throw err; });
module.exports = { JobsInProgress };

27
src/server/models/PageView.js Executable file
View File

@@ -0,0 +1,27 @@
// /backend/models/PageView.js
const mongoose = require('mongoose');
const PageViewSchema = new mongoose.Schema({
url: {
type: String,
required: true
},
idapp: String,
ip: {
type: String,
default: 'unknown'
},
userId: String,
username: String,
userAgent: {
type: String
},
referrer: String,
timestamp: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('PageView', PageViewSchema);

View File

@@ -98,9 +98,7 @@ AccountSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp, deleted: false }; const myfind = { idapp, deleted: false };
return await Account.find(myfind, (err, arrrec) => { return await Account.find(myfind).lean();
return arrrec;
});
}; };
AccountSchema.pre('save', async function (next) { AccountSchema.pre('save', async function (next) {
@@ -659,7 +657,7 @@ AccountSchema.statics.updateQtaMax = async function (idapp, username, groupname,
else else
risult = await Account.updateOne({ idapp, username, circuitId }, { $set: paramstoupdate }); risult = await Account.updateOne({ idapp, username, circuitId }, { $set: paramstoupdate });
return risult && risult.nModified > 0; return risult && risult.modifiedCount > 0;
}; };
AccountSchema.statics.getAccountsCircuitiNazionali = async function (idapp) { AccountSchema.statics.getAccountsCircuitiNazionali = async function (idapp) {
@@ -764,8 +762,8 @@ AccountSchema.statics.updateSaldoAndTransato_AllAccounts = async function (idapp
const Account = mongoose.model('Account', AccountSchema); const Account = mongoose.model('Account', AccountSchema);
Account.createIndexes((err) => { Account.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Account }; module.exports = { Account };

View File

@@ -42,13 +42,7 @@ AdTypeSchema.pre('save', async function (next) {
AdTypeSchema.statics.findAllIdApp = async function(idapp) { AdTypeSchema.statics.findAllIdApp = async function(idapp) {
const AdType = this; const AdType = this;
const query = [ return AdType.find({}).sort({_id: 1}).lean();
{$sort: {_id: 1}},
];
return await AdType.aggregate(query).then((arrrec) => {
return arrrec;
});
}; };
@@ -64,8 +58,9 @@ AdTypeSchema.statics.executeQueryTable = function(idapp, params) {
const AdType = mongoose.model('AdType', AdTypeSchema); const AdType = mongoose.model('AdType', AdTypeSchema);
AdType.createIndexes((err) => { AdType.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = {AdType}; module.exports = {AdType};

View File

@@ -64,8 +64,9 @@ AdTypeGoodSchema.statics.executeQueryTable = function(idapp, params) {
const AdTypeGood = mongoose.model('AdTypeGood', AdTypeGoodSchema); const AdTypeGood = mongoose.model('AdTypeGood', AdTypeGoodSchema);
AdTypeGood.createIndexes((err) => { AdTypeGood.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = {AdTypeGood}; module.exports = {AdTypeGood};

View File

@@ -134,7 +134,6 @@ const AttivitaSchema = new Schema(
...tools.getFieldsForAnnunci() ...tools.getFieldsForAnnunci()
}, { strict: false }); }, { strict: false });
AttivitaSchema.index({ 'idapp': 1 });
AttivitaSchema.pre('save', async function (next) { AttivitaSchema.pre('save', async function (next) {
@@ -390,8 +389,9 @@ AttivitaSchema.statics.getCompleteRecord = function (idapp, id) {
const Attivita = mongoose.model('Attivita', AttivitaSchema); const Attivita = mongoose.model('Attivita', AttivitaSchema);
Attivita.createIndexes((err) => { Attivita.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Attivita }; module.exports = { Attivita };

View File

@@ -1,14 +1,14 @@
mongoose = require('mongoose').set('debug', false) mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
const tools = require('../tools/general'); const tools = require('../tools/general');
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = "F"; mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll // Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => { mongoose.plugin((schema) => {
schema.options.usePushEach = true schema.options.usePushEach = true;
}); });
const AuthorSchema = new Schema({ const AuthorSchema = new Schema({
@@ -29,13 +29,13 @@ const AuthorSchema = new Schema({
}, },
}); });
var Author = module.exports = mongoose.model('Author', AuthorSchema); var Author = (module.exports = mongoose.model('Author', AuthorSchema));
module.exports.getFieldsForSearch = function () { module.exports.getFieldsForSearch = function () {
return [ return [
{ field: 'name', type: tools.FieldType.string }, { field: 'name', type: tools.FieldType.string },
{ field: 'surname', type: tools.FieldType.string }, { field: 'surname', type: tools.FieldType.string },
] ];
}; };
module.exports.executeQueryTable = function (idapp, params) { module.exports.executeQueryTable = function (idapp, params) {
@@ -46,9 +46,12 @@ module.exports.executeQueryTable = function (idapp, params) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Author.find(myfind).sort({name: 1, surname: 1}); return await Author.find(myfind).sort({ name: 1, surname: 1 }).select({ idapp: 0 }).lean();
}; };
module.exports.createIndexes((err) => { module.exports
if (err) throw err; .createIndexes()
}); .then(() => {})
.catch((err) => {
throw err;
});

View File

@@ -68,10 +68,7 @@ bookingSchema.statics.findAllByUserIdAndIdApp = function (userId, idapp, sall) {
else else
myfind = { userId, idapp, booked: true }; myfind = { userId, idapp, booked: true };
return Booking.find(myfind, (err, arrbooked) => { return Booking.find(myfind).lean();
// console.log('ris Booking:', arrbooked);
return arrbooked
});
}; };
@@ -94,7 +91,7 @@ function getUsersByBooking(idapp) {
$Lookup: { $Lookup: {
from: "users", from: "users",
localField: "userId", // field in my collection localField: "userId", // field in my collection
foreignField: "ObjectId(_id)", // field in the 'from' collection foreignField: "new ObjectId(_id)", // field in the 'from' collection
as: "fromItems" as: "fromItems"
} }
}, },
@@ -122,8 +119,9 @@ bookingSchema.statics.findAllDistinctByBooking = function (idapp) {
const Booking = mongoose.model('Booking', bookingSchema); const Booking = mongoose.model('Booking', bookingSchema);
Booking.createIndexes((err) => { Booking.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Booking }; module.exports = { Booking };

View File

@@ -205,8 +205,9 @@ BotSchema.statics.findAllIdApp = async function (idapp) {
const MyBot = mongoose.model('Bot', BotSchema); const MyBot = mongoose.model('Bot', BotSchema);
MyBot.createIndexes((err) => { MyBot.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { MyBot }; module.exports = { MyBot };

View File

@@ -76,8 +76,9 @@ CalZoomSchema.statics.getNextZoom = async function (idapp) {
const CalZoom = mongoose.model('CalZoom', CalZoomSchema); const CalZoom = mongoose.model('CalZoom', CalZoomSchema);
CalZoom.createIndexes((err) => { CalZoom.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { CalZoom }; module.exports = { CalZoom };

View File

@@ -2,14 +2,13 @@ const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = "F"; mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll // Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => { mongoose.plugin((schema) => {
schema.options.usePushEach = true schema.options.usePushEach = true;
}); });
const CartSchema = new Schema({ const CartSchema = new Schema({
idapp: { idapp: {
type: String, type: String,
@@ -18,18 +17,25 @@ const CartSchema = new Schema({
totalQty: { type: Number, default: 0 }, totalQty: { type: Number, default: 0 },
totalPrice: { type: Number, default: 0 }, totalPrice: { type: Number, default: 0 },
totalPriceCalc: { type: Number, default: 0 }, totalPriceCalc: { type: Number, default: 0 },
totalPriceIntero: { type: Number, default: 0 },
department: { department: {
type: String, ref: 'Department', type: String,
ref: 'Department',
}, },
items: [ items: [
{ {
order: order: { type: Schema.Types.ObjectId, ref: 'Order' },
{ type: Schema.Types.ObjectId, ref: 'Order' },
}, },
], ],
note: { note: {
type: String, type: String,
}, },
codice_sconto: {
type: String,
},
descr_sconto: {
type: String,
},
note_ordine_gas: { note_ordine_gas: {
type: String, type: String,
}, },
@@ -38,7 +44,7 @@ const CartSchema = new Schema({
}, },
}); });
var Cart = module.exports = mongoose.model('Cart', CartSchema); var Cart = (module.exports = mongoose.model('Cart', CartSchema));
module.exports.findAllIdApp = async function (idapp, userId) { module.exports.findAllIdApp = async function (idapp, userId) {
const myfind = { idapp, userId }; const myfind = { idapp, userId };
@@ -48,73 +54,113 @@ module.exports.findAllIdApp = async function (idapp, userId) {
module.exports.getCartByUserId = async function (uid, idapp) { module.exports.getCartByUserId = async function (uid, idapp) {
try { try {
const Order = require('../models/order'); const mycart = await getCart(uid, idapp);
if (!mycart) return null;
let query = { userId: uid, idapp }; await updateOrderDetails(mycart.items);
const mycart = await Cart.findOne(query).lean(); filterValidItems(mycart);
if (!!mycart) { return mycart;
for (const idkey in mycart.items) {
try {
let idorder = mycart.items[idkey]._id.toString();
let myorder = mycart.items[idkey].order;
if (!!myorder) {
idorder = mycart.items[idkey].order._id.toString();
}
if (idorder) {
let myord = await Order.getTotalOrderById(idorder);
if (myord.length > 0) {
mycart.items[idkey].order = myord[0];
}
}
} catch (e) {
console.log('err', e);
}
}
mycart.newitems = []
for (let item of mycart.items) {
if (item.order && item.order.hasOwnProperty('idapp') && (item.order.quantity > 0 || item.order.quantitypreordered > 0))
mycart.newitems.push(item)
}
mycart.items = [...mycart.newitems]
mycart.newitems = []
return mycart;
}
return null;
} catch (e) { } catch (e) {
console.log('getCartByUserId err', e); console.log('getCartByUserId err', e);
} }
}; };
module.exports.updateCartByUserId = function (userId, newCart, callback) { module.exports.getCartCompletoByCartId = async function (id_cart, idapp) {
let query = { userId: userId }; try {
Cart.find(query, function (err, c) { const mycart = await getCartById(id_cart, idapp);
if (err) throw err; if (!mycart) return null;
//exist cart in databse await updateOrderDetails(mycart.items);
if (c.length > 0) { filterValidItems(mycart);
Cart.findOneAndUpdate(
{ userId: userId }, return mycart;
} catch (e) {
console.log('getCartByUserId err', e);
}
};
// Recupera il carrello per l'utente e l'app
async function getCart(uid, idapp) {
const query = { userId: uid, idapp };
return await Cart.findOne(query).lean();
}
async function getCartById(id_cart, idapp) {
return await Cart.findOne({_id: id_cart}).lean();
}
// Aggiorna i dettagli dell'ordine per ogni articolo nel carrello
async function updateOrderDetails(items) {
const Order = require('../models/order');
for (const item of items) {
try {
const idorder = item.order ? item.order._id.toString() : item._id.toString();
const myord = await Order.getTotalOrderById(idorder);
if (myord.length > 0) {
item.order = myord[0];
}
} catch (e) {
console.log('err', e);
}
}
}
// Filtra solo gli articoli validi (con quantità > 0 o pre-ordinati)
function filterValidItems(mycart) {
mycart.newitems = [];
for (let item of mycart.items) {
if (
item.order &&
item.order.hasOwnProperty('idapp') &&
(item.order.quantity > 0 || item.order.quantitypreordered > 0)
) {
mycart.newitems.push(item);
}
}
mycart.items = [...mycart.newitems];
mycart.newitems = [];
}
module.exports.updateCartByUserId = async function (userId, newCart) {
const query = { userId: userId };
try {
// Cerca il carrello esistente nel database
const existingCart = await Cart.findOne(query);
if (existingCart) {
// Se il carrello esiste, aggiorna i dati
const updatedCart = await Cart.findOneAndUpdate(
query,
{ {
$set: { $set: {
items: newCart.items, items: newCart.items,
totalQty: newCart.totalQty, totalQty: newCart.totalQty,
totalPrice: newCart.totalPrice, totalPrice: newCart.totalPrice,
totalPriceIntero: newCart.totalPriceIntero,
totalPriceCalc: newCart.totalPriceCalc, totalPriceCalc: newCart.totalPriceCalc,
userId: userId, userId: userId,
}, },
}, },
{ new: true }, { new: true } // Restituisce il documento aggiornato
callback,
); );
return updatedCart; // Restituisce il carrello aggiornato
} else { } else {
//no cart in database // Se il carrello non esiste, crea un nuovo documento
newCart.save(callback); const createdCart = new Cart(newCart);
await createdCart.init();
const savedCart = await createdCart.save();
return savedCart; // Restituisce il carrello creato
} }
}); } catch (err) {
// Gestione degli errori
console.error("Errore durante l'aggiornamento del carrello:", err);
throw err; // Propaga l'errore al chiamante
}
}; };
module.exports.updateCartByCartId = async function (cartId, newCart) { module.exports.updateCartByCartId = async function (cartId, newCart) {
@@ -123,39 +169,52 @@ module.exports.updateCartByCartId = async function (cartId, newCart) {
const totalQty = newCart.totalQty; const totalQty = newCart.totalQty;
const totalPrice = newCart.totalPrice; const totalPrice = newCart.totalPrice;
const totalPriceCalc = newCart.totalPriceCalc; const totalPriceCalc = newCart.totalPriceCalc;
const totalPriceIntero = newCart.totalPriceIntero;
const note = newCart.note; const note = newCart.note;
const codice_sconto = newCart.codice_sconto;
const descr_sconto = newCart.descr_sconto;
const note_ordine_gas = newCart.note_ordine_gas; const note_ordine_gas = newCart.note_ordine_gas;
const modify_at = new Date(); const modify_at = new Date();
return await Cart.findOneAndUpdate({ _id: cartId }, { return await Cart.findOneAndUpdate(
$set: { { _id: cartId },
items, {
totalPrice, $set: {
totalPriceCalc, items,
totalQty, totalPrice,
note, totalPriceCalc,
note_ordine_gas, totalPriceIntero,
modify_at: new Date(), totalQty,
note,
codice_sconto,
descr_sconto,
note_ordine_gas,
modify_at: new Date(),
},
}, },
}, { new: false }).lean().then((ris) => { { new: false }
return ris; )
}).catch(err => { .lean()
console.log('err', err); .then((ris) => {
return null; return ris;
}); })
.catch((err) => {
console.log('err', err);
return null;
});
}; };
module.exports.deleteCartByCartId = async function (cartId) { module.exports.deleteCartByCartId = async function (cartId) {
return await Cart.remove({ _id: cartId }); return await Cart.deleteOne({ _id: cartId });
}; };
module.exports.createCart = async function (newCart) { module.exports.createCart = async function (newCart) {
return await newCart.save(); return await newCart.save();
}; };
Cart.createIndexes()
Cart.createIndexes((err) => { .then(() => {})
if (err) throw err; .catch((err) => {
}); throw err;
});

View File

@@ -28,9 +28,10 @@ const CashCategorySchema = new Schema({
var CashCategory = module.exports = mongoose.model('CashCategory', CashCategorySchema); var CashCategory = module.exports = mongoose.model('CashCategory', CashCategorySchema);
CashCategory.createIndexes((err) => { CashCategory.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports.getFieldsForSearch = function () { module.exports.getFieldsForSearch = function () {
return [] return []
@@ -44,7 +45,7 @@ module.exports.executeQueryTable = function (idapp, params) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await CashCategory.find(myfind); return await CashCategory.find(myfind).lean();
}; };
module.exports.getAllCashCategory = function (query, sort, callback) { module.exports.getAllCashCategory = function (query, sort, callback) {

View File

@@ -43,7 +43,7 @@ module.exports.executeQueryTable = function (idapp, params) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await CashSubCategory.find(myfind); return await CashSubCategory.find(myfind).lean();
}; };
module.exports.getAllCashSubCategory = function (query, sort, callback) { module.exports.getAllCashSubCategory = function (query, sort, callback) {
@@ -70,6 +70,7 @@ module.exports.createCashSubCategory = async function (CashSubCategory) {
}); });
} }
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -49,13 +49,14 @@ CatAISchema.statics.executeQueryTable = function (idapp, params) {
CatAISchema.statics.findAllIdApp = async function (idapp) { CatAISchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await CatAI.find(myfind).sort({ name: 1 }); return await CatAI.find(myfind).sort({ name: 1 }).lean();
}; };
const CatAI = mongoose.model('CatAI', CatAISchema); const CatAI = mongoose.model('CatAI', CatAISchema);
CatAI.createIndexes((err) => { CatAI.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = CatAI; module.exports = CatAI;

View File

@@ -1,4 +1,4 @@
const mongoose = require('mongoose').set('debug', false) const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
const tools = require('../tools/general'); const tools = require('../tools/general');
@@ -7,15 +7,13 @@ const { ObjectId } = require('mongodb');
const { IImg } = require('../models/myscheda'); const { IImg } = require('../models/myscheda');
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = "F"; mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll // Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => { mongoose.plugin((schema) => {
schema.options.usePushEach = true schema.options.usePushEach = true;
}); });
const CatalogSchema = new Schema({ const CatalogSchema = new Schema({
idapp: { idapp: {
type: String, type: String,
@@ -26,27 +24,47 @@ const CatalogSchema = new Schema({
}, },
title: { title: {
type: String, type: String,
index: true,
}, },
foto_collana: IImg, foto_collana: IImg,
idCollane: [{
idCollane: [
{
type: String,
},
],
idTipoFormato: [
{
type: Number,
},
],
argomenti: [
{
type: String,
},
],
condition_andor: {
type: Number, type: Number,
}], default: 0,
argomenti: [{ },
type: String,
}],
editore: [{ type: String }], editore: [{ type: String }],
editore_escludi: [{ type: String }],
descr_introduttiva: { descr_introduttiva: {
type: String, type: String,
}, },
idPageAssigned: { idPageAssigned: {
type: String, type: String,
}, },
idPageAssigned_stampa: { referenti: [
type: String, {
}, type: String,
referenti: [{ },
type: String, ],
}],
disattiva_link_immagini: Boolean,
img_bordata: IImg, img_bordata: IImg,
img_intro: IImg, img_intro: IImg,
@@ -55,23 +73,59 @@ const CatalogSchema = new Schema({
pagina_introduttiva_sfondo_nero: { pagina_introduttiva_sfondo_nero: {
type: Boolean, type: Boolean,
}, },
backcolor: String,
pdf_generato: String, pdf_generato: String,
pdf_generato_compressed: String,
pdf_generato_size: String,
pdf_generato_compr_size: String,
pdf_generato_stampa: String,
pdf_generato_stampa_compressed: String,
pdf_generato_stampa_compr_size: String,
pdf_generato_stampa_size: String,
data_generato: { data_generato: {
type: Date, type: Date,
}, },
data_generato_stampa: {
type: Date,
},
username_lista_generata: {
type: String,
},
data_lista_generata: {
type: Date,
},
data_lista_updated: {
type: Date,
},
username_lista_updated: {
type: String,
},
pdf_online: String, pdf_online: String,
pdf_online_size: String,
data_online: { data_online: {
type: Date, type: Date,
}, },
pdf_online_stampa: String,
pdf_online_stampa_size: String,
data_online_stampa: {
type: Date,
},
date_created: { date_created: {
type: Date, type: Date,
default: Date.now default: Date.now,
}, },
date_updated: { date_updated: {
type: Date, type: Date,
}, },
lista_prodotti: [
{
type: Schema.Types.ObjectId,
ref: 'Product',
},
],
isCatalogoGenerale: Boolean,
}); });
/* /*
@@ -86,7 +140,7 @@ CatalogSchema.pre('save', async function (next) {
*/ */
CatalogSchema.statics.getFieldsForSearch = function () { CatalogSchema.statics.getFieldsForSearch = function () {
return [{ field: 'title', type: tools.FieldType.string }] return [{ field: 'title', type: tools.FieldType.string }];
}; };
CatalogSchema.statics.executeQueryTable = function (idapp, params, user) { CatalogSchema.statics.executeQueryTable = function (idapp, params, user) {
@@ -94,7 +148,7 @@ CatalogSchema.statics.executeQueryTable = function (idapp, params, user) {
return tools.executeQueryTable(this, idapp, params, user); return tools.executeQueryTable(this, idapp, params, user);
}; };
CatalogSchema.statics.findAllIdApp = async function (idapp) { /*CatalogSchema.statics.OLD_findAllIdApp = async function (idapp) {
const Catalog = this; const Catalog = this;
const arrrec = await Catalog.aggregate([ const arrrec = await Catalog.aggregate([
@@ -116,13 +170,156 @@ CatalogSchema.statics.findAllIdApp = async function (idapp) {
]); ]);
return arrrec;
};*/
CatalogSchema.statics.findAllIdApp = async function (idapp) {
try {
const arrrec = await this.aggregate([
{ $match: { idapp } },
{ $addFields: { num_lista_prodotti: { $size: { $ifNull: ['$lista_prodotti', []] } } } },
{ $project: { lista_prodotti: 0 } },
{ $sort: { title: 1 } },
]);
return arrrec;
} catch (err) {
console.error('Errore:', err);
throw err;
}
};
CatalogSchema.statics.getCatalogById = async function (id) {
const Catalog = this;
try {
let arrrec = await Catalog.find({ _id: id })
.populate({
path: 'lista_prodotti', // Popola il campo lista_prodotti
populate: {
path: 'idProductInfo',
model: 'ProductInfo',
populate: [
{
path: 'idCatProds',
model: 'CatProd',
},
{
path: 'idSubCatProds',
model: 'SubCatProd',
},
{
path: 'idAuthors',
model: 'Author',
},
],
},
})
.populate({
path: 'lista_prodotti',
populate: {
path: 'idProducer',
model: 'Producer',
},
})
.populate({
path: 'lista_prodotti',
populate: {
path: 'idProvider',
model: 'Provider',
},
})
.populate({
path: 'lista_prodotti',
populate: {
path: 'idStorehouses',
model: 'Storehouse',
},
})
.populate({
path: 'lista_prodotti',
populate: {
path: 'idScontisticas',
model: 'Scontistica',
},
})
.populate({
path: 'lista_prodotti',
populate: {
path: 'idGasordine',
model: 'Gasordine',
},
});
// controlla prima se nella lista ci sono dei product che non esistono piu allora li devi rimuovere !
for (const catalog of arrrec) {
const originalLength = catalog.lista_prodotti.length;
catalog.lista_prodotti = catalog.lista_prodotti.filter(
(product) =>
product.idProductInfo &&
product.idProductInfo.code &&
product.idProductInfo.code !== '' &&
product.idProductInfo.imagefile &&
product.idProductInfo.imagefile !== 'noimg.jpg' &&
!product.delete
);
if (catalog.lista_prodotti.length !== originalLength) {
await catalog.save();
}
}
const transformedArrRec = arrrec.map((catalog) => ({
...catalog.toObject(), // Converte il documento Mongoose in un oggetto JavaScript puro
lista_prodotti: catalog.lista_prodotti.map((product) => ({
...product.toObject(),
productInfo: {
...product.idProductInfo.toObject(), // Copia tutti i campi di idProductInfo
catprods: product.idProductInfo.idCatProds, // Rinomina idCatProds in catprods
subcatprods: product.idProductInfo.idSubCatProds,
collana: product.idProductInfo.idCollana,
authors: product.idProductInfo.idAuthors,
},
producer: product.idProducer,
storehouse: product.idStorehouses,
scontisticas: product.idScontisticas,
gasordine: product.idGasordine,
idProductInfo: product.idProductInfo._id, // CHECK
})),
}));
return transformedArrRec && transformedArrRec.length > 0 ? transformedArrRec[0] : null;
} catch (err) {
console.error('Errore: ', err);
return null;
}
};
CatalogSchema.statics.executeQueryPickup = async function (idapp, params) {
const strfind = params.search;
if (strfind === '') {
return [];
}
// Cerca title
const reg = new RegExp(strfind, 'i');
const arrrec = await this.find({
idapp,
title: reg,
})
.sort({ title: 1 })
.limit(10)
.select('title _id')
.lean();
return arrrec; return arrrec;
}; };
const Catalog = mongoose.model('Catalog', CatalogSchema); const Catalog = mongoose.model('Catalog', CatalogSchema);
Catalog.createIndexes((err) => { Catalog.createIndexes()
if (err) throw err; .then(() => {})
}); .catch((err) => {
throw err;
});
module.exports = { Catalog }; module.exports = { Catalog };

View File

@@ -45,14 +45,15 @@ CategorySchema.statics.executeQueryTable = function (idapp, params) {
CategorySchema.statics.findAllIdApp = async function (idapp) { CategorySchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Category.find(myfind); return await Category.find(myfind).lean();
}; };
const Category = mongoose.model('Category', CategorySchema); const Category = mongoose.model('Category', CategorySchema);
Category.createIndexes((err) => { Category.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Category }; module.exports = { Category };

View File

@@ -80,8 +80,9 @@ CatGrpSchema.statics.executeQueryTable = function (idapp, params) {
const CatGrp = mongoose.model('CatGrp', CatGrpSchema); const CatGrp = mongoose.model('CatGrp', CatGrpSchema);
CatGrp.createIndexes((err) => { CatGrp.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { CatGrp }; module.exports = { CatGrp };

View File

@@ -21,6 +21,7 @@ const CatProdSchema = new Schema({
}, },
name: { name: {
type: String, type: String,
index: 1,
}, },
descr_estesa: { descr_estesa: {
type: String, type: String,
@@ -34,6 +35,9 @@ const CatProdSchema = new Schema({
color: { color: {
type: String, type: String,
}, },
quanti: {
type: Number,
}
}); });
CatProdSchema.statics.getAllCategories = function (callback) { CatProdSchema.statics.getAllCategories = function (callback) {
@@ -55,16 +59,16 @@ CatProdSchema.statics.executeQueryTable = function (idapp, params) {
CatProdSchema.statics.findAllIdApp = async function (idapp) { CatProdSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await CatProd.find(myfind).sort({ name: 1 }); return await CatProd.find(myfind).sort({ name: 1 }).lean();
}; };
CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp) { CatProdSchema.statics.updateCatDeleteEmpty = async function (idapp) {
try { try {
const result = await CatProd.aggregate([ const toDelete = await CatProd.aggregate([
{ $match: { idapp } }, { $match: { idapp } },
{ {
$lookup: { $lookup: {
from: 'productinfos', // Nome della tua collezione productInfo from: 'productinfos',
localField: '_id', localField: '_id',
foreignField: 'idCatProds', foreignField: 'idCatProds',
as: 'products' as: 'products'
@@ -77,9 +81,86 @@ CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp) {
quanti: { $size: '$products' } // Conta il numero di prodotti per ciascun CatProd quanti: { $size: '$products' } // Conta il numero di prodotti per ciascun CatProd
} }
}, },
{ $sort: { name: 1 } } // Ordina i risultati per nome { $match: { quanti: 0 } },
]); ]);
if (toDelete.length > 0) {
const ids = toDelete.map(x => x._id);
const ris = await CatProd.deleteMany({ _id: { $in: ids } });
const deletedRecs = toDelete.map(x => ({ _id: x._id, name: x.name }));
if (deletedRecs.length > 0) {
return `Lista Argomenti cancellati: ${deletedRecs.map(x => x.name).join(', ')}`;
}
}
return "Nessun argomento cancellato";
} catch (error) {
console.error('Error UpdateCatDeleteEmpty:', error);
return error;
}
};
CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp, updatedata) {
try {
const myquery = [
{ $match: { idapp } },
{
$lookup: {
from: 'productinfos', // Nome della tua collezione productInfo
localField: '_id',
foreignField: 'idCatProds',
as: 'products'
}
},
{
$addFields: {
myproducts: {
$filter: {
input: "$products",
as: "prod",
cond: {
$in: ["$$prod.idStatoProdotto", [1, 4, 34, 45, 46]]
}
}
}
}
}, {
$project: {
_id: 1,
name: 1,
idArgomento: 1,
descr_estesa: 1,
img: 1,
icon: 1,
color: 1,
quanti: { $size: '$myproducts' }, // Conta il numero di prodotti per ciascun CatProd
/*products: {
$map: {
input: "$myproducts",
as: "prod",
in: {
name: "$$prod.name"
}
}
}*/
}
},
{ $sort: { name: 1 } } // Ordina i risultati per nome
];
const result = await CatProd.aggregate(myquery);
if (updatedata) {
for (const record of result) {
await CatProd.updateOne(
{ _id: record._id },
{ $set: { quanti: record.quanti } }
);
}
}
return result; return result;
} catch (error) { } catch (error) {
console.error('Error retrieving CatProd with title count:', error); console.error('Error retrieving CatProd with title count:', error);
@@ -90,9 +171,10 @@ CatProdSchema.statics.getCatProdWithTitleCount = async function (idapp) {
const CatProd = mongoose.model('CatProd', CatProdSchema); const CatProd = mongoose.model('CatProd', CatProdSchema);
CatProd.createIndexes((err) => { CatProd.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = CatProd; module.exports = CatProd;

View File

@@ -43,9 +43,10 @@ CfgServerSchema.statics.findAllIdApp = async function(idapp) {
const CfgServer = mongoose.model('CfgServer', CfgServerSchema); const CfgServer = mongoose.model('CfgServer', CfgServerSchema);
CfgServer.createIndexes((err) => { CfgServer.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = {CfgServer}; module.exports = {CfgServer};

View File

@@ -270,7 +270,7 @@ CircuitSchema.statics.findAllIdApp = async function (idapp) {
const whatToShow = this.getWhatToShow(idapp, ''); const whatToShow = this.getWhatToShow(idapp, '');
return await Circuit.find(myfind, whatToShow).lean().sort({ name: 1 }); return await Circuit.find(myfind, whatToShow).sort({ name: 1 }).lean();
}; };
CircuitSchema.statics.isCircuitAdmin = async function (idrec, username) { CircuitSchema.statics.isCircuitAdmin = async function (idrec, username) {
@@ -607,7 +607,7 @@ CircuitSchema.statics.getCircuitById = async function (circuitId) {
CircuitSchema.statics.deleteCircuit = async function (idapp, usernameOrig, name) { CircuitSchema.statics.deleteCircuit = async function (idapp, usernameOrig, name) {
console.log('Circuito ' + name + ' rimosso da ' + usernameOrig); console.log('Circuito ' + name + ' rimosso da ' + usernameOrig);
return await Circuit.findOneAndRemove({ idapp, name }); return await Circuit.findOneAndDelete({ idapp, name });
}; };
@@ -720,6 +720,7 @@ CircuitSchema.statics.sendCoins = async function (onlycheck, idapp, usernameOrig
let ris = { let ris = {
result: false, result: false,
cansend: true, cansend: true,
errorcode: 0,
errormsg: '', errormsg: '',
rec: null, rec: null,
useraccounts: [], useraccounts: [],
@@ -768,11 +769,13 @@ CircuitSchema.statics.sendCoins = async function (onlycheck, idapp, usernameOrig
if (accountorigTable.saldo - myqty < -accountorigTable.fidoConcesso) { if (accountorigTable.saldo - myqty < -accountorigTable.fidoConcesso) {
ris.cansend = false; ris.cansend = false;
ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_FIDO', usernameOrig); ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_FIDO', usernameOrig);
ris.errorcode = shared_consts.SENDRIS_CODES.EXCEED_FIDO;
} }
if (accountdestTable.saldo + myqty > accountdestTable.qta_maxConcessa) { if (accountdestTable.saldo + myqty > accountdestTable.qta_maxConcessa) {
ris.cansend = false; ris.cansend = false;
ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_QTAMAX', extrarec.dest); ris.errormsg = i18n.__('CIRCUIT_AMOUNT_EXCEED_QTAMAX', extrarec.dest);
ris.errorcode = shared_consts.SENDRIS_CODES.EXCEED_QTAMAX;
} }
} }
@@ -1338,7 +1341,7 @@ CircuitSchema.statics.setFido = async function (idapp, username, circuitName, gr
const ris = await Account.updateFido(idapp, username, groupname, circuitId, fido); const ris = await Account.updateFido(idapp, username, groupname, circuitId, fido);
if (ris) { if (ris) {
return { qta_maxConcessa: qtamax, fidoConcesso: fido, changed: variato || (ris && ris.nModified > 0) }; return { qta_maxConcessa: qtamax, fidoConcesso: fido, changed: variato || (ris && ris.modifiedCount > 0) };
} }
} }
} }
@@ -1796,8 +1799,9 @@ CircuitSchema.statics.addMovementByOrdersCart = async function (ordersCart, user
const Circuit = mongoose.model('Circuit', CircuitSchema); const Circuit = mongoose.model('Circuit', CircuitSchema);
Circuit.createIndexes((err) => { Circuit.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Circuit }; module.exports = { Circuit };

View File

@@ -200,7 +200,7 @@ CitySchema.statics.executeQueryPickup = async function (idapp, params) {
CitySchema.statics.findAllIdApp = async function (idapp) { CitySchema.statics.findAllIdApp = async function (idapp) {
const myfind = {}; const myfind = {};
return await City.find(myfind); return await City.find(myfind).lean();
}; };
CitySchema.statics.getGeoJsonByProvince = async function (prov) { CitySchema.statics.getGeoJsonByProvince = async function (prov) {
@@ -256,7 +256,7 @@ CitySchema.statics.insertGeojsonToMongoDB = async function (nomefilejson) {
if (reccity) { if (reccity) {
const ris = await City.updateOne({ _id: reccity._id }, { $set: { geojson: citta } }); const ris = await City.updateOne({ _id: reccity._id }, { $set: { geojson: citta } });
if (ris.ok === 1) { if (ris.acknowledged) {
inseriti++; inseriti++;
} }
} }
@@ -274,8 +274,9 @@ CitySchema.statics.insertGeojsonToMongoDB = async function (nomefilejson) {
const City = mongoose.model('City', CitySchema); const City = mongoose.model('City', CitySchema);
City.createIndexes((err) => { City.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { City }; module.exports = { City };

View File

@@ -20,6 +20,7 @@ const CollanaSchema = new Schema({
}, },
title: { title: {
type: String, type: String,
index: true,
}, },
dataOra: { dataOra: {
type: Date, type: Date,
@@ -30,6 +31,9 @@ const CollanaSchema = new Schema({
enabledAlFresco: { enabledAlFresco: {
type: Boolean, type: Boolean,
}, },
quanti: {
type: Number,
},
}); });
@@ -52,6 +56,74 @@ module.exports.findAllIdApp = async function (idapp) {
return await Collana.find(myfind).sort({title: 1}).lean(); return await Collana.find(myfind).sort({title: 1}).lean();
}; };
module.exports.createIndexes((err) => { module.exports.getCollaneWithTitleCount = async function (idapp, updatedata) {
if (err) throw err; try {
});
const myquery = [
{ $match: { idapp } },
{
$lookup: {
from: 'productinfos', // Nome della tua collezione productInfo
localField: '_id',
foreignField: 'idCollana',
as: 'products'
}
},
{
$addFields: {
myproducts: {
$filter: {
input: "$products",
as: "prod",
cond: {
$in: ["$$prod.idStatoProdotto", [1, 4, 34, 45, 46]]
}
}
}
}
}, {
$project: {
_id: 1,
title: 1,
idCollana: 1,
dataOra: 1,
quanti: { $size: '$myproducts' },
products: {
$map: {
input: "$myproducts",
as: "prod",
in: {
name: "$$prod.name"
}
}
}
}
},
{ $match: { quanti: { $gt: 0 } } }, // esclude i record con quanti = 0
{ $sort: { title: 1 } } // Ordina i risultati per nome
];
const result = await Collana.aggregate(myquery);
if (updatedata) {
for (const record of result) {
await Collana.updateOne(
{ _id: record._id },
{ $set: { quanti: record.quanti } }
);
}
}
return result;
} catch (error) {
console.error('Error retrieving idCollana with title count:', error);
throw error;
}
}
module.exports.createIndexes()
.then(() => { })
.catch((err) => { throw err; });

View File

@@ -47,15 +47,14 @@ ContribtypeSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Contribtype.find(myfind, (err, arrrec) => { return await Contribtype.find(myfind).lean();
return arrrec
}).lean();
}; };
const Contribtype = mongoose.model('Contribtype', ContribtypeSchema); const Contribtype = mongoose.model('Contribtype', ContribtypeSchema);
Contribtype.createIndexes((err) => { Contribtype.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Contribtype }; module.exports = { Contribtype };

176
src/server/models/cron.js Executable file
View File

@@ -0,0 +1,176 @@
const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema;
const tools = require('../tools/general');
const shared_consts = require('../tools/shared_nodejs');
mongoose.Promise = global.Promise;
mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll
mongoose.plugin((schema) => {
schema.options.usePushEach = true;
});
const CronMod = require('../modules/CronMod');
const CronSchema = new Schema({
idapp: {
type: String,
},
active: {
type: Boolean,
default: false,
},
descr: {
type: String,
},
nomeFunzioneDbOp: {
type: String,
},
startTime: {
// Orario iniziale (es. "08:30")
type: String,
},
everyXMinutes: {
// Esegui ogni X ore
type: Number,
},
quanteVolteEseguito: {
type: Number,
default: 0,
},
quanteVolteEseguiAlGG: {
type: Number,
default: 1,
},
lastJobStarted: {
type: Date,
},
lastJobEnd: {
type: Date,
},
log: {
type: String,
},
status: {
type: Number,
},
date_created: {
type: Date,
default: Date.now,
},
date_updated: {
type: Date,
},
});
CronSchema.statics.getFieldsForSearch = function () {
return [{ field: 'descr', type: tools.FieldType.string }];
};
CronSchema.statics.executeQueryTable = function (idapp, params, user) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params, user);
};
CronSchema.statics.startJobCron = async function (idapp) {
// Esegui un loop su tutti i cron job che trovi per l'idapp specificato
const Cron = this;
try {
const cronJobs = await Cron.find({ idapp, active: true });
// console.log('Check startJobCron...', idapp);
const mycronMod = new CronMod();
const currentDate = new Date();
for (const mycron of cronJobs) {
const jobTime = new Date();
const [hours, minutes] = mycron.startTime.split(':');
jobTime.setHours(hours, minutes, 0, 0);
// Check if jobTime has passed and if 'everyXMinutes' have elapsed since last execution
if (!mycron.quanteVolteEseguito) mycron.quanteVolteEseguito = 0;
const timesPerDay = mycron.quanteVolteEseguiAlGG || 1;
const startDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
let lastJobDate = null;
if (mycron.lastJobStarted) {
lastJobDate = new Date(
mycron.lastJobStarted.getFullYear(),
mycron.lastJobStarted.getMonth(),
mycron.lastJobStarted.getDate()
);
}
let tempooltre = currentDate - mycron.lastJobStarted >= mycron.everyXMinutes * 60 * 1000;
const canExecute =
(!mycron.lastJobStarted || // se non c'è un ultimo eseguito, esegui
tempooltre) && // se è passato il tempo di attesa, esegui
(mycron.lastJobStarted && (mycron.quanteVolteEseguito < timesPerDay) || // se non ho ancora raggiunto il numero di esecuzioni al giorno
(!lastJobDate || (startDate.getTime() !== lastJobDate.getTime()))); // se non è lo stesso giorno, esegui
if (canExecute) {
if (currentDate >= jobTime) {
// Execute the function at the scheduled time
console.log(`Sto eseguendo il Cron Job: ${mycron.nomeFunzioneDbOp} alle ${currentDate.toLocaleTimeString()}`);
const status = shared_consts.STATUS_JOB.START;
if (!lastJobDate || startDate.getTime() !== lastJobDate.getTime()) {
mycron.quanteVolteEseguito = 0;
}
const quanteVolteEseguito = mycron.quanteVolteEseguito + 1;
await Cron.findOneAndUpdate(
{ _id: mycron._id },
{ $set: { lastJobStarted: currentDate, status, quanteVolteEseguito } },
{ new: true }
);
mycronMod
.eseguiDbOp(idapp, { dbop: mycron.nomeFunzioneDbOp }, null, null)
.then(async (ris) => {
console.log(`${currentDate.toLocaleTimeString()} LOG JOB: ${ris.mystr}`);
const myid = mycron._id;
const status = shared_consts.STATUS_JOB.FINISH;
const risupdate = await Cron.findOneAndUpdate(
{ _id: myid },
{ $set: { lastJobEnd: new Date(), status } },
{ new: true }
);
})
.catch(async (err) => {
const log = "Errore durante l'esecuzione del job: " + err.message || err;
const status = shared_consts.STATUS_JOB.ERR;
await Cron.findOneAndUpdate({ _id: mycron._id }, { $set: { log, status } }, { new: true });
console.error(log);
});
}
}
}
} catch (e) {
console.error('Error startJobCron:', e);
return false;
}
};
CronSchema.statics.findAllIdApp = async function (idapp) {
const Cron = this;
try {
return await Cron.find({ idapp }).then((arrrec) => {
return arrrec;
});
} catch (err) {
console.error('Errore: ', err);
}
};
const Cron = mongoose.model('Cron', CronSchema);
Cron.createIndexes()
.then(() => {})
.catch((err) => {
throw err;
});
module.exports = { Cron };

View File

@@ -26,9 +26,10 @@ const departmentSchema = new Schema({
var Department = module.exports = mongoose.model('Department', departmentSchema); var Department = module.exports = mongoose.model('Department', departmentSchema);
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports.getFieldsForSearch = function () { module.exports.getFieldsForSearch = function () {
return [{ field: 'name', type: tools.FieldType.string }, return [{ field: 'name', type: tools.FieldType.string },
@@ -44,6 +45,6 @@ module.exports.executeQueryTable = function (idapp, params) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Department.find(myfind); return await Department.find(myfind).lean();
}; };

View File

@@ -0,0 +1,59 @@
const mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
const tools = require('../tools/general');
mongoose.Promise = global.Promise;
mongoose.level = "F";
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const DestNewsletterSchema = new Schema({
idapp: {
type: String,
},
descr: {
type: String,
},
tipodest_id: {
type: Number,
},
});
DestNewsletterSchema.statics.getFieldsForSearch = function () {
return []
};
DestNewsletterSchema.statics.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, idapp, params);
};
DestNewsletterSchema.statics.DuplicateAllRecords = async function (idapporig, idappdest) {
return await tools.DuplicateAllRecords(this, idapporig, idappdest);
};
DestNewsletterSchema.statics.findAllIdApp = async function (idapp) {
const DestNewsletter = this;
const myfind = { idapp };
return await DestNewsletter.find(myfind).lean();
};
const DestNewsletter = mongoose.model('DestNewsletter', DestNewsletterSchema);
DestNewsletter.createIndexes()
.then(() => { })
.catch((err) => { throw err; });
module.exports = { DestNewsletter };

View File

@@ -106,8 +106,9 @@ DisciplineSchema.statics.DuplicateAllRecords = async function (idapporig, idappd
const Discipline = mongoose.model('Discipline', DisciplineSchema); const Discipline = mongoose.model('Discipline', DisciplineSchema);
Discipline.createIndexes((err) => { Discipline.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Discipline }; module.exports = { Discipline };

View File

@@ -228,9 +228,8 @@ ExtraListSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await ExtraList.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(this, myfind);
return arrrec
});
}; };
ExtraListSchema.statics.DuplicateAllRecords = async function (idapporig, idappdest) { ExtraListSchema.statics.DuplicateAllRecords = async function (idapporig, idappdest) {
@@ -332,9 +331,10 @@ ExtraListSchema.statics.ImportData = async function (locale, idapp, strdata) {
const ExtraList = mongoose.model('ExtraList', ExtraListSchema); const ExtraList = mongoose.model('ExtraList', ExtraListSchema);
ExtraList.createIndexes((err) => { ExtraList.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { ExtraList }; module.exports = { ExtraList };

View File

@@ -57,15 +57,14 @@ GallerySchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Gallery.find(myfind, (err, arrrec) => { return await Gallery.find(myfind).lean();
return arrrec
});
}; };
const Gallery = mongoose.model('Gallery', GallerySchema); const Gallery = mongoose.model('Gallery', GallerySchema);
Gallery.createIndexes((err) => { Gallery.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Gallery }; module.exports = { Gallery };

View File

@@ -78,6 +78,7 @@ module.exports.getGasordineByID = function (id, callback) {
Gasordine.findById(id, callback); Gasordine.findById(id, callback);
} }
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -80,8 +80,9 @@ GoodSchema.statics.executeQueryTable = function (idapp, params) {
const Good = mongoose.model('Good', GoodSchema); const Good = mongoose.model('Good', GoodSchema);
Good.createIndexes((err) => { Good.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Good }; module.exports = { Good };

View File

@@ -312,9 +312,7 @@ GraduatoriaSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Graduatoria.find(myfind, (err, arrrec) => { return await Graduatoria.find(myfind).lean();
return arrrec
});
}; };
GraduatoriaSchema.statics.isWorking = function (idapp) { GraduatoriaSchema.statics.isWorking = function (idapp) {
@@ -415,8 +413,9 @@ GraduatoriaSchema.statics.getPosizioneInGraduatoria = async function (idapp, ind
const Graduatoria = mongoose.model('Graduatoria', GraduatoriaSchema); const Graduatoria = mongoose.model('Graduatoria', GraduatoriaSchema);
Graduatoria.createIndexes((err) => { Graduatoria.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Graduatoria }; module.exports = { Graduatoria };

View File

@@ -44,9 +44,10 @@ module.exports.executeQueryTable = function (idapp, params) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await Group.find(myfind); return await Group.find(myfind).lean();
}; };
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -226,6 +226,7 @@ module.exports.calculateHoursTodo = async function (idtodo) {
}; };
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -57,7 +57,10 @@ module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp, deleted: false }; const myfind = { idapp, deleted: false };
return await ImportaDescr.find(myfind, (err, arrrec) => { try {
return arrrec; return await ImportaDescr.find(myfind).lean();
}); } catch (err) {
console.error("Errore in ImportaDescr:", err);
return null;
}
}; };

View File

@@ -57,7 +57,10 @@ module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp, deleted: false }; const myfind = { idapp, deleted: false };
return await ImportaIsbn.find(myfind, (err, arrrec) => { try {
return arrrec; return await ImportaIsbn.find(myfind).lean();
}); } catch (err) {
console.error("Errore in ImportaIsbn:", err);
return null;
}
}; };

View File

@@ -57,7 +57,12 @@ module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp, deleted: false }; const myfind = { idapp, deleted: false };
return await ImportaMacro.find(myfind, (err, arrrec) => {
return arrrec; try {
}); return await ImportaMacro.find(myfind).lean();
} catch (err) {
console.error("Errore in ImportaMacro:", err);
return null;
}
}; };

View File

@@ -53,7 +53,6 @@ module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp, deleted: false }; const myfind = { idapp, deleted: false };
return await Inventariogm.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(Inventariogm, myfind);
return arrrec;
});
}; };

View File

@@ -192,11 +192,10 @@ module.exports.findAllIdApp = async function(idapp) {
const myfind = {idapp}; const myfind = {idapp};
return await IscrittiArcadei.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(this, myfind);
return arrrec;
});
}; };
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -189,14 +189,12 @@ module.exports.findByEmail = function (idapp, email) {
module.exports.findAllIdApp = async function (idapp) { module.exports.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await IscrittiConacreis.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(this, myfind);
return arrrec
});
}; };
module.exports.createIndexes((err) => { module.exports.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });

View File

@@ -55,9 +55,7 @@ LevelSchema.statics.findAllIdApp = async function(idapp) {
{$sort: {_id: 1}}, {$sort: {_id: 1}},
]; ];
return await Level.aggregate(query).then((arrrec) => { return Level.aggregate(query);
return arrrec;
});
}; };
@@ -73,8 +71,9 @@ LevelSchema.statics.executeQueryTable = function(idapp, params) {
const Level = mongoose.model('Level', LevelSchema); const Level = mongoose.model('Level', LevelSchema);
Level.createIndexes((err) => { Level.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = {Level}; module.exports = {Level};

View File

@@ -36,9 +36,42 @@ MailingListSchema.statics.findAllIdAppSubscribed = function (idapp) {
// Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit. // Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit.
return User.find(myfind, (err, arrrec) => { return tools.findAllQueryIdApp(User, myfind);
return arrrec };
});
MailingListSchema.statics.findAllIdAppDiarioSubscr = function (idapp) {
const myfind = {
idapp,
diario_on: true,
$or: [
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
$or: [
{ email_errata: { $exists: false } },
{ email_errata: { $exists: true, $ne: true } }],
};
// Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit.
return tools.findAllQueryIdApp(User, myfind);
};
MailingListSchema.statics.findAllIdAppDiarioSubscr = function (idapp) {
const myfind = {
idapp,
test: true,
$or: [
{ deleted: { $exists: false } },
{ deleted: { $exists: true, $eq: false } }],
$or: [
{ email_errata: { $exists: false } },
{ email_errata: { $exists: true, $ne: true } }],
};
// Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit.
return tools.findAllQueryIdApp(User, myfind);
}; };
MailingListSchema.statics.getnumSent = async function (idapp, idUser) { MailingListSchema.statics.getnumSent = async function (idapp, idUser) {
@@ -62,12 +95,9 @@ MailingListSchema.statics.isOk = async function (idapp, iduser, idUser) {
MailingListSchema.statics.findAllIdApp = async function (idapp) { MailingListSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await User.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(User, myfind);
return arrrec
});
}; };
MailingListSchema.statics.isUnsubscribed = async function (idapp, hash) { MailingListSchema.statics.isUnsubscribed = async function (idapp, hash) {
@@ -84,15 +114,14 @@ MailingListSchema.statics.findByHash = function (idapp, hash) {
// Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit. // Extract only the Teacher where in the users table the field permissions is set 'Teacher' bit.
return User.findOne(myfind, (err, rec) => { return User.findOne(myfind).lean();
return rec
});
}; };
const MailingList = mongoose.model('MailingList', MailingListSchema); const MailingList = mongoose.model('MailingList', MailingListSchema);
User.createIndexes((err) => { User.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { MailingList }; module.exports = { MailingList };

View File

@@ -72,9 +72,8 @@ MovementSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await MyMovement.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(MyMovement, myfind);
return arrrec;
});
}; };
MovementSchema.pre('save', async function (next) { MovementSchema.pre('save', async function (next) {
@@ -1069,8 +1068,9 @@ MovementSchema.statics.getLastN_Transactions = async function (idapp, numtransaz
const Movement = mongoose.model('Movement', MovementSchema); const Movement = mongoose.model('Movement', MovementSchema);
Movement.createIndexes((err) => { Movement.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { Movement }; module.exports = { Movement };

View File

@@ -118,15 +118,15 @@ MsgTemplateSchema.statics.findAllIdApp = async function (idapp) {
const myfind = { idapp }; const myfind = { idapp };
return await MsgTemplate.find(myfind, (err, arrrec) => { return await tools.findAllQueryIdApp(this, myfind);
return arrrec
});
}; };
const MsgTemplate = mongoose.model('MsgTemplate', MsgTemplateSchema); const MsgTemplate = mongoose.model('MsgTemplate', MsgTemplateSchema);
MsgTemplate.createIndexes((err) => { MsgTemplate.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { MsgTemplate }; module.exports = { MsgTemplate };

View File

@@ -143,9 +143,7 @@ MyBachecaSchema.statics.findAllIdApp = async function (idapp) {
{ $sort: { descr: 1 } }, { $sort: { descr: 1 } },
]; ];
return await MyBacheca.aggregate(query).then((arrrec) => { return await MyBacheca.aggregate(query);
return arrrec;
});
}; };
@@ -383,8 +381,9 @@ MyBachecaSchema.statics.getCompleteRecord = function (idapp, id) {
const MyBacheca = mongoose.model('MyBacheca', MyBachecaSchema); const MyBacheca = mongoose.model('MyBacheca', MyBachecaSchema);
MyBacheca.createIndexes((err) => { MyBacheca.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = { MyBacheca }; module.exports = { MyBacheca };

View File

@@ -1,4 +1,4 @@
const mongoose = require('mongoose').set('debug', false) const mongoose = require('mongoose').set('debug', false);
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
const tools = require('../tools/general'); const tools = require('../tools/general');
@@ -6,90 +6,91 @@ const { ObjectId } = require('mongodb');
const { MySchedaSchema, IDimensioni, IImg, IText, IAreaDiStampa } = require('../models/myscheda'); const { MySchedaSchema, IDimensioni, IImg, IText, IAreaDiStampa } = require('../models/myscheda');
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = "F"; mongoose.level = 'F';
// Resolving error Unknown modifier: $pushAll // Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => { mongoose.plugin((schema) => {
schema.options.usePushEach = true schema.options.usePushEach = true;
}); });
const IElementiPagina = new Schema({ const IElementiPagina = new Schema({
isTemplate: Boolean,
linkIdTemplate: String,
name: String,
pagina: IDimensioni, pagina: IDimensioni,
}); });
const myCard = new Schema( const myCard = new Schema({
{ imagefile: String,
imagefile: String, vers_img: Number,
vers_img: Number, alt: String,
alt: String, description: String,
description: String, style: String,
style: String, size: String,
size: String, color: String,
color: String, content: String,
content: String, colorsub: String,
colorsub: String, link: String,
link: String, });
} const animation = new Schema({
) name: String,
const animation = new Schema( clduration: String,
{ cldelay: String,
name: String, timingtype: String,
clduration: String, });
cldelay: String,
timingtype: String,
}
);
const elemText = new Schema( const elemText = new Schema({
{ text: String,
text: String, color: String,
color: String, class: String,
class: String, size: String,
size: String, anim: animation,
anim: animation, });
}
);
const catalogo = new Schema({
//++AddCATALOGO_FIELDS
idCatalogSel: { type: String },
productTypes: [{ type: Number }],
excludeproductTypes: [{ type: Number }],
editore: [{ type: String }],
argomenti: [{ type: String }],
idCollane: [{ type: String }],
idTipologia: [{ type: Number }],
idTipoFormato: [{ type: Number }],
sort_field: { type: String },
sort_dir: { type: Number },
pdf: { type: Boolean },
pdf_filename: { type: String },
printable: { type: Boolean },
indebug: { type: Boolean },
maxnumlibri: { type: Number },
showListaArgomenti: { type: Boolean },
showOnlyCatalogoPDF: { type: Boolean },
showListaCollane: { type: Boolean },
const catalogo = new Schema( first_page: IDimensioni,
{ last_page: IDimensioni,
//++AddCATALOGO_FIELDS areadistampa: IAreaDiStampa,
productTypes: [{ type: Number }],
excludeproductTypes: [{ type: Number }],
editore: [{ type: String }],
argomenti: [{ type: String }],
idCollane: [{ type: Number }],
sort_field: { type: String },
sort_dir: { type: Number },
pdf: { type: Boolean },
pdf_filename: { type: String },
printable: { type: Boolean },
indebug: { type: Boolean },
maxnumlibri: { type: Number },
first_page: IDimensioni, print_isTemplate: Boolean,
last_page: IDimensioni, print_linkIdTemplate: String,
areadistampa: IAreaDiStampa,
dimensioni_def: IElementiPagina, dimensioni_def: IElementiPagina,
// ------------------- // -------------------
arrSchede: [ arrSchede: [
{ {
scheda: MySchedaSchema, scheda: MySchedaSchema,
order: { type: Number }, order: { type: Number },
numPagineMax: { type: Number }, numPagineMax: { type: Number },
/*arrProdToShow: { /*arrProdToShow: {
type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo type: [[mongoose.Schema.Types.Mixed]], // Definizione tipo
select: false // Imposta il campo come non selezionabile select: false // Imposta il campo come non selezionabile
},*/ },*/
} },
], ],
} });
);
const MyElemSchema = new Schema({ const MyElemSchema = new Schema({
idapp: { idapp: {
@@ -98,9 +99,9 @@ const MyElemSchema = new Schema({
path: { path: {
type: String, type: String,
}, },
oldpath: { /*oldpath: {
type: String, type: String,
}, },*/
idPage: { type: String }, idPage: { type: String },
type: { type: {
type: Number, type: Number,
@@ -233,25 +234,25 @@ const MyElemSchema = new Schema({
list: [ list: [
{ {
imagefile: { imagefile: {
type: String type: String,
}, },
vers_img: { vers_img: {
type: Number, type: Number,
}, },
order: { order: {
type: Number type: Number,
}, },
alt: { alt: {
type: String type: String,
}, },
description: { description: {
type: String type: String,
} },
} },
], ],
date_created: { date_created: {
type: Date, type: Date,
default: Date.now default: Date.now,
}, },
date_updated: { date_updated: {
type: Date, type: Date,
@@ -267,8 +268,10 @@ MyElemSchema.pre('save', async function (next) {
}); });
MyElemSchema.statics.getFieldsForSearch = function () { MyElemSchema.statics.getFieldsForSearch = function () {
return [{ field: 'title', type: tools.FieldType.string }, return [
{ field: 'content', type: tools.FieldType.string }] { field: 'title', type: tools.FieldType.string },
{ field: 'content', type: tools.FieldType.string },
];
}; };
MyElemSchema.statics.executeQueryTable = function (idapp, params, user) { MyElemSchema.statics.executeQueryTable = function (idapp, params, user) {
@@ -288,7 +291,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
// Utilizza una mappa per accoppiare i path con i loro Id // Utilizza una mappa per accoppiare i path con i loro Id
const pathToIdMap = {}; const pathToIdMap = {};
pages.forEach(page => { pages.forEach((page) => {
pathToIdMap[page.path] = page._id; // Mappa il path all'ID del documento MyPage pathToIdMap[page.path] = page._id; // Mappa il path all'ID del documento MyPage
}); });
@@ -303,7 +306,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
idPage: id, idPage: id,
oldpath: path, oldpath: path,
}, },
$unset: { path: "" } // Rimuove il campo path $unset: { path: '' }, // Rimuove il campo path
} // Imposta IdPage all'ID del documento corrispondente } // Imposta IdPage all'ID del documento corrispondente
); );
} }
@@ -312,7 +315,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
if (false) { if (false) {
// Utilizza una mappa per accoppiare i path con i loro Id // Utilizza una mappa per accoppiare i path con i loro Id
const pathToIdMap2 = {}; const pathToIdMap2 = {};
pages.forEach(page => { pages.forEach((page) => {
pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage
}); });
@@ -321,7 +324,7 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
await MyElem.updateMany( await MyElem.updateMany(
{ oldpath: path }, // Condizione per aggiornare dove il path corrisponde { oldpath: path }, // Condizione per aggiornare dove il path corrisponde
{ {
$unset: { idPage: "" } // Rimuove il campo path $unset: { idPage: '' }, // Rimuove il campo path
} // Imposta IdPage all'ID del documento corrispondente } // Imposta IdPage all'ID del documento corrispondente
); );
} }
@@ -330,14 +333,14 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
await MyElem.updateMany( await MyElem.updateMany(
{ oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde { oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde
{ {
$set: { idPage: id } $set: { idPage: id },
} // Imposta IdPage all'ID del documento corrispondente } // Imposta IdPage all'ID del documento corrispondente
); );
} }
} }
const pathToIdMap2 = {}; const pathToIdMap2 = {};
pages.forEach(page => { pages.forEach((page) => {
pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage pathToIdMap2[page.path] = page._id.toString(); // Mappa il path all'ID del documento MyPage
}); });
@@ -346,26 +349,23 @@ MyElemSchema.statics.SetIdPageInsteadThePah = async function (idapp) {
{ idapp }, { idapp },
{ oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde { oldpath: oldpath }, // Condizione per aggiornare dove il path corrisponde
{ {
$set: { idPage: id } $set: { idPage: id },
} // Imposta IdPage all'ID del documento corrispondente } // Imposta IdPage all'ID del documento corrispondente
); );
} }
console.log('Aggiornamenti effettuati con successo.'); console.log('Aggiornamenti effettuati con successo.');
return 'Aggiornamenti effettuati con successo.'; return 'Aggiornamenti effettuati con successo.';
} catch (error) { } catch (error) {
console.error('Errore durante l\'aggiornamento:', error); console.error("Errore durante l'aggiornamento:", error);
return 'Errore durante l\'aggiornamento:', error; return "Errore durante l'aggiornamento:", error;
} }
}; };
MyElemSchema.statics.deleteAllFromThisPage = async function (id) { MyElemSchema.statics.deleteAllFromThisPage = async function (id) {
const MyElem = this; const MyElem = this;
return MyElem.deleteMany({ idPage: id }); return MyElem.deleteMany({ idPage: id });
}; };
MyElemSchema.statics.findAllIdApp = async function (idapp) { MyElemSchema.statics.findAllIdApp = async function (idapp) {
const MyElem = this; const MyElem = this;
@@ -393,17 +393,16 @@ MyElemSchema.statics.findAllIdApp = async function (idapp) {
async function deleteOldMyElems(idapp) { async function deleteOldMyElems(idapp) {
try { try {
const { MyPage } = require('../models/mypage'); const { MyPage } = require('../models/mypage');
// 1. Recupera tutti gli _id dalle pagine // 1. Recupera tutti gli _id dalle pagine
const existingPages = await MyPage.find({idapp}).select('_id').lean(); const existingPages = await MyPage.find({ idapp }).select('_id').lean();
const existingPageIds = existingPages.map(page => page._id.toString()); const existingPageIds = existingPages.map((page) => page._id.toString());
// 2. Trova gli MyElem che hanno idPage non esistenti in MyPage // 2. Trova gli MyElem che hanno idPage non esistenti in MyPage
const elemsToDelete = await MyElem.find({ const elemsToDelete = await MyElem.find({
idapp, idapp,
idPage: { $nin: existingPageIds } idPage: { $nin: existingPageIds },
}); });
if (elemsToDelete.length > 0) { if (elemsToDelete.length > 0) {
@@ -418,28 +417,38 @@ async function deleteOldMyElems(idapp) {
} }
} }
/**
* Trova tutte le schede template associate a pagine di idapp.
* Restituisce un array di ogge tti con le seguenti proprietà:
* - scheda: l'oggetto scheda, con proprietà come _id, name, isTemplate
* - idPageOrig: l'idPage originale associata alla scheda
*
* Se idapp === '18', stampa i duplicati e i titoli delle pagine
* e cancella i documenti di MyElem con idPage non esistenti in MyPage
*
* @param {string} idapp ID dell'applicazione
* @returns {Promise<IMyElemTemplate[]>} Array di oggetti scheda con idPageOrig
*/
MyElemSchema.statics.findallSchedeTemplate = async function (idapp) { MyElemSchema.statics.findallSchedeTemplate = async function (idapp) {
const MyElem = this; const MyElem = this;
try { try {
const { MyPage } = require('../models/mypage'); const { MyPage } = require('../models/mypage');
const ris = await MyElem.find({ idapp }).lean(); const ris = await MyElem.find({ idapp }).lean();
const schedeTemplate = ris.flatMap(elem => const schedeTemplate = ris.flatMap((elem) =>
elem.catalogo && elem.catalogo.arrSchede ? elem.catalogo && elem.catalogo.arrSchede
elem.catalogo.arrSchede ? elem.catalogo.arrSchede
.filter(scheda => scheda.scheda?.isTemplate) .filter((scheda) => scheda.scheda?.isTemplate)
.map(scheda => ({ .map((scheda) => ({
...scheda, // mantieni i dati originali della scheda ...scheda, // mantieni i dati originali della scheda
idPageOrig: elem.idPage // aggiungi l'idPage idPageOrig: elem.idPage, // aggiungi l'idPage
})) }))
: [] : []
); );
if (idapp === '18') { if (idapp === '18') {
const duplicateIds = schedeTemplate.reduce((acc, scheda) => { const duplicateIds = schedeTemplate.reduce((acc, scheda) => {
const id = scheda.scheda._id; // Ottieni l'ID della scheda const id = scheda.scheda._id; // Ottieni l'ID della scheda
if (!acc[id]) { if (!acc[id]) {
@@ -455,7 +464,7 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) {
.map(([id, pages]) => ({ id, pages })); // Ottieni ID e pagine corrispondenti .map(([id, pages]) => ({ id, pages })); // Ottieni ID e pagine corrispondenti
// Recupera i dettagli delle pagine // Recupera i dettagli delle pagine
const pageIds = duplicates.flatMap(dup => dup.pages); // Estrai tutti gli idPage const pageIds = duplicates.flatMap((dup) => dup.pages); // Estrai tutti gli idPage
const pages = await MyPage.find({ idapp, _id: { $in: pageIds } }).lean(); const pages = await MyPage.find({ idapp, _id: { $in: pageIds } }).lean();
// Crea una mappatura tra idPage e title // Crea una mappatura tra idPage e title
@@ -465,19 +474,18 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) {
}, {}); }, {});
// Associa i titoli delle pagine agli ID duplicati // Associa i titoli delle pagine agli ID duplicati
const resultWithTitles = duplicates.map(dup => ({ const resultWithTitles = duplicates.map((dup) => ({
id: dup.id, id: dup.id,
pages: dup.pages.map(_id => ({ pages: dup.pages.map((_id) => ({
_id, _id,
title: pageMap[_id] || 'Titolo non trovato' // Usa la mappatura per trovare il titolo title: pageMap[_id] || 'Titolo non trovato', // Usa la mappatura per trovare il titolo
})) })),
})); }));
if (resultWithTitles.length > 0) { if (resultWithTitles.length > 0) {
console.log('Duplicati e titoli delle pagine:', JSON.stringify(resultWithTitles, null, 2)); console.log('Duplicati e titoli delle pagine:', JSON.stringify(resultWithTitles, null, 2));
await deleteOldMyElems(idapp); // await deleteOldMyElems(idapp);
} }
} }
return schedeTemplate; return schedeTemplate;
@@ -486,35 +494,46 @@ MyElemSchema.statics.findallSchedeTemplate = async function (idapp) {
} }
}; };
// Ricerca tra tutte le schede, contenute in catalogo, se esiste un nome di template uguale, /**
// se non lo trova allora è quello giusto per crearne uno nuovo * Ricerca tra tutte le schede, contenute in catalogo, se esiste un nome di template uguale,
* se non lo trova allora è quello giusto per crearne uno nuovo
*
* @param {string} idapp - ID dell'app
* @param {string} idPageOrig - ID della pagina originale
* @param {string} nomeTemplate - Nome del template
*
* @returns {string} Il nome del template libero
*/
MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig, nomeTemplate) { MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig, nomeTemplate) {
const MyElem = this; const MyElem = this;
try { try {
// Trova tutti gli elementi che hanno un template con lo stesso nome
const ris = await MyElem.find( const ris = await MyElem.find(
{ {
idapp, idapp,
'catalogo.arrSchede.scheda.isTemplate': true, 'catalogo.arrSchede.scheda.isTemplate': true,
'catalogo.arrSchede.scheda.idPage': { $ne: idPageOrig } 'catalogo.arrSchede.scheda.idPage': { $ne: idPageOrig },
}, },
{ {
'catalogo.arrSchede.scheda.name': 1, 'catalogo.arrSchede.scheda.name': 1,
'catalogo.arrSchede.scheda.isTemplate': 1, 'catalogo.arrSchede.scheda.isTemplate': 1,
'catalogo.arrSchede.scheda.isPagIntro': 1, 'catalogo.arrSchede.scheda.isPagIntro': 1,
'catalogo.arrSchede.scheda.idPage': 1 'catalogo.arrSchede.scheda.idPage': 1,
}); }
);
// Recupera i nomi dei template già esistenti
const existingNames = new Set( const existingNames = new Set(
ris.flatMap(elem => ris.flatMap(
elem.catalogo?.arrSchede?.filter(scheda => (elem) =>
scheda.scheda?.isTemplate && elem.catalogo?.arrSchede
scheda.scheda?.idPage !== idPageOrig ?.filter((scheda) => scheda.scheda?.isTemplate && scheda.scheda?.idPage !== idPageOrig)
) .map((scheda) => scheda.scheda?.name) || []
.map(scheda => scheda.scheda?.name) || []
) )
); );
// Crea un nuovo nome di template univoco
let ind = 2; let ind = 2;
let newNameTemplate; let newNameTemplate;
@@ -532,8 +551,10 @@ MyElemSchema.statics.getNewFreeNameTemplate = async function (idapp, idPageOrig,
const MyElem = mongoose.model('MyElem', MyElemSchema); const MyElem = mongoose.model('MyElem', MyElemSchema);
MyElem.createIndexes((err) => { MyElem.createIndexes()
if (err) throw err; .then(() => {})
}); .catch((err) => {
throw err;
});
module.exports = { MyElem }; module.exports = { MyElem };

View File

@@ -276,8 +276,9 @@ if (tools.INITDB_FIRSTIME) {
const MyEvent = mongoose.model('MyEvent', MyEventSchema); const MyEvent = mongoose.model('MyEvent', MyEventSchema);
MyEvent.createIndexes((err) => { MyEvent.createIndexes()
if (err) throw err; .then(() => { })
}); .catch((err) => { throw err; });
module.exports = {MyEvent}; module.exports = {MyEvent};

Some files were not shown because too many files have changed in this diff Show More