Skip to content

alfdagos/CFLM_QRTicketSystem

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CFLM QR Ticket System

📋 Descrizione

Sistema di gestione biglietti per eventi gasanti CFLM basato su QR Code, realizzato con Java Spring Boot e H2 Database (configurabile per PostgreSQL). Offre funzionalità complete per la generazione, visualizzazione e verifica dei biglietti, rendendolo ideale per eventi, conferenze o qualsiasi scenario che richieda un sistema di ingresso con validazione.

✨ Caratteristiche Principali

  • Generazione Biglietti Unici con ID UUID
  • 🔲 QR Code Dinamici per ogni biglietto
  • 📱 Scanner QR Code via webcam per la reception
  • ✔️ Validazione Biglietti con prevenzione duplicati
  • 📊 API REST documentate con OpenAPI/Swagger
  • 🔒 Validazione Input con Bean Validation
  • 🚨 Gestione Errori Centralizzata
  • 📝 Logging Strutturato
  • 🧪 Test Coverage Completo - 66 test con JUnit 5, Mockito e AssertJ
  • 🎨 UI Responsive con Thymeleaf e poster SVG personalizzato
  • 🎯 Architettura Pulita con pattern DTO, Mapper e Service Layer

🏗️ Architettura

Il progetto segue un'architettura a livelli ben strutturata:

📦 qr-ticket-system
├── 🎯 controller/          # REST Controllers & Web Controllers
├── 🔧 service/             # Business Logic Layer
├── 💾 repository/          # Data Access Layer (Spring Data JPA)
├── 📋 model/               # JPA Entities
├── 📤 dto/                 # Data Transfer Objects
├── ⚠️ exception/           # Custom Exceptions & Global Handler
├── ⚙️ config/              # Configuration Classes
└── 🛠️ util/                # Utility Classes

🛠️ Tecnologie Utilizzate

Backend:

  • Java 21
  • Spring Boot 3.5.7
    • Spring Web
    • Spring Data JPA
    • Spring Validation
    • Spring Security
  • Lombok - Riduzione boilerplate
  • ZXing - Generazione QR Code
  • H2 Database - Database in memoria (dev)
  • BCrypt - Password encoding

Frontend:

  • Thymeleaf - Template engine
  • HTML5/CSS3 - Struttura e stile
  • JavaScript - Interattività
  • HTML5-QRCode - Scanner QR lato browser

Testing & Documentation:

  • JUnit 5 Jupiter - Testing framework
  • Mockito - Mocking framework con @MockBean
  • AssertJ - Fluent assertions
  • Spring Boot Test - Testing utilities (@WebMvcTest, @DataJpaTest)
  • Spring Security Test - @AutoConfigureMockMvc(addFilters = false) per test senza filtri security
  • Jakarta Bean Validation - DTO validation testing
  • SpringDoc OpenAPI - Documentazione API automatica

⚙️ Prerequisiti

  • Java Development Kit (JDK): versione 17 o superiore
  • Apache Maven: 3.6+ per la gestione delle dipendenze
  • Un IDE: (IntelliJ IDEA, Eclipse, VS Code con estensioni Java)

� Installazione e Avvio

1. Clona il Repository

git clone https://github.com/alfdagos/CFLM_QRTicketSystem.git
cd CFLM_QRTicketSystem

2. Compila il Progetto

mvn clean install

3. Esegui i Test

mvn test

4. Avvia l'Applicazione

mvn spring-boot:run

L'applicazione sarà disponibile su http://localhost:8080

🧑‍💻 Sviluppo — Spring Boot DevTools

Questa repository include spring-boot-devtools come dipendenza di sviluppo (scope runtime, optional=true) per abilitare il riavvio automatico dell'applicazione e funzionalità di live reload durante lo sviluppo.

Come usarlo in locale:

  • Avvia l'app usando il wrapper Maven generato nel progetto (consigliato):
.\mvnw.cmd spring-boot:run
  • Oppure avvia con Maven installato globalmente:
mvn spring-boot:run

Comportamento utile offerto da DevTools:

  • Riavvio automatico dell'app al salvataggio delle classi Java o delle risorse (classpath restart).
  • Livereload opzionale del browser (se installi un client LiveReload o estensione browser).
  • Caricamento delle proprietà di sviluppo separate (se presenti).

Proprietà utili (es. in src/main/resources/application.yml o application.properties):

# Disabilita il restart se vuoi (default=true)
spring.devtools.restart.enabled=true

# Abilita LiveReload server integrato (browser extension necessaria per ricaricare automaticamente)
spring.devtools.livereload.enabled=true

# Esempio: disabilitare cache template Thymeleaf in sviluppo
spring.thymeleaf.cache=false

Note importanti:

  • DevTools è pensato SOLO per lo sviluppo: rimane in runtime e con optional=true nel pom.xml, quindi non sarà incluso come dipendenza transitiva in ambienti di produzione.
  • Se usi un IDE (IntelliJ/VS Code/Eclipse), salva i file per innescare il riavvio; alcuni IDE richiedono la compilazione automatica abilitata.
  • Se non vuoi che il restart venga eseguito (ad es. durante debug approfondito), puoi disabilitarlo tramite la proprietà spring.devtools.restart.enabled=false.

Per ulteriori dettagli vedi la documentazione ufficiale: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools

📚 Utilizzo

🎫 Creazione Biglietto

  1. Vai su http://localhost:8080/
  2. Compila il form con:
    • Nome Evento
    • Nome Partecipante
    • Email
  3. Clicca su "Genera Biglietto"
  4. Visualizza il biglietto con il QR Code generato

📱 Verifica Biglietti (Reception)

Nota: L'accesso alla reception ora richiede autenticazione.

  1. Vai su http://localhost:8080/reception
  2. Effettua il login con:
    • Username: reception (o admin)
    • Password: reception123 (o admin123)
  3. Autorizza l'accesso alla webcam
  4. Scansiona il QR Code del biglietto
  5. Visualizza il risultato della validazione
  6. Usa il pulsante "🔓 Logout" per uscire

🔌 API REST

Crea Biglietto

POST /api/tickets
Content-Type: application/json

{
  "eventName": "CFLM 2025 Party",
  "userName": "Mario Rossi",
  "userEmail": "[email protected]"
}

Nota: Quando si effettuano richieste tramite JavaScript fetch o AJAX, è necessario includere il token CSRF negli header:

fetch('/api/tickets', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-TOKEN': csrfToken  // Token ottenuto da Thymeleaf
  },
  body: JSON.stringify(ticketData)
});

Verifica Biglietto

POST /reception/verify/{ticketId}
X-CSRF-TOKEN: <token>

Ottieni QR Code

GET /qrcode/{ticketId}

📖 Documentazione API

Accedi alla documentazione Swagger: http://localhost:8080/swagger-ui.html

💾 Console H2 Database

Per visualizzare il database in memoria:

  • URL: http://localhost:8080/h2-console
  • JDBC URL: jdbc:h2:mem:testdb
  • Username: sa
  • Password: (lascia vuoto)

🧪 Testing

Il progetto include una suite completa di 66 test che coprono tutti i livelli dell'applicazione.

Esegui tutti i test:

mvn test

Test Coverage per Layer:

1️⃣ Controller Layer (11 test - TicketControllerTest)

  • ✅ Rendering pagina index
  • ✅ Creazione biglietto (form e API REST)
  • ✅ Visualizzazione dettaglio biglietto
  • ✅ Download immagine QR Code
  • ✅ Pagina scanner reception
  • ✅ Verifica biglietto (valido, già usato, non trovato)
  • ✅ Validazione input (errori 400)

2️⃣ Service Layer (6 test - TicketServiceTest)

  • ✅ Creazione biglietto con generazione QR Code
  • ✅ Recupero biglietto per ID
  • ✅ Validazione biglietto valido
  • ✅ Gestione biglietto già utilizzato
  • ✅ Gestione biglietto non trovato

3️⃣ Repository Layer (11 test - TicketRepositoryTest)

  • ✅ Operazioni CRUD complete (save, findById, update, delete)
  • ✅ Query personalizzate (findByQrCodeData)
  • ✅ Generazione UUID automatica
  • ✅ Persistenza immagini QR Code (BLOB)
  • ✅ Case sensitivity nelle ricerche

4️⃣ Mapper Utility (7 test - TicketMapperTest)

  • ✅ Conversione DTO → Entity
  • ✅ Conversione Entity → DTO
  • ✅ Gestione valori null
  • ✅ Round-trip conversion (integrità dati)

5️⃣ Model Layer (10 test - TicketTest)

  • ✅ Valori di default corretti
  • ✅ Getters e Setters
  • ✅ Gestione null values
  • ✅ Toggle stato validità
  • ✅ Array byte per QR Code (fino a 1000 bytes)
  • ✅ Formattazione UUID
  • ✅ LocalDateTime precision
  • ✅ Limiti VARCHAR(255)
  • ✅ Email con caratteri speciali

6️⃣ DTO Validation (11 test - TicketDTOValidationTest)

  • ✅ Validazione @NotBlank per tutti i campi
  • ✅ Validazione @Email per userEmail
  • ✅ Validazione @Size per lunghezze min/max
  • ✅ Gestione campi null
  • ✅ Gestione whitespace-only
  • ✅ Email complesse (subdomain, plus addressing)
  • ✅ Supporto caratteri Unicode

7️⃣ Exception Handler (6 test - GlobalExceptionHandlerTest)

  • ✅ TicketNotFoundException → 404
  • ✅ TicketAlreadyUsedException → 409
  • ✅ QRCodeGenerationException → 500
  • ✅ Validation errors → 400 con dettagli
  • ✅ Generic exceptions → 500

8️⃣ Configuration (3 test - QRCodeConfigTest)

  • ✅ Caricamento proprietà QR Code (width, height, format)
  • ✅ Validazione valori positivi
  • ✅ Spring Boot context loading

9️⃣ Integration Test (1 test - QrticketsystemApplicationTests)

  • ✅ Application context loads successfully

Test Statistics:

✅ Total Tests: 66
✅ Failures: 0
✅ Errors: 0
✅ Skipped: 0
✅ Success Rate: 100%

Esegui test specifici:

# Solo test del controller
mvn test -Dtest=TicketControllerTest

# Solo test del service
mvn test -Dtest=TicketServiceTest

# Solo test di validazione
mvn test -Dtest=TicketDTOValidationTest

📁 Struttura del Progetto

src/
├── main/
│   ├── java/it/cflm/qrticketsystem/
│   │   ├── QrTicketSystemApplication.java
│   │   ├── config/
│   │   │   ├── OpenApiConfig.java
│   │   │   ├── QRCodeConfig.java
│   │   │   └── SecurityConfig.java         # Spring Security Configuration
│   │   ├── controller/
│   │   │   └── TicketController.java
│   │   ├── dto/
│   │   │   ├── TicketRequestDTO.java
│   │   │   ├── TicketResponseDTO.java
│   │   │   └── TicketValidationResponseDTO.java
│   │   ├── exception/
│   │   │   ├── GlobalExceptionHandler.java
│   │   │   ├── QRCodeGenerationException.java
│   │   │   ├── TicketAlreadyUsedException.java
│   │   │   └── TicketNotFoundException.java
│   │   ├── model/
│   │   │   └── Ticket.java
│   │   ├── repository/
│   │   │   └── TicketRepository.java
│   │   ├── service/
│   │   │   └── TicketService.java
│   │   └── util/
│   │       └── TicketMapper.java
│   └── resources/
│       ├── application.properties
│       ├── static/
│       │   ├── css/
│       │   │   └── style.css
│       │   ├── js/
│       │   │   └── scanner.js
│       │   └── img/
│       │       └── poster.svg         # Poster evento personalizzato
│       └── templates/
│           ├── index.html
│           ├── login.html                  # Pagina login Spring Security
│           ├── reception_scanner.html
│           ├── ticket_detail.html
│           └── ticket_not_found.html
└── test/
    └── java/it/cflm/qrticketsystem/
        ├── config/
        │   └── QRCodeConfigTest.java
        ├── controller/
        │   └── TicketControllerTest.java
        ├── dto/
        │   └── TicketDTOValidationTest.java
        ├── exception/
        │   └── GlobalExceptionHandlerTest.java
        ├── model/
        │   └── TicketTest.java
        ├── repository/
        │   └── TicketRepositoryTest.java
        ├── service/
        │   └── TicketServiceTest.java
        ├── util/
        │   └── TicketMapperTest.java
        └── QrticketsystemApplicationTests.java

� Configurazione

application.properties

# Database H2
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=update

# QR Code Settings
qrcode.width=300
qrcode.height=300
qrcode.format=PNG

# Logging
logging.level.it.cflm.qrticketsystem=DEBUG

Per usare PostgreSQL:

  1. Decommenta la dipendenza PostgreSQL in pom.xml
  2. Aggiorna application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/qr_ticket_db
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

🔒 Sicurezza

Implementazioni Attuali:

  • 🔐 Spring Security per autenticazione/autorizzazione
  • 👥 Role-Based Access Control (ADMIN, RECEPTION, USER)
  • 🔑 BCrypt Password Encoding
  • 🔒 Form-Based Login con sessioni sicure
  • Validazione input con Bean Validation
  • 🚨 Gestione sicura delle eccezioni
  • 📝 Logging degli accessi
  • 🛡️ Protezione SQL Injection (JPA)
  • 🔐 CSRF Protection per form

Credenziali di Test:

  • Admin: admin / admin123 (accesso completo)
  • Reception: reception / reception123 (solo verifica biglietti)
  • User: user / user123 (funzionalità limitate)

� Vedi SECURITY.md per dettagli completi sulla configurazione di sicurezza.

Miglioramenti Suggeriti per Produzione:

  • 🔑 JWT per l'API REST
  • Database Users (al posto di in-memory)
  • 📧 Email Verification
  • 🔒 HTTPS obbligatorio
  • 🚦 Rate Limiting
  • 🔐 2FA (Two-Factor Authentication)
  • 🔒 Password Reset via email

📈 Miglioramenti Implementati

Highlights Recenti:

🧪 Testing Completo

  • 66 test che coprono tutti i livelli dell'applicazione
  • Test di integrazione con @WebMvcTest e @DataJpaTest
  • Copertura completa di controller, service, repository, mapper, model, DTOs
  • Test di validazione Jakarta Bean Validation
  • Test di gestione eccezioni centralizzata

🎨 UI/UX Migliorata

  • Banner orizzontale ottimizzato (1200x400px) per visualizzazione web
  • Design moderno con gradiente arcobaleno e effetti neon
  • Animazioni sulle stelle pulsanti
  • Poster SVG personalizzato con tema party (cocktail, note musicali, icone emoji)
  • Layout responsive con object-fit: contain per visualizzazione completa
  • Effetti spotlight radiali per maggiore profondità
  • Decorazioni bilanciate su entrambi i lati

🏗️ Architettura

  • 🎯 DTO Pattern per separazione API/Model
  • 🚨 Global Exception Handler centralizzato
  • ✔️ Bean Validation su tutti gli input
  • 📝 Logging SLF4J strutturato
  • 💉 Constructor Injection con Lombok
  • 🔄 @Transactional per consistenza dati
  • 🧰 Mapper Utility per conversioni DTO/Entity
  • 📖 OpenAPI/Swagger documentation
  • 🔐 Spring Security per autenticazione/autorizzazione

🔒 Sicurezza

  • Role-Based Access Control (RBAC)
  • BCrypt password encoding
  • Form-based login con sessioni sicure
  • CSRF protection su tutti i form e richieste POST
  • Token CSRF automaticamente incluso nelle richieste via Thymeleaf
  • Protezione endpoint sensibili
  • Test disabilitano filtri Spring Security con @AutoConfigureMockMvc(addFilters = false)

Test Patterns Utilizzati:

  • AAA Pattern (Arrange-Act-Assert)
  • Given-When-Then per BDD-style tests
  • MockBean per isolation testing
  • TestEntityManager per JPA testing
  • MockMvc per integration testing
  • Fluent Assertions con AssertJ

About

Sistema di gestione di Ticket per le feste gasanti del CFLM.

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors