This is an automated email from the git hooks/post-receive script. New commit to branch feature/28_avatars in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 9b760b6ec8ce7bd2f9ae40ee98071fe32e86c597 Author: Kevin Morin <morin@codelutin.com> Date: Tue Sep 19 18:10:32 2017 +0200 refs #28 ajout de l'avatar pour l'utilisateur + possibilité d'en choisir un parmi les providers disponibles --- .../db/migration/h2/V3_0_0_11__add_avatar.sql | 2 ++ .../migration/postgresql/V3_0_0_11__add_avatar.sql | 2 ++ .../chorem/pollen/rest/api/v1/PollenUserApi.java | 17 +++++++++++++ .../pollen/services/bean/PollenUserBean.java | 10 ++++++++ .../pollen/services/service/SocialAuthService.java | 18 ++++++++++++++ pollen-ui-riot-js/src/main/web/js/UserService.js | 6 +++++ pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 28 ++++++++++++++++++++-- .../src/main/web/tag/UserProfile.tag.html | 24 +++++++++++++++++++ 8 files changed, 105 insertions(+), 2 deletions(-) diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_11__add_avatar.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_11__add_avatar.sql new file mode 100644 index 00000000..197b01b4 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_0_0_11__add_avatar.sql @@ -0,0 +1,2 @@ +-- add user's avatar +alter table pollenUser add avatar VARCHAR(255); diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_11__add_avatar.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_11__add_avatar.sql new file mode 100644 index 00000000..197b01b4 --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_0_0_11__add_avatar.sql @@ -0,0 +1,2 @@ +-- add user's avatar +alter table pollenUser add avatar VARCHAR(255); diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java index 130a8212..0968efa3 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java @@ -155,4 +155,21 @@ public class PollenUserApi { socialAuthService.deleteUserCredential(credentialId); } + + @Path("/users/{userId}/avatar/{provider}") + @POST + public String setAvatar(@Context SocialAuthService socialAuthService, + @Context HttpServletRequest request, + @PathParam("userId") PollenEntityId<PollenUser> userId, + @PathParam("provider") String provider, + String providerReturn) throws Exception { + + SocialAuthManager socialAuthManager = + (SocialAuthManager) request.getSession().getAttribute(ApiUtils.SOCIAL_AUTH_MANAGER_SESSION_KEY); + //socialAuthManager + request.getSession().removeAttribute(ApiUtils.SOCIAL_AUTH_MANAGER_SESSION_KEY); + Gson gson = new Gson(); + Map<String, String> paramsMap = gson.fromJson(providerReturn, Map.class); + return socialAuthService.setAvatarToUser(userId, socialAuthManager, paramsMap); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java index a070b2d1..f18ab44f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java @@ -55,6 +55,8 @@ public class PollenUserBean extends PollenBean<PollenUser> { protected boolean gtuValidated; + protected String avatar; + protected Date premiumTo; protected boolean premium; @@ -143,6 +145,14 @@ public class PollenUserBean extends PollenBean<PollenUser> { this.gtuValidated = gtuValidated; } + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + public Date getPremiumTo() { return premiumTo; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java index 8300665d..61150e32 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java @@ -269,4 +269,22 @@ public class SocialAuthService extends PollenServiceSupport { getUserCredentialDao().delete(credential); commit(); } + + public String setAvatarToUser(PollenEntityId<PollenUser> userId, SocialAuthManager manager, Map<String, String> paramsMap) throws Exception { + checkIsConnected(); + PollenUser connectedUser = getConnectedUser(); + if (!connectedUser.getTopiaId().equals(userId.getEntityId())) { + throw new PollenUnauthorizedException(userId.getReducedId()); + } + + AuthProvider provider = manager.connect(paramsMap); + + // get profile + Profile p = provider.getUserProfile(); + + connectedUser.setAvatar(p.getProfileImageURL()); + commit(); + + return connectedUser.getAvatar(); + } } diff --git a/pollen-ui-riot-js/src/main/web/js/UserService.js b/pollen-ui-riot-js/src/main/web/js/UserService.js index c203638a..d1cceefa 100644 --- a/pollen-ui-riot-js/src/main/web/js/UserService.js +++ b/pollen-ui-riot-js/src/main/web/js/UserService.js @@ -81,6 +81,12 @@ class UserService extends FetchService { let url = "/v1/gtu/validate"; return this.post(url); } + + getProviderAvatar(userId, query) { + let url = this._getUrlPrefix(userId) + "/avatar/" + query.loginProvider; + let body = JSON.stringify(query); + return this.post(url, body); + } } module.exports = singleton(UserService); diff --git a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html index 7b29d834..ef16fc1b 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html @@ -236,8 +236,12 @@ require("./popup/GtuChangeModal.tag.html"); }); route("/user/profile", () => { - this.bus.trigger("pageChanged", "userProfile"); - riot.mount(this.refs.content, "userprofile"); + if (!session.isConnected()) { + route("/signin?url=/user/profile"); + } else { + this.bus.trigger("pageChanged", "userProfile"); + riot.mount(this.refs.content, "userprofile"); + } }); route("/favoriteLists", () => { this.bus.trigger("pageChanged", "favoriteLists"); @@ -301,6 +305,26 @@ require("./popup/GtuChangeModal.tag.html"); this.bus.off("user", callback); }); } + + } else if (q.action === "avatar" && session.isConnected()) { + let callback = (user) => { + userService.getProviderAvatar(user.id, q).then(() => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile"); + }, (e) => { + e.text().then(label => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile?error=" + label); + }); + }); + }; + + if (session.getUser()) { + callback(session.getUser()); + } else { + this.bus.on("user", (user) => { + callback(user); + this.bus.off("user", callback); + }); + } } } else { diff --git a/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html b/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html index 19f5f9c5..57fd0a0b 100644 --- a/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html @@ -164,6 +164,18 @@ require("./components/HumanInput.tag.html"); </a> </p> </div> + + <div class="o-form-element align-center" if="{loginProviders.length > 0}"> + <p>Avatar</p> + <p><img src="{user.avatar}" onerror="{test}"/></p> + <p> + <a each="{loginProvider in loginProviders}" class="provider-link" + onclick="{getProviderAvatar(loginProvider)}"> + <i class="fa fa-{authService.providerIcons[loginProvider]}" if="{authService.providerIcons[loginProvider]}"></i> + <span if="{!authService.providerIcons[loginProvider]}">{loginProvider}</span> + </a> + </p> + </div> </div> </div> @@ -190,6 +202,10 @@ require("./components/HumanInput.tag.html"); this.update(); }; +this.test = (e) => { +console.log(e) +} + this.resendValidation = () => { this.authService.resendValidation(this.user.email); }; @@ -263,6 +279,14 @@ require("./components/HumanInput.tag.html"); }); }; + getProviderAvatar= (provider) => (e) => { + let redirection = encodeURIComponent(location.origin + location.pathname + + "?loginProvider=" + provider + "&action=avatar"); + this.authService.getLoginProviderUrl(provider, redirection).then(result => { + location.assign(result); + }); + }; + this.listen("user", this.onUserChange); </script> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.