Modello Dati Logico¶
Panoramica¶
Questa sezione descrive il modello dati logico dell'applicazione mobile HapGree, definito a partire dai contratti OpenAPI (Specs/OpenApi/OpenApi/src/Models/*.ts), dai DTO generati in hapgree_client e dalle strutture dati utilizzate nei ViewModel e nelle entità applicative in lib/.
Nota di architettura: La persistenza fisica (database relazionale, indici, vincoli di integrità e storicizzazione) è gestita interamente a livello di backend. Il client mobile interagisce con queste entità scambiando DTO di richiesta e modelli di risposta JSON.
Entità Principali¶
User¶
Rappresenta il profilo dell'utente autenticato nell'applicazione.
Campi principali:
- id: identificativo univoco dell'utente
- role: ruolo applicativo
- email: indirizzo email
- name: nome
- lastName: cognome
- avatarImageUrl: URL dell'immagine profilo
- birthdate: data di nascita
Utilizzo: gestione sessione, profilo utente, associazione a viaggi, consumi, gruppi e certificati di compensazione.
PhysicalActivity¶
Rappresenta l'attività fisica giornaliera sincronizzata da Health Connect o Apple Health.
Campi principali:
- id: identificativo del record
- userId: identificativo dell'utente
- steps: numero totale di passi registrati
- kilometers: distanza percorsa in chilometri
- activityDate: data di riferimento dell'attività
Travel / CreateTravel¶
Rappresenta una sessione di viaggio registrata manualmente o tramite il tracking automatico GPS.
Campi principali (CreateTravel):
- distance: distanza in km
- travelReasonType: motivazione dello spostamento (work, personal, ecc.)
- vehicleType: tipologia di veicolo (dieselCar, electricCar, ecc.)
- avgSpeed: velocità media calcolata
- totalTime: durata complessiva dello spostamento
- idleTime: tempo trascorso in sosta
- drivingScore: indice di efficienza di guida
- startLocation / endLocation: coordinate di partenza e arrivo
- startTime / endTime: timestamp di inizio e fine
- polylineSegments: lista di punti per il tracciamento del percorso sulla mappa
EnergyBill¶
Rappresenta una bolletta o un consumo energetico inserito dall'utente.
Campi principali:
- id: identificativo univoco del record
- userId: utente associato
- amountConsumed: valore del consumo energetico
- type: fonte energetica (water, gas, electricity)
- totalEmission: stima di emissioni CO2 calcolata
- startDate / endDate: periodo di riferimento della bolletta
Food¶
Rappresenta un singolo alimento o prodotto inserito a catalogo.
Campi principali:
- id: identificativo del prodotto
- ean: codice a barre (EAN/UPC)
- name: denominazione del prodotto
- category: categoria alimentare
- co2KgForProductKg: fattore di emissione (kg CO2 per kg di prodotto)
- emissionCategory: classe Green-Score (a - e)
- quantity: quantità / peso acquistato
- imageUrl: immagine del prodotto
FoodReceipt¶
Rappresenta uno scontrino o un acquisto cumulativo di prodotti alimentari.
Campi principali:
- id: identificativo dello scontrino
- userId: identificativo dell'utente
- foods: lista dei prodotti associati (Food[])
- elementsNumber: numero totale di articoli
- cO2Emitted: emissione complessiva associata allo scontrino
- type: modalità di inserimento (manual, automatic)
- status: stato di elaborazione per scontrini OCR (pending, processed, error)
- createdAt: data di registrazione
Group e GroupMembership¶
Gestiscono la dimensione social, le sfide di gruppo e le classifiche condivise.
Campi principali Group:
- id: identificativo univoco del gruppo
- ownerId: identificativo del creatore
- name: nome del gruppo
- description: descrizione del gruppo
- tag: codice identificativo univoco per l'invito / accesso
- isPrivate: flag di visibilità (pubblico / privato)
Campi GroupMembership:
- groupId: riferimento al gruppo
- userId: riferimento all'utente
- joinStatus: stato di adesione (membro, richiesta pendente)
ChallengeInstance e ChallengeProgress¶
Gestiscono le sfide (giornaliere, settimanali, mensili) per singoli utenti e gruppi.
Campi principali ChallengeInstance:
- id: identificativo della challenge
- timeframe: scadenza temporale
- reward: punti o badge attribuiti al completamento
- category: categoria di riferimento
- timeframe_type: cadenza (giorno, settimana, mese)
- collected: flag di avvenuto riscatto della ricompensa
Campi ChallengeProgress:
- challengeId: identificativo della sfida
- userId: utente associato
- progress: percentuale di completamento (0.0 - 1.0)
CompensationProject e CompensationCertificate¶
Gestiscono il catalogo dei progetti ecologici e i relativi certificati di compensazione rilasciati.
Campi CompensationProject:
- id: identificativo del progetto
- title: nome del progetto
- description: descrizione e obiettivi ecologici
- imageUrl: immagine di copertina
Campi CompensationCertificate:
- id: identificativo del certificato
- userId: utente titolare
- projectId: progetto associato
- amount: importo versato (EUR)
- compensatedKg: quantità di CO2 compensata (kg)
- downloadUrl: URL per scaricare il documento ufficiale
- createdAt: timestamp di rilascio
Diagramma Relazionale (ER Logico)¶
erDiagram
USER ||--o{ PHYSICAL_ACTIVITY : records
USER ||--o{ TRAVEL : performs
USER ||--o{ ENERGY_BILL : uploads
USER ||--o{ FOOD_RECEIPT : creates
FOOD_RECEIPT ||--|{ FOOD : contains
USER ||--o{ GROUP_MEMBERSHIP : joins
GROUP ||--o{ GROUP_MEMBERSHIP : has_members
USER ||--o{ GROUP : owns
GROUP ||--o{ CHALLENGE_INSTANCE : hosts
USER ||--o{ CHALLENGE_PROGRESS : progresses
CHALLENGE_INSTANCE ||--o{ CHALLENGE_PROGRESS : tracks
USER ||--o{ COMPENSATION_CERTIFICATE : receives
COMPENSATION_PROJECT ||--o{ COMPENSATION_CERTIFICATE : certifies
USER {
int id PK
int role
string email
string name
string lastName
string avatarImageUrl
date birthdate
}
PHYSICAL_ACTIVITY {
int id PK
int userId FK
int steps
float kilometers
date activityDate
}
TRAVEL {
int id PK
int userId FK
float distance
string travelReasonType
string vehicleType
float avgSpeed
int totalTime
int idleTime
float drivingScore
datetime startTime
datetime endTime
}
ENERGY_BILL {
int id PK
int userId FK
float amountConsumed
string type
float totalEmission
date startDate
date endDate
}
FOOD_RECEIPT {
int id PK
int userId FK
string type
string status
float cO2Emitted
int elementsNumber
date createdAt
}
FOOD {
int id PK
string ean
string name
string category
float co2KgForProductKg
string emissionCategory
float quantity
}
GROUP {
int id PK
int ownerId FK
string name
string description
string tag
bool isPrivate
}
GROUP_MEMBERSHIP {
int groupId FK
int userId FK
string joinStatus
}
CHALLENGE_INSTANCE {
int id PK
string timeframe
int reward
string category
string timeframe_type
bool collected
}
CHALLENGE_PROGRESS {
int challengeId FK
int userId FK
float progress
}
COMPENSATION_PROJECT {
int id PK
string title
string description
string imageUrl
}
COMPENSATION_CERTIFICATE {
int id PK
int userId FK
int projectId FK
float amount
float compensatedKg
string downloadUrl
datetime createdAt
}
Modelli di Aggregazione e Read-Model¶
Oltre alle entità operative sopra riportate, l'app consuma DTO composti ottimizzati per il rendering dei cruscotti:
UserDashboard: include i totali emessi/risparmiati (Stats) e la scomposizione per categoria (weekBreakdown);RecentActivity: feed paginato delle ultime attività registrate su tutte le categorie;LeaderBoard: graduatorie e punteggi per utenti e gruppi con filtri temporali.