Progetto del hackathon 2022 di Sintra. Una versione live è visualizzabile al sito http://prestalock.emagon.xyz (consigliamo di usare Milano come provincia, ci sono già dei prodotti)
L'idea del progetto è basata sul concetto di economia circolare, ovvero un modello di produzione e consumo che implica: condivisione, prestito, riutilizzo, riparazione, ricondizionamento e riciclo dei materiali e prodotti esistenti il più a lungo possibile. Per questo motivo nasce PRESTALOck, un progetto che attraverso l'utilizzo di smart locker mira ad aiutare utenti che vorrebbero condividere oggetti di uso comune. L'idea è semplice: un utente disposto a prestare un oggetto pubblica sul portale un'inserzione contenete una foto e la descrizione di tale oggetto; un utente che ha necessità di prendere in prestito tale oggetto lo prenota attraverso il portale. I due utenti si scambiano il prodotto depositandolo nello smartlocker accordato. Gli utenti devono risiedere nella stessa provincia per poter scambiare oggetti.
- Bonis98 (referente backend e "PM").
- e-magon (referente frontend).
- Demiurgo443 (backend).
- Sfriso (frontend).
- giorgiabressa (progettazione iniziale).
- Abbiamo reso disponibile una versione live qua
cd
nella cartella del backend- Eseguire
npm install
per installare le dipendenze - Generare i certificati SSL
cd
incertificates
- Eseguire
openssl req -nodes -new -x509 -keyout server.key -out server.cert
- Creare file .env (istruzioni in .env.example) nella cartella del backend.
- Se non si utilizza OAuth, è possibile non impostare le relative variabili (clientId, ClientSecret e redirectURI)
- Eseguire il server con
npm start
- Facoltativo: popolare il DB con dati demo:
- Eseguire il server per creare il database sqlite
- Per ricevere le email di test cambiare gli indirizzi nel file demoUsers:
- In alternativa usare mailtrap senza cambiare indirizzi (da impostare nel file .env).
cd database/
- Eseguire il comando
npx sequelize-cli db:seed:all
per popolarlo. - Eseguire il comando
npx sequelize-cli db:seed:undo:all
per rimuovere i dati demo.
- Il server risponde a localhost.
-
Frontend:
- NPM con framework Vue.js (Nuxt per gestire Vue).
- TailwindCSS.
-
Backend:
- Node.js + NPM.
- SQLite + ORM
Sequelize
per base di dati. - Libreria Node
Nodemailer
per invio email. - Libreria Node
helmet
per incrementare la sicurezza (per es.: aggiungere delle policy CORS). - Libreria
googleapis
per oauth2 Google.
- Responsiveness per utilizzo da dispositivi mobili.
- Il sistema è una PWA: Progressive Web App, per questo motivo da smartphone è possibile aggiungerla alla schermata home e visualizzarla come un'app installata.
- Registrazione e Login utente:
- Credenziali classiche.
- OAuth Google.
- OAuth Facebook (Accetta solo account developer abilitati, la logica di funzionamento è visibile in signinFacebook).
- Logout.
- Notifiche via email.
- Conferma registrazione utente.
- Richiesta di prestito.
- Conferma deposito oggetto nel locker (sia per richiesta, sia per restituzione).
- Invio codici di sblocco dei locker.
- Inserimento prodotto con relativa foto.
- Modifica di un prodotto.
- Pagina riepilogativa prodotti inseriti e presi in prestito (attivi al momento).
- Pagina riepilogativa prodotti inseriti e presi in prestito (prestiti terminati).
- Area che visualizza informazioni utente.
- Richiesta di prestito.
- Conferma di deposito oggetto nel locker.
- Notifica di avvio procedura restituzione.
- Conferma di deposito oggetto nel locker per restituzione.
- Recupero password dimenticata.
- Modifica dei locker che l'utente intende utilizzare.
- Si assume che il locker utilizzato per la restituzione del prodotto corrisponda a quello utilizzato per iniziare il prestito.
- Inoltre, il prodotto restituito non torna immediatamente disponibile per un ulteriore prestito, si è deciso di lasciare a discrezione del proprietario la decisione di renderlo di nuovo disponibile (dalla pagina di modifica prodotto).
- Si assume che il richiedente del prestito ritiri istantaneamente il prodotto nel momento in cui il proprietario lo deposita nel locker.
- In particolare, nell'API
/api/loan/start
chiamata dal proprietario per confermare il deposito di un oggetto viene effettuata anche la chiamata all'API direlease
del locker. - La decisione è stata presa perché in un contesto reale dovrebbe essere il locker stesso a rilasciare la prenotazione nel momento in cui viene aperto dal richiedente.
- Si assume che nella pagina principale l'utente possa vedere anche i propri prodotti inseriti.
- Tali prodotti non possono essere prenotati dall'utente stesso.
- In un contesto reale non andrebbero mostrati nella pagina principale ma solo in quella del profilo utente.
- La decisione è stata presa per dimostrare il funzionamento dell'app in maniera più intuitiva e permettere di visualizzare i prodotti appena inseriti senza dover utilizzare un altro account.
- Nel codice abbiamo lasciato "commentato" il blocco necessario a implementare questo filtro.
Gli autori del prototipo auspicano i seguenti sviluppi futuri:
- Clustering degli utenti (tramite AI) per mostrare oggetti per i quali l'utente potrebbe essere interessato.
- Sistema di feedback degli utenti e prestiti (indice di affidabilità di utente nella puntualità di consegna/restituzione e cura dell'oggetto).
- Pre-hash lato frontend delle password.
- Possibilità di rendere i prestiti dei noleggi (aggiungendo un compenso in denaro).
- Passaggio a DBMS più stabile (MySQL/MariaDB).
- Notifiche push (per utenti mobili).
- Duplicazione dei dati dell'oggetto nel database al momento della presa in prestito (per mantenere uno storico prestiti immutabile a future modifiche prodotti).
- Chat tra utenti registrati per richiesta informazioni dettagliate.