WebAPI: Modifica Endpoint

Lavorando ad un progetto InDe Cloud, in cui la web app utilizza i dati di un’applicazione foundation tramite WebAPI, mi sono scontrato con una necessità forse interessante anche per altri.

Premetto che l’applicazione foundation è strutturata così:
Un database unico in cui risiedono i dati comuni a tutte le aziende utilizzatrici, più la tabella con i dati identificativi di queste aziende. Questo database prende il nome di Globale.
Un database separato per ogni azienda utilizzatrice, con i dati gestiti da quell’azienda.
Al login, l’utente dichiara l’azienda in cui lavora e l’applicazione modifica di conseguenza la connection string al database aziendale, lasciando inalterata quella al database globale.
A livello di server web, per ora c’è un unico server web da cui è possibile accedere al db globale e a tutti i db aziendali. Più avanti però potrebbero esserci più installazioni della stessa applicazione foundaiton, ognuna con uno o più database aziendali. In pratica, avremo un server web centrale con i dati globali, e più server web aziendali con i dati delle aziende.

In questo contesto, l’applicazione cloud che consuma le WebAPI dell’applicazione foundation deve poter modificare l’Endpoint delle classi in fase di login, differentemente tra sessione e sessione.
Purtroppo però il metodo previsto non supporta questa possibilità:

App.NwindLibreria.MyODataAPI.init = function (app)
{
App.NwindLibreria.Products.webApiEndpoint = {
type : "NwindLibreria.MyODataAPI",
url : "https://prod3-pro-gamma.instantdevelopercloud.com/academy"
};
...
};

Modificando l’Endpoint a livello di App (A maiuscola), lo si modifica a livello di installazione, e quindi per tutte le sessioni. Lo stesso non è previsto a livello di app (a minuscola).

La soluzione suggerita dall’assistenza è:
Intercettare l’evento OnInit di ogni classe ed eseguire da lì la personalizzazione:

this.webApiEndpoint = new App.NwindLibreria.MyODataAPI(app);
this.webApiEndpoint.url = "https://prod3-pro-gamma.instantdevelopercloud.com/academy";

Questa soluzione, seppur funzionante, fa nascere due ulteriori esigenze:

  1. Avere un metodo per la modifica dell’Endpoint a livello di sessione.
  2. Poter globalizzare gli eventi documentali, in modo tale da centralizzare le operazioni che tutte (o buona parte) di esse devono eseguire.

Che ne dite?

3 Mi Piace

Avere un “DocumentHelper” anche su Cloud sarebbe veramente utile, in un altro progetto ho riscontrato la stessa esigenza ed ho dovuto ingegnarmi usando una classe DO base dove ho dichiarato variabili comuni e gestito eventi che devono funzionare nello stesso modo per tutti i documenti.
Ho quindi esteso questa classe su tutte le classi DO, però è un modo di lavorare che rischia di portarsi dietro una marea di problemi, basta una piccola dimenticanza e non funziona come dovrebbe.

L’unica fortuna è che la reflection in javascript è moooooolto più vasta di foundation e quindi consente di gestire le cose molto più minuziosamente, ma permette anche di fare le peggiori porcate :rofl:

2 Mi Piace