Para todos los que seguimos las novedades que hay en el desarrollo de Office 365, hemos podido observar que desde la división de Office 365 se están realizando muchos esfuerzos en cumplir la hoja de ruta impulsada por Satya Nadella: todo servicio de Microsoft debe de poder ejecutarse en cualquier dispositivo y cualquier plataforma. En un primer lugar, todo lo que estamos viendo son esfuerzos para que todo servicio de Office 365 disponga de una API REST y un sistema de autenticación bastante claro. Esto lo podemos observar en la cantidad de API's disponibles y su posterior unificación en una única API. Para el tema de la Autenticación disponemos de la librería ADAL de la cual ya hemos hablado en anteriores artículos. Recientemente habían pocas novedades en cuanto a poder utilizar herramientas en otras plataformas no Windows, pero desde los últimos meses y propiciado por la salida de Visual Studio Code todo esto está cambiando. En muchos productos de la misma forma que sacan un SDK para Windows, el equipo de producto también proporciona herramientas para los desarrolladores de Android e IOS.
Ahora bien, ¿cómo podemos utilizar Office 365 en todas las plataformas? Por un lado, tenemos el mensaje que en SharePoint Online no es posible utilizar las Soluciones de Tipo Granja para extender la plataforma, la única posibilidad es o bien utilizando JavaScript o bien desarrollando aplicaciones o Add-Ins. Ya hemos visto cómo implementar Add-Ins dentro de una aplicación ASP.NET MVC, ahora vamos a ver cómo hacer una aplicación con Node.js.
¿Qué es Node.js?
Node.js es un servidor de aplicaciones cuya principal característica es que está implementado en JavaScript. Este motivo ha hecho que haya incrementado mucho su popularidad entre los desarrolladores Web. No hace falta conocimientos avanzados para tener levantado un sitio web con la ventaja de que es multiplataforma y su motor de ejecución es V8 (el motor de ejecución del navegador Google Chrome). Con un código tan sencillo como el siguiente tenemos el clásico "Hola mundo" en el servidor:
1var http = require('http');2http.createServer(function (request, response) {3 response.writeHead(200, {'Content-Type': 'text/plain'});4 response.end('Hello World\n');5}).listen(8000);6console.log('Server running at http://127.0.0.1:8000/');7
Pero Node.js, no se ha popularizado solamente por ser un servidor, sino por dos motivos más :
Visual Studio Code
Mucho estamos hablando de herramientas Open Source y en las que Microsoft se ha posicionado en cuanto a su uso e incluso evolución. Pero si hay algo que podemos decir es que la joya de la corona de la multinacional de Redmond en cuanto a herramientas no es otra que Visual Studio, el IDE de desarrollo más completo del mercado. El único defecto que tiene (si se puede llamar defecto) es que solamente se puede ejecutar en un entorno Microsoft. Para paliar este problema, Microsoft anunció un IDE totalmente gratuito y multiplataforma: Visual Studio Code. Una herramienta 100% diseñada para desarrolladores Web.
Este pequeño Visual Studio tiene alguna de las características de su hermano mayor, como es su fácil uso, el Intellisene, el refactoring y los snippets. Además como gran ventaja es que se complementa muy bien con Node.js y con todo el stack Web. Incluso disponemos de una plantilla de Youman (Youman es una herramienta para crear proyectos, similar a los templates de Visual Studio pero para el mundo FrontEnd) para poder personalizar a nuestro gusto los colores del IDE.
Tras esta introducción vamos a ver como comenzar con un desarrollo sobre la API Unificada de Office 365.
Ejemplo Aplicación Angular con la API Unificada y alojada en Node.js
Requisitos Previos:
Manos a la obra:
Provisionando el esqueleto del proyecto:
1>bower init2
1>touch .bowercc2
1{2 "directory": "lib"3}4
1>bower install bootstrap angular angular-route adal-angular --save2
Construyendo la Aplicación:
1<!DOCTYPE html>2<html lang="en">3<head>4 <meta charset="UTF-8">5 <title>Compartimoss My Organization</title>6 <link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.min.css">7</head>8<body ng-app="app">9 <div ng-view></div>10 <!-- JQuery and Bootstrap references -->11 <script type="text/javascript" src="lib/jquery/dist/jquery.min.js"></script>12 <script type="text/javascript" src="lib/bootstrap/dist/js/bootstrap.min.js"></script>13 <!-- Angular reference -->14 <script type="text/javascript" src="lib/angular/angular.min.js"></script>15 <script type="text/javascript" src="lib/angular-route/angular-route.min.js"></script>16 <!-- ADAL reference -->17 <script type="text/javascript" src="lib/adal-angular/dist/adal.min.js"></script>18 <script type="text/javascript" src="lib/adal-angular/dist/adal-angular.min.js"></script>19 <!-- App scripts -->20 <script type="text/javascript" src="app/app.js"></script>21</body>22</html>23
1angular.module("orgExplorer",[app.services", "app.controllers", "ngRoute", "AdalAngular"])2
1angular.module("orgExplorer", [app.services", "app.controllers", "ngRoute", "AdalAngular"])2.config(["$routeProvider", "$httpProvider", "adalAuthenticationServiceProvider", function ($routeProvider, $httpProvider, adalProvider) {3 $routeProvider.when("/login", {4 controller: "loginCtrl",5 templateUrl: "/app/templates/view-login.html",6 requireADLogin: false7 })8 .when("/user", {9 controller: "meCtrl",10 templateUrl: "/app/templates/view-user.html",11 requireADLogin: true12 })13 .when("/user/:id", {14 controller: "userCtrl",15 templateUrl: "/app/templates/view-user.html",16 requireADLogin: true17 })18 .otherwise({ redirectTo: "/login" });19
1adalProvider.init({2 instance: "https://login.microsoftonline.com/",3