martes, 22 de marzo de 2016

Property Bag - Buenas prácticas al desarrollar software

Es de lo más común desarrollar software en el que determinadas piezas tienen que ser configurables. Un ejemplo de estas piezas serían aquellas que conectan a base de datos y requieren cadenas de conexión en los que intervienen el nombre del servidor, puerto, instancia de base de datos, etc.
¿En dónde colocan ustedes esa información necesaria para que su aplicación funcione? Hay varias técnicas y todas ellas intentan mantener el mayor equilibrio posible entre Facilidad para gestionar la información y Seguridad de la información. Algunas de ellas pueden ir desde escribir ésta información directamente en el código (muy mala idea); usar archivos XML como el web.config (no recomendable); hasta colocarla en una base de datos diferente (lo cual trae de nuevo el mismo problema). 

En SharePoint existe el mismo reto cuando desarrollamos soluciones para dicha plataforma pero, con un abanico más amplio de herramientas; por ejemplo, crear una lista con dos columnas (Clave y Valor). Su función es la misma que un diccionario en el que la clave nos permite vincular la información con alguna variable en nuestro código y el valor nos da la información que necesitamos. La solución es sencilla; no necesitamos de cadenas de conexión gracias al API de desarrollo; útil y nos provee de una interfaz de usuario con la que podemos gestionar la información. El problema está en la seguridad y es que las listas son rastreables por el motor de búsqueda o bien, se puede acceder a la información desde: Todo el contenido del sitio.
Ciertamente hay trucos para evitar estos inconvenientes pero, probemos una solución mas "elegante". 

Existe una herramienta conocida como Property Bag que nos permite gestionar información y que no es rastreable por el motor de búsqueda ni está disponible por alguna interfaz de usuario en SharePoint. Su funcionamiento es igual que el de un diccionario y la forma en la que lo trabajamos es la misma que con un Ítem de una lista en SharePoint; lo mejor es que está disponible en las versiones más recientes de SharePoint, incluso en el Online.

En el siguiente ejemplo ocupo el API de desarrollo de SharePoint con JavaScript para almacenar una variable llamada _Propiedad_Conexion en el Property Bag.


function crearInformacion() {
    var context = SP.ClientContext.get_current();
    var web = context.get_web();
    var informacion = "Información necesaria para conexión";

    context.load(web);
    var webProperties = web.get_allProperties();
    var propiedad = webProperties.set_item("_Propiedad_Conexion", informacion);
    web.update();

    context.executeQueryAsync(Function.createDelegate(this, function (sender, args) {
        alert("Información creada/actualizada correctamente");
    }),
        Function.createDelegate(this, this.onQueryFailed)
    );
}

En la siguiente función recuperaremos la misma variable del Property Bag. Recuerden ocupar las secciones try/catch para evitar interrupciones de código en el caso de que no exista la variable en el Property Bag.


function cargarInformacionMapa() {
    var context = SP.ClientContext.get_current();
    var web = context.get_web();
    var webProperties = web.get_allProperties();

    context.load(webProperties);

    context.executeQueryAsync(Function.createDelegate(this, function (sender, args) {
        try {
            var propiedad = webProperties.get_item("_Propiedad_Conexion");
            //TODO: Hacer algo adicional.
        } catch (error) {
            console.log("No existe la variable en el Property Bag");
        }
    }),
        Function.createDelegate(this, this.onQueryFailed)
    );
}


Espero que este post les ayude a construir mejores soluciones y recuerden, felices trazos jejeje.