diff --git a/app/controllers/PostsController.js b/app/controllers/PostsController.js index 98181a2..5406b78 100755 --- a/app/controllers/PostsController.js +++ b/app/controllers/PostsController.js @@ -13,8 +13,25 @@ class PostsController extends Controller { constructor() { super(Post) + console.log("I am in PostsController"); } + findPublished(req, res, next) { + // Get all documents and filter with queries string (req.query : ex. http://domain.ext/api/?query=string) + // this.model.find(req.query, (err, documents) => { + console.log("in findPublished "); + // GET /search?q=tobi+ferret + // req.query.q + // => "tobi ferret" + this.model.find('req.query.publish' , (err, documents) => { + // this.model.find('/app/blog/posts/?publish=true' , (err, documents) => { + res.json(documents) + console.log("posts.publish", req.query.publish); + + }) + } + + } module.exports = PostsController diff --git a/app/models/post.js b/app/models/post.js index 06fe4da..bd38fc9 100755 --- a/app/models/post.js +++ b/app/models/post.js @@ -11,6 +11,12 @@ module.exports = mongoose.model('Post', new mongoose.Schema({ }, content: { type: String + }, + publishedAt: { + type: Date + }, + publish: { + type: Boolean } }, { timestamps: true diff --git a/app/routes/posts.js b/app/routes/posts.js index 672c9a2..6479a40 100755 --- a/app/routes/posts.js +++ b/app/routes/posts.js @@ -9,7 +9,7 @@ module.exports = (app) => { // Create new controller let ctrl = new PostsController(); - //GET (for READ) method + // //GET (for READ) method app.get('/posts', (req, res, next) => { return ctrl.find(req, res, next) }) diff --git a/package.json b/package.json index dc0a4ae..b0809ab 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "express-jwt": "^5.1.0", "jsonwebtoken": "^7.3.0", "method-override": "~2.3.6", + "moment": "^2.18.1", "mongoose": "^4.8.7", "morgan": "~1.7.0", "passport": "^0.3.2", diff --git a/posts.json b/posts.json new file mode 100644 index 0000000..61d3e10 --- /dev/null +++ b/posts.json @@ -0,0 +1,11 @@ +{"_id":{"$oid":"59098efab395541750ab50a1"},"updatedAt":{"$date":"2017-05-03T08:50:39.820Z"},"createdAt":{"$date":"2017-05-03T08:04:10.369Z"},"title":"Exercice 1","content":"elsadd@hotmail.fr \nle mot de passe c'est la première lettre de l'alphabet\n\n1. Ce qu’est un fork Github ?\n c'est quand on duplique un projet présent sur GitHub afin de le faire évoluer de son coté différemment de la version originale.\n\\n\n2. A quoi sert-il ?\n cela permet de faire des évolutions sans qu'li n'y ait d'impact sur la version d'origine tout en gardant un lien avec elle. De nombreux logiciels sont issus de Forks. \n\n3. Qu’est-ce qu’une pull request ? Quel est l’intérêt ?\n c'est du code qui est présenté aux propriétaires du projet afin d’être validé publiquement avant de l'intégrer (merge) dans le code existant du projet. Ce peut être en interne ou en externe. Cela permet d'intégrer des contributions.\n \n4. Qu’est-ce qu’une branche ?\n\"Créer une branche signifie diverger de la ligne principale de développement et continuer à travailler sans se préoccuper de cette ligne principale.\"\n cela permet de séparer le modifications de code et de les fusionner plus tard si on le souhaite\n\n5. Quelle est la différence entre une branche et un fork ? \nune branche appartient à un projet donné, un fork c'est un autre projet, qui a lui même ses propres branches.","__v":0,"publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"publish":true} +{"_id":{"$oid":"5909946c41cbd21c20468bc8"},"updatedAt":{"$date":"2017-05-03T18:07:03.677Z"},"createdAt":{"$date":"2017-05-03T08:27:24.820Z"},"title":"exo 5 publishedAt","content":"Instructions : \nLors de l’ajout/édition d’un article, un troisième champ « date de publication » doit être visible et on doit pouvoir y inscrire une date\nL’usage d’un Datepicker est un gros plus mais pas indispensable. Si vous n’utilisez pas de datepicker, mettez au moins un message d’aide pour que l’utilisateur renseigne la date sous le bon format. \nLe contenu de ce champ doit apparaître sur la page de visualisation d’un article, en dessous de son titre : « publié le JJ-MM-AAAA »\nPensez à la mise à jour du schéma Mongoose pour l’enregistrement, réfléchissez à un bon nom de champs, en prenant exemple sur les « createdAt » / « updatedAt »","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"__v":0,"publish":true} +{"_id":{"$oid":"5909963341cbd21c20468bc9"},"updatedAt":{"$date":"2017-05-03T20:54:32.295Z"},"createdAt":{"$date":"2017-05-03T08:34:59.426Z"},"title":"exo5","content":"Nous aimerions ajouter une date de publication à l’article sous la forme «JJ-MM-AAAA », par exemple : 03-05-2017.","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"__v":0,"publish":true} +{"_id":{"$oid":"5909ee89848fc51ce01353b6"},"updatedAt":{"$date":"2017-05-03T18:31:38.771Z"},"createdAt":{"$date":"2017-05-03T14:51:53.136Z"},"title":"EXO 6","publishedAt":{"$date":"2017-05-03T22:00:00.000Z"},"content":"Ajouter un champ « publié » à l’article","__v":0,"publish":true} +{"_id":{"$oid":"5909feacdd2af62e3fe6253d"},"updatedAt":{"$date":"2017-05-03T16:04:30.339Z"},"createdAt":{"$date":"2017-05-03T16:00:44.519Z"},"title":"exo16 export mongo","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"content":"mongoexport --db blog --collection posts --out posts.json\nmongoexport --db blog --collection users --out users.json","__v":0,"publish":true} +{"_id":{"$oid":"590a0a4782f7713bdcac8f45"},"updatedAt":{"$date":"2017-05-03T18:11:19.947Z"},"createdAt":{"$date":"2017-05-03T16:50:15.392Z"},"title":"exo 11 debugg","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"__v":0,"content":"pb dans Mongo, arrive pas à faire ménage des anciens Id bookmark en double","publish":true} +{"_id":{"$oid":"590a1cfb4fa3a545d429d612"},"updatedAt":{"$date":"2017-05-03T18:10:03.606Z"},"createdAt":{"$date":"2017-05-03T18:10:03.606Z"},"title":"test favori","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"__v":0,"publish":true} +{"_id":{"$oid":"590a41e01aa4026008f6af0d"},"updatedAt":{"$date":"2017-05-03T20:47:28.893Z"},"createdAt":{"$date":"2017-05-03T20:47:28.893Z"},"title":"EXO6 not Published","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"content":"this article is not published","__v":0,"publish":false} +{"_id":{"$oid":"590a42281aa4026008f6af0e"},"updatedAt":{"$date":"2017-05-03T20:48:40.042Z"},"createdAt":{"$date":"2017-05-03T20:48:40.042Z"},"title":"EXO6 Published yes","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"content":"article publié","__v":0,"publish":true} +{"_id":{"$oid":"590a43b81aa4026008f6af0f"},"updatedAt":{"$date":"2017-05-03T20:55:45.723Z"},"createdAt":{"$date":"2017-05-03T20:55:20.955Z"},"title":"exo6","publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"content":"this.Publish no","publish":false,"__v":0} +{"_id":{"$oid":"590a4b8d64ded768e72a0da9"},"updatedAt":{"$date":"2017-05-03T21:51:37.449Z"},"createdAt":{"$date":"2017-05-03T21:28:45.738Z"},"publish":true,"publishedAt":{"$date":"2017-05-02T22:00:00.000Z"},"title":"La MEAN Stack","content":"Angular\n1. A quoi elle sert ? C'est un framework MVC pour définir l'architecture du projet\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? On peut l'utiliser des 2 cotés front \u0026 back mais pas obligé\n3. Si elle est facultative ou non pour ce projet : non\nAngular UI Router\n1. A quoi elle sert ? C'est un outil qui permet de faciliter la navigation sur un site sans avoir à recharger toute la page, très pratique pour les sites Single page\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? En front car c'est pour afficher\n3. Si elle est facultative ou non pour ce projet, si on l'en lève on n'affiche plus rien sur notre site, il aurait fallu le concevoir différement.\nExpress\n1. A quoi elle sert ? C'est un framework basé sur Node .js pour construire le serveur\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? En back\n3. Si elle est facultative ou non pour ce projet, Non, si on n'a pas de serveur on n'a pas de données à afficher\nJSONWebToken\n1. A quoi elle sert ? C'est un standard utilisé pour l'authentification\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? front \u0026 back\n3. Si elle est facultative ou non pour ce projet. On peut faire autrement oui\nMongoose\n1. A quoi elle sert ? C'est pour l'accès à la base de données\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? Accès par le back et par le terminal on peut aussi\n3. Si elle est facultative ou non pour ce projet . Si on utilise une autre DB NoSQL oui\nMaterializeCSS\n1. A quoi elle sert ? C'est un framework pour le CSS\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? Coté front\n3. Si elle est facultative ou non pour ce projet, oui mais c'est moins joli et pratique à coder, on pourrait changer pour bootstrap\nPassport\n1. A quoi elle sert ? C'est pout l'authentification\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? Les deux\n3. Si elle est facultative ou non pour ce projet, on pourrait\nBabel\n1. A quoi elle sert ? C'est un compilateur pour la rétrocompatibilité avec d'anciens navigateurs\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? front\n3. Si elle est facultative ou non pour ce projet. Oui si notre navigateur est à jour avec les technos utilisées\nSCSS\n1. A quoi elle sert ? Ça prend moins de place que le css\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? front\n3. Si elle est facultative ou non pour ce projet. oui\nNodemon\n1. A quoi elle sert ? Ça sert au dev . C'est un service qui relance les scripts en cas de modifications, on voit les résultats (ok ou Ko) sur le terminal\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? Que en dev - Back affiché sur terminal. Se trouve dans \"devDependencies\" du package.json\n3. Si elle est facultative ou non pour ce projet, oui mais pour tester et débuger c'est plus pratique\nWebpack\n1. A quoi elle sert ? Comme audessus mais coté front Ça sert au dev, regénère le js pour l'afficher sans tout rafraichir\n2. Où va-t-on l’utiliser  ? Que en dev- Front affiché sur terminal. Se trouve dans \"devDependencies\" du package.json\n3. Si elle est facultative ou non pour ce projet, oui mais pour tester et débuger c'est plus pratique\n\nLivereload \n1. A quoi elle sert ? pour rafraichir le navigateur automatiquement (au lieu de faire F5)\n2. Où va-t-on l’utiliser (côté front, côté back, front \u0026 back, terminal…) ? Que en dev- Front \n3. Si elle est facultative ou non pour ce projet, oui mais pour tester et débuger c'est plus pratique","__v":0} diff --git a/public/js/app.js b/public/js/app.js index 72c1c02..07a6c09 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -15,10 +15,11 @@ import services from './services/services.md' import common from './components/common/common.md' import login from './components/login/login.md' import blog from './components/blog/blog.md' +import algo1 from './components/algo1/algo1.md' console.log("In app.js") console.log(services) - + angular.module('app', [ angularUIRouter, angularCookies, @@ -27,5 +28,6 @@ angular.module('app', [ services, common, login, - blog + blog, + algo1 ]) diff --git a/public/js/components/algo1/algo1.html b/public/js/components/algo1/algo1.html new file mode 100644 index 0000000..98a48f0 --- /dev/null +++ b/public/js/components/algo1/algo1.html @@ -0,0 +1,12 @@ +
+ +
+
+
+

algo1

+

{{$ctrl.myFriend}}

+
+
+ +
+
diff --git a/public/js/components/algo1/algo1.js b/public/js/components/algo1/algo1.js new file mode 100644 index 0000000..08986c4 --- /dev/null +++ b/public/js/components/algo1/algo1.js @@ -0,0 +1,42 @@ +/* +Create Angular component algo1 into module app.blog +*/ +let algo1 = { + templateUrl: 'js/components/algo1/algo1.html', + controller: [ 'UsersService', '$state', function( UsersService, $state ) { + 'use strict' + console.log("algo1.js"); + angular.extend( this, { + $onInit() { + UsersService.getCurrent().then( ( user ) => { + this.user = user + } ).catch( ( err ) => { + + } ) + }, + disconnect() { + UsersService.disconnect().then( () => { + Materialize.toast( 'Disconnected', 4000, 'toast-warning' ) + this.user = null + $state.reload() + } ) + } + } ) + + function friend(friends){ + //your code here + // for each friend in array friends + // test if lenght = 4 then push it in return array + let isFriend = []; + friends.forEach(function(y) { + if (y.length === 4) { isFriend.push(y)} + }) + return isFriend ; + } + this.myFriend = friend(["Ryan", "Kieran", "Mark"]); + console.log("I have this friends: ", this.myFriend ); + + } ] +} + +export default algo1 diff --git a/public/js/components/algo1/algo1.md.js b/public/js/components/algo1/algo1.md.js new file mode 100644 index 0000000..bc089f7 --- /dev/null +++ b/public/js/components/algo1/algo1.md.js @@ -0,0 +1,25 @@ +/* +Create Angular module app.blog and define all states +blog : parent state, is an abstrat state too with templateUrl +*/ + +import algo1Component from './algo1' + +let algo1Module = angular.module('app.algo1', []) + .component('algo1', algo1Component) + .config(['$stateProvider', ($stateProvider, $urlRouterProvider, $locationProvider) => { + console.log("algo1.md.js"); + /* + Define a state with name 'blog' this state is abstract and url is empty (root of application) + template is ui-view it's used to display nested views + */ + // $stateProvider + // .state('algo1', { + // url: '/algo1', + // abstract: true, + // templateUrl: 'js/components/algo1/algo1.html' + // }) + }]) + .name + +export default algo1Module diff --git a/public/js/components/blog/blogItem/blogItem.html b/public/js/components/blog/blogItem/blogItem.html index b83316f..8e21c57 100755 --- a/public/js/components/blog/blogItem/blogItem.html +++ b/public/js/components/blog/blogItem/blogItem.html @@ -2,7 +2,7 @@
- +
@@ -11,12 +11,34 @@ + + + +

+ + + Publié le {{$ctrl.post.publishedAt | date: "dd-MM-yyyy"}} + + + + +

+ +
+

+
{{$ctrl.post.content | limitTo: ($ctrl.editable ? $ctrl.post.content.length : 110)}}
+
@@ -32,6 +54,7 @@ {{($ctrl.isFav() ? 'turned_in' : 'turned_in_not')}} +
diff --git a/public/js/components/blog/blogItem/blogItem.js b/public/js/components/blog/blogItem/blogItem.js index 97d54ee..8cb5961 100755 --- a/public/js/components/blog/blogItem/blogItem.js +++ b/public/js/components/blog/blogItem/blogItem.js @@ -35,6 +35,7 @@ let blogItem = { PostsService.getById($stateParams.id).then((res) => { // when this request receives response we affect response data to this controller variable post this.post = res.data; + this.post.publishedAt = new Date(this.post.publishedAt) // save into initialPost a copy of this post (used for undo) initialPost = angular.copy(this.post) }) @@ -42,6 +43,7 @@ let blogItem = { } else { //If $stateParams.id doesn't exist we change state to app.blog.list (redirection to list) $state.go('blog.list') + console.log("redirect to blog.list"); } // Create delete function. diff --git a/public/js/components/blog/blogItem/blogItemMenu.js b/public/js/components/blog/blogItem/blogItemMenu.js index e3fb662..b021690 100755 --- a/public/js/components/blog/blogItem/blogItemMenu.js +++ b/public/js/components/blog/blogItem/blogItemMenu.js @@ -5,7 +5,7 @@ Create Angular component blogItemMenu into module app.blog with databindings pro - onEdit : function - onDelete : function - onSave : function -About bindings: +About bindings: http://stackoverflow.com/questions/37818740/use-of-symbols-and-in-custom-directives-scope-binding-angula */ let blogItemMenu = { diff --git a/public/js/components/blog/blogList/blogList.js b/public/js/components/blog/blogList/blogList.js index ab19e29..2a778b1 100755 --- a/public/js/components/blog/blogList/blogList.js +++ b/public/js/components/blog/blogList/blogList.js @@ -22,7 +22,7 @@ let blogList = { this.posts = res.data }).catch((err) => { this.posts = [{ - title: "Hello There", + title: "Hello There", content: "I am an intersting article. There was an error by the way because API doesn't exist yet" }] }) @@ -33,7 +33,6 @@ let blogList = { // Add 3 to startIndex this.startIndex += 3 } - }] } diff --git a/public/js/components/common/navbar.html b/public/js/components/common/navbar.html index 7c2ca66..e3c0d35 100755 --- a/public/js/components/common/navbar.html +++ b/public/js/components/common/navbar.html @@ -1,25 +1,29 @@ diff --git a/public/js/components/common/navbar.js b/public/js/components/common/navbar.js index c994d8c..258250e 100755 --- a/public/js/components/common/navbar.js +++ b/public/js/components/common/navbar.js @@ -1,6 +1,9 @@ + +import moment from 'moment'; + let navbar = { templateUrl: 'js/components/common/navbar.html', - controller: ['UsersService', '$state', function(UsersService, $state) { + controller: ['UsersService', '$state','$interval', function(UsersService, $state, $interval) { 'use strict' angular.extend(this, { $onInit() { @@ -19,6 +22,14 @@ let navbar = { } }) + // $interval(fn, delay, [count], [invokeApply], [Pass]); + $interval(() => { + this.curentTime = moment().format('MMMM Do YYYY, h:mm:ss a'); + }, 1000) + // this.currentDate => {} + + console.log("this.curentTime", this.curentTime); + }] } diff --git a/public/js/config/routes.js b/public/js/config/routes.js index 84745e8..e1cfcac 100755 --- a/public/js/config/routes.js +++ b/public/js/config/routes.js @@ -16,6 +16,14 @@ export default ['$stateProvider', '$urlRouterProvider', '$locationProvider', ($s abstract: true, template: '
' }) + .state('algo1', { + url: '/algo1/', + template: '', + controller: ['Algo1Service', "$stateParams", '$state', function(Algo1Service, $stateParams, $state) { + $state.go('algo1') + + }] + }) .state('callback', { url: '/auth/callback/:token', template: '', diff --git a/public/js/services/algo1Service.js b/public/js/services/algo1Service.js new file mode 100644 index 0000000..2b6d4ba --- /dev/null +++ b/public/js/services/algo1Service.js @@ -0,0 +1,11 @@ +export default ['$http', class Algo1Service { + + constructor($http) { + this.$http = $http + console.log("Algo1Service"); + } + // get() { + // // HTTP Request method GET to our express API + // return this.$http.get('/api/algo1') + // } +}] diff --git a/public/js/services/postsService.js b/public/js/services/postsService.js index ac1f9dd..75f9e80 100755 --- a/public/js/services/postsService.js +++ b/public/js/services/postsService.js @@ -9,11 +9,16 @@ export default ['$http', class PostsService { get() { // HTTP Request method GET to our express API - return this.$http.get('/api/posts') + // return this.$http.get('/api/posts') + return this.$http.get('/api/posts/?publish=true') } getById(id) { // HTTP Request method GET with param (post id) to our express API - return this.$http.get('/api/posts/' + id) + // if ( ) { + return this.$http.get('/api/posts/' + id) + // } else { + // console.log("« Article not published yet » "); + //} } save(post) { if (post._id) { diff --git a/public/js/services/services.md.js b/public/js/services/services.md.js index f2aa35f..9957148 100644 --- a/public/js/services/services.md.js +++ b/public/js/services/services.md.js @@ -3,10 +3,12 @@ Create app.service module */ import postsService from './postsService' import usersService from './usersService' +import algo1Service from './algo1Service' let servicesModule = angular.module('app.services', []) .service('PostsService', postsService) .service('UsersService', usersService) + .service('Algo1Service', algo1Service) .name export default servicesModule diff --git a/users.json b/users.json new file mode 100644 index 0000000..a888292 --- /dev/null +++ b/users.json @@ -0,0 +1 @@ +{"_id":{"$oid":"590989d4b395541750ab50a0"},"updatedAt":{"$date":"2017-05-03T20:00:01.004Z"},"createdAt":{"$date":"2017-05-03T07:42:13.448Z"},"salt":"7713a5d3e38c6e0373073be108a657712ea1b5a3cb94b17895b2cf392b8f4238","email":"elsadd@hotmail.fr","name":"elsa","isAdmin":false,"bookmarks":[{"$oid":"5909963341cbd21c20468bc9"},{"$oid":"5909963341cbd21c20468bc9"},{"$oid":"5909963341cbd21c20468bc9"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909feacdd2af62e3fe6253d"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"5909946c41cbd21c20468bc8"},{"$oid":"590a1cfb4fa3a545d429d612"},{"$oid":"590a0a4782f7713bdcac8f45"}],"encryptedPassword":"4fae489a7f5dccff7689fd4d501c1568c592b79640b200d6e80ba8f39e68555fa981f2f15de09c6a0d4de9b94ca52a04fd72068e1fefc70cde329b481d31e1fd570de71be8890588eeb8f3faee2758e52443c39dfae8d95ddea254108bf0f24efb7e20cc72c58fdf2f86d79ec8eddcafaba388c97a25e05e7e0d811a3ba6fb414516b2dcdf7cc539f66b73117ef4c5560c861a026bc0ffebf4b5c7ca4d3bdaad4ea71caa8bf868352e7334c65f51ef6d58f6f08c57b3f1c567838257802ae346bb522b54cd0fe2629e39d13638e420d36401c34ff3a4a53a0c87ca2cefc70b6dab72145f4b9652c482e5e81264e05cb46f7c5f2b784450854853b2c62bbeb435","__v":0}