Logo
VirtualCard

VirtualCard

1 maggio 2025 → 19 agosto 2025
Angular NestJS PostgreSQL Docker MinIO TypeScript Full-stack QR Code Business Cards JWT RBAC PrimeNG

Il Problema

VirtualCard nasce dall’esigenza di creare un sistema centralizzato per network marketing teams dove un amministratore può gestire una community di utenti, e ogni utente può creare il proprio biglietto da visita digitale sempre aggiornato, condivisibile via QR code.

Il problema principale è che i biglietti da visita tradizionali diventano obsoleti quando cambiano le informazioni di contatto, e c’è anche l’impatto ambientale dello spreco di carta.

La Soluzione

Ho progettato VirtualCard come una piattaforma completa dove un amministratore crea gli account, gli utenti ricevono un’email, configurano il loro profilo e in pochi minuti hanno un biglietto da visita digitale professionale, condivisibile via QR code o link diretto.

Il sistema include biglietti da visita digitali con URL unico, esportazione PDF pronta per la stampa, generazione QR code, personalizzazione profilo con upload foto, autenticazione JWT con RBAC, design responsive con dark/light mode, dashboard amministratore per gestione utenti, recupero password sicuro e architettura API-First con API RESTful documentata.

Project Introduction - VirtualCard

Come Funziona

L’amministratore ha accesso a una dashboard dove può vedere tutti gli utenti, creare nuovi account inserendo un’email, e gestire l’intera community. Quando crea un nuovo utente, il sistema invia automaticamente un’email con un link per impostare la password.

L’utente, dopo aver ricevuto l’email e impostato la password, accede a un’interfaccia dove può compilare le proprie informazioni personali, caricare una foto profilo che viene automaticamente ottimizzata, creare uno slug personalizzato per il proprio URL, e abilitare o disabilitare funzionalità specifiche (WhatsApp, sito web, vCard).

Può generare un QR code che punta direttamente al proprio profilo pubblico, accessibile a chiunque anche senza account, con pulsanti per chiamare, inviare un’email, aprire WhatsApp o visitare il sito web.

Le Sfide Tecniche

La gestione delle dipendenze tra campi è stata una delle sfide più interessanti: se un utente abilita il pulsante WhatsApp, deve aver compilato il numero di telefono; se abilita il sito web, deve aver inserito un URL valido. Ho implementato queste validazioni sia lato frontend (per UX) che lato backend (per sicurezza).

La generazione del QR code è stata risolta usando angularx-qrcode per generare il codice direttamente nel frontend, basandomi sullo slug dell’utente. Il QR code punta sempre allo stesso URL, anche se l’utente modifica le proprie informazioni, garantendo che i biglietti stampati rimangano validi.

La gestione delle immagini è stata cruciale: ho implementato un servizio di ottimizzazione che ridimensiona e comprime automaticamente le foto caricate con Sharp, mantenendo la qualità ma riducendo drasticamente le dimensioni per migliorare i tempi di caricamento del profilo pubblico.

Il Processo di Design

Il processo è iniziato con la ricerca e la pianificazione, mappando i flussi utente e definendo le funzionalità core con focus su semplicità e usabilità. L’obiettivo era creare un sistema che permettesse onboarding rapido degli utenti tramite pannello admin, creazione intuitiva di biglietti da visita pronti per la stampa, hub di contatto pubblico mobile-friendly per ogni utente, e scalabilità con gestione dati basata sui ruoli.

Ho creato wireframe dettagliati per mappare tutte le schermate chiave: flussi di autenticazione (login, recupero password, verifica), gestione profilo (upload foto con drag & drop, compilazione informazioni, creazione slug, toggle funzionalità, generazione QR), dashboard amministratore (lista utenti con ricerca, creazione ed eliminazione), e profilo pubblico (visualizzazione informazioni, pulsanti azione, download vCard).

Questo processo ha anche aiutato a definire gli endpoint API necessari.

Wireframe - VirtualCard

L’identità di VirtualCard è costruita su chiarezza, struttura e precisione digitale. Un logotipo personalizzato unisce estetica futuristica e geometria funzionale, con toni scuri, contrasti forti e forme modulari.

La tipografia principale è Blinker con fallback Inter. La palette colori usa Primary #e1c36d (golden yellow) con scale da 50 a 950, e Neutral #99990b con scale complementari.

Il sistema di design utilizza transizioni fluide (0.2s), focus ring personalizzati e iconografia coerente.

Branding & Identity - VirtualCard

Implementazione

Ho implementato l’interfaccia con PrimeNG, che mi ha permesso di sviluppare rapidamente mantenendo un design professionale allineato ai wireframe. L’architettura backend è modulare: ogni feature è in un modulo separato (auth, users, common), rendendo il codice manutenibile e testabile.

Ho documentato tutto: API, database, architettura, regole di business, e ho creato una Postman collection per testare gli endpoint.

Questo progetto mi ha permesso di approfondire diversi aspetti dello sviluppo full-stack: gestione file storage con MinIO, ottimizzazione immagini con Sharp, implementazione sistema di ruoli robusto, e strutturazione applicazione Angular con lazy loading e route guards.


Dettagli Tecnici

Stack Tecnologico
CategoriaTecnologiaVersioneScopo
FrontendAngular19Framework SPA
PrimeNG19.1.3Component library
PrimeFlex4.0.0Utility CSS
TypeScript5.7Strict mode
BackendNestJS11Framework API
TypeORM11ORM
PostgreSQLLatestDatabase
Passport.js-JWT Auth
InfrastrutturaDocker-Containerizzazione
NginxAlpineReverse proxy
MinIO-Object storage
Sharp-Image optimization
Architettura & Deployment

Docker Services

ServiceImagePorteFunzione
nginxalpine80/443Reverse proxy
backendnode:23-slim3000NestJS API
frontendnode:23-slim4200Angular SPA
postgreslatest35000Database
miniominio/minio9000/9001File storage

Volumes

  • postgres_data - Persistenza database
  • minio_data - Persistenza file storage
Database Schema

Tabelle Principali

TabellaChiaveRelazione
auth_usersuuid (PK)One-to-One
user_profilesuuid (PK)← auth_users

Campi Principali

auth_users:

  • email (unique, max 255)
  • role (enum: admin/user)
  • is_configured (boolean)
  • reset_token (max 511, 10min expiry)

user_profiles:

  • name, surname (2-50 chars)
  • phone, area_code (5-20, 2-10 chars)
  • website (valid URL)
  • slug (unique, [a-z0-9-])
  • profile_photo (max 1024 chars)

Triggers Automatici:

  • update_updated_at_column() - Gestione timestamp
API Endpoints
MetodoEndpointDescrizioneAccesso
POST/auth/loginAutenticazione JWTPublic
POST/auth/recoverPassword recoveryPublic
POST/auth/verifyReset passwordPublic
POST/users/createCrea utenteAdmin
GET/users/listLista utentiAdmin
GET/users/:slugProfilo pubblicoPublic
PUT/users/editModifica profiloOwner/Admin
DELETE/users/deleteElimina utenteOwner/Admin
POST/users/upload-photoUpload foto (max 5MB)Owner/Admin

Response Structure:

{ success: boolean; message: string; data: any | null; }
Validazioni & Regole
CampoRequisitiDipendenze
Password8-128 chars, maiusc+minusc+num+special-
EmailValid format, max 255, unique-
Slug[a-z0-9-], unique, non modificabileObbligatorio se vCard enabled
Phone5-20 charsObbligatorio se WhatsApp enabled
WebsiteValid URLObbligatorio se Website enabled
FotoJPG/PNG, max 5MBAuto-ottimizzata con Sharp
Ruoli & Permessi
FunzionalitàUSERADMIN
Login/Logout
Profilo pubblico
Modifica profilo proprio
Eliminazione account✅ (proprio)✅ (tutti)
Upload foto
Generazione QR
Lista utenti
Creazione utenti
Dashboard admin
Sicurezza

Security Layers

LayerImplementazione
NetworkSSL/TLS, Firewall, Rate limiting
ApplicationJWT Auth, RBAC, Input validation, XSS/CSRF protection
Databcrypt hashing, Encryption at rest, Backups

Security Headers

  • X-Frame-Options, X-Content-Type-Options
  • X-XSS-Protection, Content-Security-Policy
  • Strict-Transport-Security
Documentazione

Tutta la documentazione è disponibile nel repository GitHub:

  • docs/api.md - API endpoints completi
  • docs/database.md - Schema database
  • docs/architecture-map.md - Mappa architetturale
  • docs/functional-documentation.md - Regole di business
  • docs/roles.md - Ruoli e permessi
  • docs/virtualcard.postman_collection.json - Postman collection