Ho una piattaforma SaaS in cui l'utente compila un modulo e i dati inseriti nel modulo vengono salvati in un database. L'interfaccia utente del modulo ha una grande quantità di configurazione (originata dal DB ma finisce in JavaScript) e business logic (in JavaScript). Dopo che un modulo è stato compilato e salvato, l'utente può tornare indietro in qualsiasi momento e modificarlo.
La ruga è che una vecchia voce di modulo deve comportarsi come quando era stata compilata per la prima volta - ha bisogno della stessa configurazione e logica di business - Anche se il SaaS ha attraversato una modifica dello schema dati e modificato la logica di business da poi.
Per confermare, i nuovi moduli compilati dall'utente useranno naturalmente lo schema dei dati nuovo / corrente e la logica aziendale. Ma i moduli precedenti devono comportarsi come quando sono stati creati.
Quindi ho bisogno di un modo ragionevole per configurare la versione, la logica di business e qualsiasi dipendenza.
Il meglio che ho imparato è quando l'utente salva la sua voce, per salvare la configurazione del modulo come JSON insieme alla voce. Quando l'utente torna a modificare una vecchia voce, non carico la configurazione dallo schema del database corrente ma semplicemente scarico la configurazione JSON salvata con la voce.
Per la logica aziendale, salvi un numero di versione del sistema insieme alla voce, ad esempio "01". Quando l'utente carica un vecchio modulo, controllo la versione del modulo e quindi carica il modulo JavaScript da un percorso come "js / main_01.js". Quando apporto una modifica non retrocompatibile alla logica aziendale, aumento il numero di versione del sistema, ad esempio "02". Le nuove forme avrebbero quindi utilizzato "js / main_02.js". Uso anche questo approccio di controllo delle versioni a basso costo per i modelli di visualizzazione HTML che sta diventando sempre più difficile.
Questo approccio funziona ma sembra un po 'fragile o nostrano. Sto cercando di evitare condizionali nella mia logica aziendale come if version==2: do this
. Questo approccio evita questo, ma ha anche aspetti negativi.
Non penso che lo stack sia davvero importante per questo convo ma, nel caso, sto usando django / mysql.