Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

[SharePoint 2013] Extendiendo Características sociales Parte I

Dado que ahora estamos inmersos en el desarrollo de una APP que intenta aprovechar las características sociales y que esperemos que en las próximas semanas esté publicada en la Office Store,  voy a intentar explicar cómo se puede sacar partido de las características sociales desde el punto de vista de los desarrolladores y cómo casa eso con el roadmap de Yammer dentro de los productos de Microsoft.

Si analizamos todas las características sociales que icorpora, al poco nos daremos cuenta de que estamos ante un producto igual de competitivo que el resto de redes sociales disponibles en el mercado llámese Facebook, Twitter, etc. Y toda esta información la tenemos disponible tanto a través de las API cliente (en .NET, JavaScript y Windows Phone) cómo mediante el uso de la API Rest.

Las cuatro tienen las mismas posibilidades de desarrollo, por lo que he optado por elegir la API Rest principalmente porque está disponible en todas plataformas: Microsoft (W8, WP8) y NO Microsoft (Android, IOS) en las que realicemos nuestros desarrollos.

Dentro de las características sociales tenemos dos grandes tipos de recursos :

  1. Feed: dónde se muestra información sobre los post publicados en MySite, respuestas a los mismos, las cosas que me gustan/ya me gustan, las menciones recibidas, publicar/eliminar post, etc.
  2. Following: en el que podemos consultas que elementos de SharePoint seguimos, quién nos sigue, seguir a un determinado elemento, dejar de seguir un determinado elemento, me sugiere elementos de sharepoint que me puede gustar,  etc..

Como podéis haber observado prácticamente tenemos todas las opciones para poder tener una buena herramienta «Social» dentro de nuestro SharePoint, pero quizás bien porque se esta esperando la llegada de Yammer dentro de la suite o bien, porque el objetivo de SharePoint no es ser el nuevo Facebook, el caso es que hay muchas opciones que nos faltan.

Personalmente echo de menos mayor presencia de las características sociales fuera de lo que es el «My Site» o los sitios de comunidad; tener un sistema de notificaciones mucho mejor y también un chat tipo Yammer/FaceBook para poder comunicarnos con el resto de compañeros de nuestra empresa en tiempo real. No obstante, tenemos que agradecer a Microsoft que nos deje camino a los desarrolladores para mejorar el producto y en base a las características de fabrica extenderla y así, poder realizar un producto impresionante. Algo semejante a lo que comento lo realizamos en ENCAMINA para la versión 2010, donde desarrollamos un producto que su funcionalidad es exactamente la misma que tienen en 2013 los sitios de comunidad, esta solución la hemos llamado River.

A continuación vamos a desarrollar un APP-Part, del que podamos hacer uso en cualquier sitio de nuestro SharePoint. Es decir, lo que vamos a implementar es una solución que nos facilite el tener mucho más accesible el MySite de manera que podamos postear lo que está ocurriendo ahora mismo. Al fin y al cabo, lo que vamos a implementar es como escribir un Post en MySite.

Manos a la obra

1. Creamos un proyecto de Visual Studio 2012 de Tipo SharePoint APP
2. El alojamiento de esta APP es SharePoint-Hosted (por lo que solo vamos a poder hacer uso del modelo de objetos en JavaScript).
3. Para poder hacer uso de las caracteristicas sociales dentro de nuestra APP tenemos que darle permisos a la APP para que pueda acceder a la información «social» de nuestro SharePoint.  ¿Cómo dar permisos? Pues editamos el fichero AppManifest.xml y en la pestaña de permisos otorgamos Full Control a los Perfiles de Usuario. Los permisos que podemos dar son: lectura, escritura, administrar o control Total.  Tal y como se muestran en la siguiente imagen:

Permisos APP

 Cuando instalemos la APP en nuestro SharePoint nos indicara en un mensaje que           esta APP solicita el control total sobre los perfiles de Usuario por lo que queda a decisión de la persona que instala la APP el determinar si se permite acceder a los perfiles de usuario o no. En caso de que estos permisos se denieguen la APP no se instalará.
ConfianzaAPP

Una vez ya hemos dado los permisos a nuestra APP, el siguiente paso es añadir un APP-Part en nuestra Aplicación:

APP-Part

Al añadir el App-Part nos añade dos objetos a nuestro proyecto por un lado el propio App-Part que no es más que un fichero xml en el que indica como se mostrará cuando se instale la APP en nuestro SharePoint. Y también añadirá una pagina .aspx que es la que se mostrará dentro de un Iframe cuando despleguemos nuestra APP. Tal y como se visualiza en la siguiente imagen:

Example

4. Una vez añadido el APP-Part, nos dirigimos a la pagina «CreatePost.aspx» y añadimos el siguiente código html y le añadimos la referencia a nuestro fichero JavaScript «App.js»:

  1. </em></pre>
    </li>
    	<li style="display: inline !important;"></li>
    </ol>
    <pre style="display: inline !important;"><em id="__mceDel" style="font-size: 16px;"><em id="__mceDel" style="font-size: 16px;"></em></em></pre>
    <div><input onclick="postToMyFeed();" type="button" value="Compartir" /></div>
    <pre>

    5. El siguiente paso es añadir en la función postToMyFeed dentro del fichero App.js:

    function postToMyFeed() {
        var valor = $("#post").val();
        $("#post").text = "";
        var feedManagerEndpoint = appweburl + "/_api/social.feed";
        $.ajax({
            url: feedManagerEndpoint + "/my/Feed/Post",
            type: "POST",
            data: JSON.stringify({
                'restCreationData': {
                    '__metadata': {
                        'type': 'SP.Social.SocialRestPostCreationData'
                    },
                    'ID': null,
                    'creationData': {
                        '__metadata': {
                            'type': 'SP.Social.SocialPostCreationData'
                        },
                        'ContentText': "'" + valor + "'",
                        'UpdateStatusText': false
                    }
                }
            }),
            headers: {
                "accept": "application/json;odata=verbose",
                "content-type": "application/json;odata=verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").val()
            },
            success: function () {
                alert("Post Created");
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("POST error:\n" + xhr.status + "\n" + thrownError);
            }
        });
    }
    

    6. Una vez finalizado instalamos la aplicación y añadimos el APP Part en cualquier pagina, de la siguiente forma, editamos la página, insertamos elemento de Aplicación y podremos seleccionar el APP-Part que acabamos de desarrollar:

    Ribbon App

    7. Una vez ya instalada en nuestro SharePoint visualizaremos el APP-Part creado:

    DemoApp

    ¿Con esta implementación estáis seguro que funcionaria correctamente la APP? ¿Queréis comprobarlo por curiosidad? Efectivamente el código introducido no funciona, nos devuelve un Error de Opción no permitida. ¿Por qué? En primer lugar seguro que pensamos estamos realizando una llamada entre dominios, y de ahí este error. Si se están haciendo llamadas entre dominios es lógico que no funcione. Se debe hacer que hacer uso de la libreria Cross-Domain. Pero no estamos realizando llamadas entre dominios, es más las APP-Part se ejecutan en nuestra propia url, ya que no es más que un Iframe dentro de nuestra página web. El problema está en el valor que tiene el parámetro «$(«#__REQUESTDIGEST»).val()» que al estar dentro del Iframe nos devuelve nulo, por lo que al hacer la petición nos deniega el permiso. Para solucionarlo lo que tenemos que hacer es realizar un Post previo al Contexto de la APP para obtener este valor y a continuación ya realizar la llamada. Es decir el código quedaría de la siguiente forma:

    
    function postToMyFeed() {
        $.ajax({
            url: appweburl +"/_api/contextinfo",
            type: "POST",
            headers: {
                "accept": "application/json;odata=verbose",
                "content-type": "application/json;odata=verbose",
            },
            success: function (data) {
                digest = data.d.GetContextWebInformation.FormDigestValue;
                post();
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("POST error:\n" + xhr.status + "\n" + thrownError);
            }
        });
    
    }
    
    function post()
    {
        var valor = $("#post").val();
        $("#post").text = "";
        var feedManagerEndpoint = appweburl + "/_api/social.feed";
    
        var urlPost=appweburl + "/_api/social.feed" +
                  "/my/Feed/Post";
        $.ajax({
            url: urlPost,
            type: "POST",
            data: JSON.stringify({
                'restCreationData': {
                    '__metadata': {
                        'type': 'SP.Social.SocialRestPostCreationData'
                    },
                    'ID': null,
                    'creationData': {
                        '__metadata': {
                            'type': 'SP.Social.SocialPostCreationData'
                        },
                        'ContentText': "'" + valor + "'",
                        'UpdateStatusText': false
                    }
                }
            }),
            headers: {
                "accept": "application/json;odata=verbose",
                "content-type": "application/json;odata=verbose",
                "X-RequestDigest": digest
            },
            success: function () {
                alert("Post Created");
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("POST error:\n" + xhr.status + "\n" + thrownError);
            }
        });
    }
    

    Todo lo que despleguemos utilizando nuestra APP se visualizará dentro de nuestro MySite indicando que se ha utilizado nuestra APP
    MySite

    Conclusión

    Hemos comprobado que de una forma sencilla podemos extender las capacidades sociales que vienen de serie, hemos creado una APP-Part en la que podemos realizar comentarios y que estos se visualicen dentro de nuestro MySite. Si lo comparamos con ejemplos de la vida real, en este mismo blog tenemos un plugin para realizar comentarios a través de Facebook (algo similar, salvando las distancias, a lo que acabamos de implementar pero dentro de SharePoint). ¿Todo esto cómo casa con Yammer? Como hablamos en el CEUS VIII nosotros estamos convencidos de la utilidad de Yammer y del gran partido que se puede hacer uso de él en SharePoint. Pero a día de hoy, esta integración es pura especulación y muchos rumores sobre cual va a ser el papel que va a tener Yammer dentro de SharePoint. Lo que tenemos claro es la forma de desarrollo en la que Yammer será una APP y que la podemos utilizar dentro de SharePoint, pero de ahí a haber una integración total entre los usuarios de SharePoint y Yammer, creo que aún quedará un tiempo (en caso de que finalmente se produzca). Mientras esto llega, podemos sacar el mejor partido las características sociales que hay en SharePoint que son muchas y muy buenas, e incluso nos podemos plantear realizar nosotros mismos la sincronización de ambos perfiles el de SharePoint con el perfil del usuario en otras redes sociales como pueda ser Yammer.

    Podéis descargaros el ejemplo desde el siguiente link.

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en sharepoint 2013, Yammer y etiquetada como , , . Enlace permanente .
Suscríbete a Desarrollando sobre SharePoint

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!

ENCAMINA, piensa en colores