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 c7550c51e3f6cb5e502e0ff257e4f181acb1c984 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 ++ pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 28355 -> 28419 bytes .../chorem/pollen/rest/api/v1/PollenUserApi.java | 17 +++++++++++++ .../pollen/services/bean/PollenUserBean.java | 12 +++++++++ .../pollen/services/service/SocialAuthService.java | 18 +++++++++++++ pollen-ui-riot-js/src/main/web/js/UserService.js | 7 +++++- pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 28 +++++++++++++++++++-- .../src/main/web/tag/UserProfile.tag.html | 24 ++++++++++++++++++ 10 files changed, 108 insertions(+), 4 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-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties index 926a53e6..19fe27c2 100644 --- a/pollen-persistence/src/main/xmi/pollen.properties +++ b/pollen-persistence/src/main/xmi/pollen.properties @@ -18,7 +18,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ###m -model.tagvalue.version=3.0.0.10 +model.tagvalue.version=3.0.0.11 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 0da955ef..1642eec1 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ 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 188b9ea7..023864c8 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 @@ -158,4 +158,21 @@ public class PollenUserApi { socialAuthService.deleteUserCredential(userId, 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 d1d1ccb5..aea1b1d0 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 @@ -56,6 +56,8 @@ public class PollenUserBean extends PollenBean<PollenUser> { protected boolean gtuValidated; + protected String avatar; + public PollenUserBean() { super(PollenUser.class); } @@ -82,6 +84,7 @@ public class PollenUserBean extends PollenBean<PollenUser> { }) .collect(Collectors.toList())); } + setAvatar(entity.getAvatar()); } @Override @@ -95,6 +98,7 @@ public class PollenUserBean extends PollenBean<PollenUser> { entity.setLanguage(getLanguage()); entity.setEmail(getEmail()); entity.setPassword(getPassword()); + entity.setAvatar(getAvatar()); return entity; @@ -179,4 +183,12 @@ public class PollenUserBean extends PollenBean<PollenUser> { public void setGtuValidated(boolean gtuValidated) { this.gtuValidated = gtuValidated; } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } } 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 d9afcc3f..e651320c 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 @@ -247,4 +247,22 @@ public class SocialAuthService extends PollenServiceSupport { dao.delete(dao.forTopiaIdEquals(credentialId.getEntityId()).findUnique()); 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 396921a5..0ed302e9 100644 --- a/pollen-ui-riot-js/src/main/web/js/UserService.js +++ b/pollen-ui-riot-js/src/main/web/js/UserService.js @@ -68,7 +68,6 @@ class UserService extends FetchService { return this.post(url, body); } - unlinkProvider(userId, credentialId) { let url = this._getUrlPrefix(userId) + "/credentials/" + credentialId; return this.doDelete(url); @@ -78,6 +77,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 b3ff983d..cb829dff 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 @@ -224,8 +224,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"); @@ -289,6 +293,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 6b0d9b86..749ee115 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 @@ -144,6 +144,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> @@ -170,6 +182,10 @@ require("./components/HumanInput.tag.html"); this.update(); }; +this.test = (e) => { +console.log(e) +} + this.resendValidation = () => { this.authService.resendValidation(this.user.email); }; @@ -243,6 +259,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>.