Author: kmorin Date: 2013-06-21 23:26:23 +0200 (Fri, 21 Jun 2013) New Revision: 3839 Url: http://chorem.org/projects/pollen/repository/revisions/3839 Log: - fix CORS server side - real user creation and login Modified: trunk/pollen-persistence/pom.xml trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/JpaPollenPersistenceContext.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenServiceContextFilter.java trunk/pollen-rest-api/src/main/resources/mapping trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties trunk/pollen-ui-js/src/main/webapp/index.html trunk/pollen-ui-js/src/main/webapp/js/controls/menu.js trunk/pollen-ui-js/src/main/webapp/js/controls/poll_form.js trunk/pollen-ui-js/src/main/webapp/js/controls/user_form.js trunk/pollen-ui-js/src/main/webapp/js/models/polls.js trunk/pollen-ui-js/src/main/webapp/js/models/users.js trunk/pollen-ui-js/src/main/webapp/views/poll_list.ejs trunk/pollen-ui-js/src/main/webapp/views/user_form.ejs trunk/pom.xml Modified: trunk/pollen-persistence/pom.xml =================================================================== --- trunk/pollen-persistence/pom.xml 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-persistence/pom.xml 2013-06-21 21:26:23 UTC (rev 3839) @@ -60,6 +60,11 @@ </dependency> <dependency> + <groupId>org.nuiton.jpa</groupId> + <artifactId>nuiton-jpa-hibernate</artifactId> + </dependency> + + <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </dependency> Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/JpaPollenPersistenceContext.java =================================================================== --- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/JpaPollenPersistenceContext.java 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/JpaPollenPersistenceContext.java 2013-06-21 21:26:23 UTC (rev 3839) @@ -25,7 +25,7 @@ import org.nuiton.jpa.api.JpaEntity; import org.nuiton.jpa.api.JpaEntityIdFactory; -import org.nuiton.jpa.api.hibernate.HibernateUtil; +import org.nuiton.jpa.hibernate.HibernateUtil; import javax.persistence.EntityManager; Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2013-06-21 21:26:23 UTC (rev 3839) @@ -25,7 +25,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.gson.Gson; +import com.google.gson.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.debux.webmotion.server.call.Call; @@ -92,7 +92,7 @@ } Object map = toMap(model, includeCollection); - Gson gson = new Gson(); + Gson gson = new GsonBuilder().create(); String json = gson.toJson(map); PrintWriter out = context.getOut(); out.print(json); Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenServiceContextFilter.java =================================================================== --- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenServiceContextFilter.java 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenServiceContextFilter.java 2013-06-21 21:26:23 UTC (rev 3839) @@ -32,6 +32,7 @@ import org.debux.webmotion.server.call.HttpContext; import javax.persistence.EntityManager; +import javax.servlet.http.HttpServletResponse; /** * Inject le service context dans les controlleurs. @@ -58,6 +59,10 @@ addSecurityContext(context, serviceContext); doProcess(); + + HttpServletResponse response = context.getResponse(); + response.addHeader(HttpContext.HEADER_ACCESS_CONTROL_ALLOW_ORIGIN, "*"); + response.addHeader(HttpContext.HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); } protected void addSecurityContext(HttpContext context, Modified: trunk/pollen-rest-api/src/main/resources/mapping =================================================================== --- trunk/pollen-rest-api/src/main/resources/mapping 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-rest-api/src/main/resources/mapping 2013-06-21 21:26:23 UTC (rev 3839) @@ -13,10 +13,8 @@ [errors] org.chorem.pollen.services.exception.EntityNotFoundException ErrorAction.on404 -org.chorem.pollen.services.exception.UserEmailAlreadyUsedException ErrorAction.on500 -org.chorem.pollen.services.exception.UserLoginAlreadyUsedException ErrorAction.on500 org.chorem.pollen.services.exception.UserInvalidPasswordException ErrorAction.on500 -org.chorem.pollen.services.exception.UserInvalidEmailActiviationTokenException ErrorAction.on500 +org.chorem.pollen.services.exception.UserInvalidEmailActivationTokenException ErrorAction.on500 org.chorem.pollen.services.exception.AbstractInvalidFormException ErrorAction.on500Form [actions] Modified: trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties =================================================================== --- trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/bundle/Messages.properties 2013-06-21 21:26:23 UTC (rev 3839) @@ -80,6 +80,7 @@ #poll lists pollen.polls.created.title=Sondages créés +pollen.polls.created.empty=Vous n'avez créé aucun sondage #poll summary pollen.poll.summary.title=Sondage \'{0}\' Modified: trunk/pollen-ui-js/src/main/webapp/index.html =================================================================== --- trunk/pollen-ui-js/src/main/webapp/index.html 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/index.html 2013-06-21 21:26:23 UTC (rev 3839) @@ -53,7 +53,14 @@ <script src="js/libs/jquery.scrollto.js"></script> <script type="text/javascript"> - var backendUrl = 'http://localhost:8080/pollen-rest-api/v1'; + var backendUrl = 'http://localhost:8080/pollen/v1'; + var paramForWM = function(obj, objName) { + var result = ""; + for (var k in obj) { + result += objName + '.' + k + '=' + obj[k] + '&'; + } + return result; + } </script> <script src="js/models/polls.js"></script> @@ -96,8 +103,6 @@ } }); - - </script> </body> Modified: trunk/pollen-ui-js/src/main/webapp/js/controls/menu.js =================================================================== --- trunk/pollen-ui-js/src/main/webapp/js/controls/menu.js 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/js/controls/menu.js 2013-06-21 21:26:23 UTC (rev 3839) @@ -26,17 +26,17 @@ }, '#loginForm submit': function(form) { - can.ajax({ - url: backendUrl + '/login', + can.ajax(backendUrl + '/login', { + type: 'PUT', data: { login: form.find('[name="login"]').val(), password: form.find('[name="password"]').val() }, - type: "PUT", success: function(user) { form[0].reset(); form.parents(".dropdown.open").removeClass("open"); - currentUser.attr(user, true); + currentUser.attr(user.pollenUser, true); + currentUser.attr("token", user.id); window.localStorage.setItem('currentUser', JSON.stringify(currentUser._data)); } }); @@ -44,7 +44,16 @@ }, '#menuItemLogout click': function() { - currentUser.attr(new User(), true); - window.localStorage.set('currentUser', currentUser._data); + can.ajax(backendUrl + '/logout', { + type: 'GET', + data: { + login: currentUser.login, + token: currentUser.token + }, + success: function(user) { + currentUser.attr({}, true); + window.localStorage.setItem('currentUser', '{}'); + } + }); } }); \ No newline at end of file Modified: trunk/pollen-ui-js/src/main/webapp/js/controls/poll_form.js =================================================================== --- trunk/pollen-ui-js/src/main/webapp/js/controls/poll_form.js 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/js/controls/poll_form.js 2013-06-21 21:26:23 UTC (rev 3839) @@ -37,7 +37,16 @@ ':type/:action route': function(data) { if (data.type === "poll" && data.action === "create") { - this.editPoll(new Poll()); + var self = this; + $.when(can.ajax(backendUrl + "/polls/new", { + data: { + choiceType: "TEXT", + userId: currentUser.id + } + })).then(function(poll) { + console.log(poll) + self.editPoll(new Poll(poll)); + }); } }, Modified: trunk/pollen-ui-js/src/main/webapp/js/controls/user_form.js =================================================================== --- trunk/pollen-ui-js/src/main/webapp/js/controls/user_form.js 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/js/controls/user_form.js 2013-06-21 21:26:23 UTC (rev 3839) @@ -62,15 +62,26 @@ '#userEditionForm submit': function(form) { var self = this, user = this.options.user, + password = user.password, errors = user.errors(); if (errors == null) { user.repeatPassword = null; - //TODO 20130618 kmorin encrypt password user.save(function(data) { - if (data.id) { - user.id = data.id; - } + form[0].reset(); + can.ajax(backendUrl + '/login', { + type: 'PUT', + data: { + login: user.login, + password: password + }, + success: function(user) { + currentUser.attr(user.pollenUser, true); + currentUser.attr("token", user.id); + window.localStorage.setItem('currentUser', JSON.stringify(currentUser._data)); + can.route.attr({ type: 'polls', action: 'created' }); + } + }); }); } else { Modified: trunk/pollen-ui-js/src/main/webapp/js/models/polls.js =================================================================== --- trunk/pollen-ui-js/src/main/webapp/js/models/polls.js 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/js/models/polls.js 2013-06-21 21:26:23 UTC (rev 3839) @@ -23,7 +23,13 @@ var Poll = can.Model({ findAll : "GET " + backendUrl + "/polls", findOne : "GET " + backendUrl + "/polls/{id}", - create : "POST " + backendUrl + "/polls", + create : function(attrs) { + var t = paramForWM(attrs, 'poll') + 'userId=' + currentUser.id; + return can.ajax(backendUrl + "/polls",{ + type: "POST", + data: t + }); + }, update : "PUT " + backendUrl + "/polls/{id}", destroy : "DELETE " + backendUrl + "/polls/{id}" },{}); @@ -74,19 +80,19 @@ }, ]; -can.fixture("GET " + backendUrl + "/polls", function(){ - return POLLS; -}); +//can.fixture("GET " + backendUrl + "/polls", function(){ +// return POLLS; +//}); -can.fixture("GET " + backendUrl + "/polls/{id}", function(orig) { - return POLLS[orig.data.id - 1]; -}); +//can.fixture("GET " + backendUrl + "/polls/{id}", function(orig) { +// return POLLS[orig.data.id - 1]; +//}); var idToInc= 3; -can.fixture("POST " + backendUrl + "/polls", function() { - console.log("create poll " + idToInc); - return {id: (idToInc++)} -}); +//can.fixture("POST " + backendUrl + "/polls", function() { +// console.log("create poll " + idToInc); +// return {id: (idToInc++)} +//}); can.fixture("PUT " + backendUrl + "/polls/{id}", function(orig) { console.log("update poll " + orig.data.id); Modified: trunk/pollen-ui-js/src/main/webapp/js/models/users.js =================================================================== --- trunk/pollen-ui-js/src/main/webapp/js/models/users.js 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/js/models/users.js 2013-06-21 21:26:23 UTC (rev 3839) @@ -23,7 +23,12 @@ var User = can.Model({ findAll : "GET " + backendUrl + "/users", findOne : "GET " + backendUrl + "/users/{id}", - create : "POST " + backendUrl + "/users", + create : function(attrs) { + return can.ajax(backendUrl + "/users",{ + type: "POST", + data: paramForWM(attrs, 'user') + 'generatePassword=false' + }); + }, update : "PUT " + backendUrl + "/users/{id}", init: function() { @@ -67,31 +72,31 @@ }, ]; -can.fixture("GET " + backendUrl + "/users", function(){ - return USERS; -}); - -can.fixture("GET " + backendUrl + "/users/{id}", function(orig) { - return USERS[orig.data.id - 1]; -}); - -var idToInc= 3; -can.fixture("POST " + backendUrl + "/users", function() { - console.log("create user " + idToInc); - return {id: (idToInc++)} -}); - -can.fixture("PUT " + backendUrl + "/users/{id}", function(orig) { - console.log("update user " + orig.data.id); - return {}; -}); - -can.fixture("PUT " + backendUrl + "/login", function(orig) { - console.log("login user " + orig.data.login); - for (var i = 0 ; i < USERS.length ; i++) { - if (USERS[i].login == orig.data.login) { - return USERS[i]; - } - } - return {}; -}); \ No newline at end of file +//can.fixture("GET " + backendUrl + "/users", function(){ +// return USERS; +//}); +// +//can.fixture("GET " + backendUrl + "/users/{id}", function(orig) { +// return USERS[orig.data.id - 1]; +//}); +// +//var idToInc= 3; +//can.fixture("POST " + backendUrl + "/users", function() { +// console.log("create user " + idToInc); +// return {id: (idToInc++)} +//}); +// +//can.fixture("PUT " + backendUrl + "/users/{id}", function(orig) { +// console.log("update user " + orig.data.id); +// return {}; +//}); +// +//can.fixture("PUT " + backendUrl + "/login", function(orig) { +// console.log("login user " + orig.data.login); +// for (var i = 0 ; i < USERS.length ; i++) { +// if (USERS[i].login == orig.data.login) { +// return USERS[i]; +// } +// } +// return {}; +//}); \ No newline at end of file Modified: trunk/pollen-ui-js/src/main/webapp/views/poll_list.ejs =================================================================== --- trunk/pollen-ui-js/src/main/webapp/views/poll_list.ejs 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/views/poll_list.ejs 2013-06-21 21:26:23 UTC (rev 3839) @@ -1,7 +1,11 @@ <h1><%= $.i18n.prop("pollen.polls." + can.route.attr('action') + ".title") %></h1> -<% polls.each(function(poll) { %> +<% if (polls.length == 0) { %> +<p><%= pollen.polls.created.empty %></p> +<% } else { + polls.each(function(poll) { %> <div> <%== can.route.link(poll.attr('title'), {type: 'poll', action: 'summary', id: poll.attr('id')}) %> </div> -<% }); %> \ No newline at end of file +<% }); + } %> \ No newline at end of file Modified: trunk/pollen-ui-js/src/main/webapp/views/user_form.ejs =================================================================== --- trunk/pollen-ui-js/src/main/webapp/views/user_form.ejs 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pollen-ui-js/src/main/webapp/views/user_form.ejs 2013-06-21 21:26:23 UTC (rev 3839) @@ -1,6 +1,6 @@ <h1><%= user.attr('id') ? pollen.user.form.edit.title.update : pollen.user.form.edit.title.creation %></h1> -<form id='userEditionForm' class="form-horizontal"> +<form method="post" id='userEditionForm' class="form-horizontal"> <div class="control-group"> <label class="control-label" for="userEditionFormLogin"><%= pollen.user.login.label %></label> @@ -9,7 +9,7 @@ id='userEditionFormLogin' placeholder='<%= pollen.user.login.placeholder %>' value='<%= user.attr("login")%>' - required/> + /> <span class="help-inline"></span> </div> </div> @@ -22,7 +22,7 @@ id='userEditionFormPassword' placeholder='<%= pollen.user.password.placeholder %>' value='<%= user.attr("password")%>' - required/> + /> <span class="help-inline"></span> </div> </div> @@ -35,7 +35,7 @@ id='userEditionFormRepeatPassword' placeholder='<%= pollen.user.repeatPassword.placeholder %>' value='<%= user.attr("repeatPassword")%>' - required/> + /> <span class="help-inline"></span> </div> </div> @@ -48,7 +48,7 @@ id='userEditionFormName' placeholder='<%= pollen.user.name.placeholder %>' value='<%= user.attr("name")%>' - required/> + /> <span class="help-inline"></span> </div> </div> @@ -61,7 +61,7 @@ id='userEditionFormEmail' placeholder='<%= pollen.user.email.placeholder %>' value='<%= user.attr("email")%>' - required/> + /> <span class="help-inline"></span> </div> </div> Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-06-20 07:55:10 UTC (rev 3838) +++ trunk/pom.xml 2013-06-21 21:26:23 UTC (rev 3839) @@ -174,7 +174,7 @@ <!--<jqueryPluginVersion>3.5.0</jqueryPluginVersion>--> <shiroVersion>1.2.2</shiroVersion> <slf4jVersion>1.7.5</slf4jVersion> - <jettyVersion>8.1.11.v20130520</jettyVersion> + <jettyVersion>9.0.3.v20130506</jettyVersion> <!--jettyVersion>${jettyPluginVersion}</jettyVersion--> <hibernateVersion>4.2.2.Final</hibernateVersion> <seleniumVersion>2.33.0</seleniumVersion> @@ -257,6 +257,12 @@ <dependency> <groupId>org.nuiton.jpa</groupId> + <artifactId>nuiton-jpa-hibernate</artifactId> + <version>${nuitonJpaVersion}</version> + </dependency> + + <dependency> + <groupId>org.nuiton.jpa</groupId> <artifactId>nuiton-jpa-junit</artifactId> <version>${nuitonJpaVersion}</version> </dependency>