CodeShop rappresenta un ecosistema full-stack concepito per rivoluzionare la vendita e la distribuzione di asset digitali. La piattaforma si distingue per un'architettura robusta che coniuga le prestazioni enterprise di Spring Boot 3.x e Java 21 con un'interfaccia utente moderna basata su estetica Glassomorphism e navigazione fluida in modalitΓ SPA. Grazie all'integrazione nativa con PayPal REST API e a un sistema di autenticazione stateless basato su JWT, il progetto garantisce transazioni sicure e un controllo granulare degli accessi. L'intero ciclo di vendita Γ¨ completamente automatizzato attraverso l'implementazione del pattern Observer, che assicura la consegna istantanea dei prodotti tramite notifiche email e aree riservate, mentre la completa containerizzazione con Docker rende l'intera infrastruttura scalabile e pronta per il deployment immediato in ambienti di produzione.
- Caratteristiche Principali
- Tech Stack
- Design Patterns
- Architettura del Progetto
- Installazione e Setup
- π³ Docker & Containerizzazione
- Configurazione
- Team di Sviluppo
- JWT (JSON Web Token): Autenticazione stateless con token a scadenza (24h).
- RBAC: Gestione ruoli differenziata tra
USEReADMIN. - Password Security: Criptazione delle credenziali e notifiche email in caso di modifica.
- Catalogo Dinamico: Navigazione prodotti filtrata per categorie (Snippet, Progetti, Database).
- Carrello Avanzato: Gestione persistente del carrello con ricalcolo totali lato server.
- Integrazione PayPal: Flusso di pagamento sicuro tramite PayPal REST SDK con verifica transazione lato server.
- Download Automatico: Al termine del pagamento, l'utente riceve istantaneamente un'email con il link di download.
- Area Riservata: Storico ordini completo con pulsante "Scarica" per ogni prodotto acquistato (disponibile per 14 giorni).
- Notifiche Transazionali: Sistema di notifiche via email per registrazione, ordini e sicurezza account.
- Gestione Catalogo (CRUD): Interfaccia dedicata per gli amministratori per aggiungere, modificare o rimuovere prodotti in tempo reale.
- Controllo Accessi Avanzato: Visualizzazione completa degli ordini e dei file per la gestione operativa.
- Policy di Download: Implementazione di restrizioni temporali (es. 14 giorni) per il download dei file da parte degli utenti, garantendo la sicurezza degli asset.
- Modern Design: Interfaccia responsiva con effetti Glassomorphism e animazioni fluide.
- SPA (Single Page Application): Navigazione dinamica senza ricaricamento della pagina.
| Componente | Tecnologie |
|---|---|
| Backend | Java 21, Spring Boot 3.x, Spring Security |
| Persistence | Spring Data JPA, Hibernate, MySQL |
| Security | JSON Web Token (JWT) |
| Payments | PayPal REST API SDK |
| Spring Mail (SMTP), HTML Templates | |
| Frontend | HTML5, CSS3 (Vanilla), JavaScript (ES6+) |
| Container | Docker, Docker Compose |
| Build Tool | Maven |
Il progetto implementa diversi pattern architetturali per garantire scalabilitΓ e manutenibilitΓ :
- Observer Pattern: Utilizzato per il sistema di notifiche. Ogni azione rilevante (Registrazione, Ordine) notifica i vari
Observerper l'invio di email o log di sistema. - MVC (Model-View-Controller): Separazione netta tra logica di business, persistenza e presentazione.
- Repository Pattern: Per l'astrazione dell'accesso ai dati tramite Spring Data JPA.
ProgettoFinale/
βββ final_project/
β βββ src/main/java/com/example/final_project/
β β βββ Config/ # Configurazioni (PayPal)
β β βββ Controller/ # Endpoint REST API
β β βββ Model/ # EntitΓ JPA (User, Product, Order, etc.)
β β βββ Repository/ # Interfacce Spring Data JPA
β β βββ Service/ # Business Logic e integrazioni esterne
β β βββ Security/ # Logica JWT e Filtri di sicurezza
β β βββ Observer/ # Implementazione del pattern Observer
β βββ src/main/resources/
β βββ static/ # Frontend Assets (HTML, CSS, JS)
β βββ application.yaml # Configurazione applicativa
- JDK 21 o superiore
- MySQL 8.0+
- Maven 3.8+
- Docker & Docker Compose (opzionale per esecuzione in container)
git clone https://github.com/Michecosa/ProgettoFinale.git
cd ProgettoFinale/final_projectCrea un database MySQL chiamato final_project:
CREATE DATABASE final_project;Copia il file .env.example in un nuovo file chiamato .env e inserisci le tue credenziali (Database, Email SMTP, PayPal).
Γ importante sapere che il progetto utilizza due file .env per diversi scopi:
.envnella cartella principale (ProgettoFinale/): Viene utilizzato da Docker Compose. Quando lancidocker-compose up, Docker cerca questo file per configurare il database e l'applicazione nei container..envdentro la cartellafinal_project/: Viene utilizzato per l'avvio locale (tramite IntelliJ, VS Code o./mvnw spring-boot:run). Spring Boot carica automaticamente questo file per risolvere le variabili definite inapplication.yaml.
mvn clean install
mvn spring-boot:runL'applicazione sarΓ disponibile all'indirizzo: http://localhost:8080
Il progetto Γ¨ completamente containerizzato con Docker e Docker Compose, permettendo di avviare l'intero stack (App + Database) senza installare MySQL o Java localmente.
- Docker Desktop installato e avviato
- Maven 3.8+ (solo per compilare il JAR)
Copia .env.example in .env nella cartella principale (ProgettoFinale/) e compila i valori:
cp .env.example .envSe non hai una password per MySQL (es. XAMPP su Windows), lascia
DB_PASSWORD=vuoto β funziona sia con password vuota che con una password impostata.
cd final_project
./mvnw clean package -DskipTests # Mac / Linux
mvnw.cmd clean package -DskipTests # Windows
cd ..Dalla cartella ProgettoFinale/:
docker compose up --build -dDocker avvierΓ prima il database e aspetterΓ che sia pronto, poi avvierΓ Spring Boot. Al primo avvio Hibernate crea automaticamente tutte le tabelle.
Dopo il primo avvio (necessario solo la prima volta, o dopo docker compose down -v):
Mac / Linux:
docker exec -i mysql_db mysql -uroot final_project < init-data.sql
# se hai impostato una password:
docker exec -i mysql_db mysql -uroot -pTUAPASSWORD final_project < init-data.sqlWindows PowerShell:
Get-Content init-data.sql | docker exec -i mysql_db mysql -uroot final_project
# se hai impostato una password:
Get-Content init-data.sql | docker exec -i mysql_db mysql -uroot -pTUAPASSWORD final_projectL'applicazione Γ¨ ora disponibile su http://localhost:8080
Account admin precaricato:
| Campo | Valore |
|---|---|
| Username | admin |
| Password | miche |
admin@codemarketplace.it |
| Comando | Descrizione |
|---|---|
docker compose up -d |
Avvia i container in background |
docker compose down |
Ferma i container (i dati rimangono) |
docker compose down -v |
Ferma e cancella il database |
docker compose logs -f app-security |
Segui i log di Spring Boot in tempo reale |
docker compose build --no-cache |
Ricostruisce l'immagine da zero |
Attenzione:
docker compose down -vcancella tutti i dati del database. Dopo questo comando sarΓ necessario ripetere il Passo 4.
mysql_db: MySQL 8.0 con healthcheck β Spring Boot aspetta che il DB sia pronto prima di partire.spring_app: Immagine Alpine con JRE 21, porta8080esposta sull'host.
Per testare i pagamenti, assicurati di avere un account developer su PayPal Developer e configura le chiavi:
paypal:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
mode: sandboxIl progetto utilizza il file .env per separare i segreti dal codice. Assicurati che le seguenti chiavi siano configurate:
| Variabile | Descrizione |
|---|---|
DB_URL |
URL di connessione al database MySQL |
DB_USERNAME |
Username del database |
DB_PASSWORD |
Password del database |
MAIL_USERNAME |
Email per l'invio delle notifiche |
MAIL_PASSWORD |
App Password (per Gmail) o password SMTP |
JWT_SECRET |
Chiave segreta per la firma dei token (Base64) |
JWT_EXPIRATION |
Durata del token in millisecondi |
PAYPAL_CLIENT_ID |
Client ID ottenuto dalla dashboard PayPal |
PAYPAL_CLIENT_SECRET |
Secret ottenuto dalla dashboard PayPal |
PAYPAL_MODE |
sandbox per test o live per produzione |
![]() Donato Morra |
![]() Michela Della Gatta |
Questo progetto Γ¨ distribuito sotto Licenza MIT. Consulta il file LICENSE per ulteriori dettagli.

