Truc 25 : Gérer un Crud partagé en ligne avec Mongolab et AngularJs PARTIE 2 : Un service $http pour Mongolab

MongoLabIntroduction


Comme indiqué dans la partie un, il est suggéré de créer un service(ou une factory) dédié aux accès $http.

Le but est de séparer la logique d’accès Réseau du reste de l’application afin de ne pas polluer le code dans les controleurs.

Voici donc la version ou j’ai créé une factory afin d’accéder en ligne à Mongolab.

Pour le tester, cliquer ICI

Quelques remarques :

  • Lorsqu’un ordinateur supprime un utilisateur, le second ordinateur rafraichit la liste automatiquement grâce à ma fonction $interval toutes les 1secondes, de ce fait, on peut réellement parler d’application partagée.
  • C’est assez rapide, mais bien sur pas sécurisé.
  • C’est bien plus rapide d’écrire du code comme ça, sans Back END, tout en Javascript, de plus les champs s’auto génèrent dans MongoDb, c’est très agréable. Il faut aussi savoir de quelle façon sécuriser une app MongoDb !
  • Reste à voir ce que propose Socket.io et à faire quelques micros Apps en ligne avec MongoLab.
  • Le Crud s’occupe de chaque élèment en fonction de son ID, mais rien ne nous empêche de sauvegarder tout le modèle de données à chaque fois d’un seul coup pour aller plus vite…Reste à voir si c’est possible en cas de grosse base de données Mongolab….

Mon code (Temps de réalisation 2h):


<!DOCTYPE html>
<html ng-app="monApp">
  <head>
   <meta charset="utf8" >
    <title>UN CRUD Partagé en ligne dans une BDD MongoLab avec AngularJs</title>
        <!-- CHARGEMENT DES LIBRAIRIES -->
			<!-- APPEL LIB ANGULAR -->
				<script type="text/javascript" src="angular-1.3.13/angular.min.js"></script>
				<script src="angular-route.min.js"></script>
				<script src="librairies/angular-locale_fr-fr.js"></script>
			<!-- CSS DE L'APPLICATION -->
				<link href="truc25.css" media="screen" rel="stylesheet" type="text/css" />
		<!-- FIN DE CHARGEMENT DES LIBRAIRIES -->
	   <script>

         var monApp = angular.module('monApp',['ngRoute'])

        .config(function ($routeProvider, $locationProvider,$httpProvider){

		<!-- ROUTING ANGULAR -->
		$routeProvider
            .when('/accueil', {
              templateUrl: 'defaut.html',
              controller: 'accueilCtrl'
            })
            .when('/liste', {
              templateUrl: 'liste.html',
              controller: 'listeCtrl'
            })
            .when('/creer', {
              templateUrl: 'enregistrer.html',
              controller: 'enregistrerCtrl'
            })

            .otherwise({redirectTo: '/accueil'});
		})

		<!-- LE CONTROLEUR DE L'ACCUEIL -->
		.controller("accueilCtrl", function($scope) {
			$scope.bonjour = "Mr Durand";
		})

		<!-- LE CONTROLEUR DE LA LISTE, DE LA SUPPRESSION ET DE LA MISE A JOUR -->
        .controller("listeCtrl", function($scope,crudMongolab,$interval) {

			<!-- Lecture des datas dans la factory Mongolab, la fonction success gère l'asynchronicité. -->
			crudMongolab.getUtilisateurs().success(function(data, status){
				$scope.liste = data;
			});

			<!-- Fonction de Rafraichissement de la liste -->
			$scope.rf = function(){
				crudMongolab.getUtilisateurs().success(function(data, status){
					$scope.liste = data;
				});
			}

			$interval(function() {
			  $scope.rf();
			}, 1000);

			$scope.supprimer = function(id){
					crudMongolab.supprimeUtilisateur(id).success(function(data, status){
						$scope.rf();// Rafraichissement de la liste après suppression
						alert('Utilisateur supprimé en ligne dans MONGOLAB! ')
					})
			}   

			$scope.miseajour = 	function(id){
				crudMongolab.modifieUtilisateur(id).success(function(data, status){
						console.log(data)
						$scope.majNom = data.nom;
						$scope.majAge = data.age;
						$scope.majId = data._id.$oid;
					})	 	

			}	

			$scope.validerMaj = function(){

				crudMongolab.valideModification($scope.majId,$scope.majNom,$scope.majAge).success(function(data, status){
					$scope.rf();// Rafraichissement de la liste après update
					alert('Utilisateur mis à jour en ligne dans MONGOLAB! ')
				})	

			};

		<!-- FIN DU CONTROLEUR -->
        })

		<!-- LE CONTROLEUR DE LA CREATION D UN UTILISATEUR -->
        .controller("enregistrerCtrl", function($scope,crudMongolab) {

			<!-- Initialisation des champs Input -->
			$scope.nom = "";
			$scope.age = "";

			<!-- Envoi des valeurs entrées par l'utilisateur dans notre database mongolab -->
			$scope.enregistrer = function(){

				crudMongolab.creerUtilisateur($scope.nom,$scope.age ).success(function(data, status){
						alert('Utilisateur Créé en ligne dans MONGOLAB! ')
						$scope.rf();//rafrachissement de la liste après suppression

					})
			};

		<!-- FIN DU CONTROLEUR -->
        })

		<!-- VOICI LA FACTORY QUI S OCCUPE DE TOUT LE CRUD DANS MONGOLAB EN LIGNE-->

		.factory("crudMongolab",function($http){
			var factory = {};

				<!-- OBTENIR LA LISTE DES UTILISATEURS -->
				factory.getUtilisateurs = function(){
					return $http.get('https://api.mongolab.com/api/1/databases/superjojo/collections/Test?apiKey=GP50LkzEgoxBnZDP9N-jCkpO5yln2gIS')
				};

				<!-- SUPPRIMER UN UTILISATEUR -->
				factory.supprimeUtilisateur = function(id){
					return $http.delete('https://api.mongolab.com/api/1/databases/superjojo/collections/Test/'+id,
						{
							params:{
							 apiKey:'GP50LkzEgoxBnZDP9N-jCkpO5yln2gIS'
							}
						}
					)

				}

				<!-- CREER UN UTILISATEUR -->
				factory.creerUtilisateur = function(nom,age){
					return 	$http.post('https://api.mongolab.com/api/1/databases/superjojo/collections/Test?apiKey=GP50LkzEgoxBnZDP9N-jCkpO5yln2gIS', {	"nom":nom,"age":age}, {
						headers: {
						'Content-Type': 'application/json; charset=UTF-8'
						}
					})

				}

				<!-- MODIFIER UN UTILISATEUR -->

				factory.modifieUtilisateur = function(id){
					return 	$http.get('https://api.mongolab.com/api/1/databases/superjojo/collections/Test/'+id,
						{
							params:{
							 apiKey:'GP50LkzEgoxBnZDP9N-jCkpO5yln2gIS'
							}
						}
					)

				}

				factory.valideModification = function(id,nom,age){
					return 	$http.put('https://api.mongolab.com/api/1/databases/superjojo/collections/Test/'+id,{"nom":nom,"age":age},
						{
							params:{
							 apiKey:'GP50LkzEgoxBnZDP9N-jCkpO5yln2gIS'
							}
						}
					)

				}

			return factory
		});

    </script>
 </head>

 <!-- La page HTML générale -->
<body ng-controller="accueilCtrl" >
	<img src="MongoLab.png" ></img>

<h1>UN CRUD  dans une BDD MongoLab avec AngularJs</h1>

<!-- Le menu, qui appelle,grâce à HREF, les différentes vues HTML situées plus bas, puis les affiche dans la balise ng-view -->

<div class="container ">

<div class="menu designDiv">
            <a href="#/accueil" class="">Accueil</a>
            <a href="#/liste" class="">Liste   </a>
            <a href="#/creer" class="">Créer</a>

        </div>

        <!-- Cette balise NG-View va afficher les différentes vues -->

<div id="main" class="designDiv">

<div ng-view></div>

        </div>

	</div>

</body>

<!-- Voici maintenant la liste des vues qui s'affichent dans la balise ng-view(voir plus haut), qui doivent généralement être dans un fichier séparé, normalement dans un réperoire "views", pour être à la norme BOWER -->
<!-- VUE HTML : DEFAUT-->
    <script type="text/ng-template" id="defaut.html">
        Bonjour {{bonjour}} je suis la vue de l'accueil.
    </script>

<!-- VUE HTML : LISTE -->
    <script type="text/ng-template" id="liste.html">

<div class="listStyle">
			Bonjour, je suis la vue qui présente une liste(collection) présente dans la base de donnée MongoLab.

<div class="personne" ng-repeat="element in liste">

<h2>Nom:{{element.nom}} </h2>

  Age:{{element.age}} 

			<button class="button" ng-click="supprimer(element._id.$oid)">Supprimer</button>
			<button class="button" ng-click="miseajour(element._id.$oid)">Mettre à jour</button>
			</div>

		</div>

<div class="majStyle">
			Bonjour, je suis la DIV qui permet de mettre à jour les données sur Mongolab
			<label>Nom</label>

				<input ng-model="majNom" ></input>{{majnom}} 

			<label>Age</label>

				<input type="number" ng-model="majAge"></input>{{majage}}

			<button class="button" ng-click="validerMaj()">Enregistrer sur Mongolab</button>

		</div>

    </script>

<!-- VUE HTML : ENREGISTRER -->
    <script type="text/ng-template" id="enregistrer.html">
        Bonjour, je suis la vue qui permet d'enregistrer un élèment dans la liste(collection)  dans la base de donnée Mongolab.

			<label>Nom</label>

				<input ng-model="nom" ></input>{{nom}} 

			<label>Age</label>

				<input type="number" ng-model="age"></input>{{age}}

		{{data}}
		<button ng-click="enregistrer(data)">Enregistrer</button>
	</script> 

<style>
   .listStyle{

   background-color:lightgrey;
   width : 50%;
   float:left;
   }
   .majStyle{
	background-color:ivory;
   width : 50%;
   float:left;
   }
   .personne{
   border-top:20px;
   background-color:ivory;
	border:1px solid grey;
	border-width:1px 1px 1px 1px;
	height:120px;
	}
	.button{
   float:right;
	}
	</style>

Publicités