Skip to main content

πŸ“‹ Proposta Ristrutturazione Database Devices

Data: 12 Dicembre 2025
Stato: Draft - In discussione
Autori: Team Visla GPS


🎯 Obiettivo​

Separare nettamente i dati fissi del dispositivo (gestiti da admin) dai dati personalizzabili per utente (gestiti da owner/viewer), migliorando la gestione della condivisione e riducendo la complessitΓ  dello schema.


πŸ“Š Schema Attuale vs Proposto​

Schema Attuale (3 tabelle)​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DeviceList β”‚ β”‚ Device β”‚ β”‚ UserDevice β”‚
β”‚ (inventario) β”‚ β”‚ (runtime + β”‚ β”‚ (permessi + β”‚
β”‚ β”‚ β”‚ custom attrs) β”‚ β”‚ ownership) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Problemi:

  • Device mescola dati fissi (model) con dati runtime (status) e custom (name)
  • Duplicazione di dati tra DeviceList e Device
  • Il nome del device Γ¨ unico, ma ogni utente potrebbe volerlo vedere diversamente

Schema Proposto (2 tabelle)​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DeviceCatalog β”‚ ◄──1:N──│ UserDeviceView β”‚
β”‚ (FIXED) β”‚ β”‚ (CUSTOM + PERMESSI) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Vantaggi:

  • βœ… Separazione chiara delle responsabilitΓ 
  • βœ… Ogni utente puΓ² personalizzare il proprio "view" del device
  • βœ… Meno tabelle, meno complessitΓ 
  • βœ… Condivisione piΓΉ naturale

πŸ“ Schema Dettagliato​

Tabella device_catalog (FIXED - gestita da Admin)​

Contiene i dati immutabili del dispositivo fisico, gestiti esclusivamente dall'amministratore.

ColonnaTipoConstraintsDescrizione
idBIGINTPK, AUTO_INCREMENTID primario
imeiVARCHAR(128)UNIQUE, NOT NULLIMEI del dispositivo
device_unique_idVARCHAR(128)Device unique ID originale
protocol_idVARCHAR(128)UNIQUE, INDEX, NOT NULLID usato dal decoder per match
modelVARCHAR(128)NOT NULLModello (S21L, G11-SE, etc.)
simVARCHAR(128)Numero SIM associata
claim_tokenVARCHAR(128)UNIQUE, NOT NULLToken per claim da app
statusVARCHAR(32)DEFAULT 'offline'online/offline (runtime)
last_updateDATETIMEUltimo aggiornamento posizione
position_idBIGINTID ultima posizione
created_atDATETIMENOT NULLData creazione inventario
CREATE TABLE device_catalog (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
imei VARCHAR(128) UNIQUE NOT NULL,
device_unique_id VARCHAR(128),
protocol_id VARCHAR(128) UNIQUE NOT NULL,
model VARCHAR(128) NOT NULL,
sim VARCHAR(128),
claim_token VARCHAR(128) UNIQUE NOT NULL,
status VARCHAR(32) DEFAULT 'offline',
last_update DATETIME,
position_id BIGINT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,

INDEX idx_protocol_id (protocol_id),
INDEX idx_claim_token (claim_token)
);

Tabella user_device_view (CUSTOM - gestita da Owner/Viewer)​

Contiene la "vista" personalizzata che ogni utente ha del dispositivo, inclusi permessi e attributi custom.

ColonnaTipoConstraintsDescrizione
idBIGINTPK, AUTO_INCREMENTID primario
user_idBIGINTNOT NULL, INDEXID utente
device_idBIGINTFK β†’ device_catalog, NOT NULLRiferimento al device
OWNERSHIP
is_ownerBOOLEANNOT NULL, DEFAULT FALSETRUE se Γ¨ il proprietario
shared_byBIGINTuser_id di chi ha condiviso (NULL se owner)
CUSTOM ATTRIBUTES
nameVARCHAR(128)NOT NULLNome personalizzato
categoryVARCHAR(128)Categoria (auto, moto, bici...)
iconVARCHAR(64)Icona personalizzata
colorVARCHAR(32)Colore nel UI
attributesTEXTJSON con attributi extra
group_idBIGINTGruppo/folder per organizzazione
PERMISSIONS
permission_positionBOOLEANDEFAULT TRUEPuΓ² vedere posizione
permission_eventsBOOLEANDEFAULT TRUEPuΓ² vedere eventi
permission_geofencesBOOLEANDEFAULT TRUEPuΓ² gestire geofence
permission_notificationsBOOLEANDEFAULT TRUERiceve notifiche
permission_commandsBOOLEANDEFAULT FALSEPuΓ² inviare comandi
META
created_atDATETIMENOT NULLData creazione relazione
CREATE TABLE user_device_view (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
device_id BIGINT NOT NULL,

-- Ownership
is_owner BOOLEAN NOT NULL DEFAULT FALSE,
shared_by BIGINT,

-- Custom attributes
name VARCHAR(128) NOT NULL,
category VARCHAR(128),
icon VARCHAR(64),
color VARCHAR(32),
attributes TEXT,
group_id BIGINT,

-- Permissions
permission_position BOOLEAN NOT NULL DEFAULT TRUE,
permission_events BOOLEAN NOT NULL DEFAULT TRUE,
permission_geofences BOOLEAN NOT NULL DEFAULT TRUE,
permission_notifications BOOLEAN NOT NULL DEFAULT TRUE,
permission_commands BOOLEAN NOT NULL DEFAULT FALSE,

-- Meta
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,

UNIQUE KEY uk_user_device (user_id, device_id),
FOREIGN KEY (device_id) REFERENCES device_catalog(id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_device_id (device_id)
);

πŸ”„ Flussi di Business​

1. Admin Crea Dispositivo (Inventario)​

2. Utente Claim Dispositivo​

3. Owner Condivide con Viewer​

4. Viewer Personalizza la sua Vista​


πŸ“‹ Matrice Permessi​

AzioneOwnerViewer (con permesso)Viewer (senza permesso)
Vedere posizioneβœ…βœ… (se permission_position)❌
Vedere eventiβœ…βœ… (se permission_events)❌
Modificare nome/categoriaβœ…βœ… (la sua vista)βœ… (la sua vista)
Gestire geofenceβœ…βœ… (se permission_geofences)❌
Inviare comandiβœ…βœ… (se permission_commands)❌
Condividere con altriβœ…βŒβŒ
Rimuovere deviceβœ…βŒβŒ

πŸ› οΈ Impatto sui Microservizi​

ServizioModifiche Necessarie
device-serviceRefactor modelli, routes, logica claim
db-persisterAggiornare status/position su device_catalog
tracking-serviceQuery join device_catalog + user_device_view
sharing-serviceLogica inserimento user_device_view
admin-panelCRUD su device_catalog, import CSV
notification-serviceQuery permessi da user_device_view

πŸ“ˆ Migrazione​

Step 1: Creare nuove tabelle​

-- Creare device_catalog e user_device_view

Step 2: Migrare dati esistenti​

-- Da device_list + devices β†’ device_catalog
INSERT INTO device_catalog (imei, device_unique_id, protocol_id, model, sim, claim_token, status, last_update, position_id)
SELECT
dl.imei,
dl.device_unique_id,
COALESCE(d.unique_id, dl.device_unique_id, dl.imei) as protocol_id,
COALESCE(dl.model, d.model),
dl.sim,
dl.token,
d.status,
d.last_update,
d.position_id
FROM device_list dl
LEFT JOIN devices d ON d.unique_id = dl.device_unique_id OR d.unique_id = dl.imei;

-- Da user_device + devices β†’ user_device_view
INSERT INTO user_device_view (user_id, device_id, is_owner, shared_by, name, category, attributes, permission_position, ...)
SELECT
ud.user_id,
dc.id,
ud.is_owner,
ud.shared_by,
d.name,
d.category,
d.attributes,
ud.permission_position,
...
FROM user_device ud
JOIN devices d ON d.id = ud.device_id
JOIN device_catalog dc ON dc.protocol_id = d.unique_id;

Step 3: Aggiornare codice microservizi​

Step 4: Test completi​

Step 5: Drop vecchie tabelle (dopo periodo di transizione)​


❓ Domande Aperte​

  1. Gruppi/Folder: Ogni utente puΓ² avere i propri gruppi o sono condivisi con chi accede al device?

  2. Attributi custom condivisi: Ci sono attributi che l'owner imposta e tutti vedono (es. targa)?

  3. Notifiche: Le notifiche sono per device (owner imposta, tutti ricevono) o per user_device_view (ognuno imposta le sue)?

  4. Storico condivisione: Serve tenere log di chi ha avuto accesso e quando?


βœ… Prossimi Passi​

  • Review da parte del team
  • Rispondere alle domande aperte
  • Creare implementation plan dettagliato
  • Stimare effort
  • Pianificare sprint

Documento generato il 12/12/2025 - Versione 1.0